Remove dart_to_js_script_rewriter from pubspec.yaml as it is not used by (#5)

observatory.
diff --git a/packages/async/.gitignore b/packages/async/.gitignore
deleted file mode 100644
index 7a2e8dd..0000000
--- a/packages/async/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.buildlog
-.DS_Store
-.idea
-.pub/
-.settings/
-build/
-packages
-pubspec.lock
-.packages
diff --git a/packages/async/.test_config b/packages/async/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/async/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/async/.travis.yml b/packages/async/.travis.yml
deleted file mode 100644
index 2ea8538..0000000
--- a/packages/async/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: dart
-
-dart:
-  - dev
-
-dart_task:
-  - test: --platform vm
-  # No parallelism on Firefox (-j 1)
-  # Causes flakiness – need to investigate
-  - test: --platform firefox -j 1
-  - dartanalyzer
-  - dartfmt
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-cache:
-  directories:
-    - $HOME/.pub-cache
diff --git a/packages/async/AUTHORS b/packages/async/AUTHORS
deleted file mode 100644
index e8063a8..0000000
--- a/packages/async/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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/packages/async/CHANGELOG.md b/packages/async/CHANGELOG.md
deleted file mode 100644
index 0807821..0000000
--- a/packages/async/CHANGELOG.md
+++ /dev/null
@@ -1,232 +0,0 @@
-## 2.0.6
-
-* Add further support for Dart 2.0 library changes to `Stream`.
-
-## 2.0.5
-
-* Fix Dart 2.0 [runtime cast errors][sdk#27223] in `StreamQueue`.
-
-[sdk#27223]: https://github.com/dart-lang/sdk/issues/27223
-
-## 2.0.4
-
-* Add support for Dart 2.0 library changes to `Stream` and `StreamTransformer`.
-  Changed classes that implement `StreamTransformer` to extend
-  `StreamTransformerBase`, and changed signatures of `firstWhere`, `lastWhere`,
-  and `singleWhere` on classes extending `Stream`.  See
-  also [issue 31847][sdk#31847].
-
-  [sdk#31847]: https://github.com/dart-lang/sdk/issues/31847
-
-## 2.0.3
-
-* Fix a bug in `StreamQueue.startTransaction()` and related methods when
-  rejecting a transaction that isn't the oldest request in the queue.
-
-## 2.0.2
-
-* Add support for Dart 2.0 library changes to class `Timer`.
-
-## 2.0.1
-
-* Fix a fuzzy arrow type warning.
-
-## 2.0.0
-* Remove deprecated public `result.dart` and `stream_zip.dart` libraries and
-  deprecated classes `ReleaseStreamTransformer` and `CaptureStreamTransformer`.
-
-* Add `captureAll` and `flattenList` static methods to `Result`.
-
-* Change `ErrorResult` to not be generic and always be a `Result<Null>`.
-  That makes an error independent of the type of result it occurs instead of.
-
-## 1.13.3
-
-* Make `TypeSafeStream` extend `Stream` instead of implementing it. This ensures
-  that new methods on `Stream` are automatically picked up, they will go through
-  the `listen` method which type-checks every event.
-
-## 1.13.2
-
-* Fix a type-warning.
-
-## 1.13.1
-
-* Use `FutureOr` for various APIs that had previously used `dynamic`.
-
-## 1.13.0
-
-* Add `collectBytes` and `collectBytesCancelable` functions which collects
-  list-of-byte events into a single byte list.
-
-* Fix a bug where rejecting a `StreamQueueTransaction` would throw a
-  `StateError` if `StreamQueue.rest` had been called on one of its child queues.
-
-* `StreamQueue.withTransaction()` now properly returns whether or not the
-  transaction was committed.
-
-## 1.12.0
-
-* Add an `AsyncCache` class that caches asynchronous operations for a period of
-  time.
-
-* Add `StreamQueue.peek` and `StreamQueue.lookAheead`.
-  These allow users to look at events without consuming them.
-
-* Add `StreamQueue.startTransaction()` and `StreamQueue.withTransaction()`.
-  These allow users to conditionally consume events based on their values.
-
-* Add `StreamQueue.cancelable()`, which allows users to easily make a
-  `CancelableOperation` that can be canceled without affecting the queue.
-
-* Add `StreamQueue.eventsDispatched` which counts the number of events that have
-  been dispatched by a given queue.
-
-* Add a `subscriptionTransformer()` function to create `StreamTransformer`s that
-  modify the behavior of subscriptions to a stream.
-
-## 1.11.3
-
-* Fix strong-mode warning against the signature of Future.then
-
-## 1.11.1
-
-* Fix new strong-mode warnings introduced in Dart 1.17.0.
-
-## 1.11.0
-
-* Add a `typedStreamTransformer()` function. This wraps an untyped
-  `StreamTransformer` with the correct type parameters, and asserts the types of
-  events as they're emitted from the transformed stream.
-
-* Add a `StreamSinkTransformer.typed()` static method. This wraps an untyped
-  `StreamSinkTransformer` with the correct type parameters, and asserts the
-  types of arguments passed in to the resulting sink.
-
-## 1.10.0
-
-* Add `DelegatingFuture.typed()`, `DelegatingStreamSubscription.typed()`,
-  `DelegatingStreamConsumer.typed()`, `DelegatingSink.typed()`,
-  `DelegatingEventSink.typed()`, and `DelegatingStreamSink.typed()` static
-  methods. These wrap untyped instances of these classes with the correct type
-  parameter, and assert the types of values as they're accessed.
-
-* Add a `DelegatingStream` class. This is behaviorally identical to `StreamView`
-  from `dart:async`, but it follows this package's naming conventions and
-  provides a `DelegatingStream.typed()` static method.
-
-* Fix all strong mode warnings and add generic method annotations.
-
-* `new StreamQueue()`, `new SubscriptionStream()`, `new
-  DelegatingStreamSubscription()`, `new DelegatingStreamConsumer()`, `new
-  DelegatingSink()`, `new DelegatingEventSink()`, and `new
-  DelegatingStreamSink()` now take arguments with generic type arguments (for
-  example `Stream<T>`) rather than without (for example `Stream<dynamic>`).
-  Passing a type that wasn't `is`-compatible with the fully-specified generic
-  would already throw an error under some circumstances, so this is not
-  considered a breaking change.
-
-* `ErrorResult` now takes a type parameter.
-
-* `Result.asError` now returns a `Result<T>`.
-
-## 1.9.0
-
-* Deprecate top-level libraries other than `package:async/async.dart`, which
-  exports these libraries' interfaces.
-
-* Add `Result.captureStreamTransformer`, `Result.releaseStreamTransformer`,
-  `Result.captureSinkTransformer`, and `Result.releaseSinkTransformer`.
-
-* Deprecate `CaptureStreamTransformer`, `ReleaseStreamTransformer`,
-  `CaptureSink`, and `ReleaseSink`. `Result.captureStreamTransformer`,
-  `Result.releaseStreamTransformer`, `Result.captureSinkTransformer`, and
-  `Result.releaseSinkTransformer` should be used instead.
-
-## 1.8.0
-
-- Added `StreamSinkCompleter`, for creating a `StreamSink` now and providing its
-  destination later as another sink.
-
-- Added `StreamCompleter.setError`, a shortcut for emitting a single error event
-  on the resulting stream.
-
-- Added `NullStreamSink`, an implementation of `StreamSink` that discards all
-  events.
-
-## 1.7.0
-
-- Added `SingleSubscriptionTransformer`, a `StreamTransformer` that converts a
-  broadcast stream into a single-subscription stream.
-
-## 1.6.0
-
-- Added `CancelableOperation.valueOrCancellation()`, which allows users to be
-  notified when an operation is canceled elsewhere.
-
-- Added `StreamSinkTransformer` which transforms events before they're passed to
-  a `StreamSink`, similarly to how `StreamTransformer` transforms events after
-  they're emitted by a stream.
-
-## 1.5.0
-
-- Added `LazyStream`, which forwards to the return value of a callback that's
-  only called when the stream is listened to.
-
-## 1.4.0
-
-- Added `AsyncMemoizer.future`, which allows the result to be accessed before
-  `runOnce()` is called.
-
-- Added `CancelableOperation`, an asynchronous operation that can be canceled.
-  It can be created using a `CancelableCompleter`.
-
-- Added `RestartableTimer`, a non-periodic timer that can be reset over and
-  over.
-
-## 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.
-
-- Added a `StreamSplitter` class for splitting a stream into multiple new
-  streams.
-
-## 1.1.1
-
-- Updated SDK version constraint to at least 1.9.0.
-
-## 1.1.0
-
-- ChangeLog starts here.
diff --git a/packages/async/CONTRIBUTING.md b/packages/async/CONTRIBUTING.md
deleted file mode 100644
index 6f5e0ea..0000000
--- a/packages/async/CONTRIBUTING.md
+++ /dev/null
@@ -1,33 +0,0 @@
-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/packages/async/LICENSE b/packages/async/LICENSE
deleted file mode 100644
index de31e1a..0000000
--- a/packages/async/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/async/README.md b/packages/async/README.md
deleted file mode 100644
index 60e7b0b..0000000
--- a/packages/async/README.md
+++ /dev/null
@@ -1,93 +0,0 @@
-Contains utility classes in the style of `dart:async` to work with asynchronous
-computations.
-
-* The [`AsyncCache`][AsyncCache] class allows expensive asynchronous
-  computations values to be cached for a period of time.
-
-* The [`AsyncMemoizer`][AsyncMemoizer] class makes it easy to only run an
-  asynchronous operation once on demand.
-
-* The [`CancelableOperation`][CancelableOperation] class defines an operation
-  that can be canceled by its consumer. The producer can then listen for this
-  cancellation and stop producing the future when it's received. It can be
-  created using a [`CancelableCompleter`][CancelableCompleter].
-
-* The delegating wrapper classes allow users to easily add functionality on top
-  of existing instances of core types from `dart:async`. These include
-  [`DelegatingFuture`][DelegatingFuture],
-  [`DelegatingStream`][DelegatingStream],
-  [`DelegatingStreamSubscription`][DelegatingStreamSubscription],
-  [`DelegatingStreamConsumer`][DelegatingStreamConsumer],
-  [`DelegatingSink`][DelegatingSink],
-  [`DelegatingEventSink`][DelegatingEventSink], and
-  [`DelegatingStreamSink`][DelegatingStreamSink].
-
-  The delegating classes all have `.typed()` constructors which allow users to
-  cast the generic type parameters in a way that's safe for strong mode. For
-  example, if `future` is a `Future<dynamic>` and you know it actually contains an
-  `int`, you can write `DelegatingFuture.typed<int>(future)`.
-
-* The [`FutureGroup`][FutureGroup] class makes it easy to wait until a group of
-  features that may change over time completes.
-
-* The [`LazyStream`][LazyStream] class allows a stream to be initialized lazily
-  when `.listen()` is first called.
-
-* The [`NullStreamSink`][NullStreamSink] class is an implementation of
-  `StreamSink` that discards all events.
-
-* The [`RestartableTimer`][RestartableTimer] class extends `Timer` with a
-  `reset()` method.
-
-* The [`Result`][Result] class that can hold either a value or an error. It
-  provides various utilities for converting to and from `Future`s and `Stream`s.
-
-* The [`StreamGroup`][StreamGroup] class merges a collection of streams into a
-  single output stream.
-
-* The [`StreamQueue`][StreamQueue] class allows a stream to be consumed
-  event-by-event rather than being pushed whichever events as soon as they
-  arrive.
-
-* The [`StreamSplitter`][StreamSplitter] class allows a stream to be duplicated
-  into multiple identical streams.
-
-* The [`StreamZip`][StreamZip] class combines multiple streams into a single
-  stream of lists of events.
-
-* This package contains a number of [`StreamTransformer`][StreamTransformer]s.
-  [`SingleSubscriptionTransformer`][SingleSubscriptionTransformer] converts a
-  broadcast stream to a single-subscription stream, and
-  [`typedStreamTransformer`][typedStreamTransformer] casts the type of a
-  `Stream`. It also defines a transformer type for [`StreamSink`][StreamSink]s,
-  [`StreamSinkTransformer`][StreamSinkTransformer].
-
-* The [`SubscriptionStream`][SubscriptionStream] class wraps a
-  `StreamSubscription` so it can be re-used as a `Stream`.
-
-[AsyncCache]: https://www.dartdocs.org/documentation/async/latest/async/AsyncCache-class.html
-[AsyncMemoizer]: https://www.dartdocs.org/documentation/async/latest/async/AsyncMemoizer-class.html
-[CancelableCompleter]: https://www.dartdocs.org/documentation/async/latest/async/CancelableCompleter-class.html
-[CancelableOperation]: https://www.dartdocs.org/documentation/async/latest/async/CancelableOperation-class.html
-[DelegatingEventSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingEventSink-class.html
-[DelegatingFuture]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingFuture-class.html
-[DelegatingSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingSink-class.html
-[DelegatingStreamConsumer]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamConsumer-class.html
-[DelegatingStreamSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamSink-class.html
-[DelegatingStreamSubscription]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamSubscription-class.html
-[DelegatingStream]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStream-class.html
-[FutureGroup]: https://www.dartdocs.org/documentation/async/latest/async/FutureGroup-class.html
-[LazyStream]: https://www.dartdocs.org/documentation/async/latest/async/LazyStream-class.html
-[NullStreamSink]: https://www.dartdocs.org/documentation/async/latest/async/NullStreamSink-class.html
-[RestartableTimer]: https://www.dartdocs.org/documentation/async/latest/async/RestartableTimer-class.html
-[Result]: https://www.dartdocs.org/documentation/async/latest/async/Result-class.html
-[SingleSubscriptionTransformer]: https://www.dartdocs.org/documentation/async/latest/async/SingleSubscriptionTransformer-class.html
-[StreamGroup]: https://www.dartdocs.org/documentation/async/latest/async/StreamGroup-class.html
-[StreamQueue]: https://www.dartdocs.org/documentation/async/latest/async/StreamQueue-class.html
-[StreamSinkTransformer]: https://www.dartdocs.org/documentation/async/latest/async/StreamSinkTransformer-class.html
-[StreamSink]: https://api.dartlang.org/stable/latest/dart-async/StreamSink-class.html
-[StreamSplitter]: https://www.dartdocs.org/documentation/async/latest/async/StreamSplitter-class.html
-[StreamTransformer]: https://api.dartlang.org/stable/latest/dart-async/StreamTransformer-class.html
-[StreamZip]: https://www.dartdocs.org/documentation/async/latest/async/StreamZip-class.html
-[SubscriptionStream]: https://www.dartdocs.org/documentation/async/latest/async/SubscriptionStream-class.html
-[typedStreamTransformer]: https://www.dartdocs.org/documentation/async/latest/async/typedStreamTransformer.html
diff --git a/packages/async/analysis_options.yaml b/packages/async/analysis_options.yaml
deleted file mode 100644
index a10d4c5..0000000
--- a/packages/async/analysis_options.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/packages/async/codereview.settings b/packages/async/codereview.settings
deleted file mode 100644
index af9ef31..0000000
--- a/packages/async/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/async/commit/
-CC_LIST: reviews@dartlang.org
diff --git a/packages/async/lib/async.dart b/packages/async/lib/async.dart
deleted file mode 100644
index 25fc0fd..0000000
--- a/packages/async/lib/async.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-export "src/async_cache.dart";
-export "src/async_memoizer.dart";
-export "src/byte_collector.dart";
-export "src/cancelable_operation.dart";
-export "src/delegate/event_sink.dart";
-export "src/delegate/future.dart";
-export "src/delegate/sink.dart";
-export "src/delegate/stream.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/lazy_stream.dart";
-export "src/null_stream_sink.dart";
-export "src/restartable_timer.dart";
-export "src/result/result.dart";
-export "src/result/error.dart";
-export "src/result/future.dart";
-export "src/result/value.dart";
-export "src/single_subscription_transformer.dart";
-export "src/stream_completer.dart";
-export "src/stream_group.dart";
-export "src/stream_queue.dart";
-export "src/stream_sink_completer.dart";
-export "src/stream_sink_transformer.dart";
-export "src/stream_splitter.dart";
-export "src/stream_subscription_transformer.dart";
-export "src/stream_zip.dart";
-export "src/subscription_stream.dart";
-export "src/typed_stream_transformer.dart";
diff --git a/packages/async/lib/src/async_cache.dart b/packages/async/lib/src/async_cache.dart
deleted file mode 100644
index af52cd0..0000000
--- a/packages/async/lib/src/async_cache.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// Runs asynchronous functions and caches the result for a period of time.
-///
-/// This class exists to cover the pattern of having potentially expensive code
-/// such as file I/O, network access, or isolate computation that's unlikely to
-/// change quickly run fewer times. For example:
-///
-/// ```dart
-/// final _usersCache = new AsyncCache<List<String>>(const Duration(hours: 1));
-///
-/// /// Uses the cache if it exists, otherwise calls the closure:
-/// Future<List<String>> get onlineUsers => _usersCache.fetch(() {
-///   // Actually fetch online users here.
-/// });
-/// ```
-///
-/// This class's timing can be mocked using [`fake_async`][fake_async].
-///
-/// [fake_async]: https://pub.dartlang.org/packages/fake_async
-class AsyncCache<T> {
-  /// How long cached values stay fresh.
-  final Duration _duration;
-
-  /// Cached results of a previous [fetchStream] call.
-  StreamSplitter<T> _cachedStreamSplitter;
-
-  /// Cached results of a previous [fetch] call.
-  Future<T> _cachedValueFuture;
-
-  /// Fires when the cache should be considered stale.
-  Timer _stale;
-
-  /// Creates a cache that invalidates after an in-flight request is complete.
-  ///
-  /// An ephemeral cache guarantees that a callback function will only be
-  /// executed at most once concurrently. This is useful for requests for which
-  /// data is updated frequently but stale data is acceptable.
-  factory AsyncCache.ephemeral() => new AsyncCache(Duration.ZERO);
-
-  /// Creates a cache that invalidates its contents after [duration] has passed.
-  ///
-  /// The [duration] starts counting after the Future returned by [fetch]
-  /// completes, or after the Stream returned by [fetchStream] emits a done
-  /// event.
-  AsyncCache(this._duration);
-
-  /// Returns a cached value from a previous call to [fetch], or runs [callback]
-  /// to compute a new one.
-  ///
-  /// If [fetch] has been called recently enough, returns its previous return
-  /// value. Otherwise, runs [callback] and returns its new return value.
-  Future<T> fetch(Future<T> callback()) async {
-    if (_cachedStreamSplitter != null) {
-      throw new StateError('Previously used to cache via `fetchStream`');
-    }
-    if (_cachedValueFuture == null) {
-      _cachedValueFuture = callback();
-      await _cachedValueFuture;
-      _startStaleTimer();
-    }
-    return _cachedValueFuture;
-  }
-
-  /// Returns a cached stream from a previous call to [fetchStream], or runs
-  /// [callback] to compute a new stream.
-  ///
-  /// If [fetchStream] has been called recently enough, returns a copy of its
-  /// previous return value. Otherwise, runs [callback] and returns its new
-  /// return value.
-  Stream<T> fetchStream(Stream<T> callback()) {
-    if (_cachedValueFuture != null) {
-      throw new StateError('Previously used to cache via `fetch`');
-    }
-    if (_cachedStreamSplitter == null) {
-      _cachedStreamSplitter = new StreamSplitter(callback()
-          .transform(new StreamTransformer.fromHandlers(handleDone: (sink) {
-        _startStaleTimer();
-        sink.close();
-      })));
-    }
-    return _cachedStreamSplitter.split();
-  }
-
-  /// Removes any cached value.
-  void invalidate() {
-    _cachedValueFuture = null;
-    _cachedStreamSplitter?.close();
-    _cachedStreamSplitter = null;
-    _stale?.cancel();
-    _stale = null;
-  }
-
-  void _startStaleTimer() {
-    _stale = new Timer(_duration, invalidate);
-  }
-}
diff --git a/packages/async/lib/src/async_memoizer.dart b/packages/async/lib/src/async_memoizer.dart
deleted file mode 100644
index d1c0f32..0000000
--- a/packages/async/lib/src/async_memoizer.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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 can be accessed at any time, and will fire once [runOnce] is called.
-  Future<T> get future => _completer.future;
-  final _completer = new Completer<T>();
-
-  /// Whether [runOnce] has been called yet.
-  bool get hasRun => _completer.isCompleted;
-
-  /// Runs the function, [computation], if it hasn't been run before.
-  ///
-  /// If [runOnce] has already been called, this returns the original result.
-  Future<T> runOnce(FutureOr<T> computation()) {
-    if (!hasRun) _completer.complete(new Future.sync(computation));
-    return future;
-  }
-}
diff --git a/packages/async/lib/src/byte_collector.dart b/packages/async/lib/src/byte_collector.dart
deleted file mode 100644
index 3c1d49d..0000000
--- a/packages/async/lib/src/byte_collector.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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:typed_data";
-import "cancelable_operation.dart";
-
-/// Collects an asynchronous sequence of byte lists into a single list of bytes.
-///
-/// If the [source] stream emits an error event,
-/// the collection fails and the returned future completes with the same error.
-///
-/// If any of the input data are not valid bytes, they will be truncated to
-/// an eight-bit unsigned value in the resulting list.
-Future<Uint8List> collectBytes(Stream<List<int>> source) {
-  return _collectBytes(source, (_, result) => result);
-}
-
-/// Collects an asynchronous sequence of byte lists into a single list of bytes.
-///
-/// Returns a [CancelableOperation] that provides the result future and a way
-/// to cancel the collection early.
-///
-/// If the [source] stream emits an error event,
-/// the collection fails and the returned future completes with the same error.
-///
-/// If any of the input data are not valid bytes, they will be truncated to
-/// an eight-bit unsigned value in the resulting list.
-CancelableOperation<Uint8List> collectBytesCancelable(
-    Stream<List<int>> source) {
-  return _collectBytes(
-      source,
-      (subscription, result) => new CancelableOperation.fromFuture(result,
-          onCancel: subscription.cancel));
-}
-
-/// Generalization over [collectBytes] and [collectBytesCancelable].
-///
-/// Performs all the same operations, but the final result is created
-/// by the [result] function, which has access to the stream subscription
-/// so it can cancel the operation.
-T _collectBytes<T>(
-    Stream<List<int>> source,
-    T result(
-        StreamSubscription<List<int>> subscription, Future<Uint8List> result)) {
-  var byteLists = <List<int>>[];
-  var length = 0;
-  var completer = new Completer<Uint8List>.sync();
-  var subscription = source.listen(
-      (bytes) {
-        byteLists.add(bytes);
-        length += bytes.length;
-      },
-      onError: completer.completeError,
-      onDone: () {
-        completer.complete(_collect(length, byteLists));
-      },
-      cancelOnError: true);
-  return result(subscription, completer.future);
-}
-
-// Join a lists of bytes with a known total length into a single [Uint8List].
-Uint8List _collect(int length, List<List<int>> byteLists) {
-  var result = new Uint8List(length);
-  int i = 0;
-  for (var byteList in byteLists) {
-    var end = i + byteList.length;
-    result.setRange(i, end, byteList);
-    i = end;
-  }
-  return result;
-}
diff --git a/packages/async/lib/src/cancelable_operation.dart b/packages/async/lib/src/cancelable_operation.dart
deleted file mode 100644
index 2bf0f3b..0000000
--- a/packages/async/lib/src/cancelable_operation.dart
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 'utils.dart';
-
-/// An asynchronous operation that can be cancelled.
-///
-/// The value of this operation is exposed as [value]. When this operation is
-/// cancelled, [value] won't complete either successfully or with an error. If
-/// [value] has already completed, cancelling the operation does nothing.
-class CancelableOperation<T> {
-  /// The completer that produced this operation.
-  ///
-  /// This is canceled when [cancel] is called.
-  final CancelableCompleter<T> _completer;
-
-  CancelableOperation._(this._completer);
-
-  /// Creates a [CancelableOperation] wrapping [inner].
-  ///
-  /// When this operation is canceled, [onCancel] will be called and any value
-  /// or error produced by [inner] will be discarded. If [onCancel] returns a
-  /// [Future], it will be forwarded to [cancel].
-  ///
-  /// [onCancel] will be called synchronously when the operation is canceled.
-  /// It's guaranteed to only be called once.
-  factory CancelableOperation.fromFuture(Future<T> inner,
-      {FutureOr onCancel()}) {
-    var completer = new CancelableCompleter<T>(onCancel: onCancel);
-    completer.complete(inner);
-    return completer.operation;
-  }
-
-  /// The value returned by the operation.
-  Future<T> get value => _completer._inner.future;
-
-  /// Creates a [Stream] containing the result of this operation.
-  ///
-  /// This is like `value.asStream()`, but 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);
-
-    value.then((value) {
-      controller.add(value);
-      controller.close();
-    }, onError: (error, stackTrace) {
-      controller.addError(error, stackTrace);
-      controller.close();
-    });
-    return controller.stream;
-  }
-
-  /// Creates a [Future] that completes when this operation completes *or* when
-  /// it's cancelled.
-  ///
-  /// If this operation completes, this completes to the same result as [value].
-  /// If this operation is cancelled, the returned future waits for the future
-  /// returned by [cancel], then completes to [cancellationValue].
-  Future valueOrCancellation([T cancellationValue]) {
-    var completer = new Completer<T>.sync();
-    value.then((result) => completer.complete(result),
-        onError: completer.completeError);
-
-    _completer._cancelMemo.future.then((_) {
-      completer.complete(cancellationValue);
-    }, onError: completer.completeError);
-
-    return completer.future;
-  }
-
-  /// Cancels this operation.
-  ///
-  /// This returns the [Future] returned by the [CancelableCompleter]'s
-  /// `onCancel` callback. Unlike [Stream.cancel], it never returns `null`.
-  Future cancel() => _completer._cancel();
-}
-
-/// A completer for a [CancelableOperation].
-class CancelableCompleter<T> {
-  /// The completer for the wrapped future.
-  final Completer<T> _inner;
-
-  /// The callback to call if the future is canceled.
-  final FutureOrCallback _onCancel;
-
-  /// Creates a new completer for a [CancelableOperation].
-  ///
-  /// When the future operation canceled, as long as the completer hasn't yet
-  /// completed, [onCancel] is called. If [onCancel] returns a [Future], it's
-  /// forwarded to [CancelableOperation.cancel].
-  ///
-  /// [onCancel] will be called synchronously when the operation is canceled.
-  /// It's guaranteed to only be called once.
-  CancelableCompleter({FutureOr onCancel()})
-      : _onCancel = onCancel,
-        _inner = new Completer<T>() {
-    _operation = new CancelableOperation<T>._(this);
-  }
-
-  /// The operation controlled by this completer.
-  CancelableOperation<T> get operation => _operation;
-  CancelableOperation<T> _operation;
-
-  /// Whether the completer has completed.
-  bool get isCompleted => _isCompleted;
-  bool _isCompleted = false;
-
-  /// Whether the completer was canceled before being completed.
-  bool get isCanceled => _isCanceled;
-  bool _isCanceled = false;
-
-  /// The memoizer for [_cancel].
-  final _cancelMemo = new AsyncMemoizer();
-
-  /// Completes [operation] to [value].
-  ///
-  /// If [value] is a [Future], this will complete to the result of that
-  /// [Future] once it completes.
-  void complete([value]) {
-    if (_isCompleted) throw new StateError("Operation already completed");
-    _isCompleted = true;
-
-    if (value is! Future) {
-      if (_isCanceled) return;
-      _inner.complete(value);
-      return;
-    }
-
-    if (_isCanceled) {
-      // Make sure errors from [value] aren't top-leveled.
-      value.catchError((_) {});
-      return;
-    }
-
-    value.then((result) {
-      if (_isCanceled) return;
-      _inner.complete(result);
-    }, onError: (error, stackTrace) {
-      if (_isCanceled) return;
-      _inner.completeError(error, stackTrace);
-    });
-  }
-
-  /// Completes [operation] to [error].
-  void completeError(Object error, [StackTrace stackTrace]) {
-    if (_isCompleted) throw new StateError("Operation already completed");
-    _isCompleted = true;
-
-    if (_isCanceled) return;
-    _inner.completeError(error, stackTrace);
-  }
-
-  /// Cancel the completer.
-  Future _cancel() {
-    if (_inner.isCompleted) return new Future.value();
-
-    return _cancelMemo.runOnce(() {
-      _isCanceled = true;
-      if (_onCancel != null) return _onCancel();
-    });
-  }
-}
diff --git a/packages/async/lib/src/delegate/event_sink.dart b/packages/async/lib/src/delegate/event_sink.dart
deleted file mode 100644
index 54c3e52..0000000
--- a/packages/async/lib/src/delegate/event_sink.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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<T> sink) : _sink = sink;
-
-  DelegatingEventSink._(this._sink);
-
-  /// Creates a wrapper that coerces the type of [sink].
-  ///
-  /// Unlike [new DelegatingEventSink], this only requires its argument to be an
-  /// instance of `EventSink`, not `EventSink<T>`. This means that calls to
-  /// [add] may throw a [CastError] if the argument type doesn't match the
-  /// reified type of [sink].
-  static EventSink<T> typed<T>(EventSink sink) =>
-      sink is EventSink<T> ? sink : new DelegatingEventSink._(sink);
-
-  void add(T data) {
-    _sink.add(data);
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    _sink.addError(error, stackTrace);
-  }
-
-  void close() {
-    _sink.close();
-  }
-}
diff --git a/packages/async/lib/src/delegate/future.dart b/packages/async/lib/src/delegate/future.dart
deleted file mode 100644
index 129ad49..0000000
--- a/packages/async/lib/src/delegate/future.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../typed/future.dart';
-
-/// A wrapper that forwards calls to a [Future].
-class DelegatingFuture<T> implements Future<T> {
-  /// The wrapped [Future].
-  final Future<T> _future;
-
-  DelegatingFuture(this._future);
-
-  /// Creates a wrapper which throws if [future]'s value isn't an instance of
-  /// `T`.
-  ///
-  /// This soundly converts a [Future] to a `Future<T>`, regardless of its
-  /// original generic type, by asserting that its value is an instance of `T`
-  /// whenever it's provided. If it's not, the future throws a [CastError].
-  static Future<T> typed<T>(Future future) =>
-      future is Future<T> ? future : new TypeSafeFuture<T>(future);
-
-  Stream<T> asStream() => _future.asStream();
-
-  Future<T> catchError(Function onError, {bool test(Object error)}) =>
-      _future.catchError(onError, test: test);
-
-  Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) =>
-      _future.then(onValue, onError: onError);
-
-  Future<T> whenComplete(action()) => _future.whenComplete(action);
-
-  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
-      _future.timeout(timeLimit, onTimeout: onTimeout);
-}
diff --git a/packages/async/lib/src/delegate/sink.dart b/packages/async/lib/src/delegate/sink.dart
deleted file mode 100644
index 7c68a0f..0000000
--- a/packages/async/lib/src/delegate/sink.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// 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<T> sink) : _sink = sink;
-
-  DelegatingSink._(this._sink);
-
-  /// Creates a wrapper that coerces the type of [sink].
-  ///
-  /// Unlike [new DelegatingSink], this only requires its argument to be an
-  /// instance of `Sink`, not `Sink<T>`. This means that calls to [add] may
-  /// throw a [CastError] if the argument type doesn't match the reified type of
-  /// [sink].
-  static Sink<T> typed<T>(Sink sink) =>
-      sink is Sink<T> ? sink : new DelegatingSink._(sink);
-
-  void add(T data) {
-    _sink.add(data);
-  }
-
-  void close() {
-    _sink.close();
-  }
-}
diff --git a/packages/async/lib/src/delegate/stream.dart b/packages/async/lib/src/delegate/stream.dart
deleted file mode 100644
index 116d11f..0000000
--- a/packages/async/lib/src/delegate/stream.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// Simple delegating wrapper around a [Stream].
-///
-/// Subclasses can override individual methods, or use this to expose only the
-/// [Stream] methods of a subclass.
-///
-/// Note that this is identical to [StreamView] in `dart:async`. It's provided
-/// under this name for consistency with other `Delegating*` classes.
-class DelegatingStream<T> extends StreamView<T> {
-  DelegatingStream(Stream<T> stream) : super(stream);
-
-  /// Creates a wrapper which throws if [stream]'s events aren't instances of
-  /// `T`.
-  ///
-  /// This soundly converts a [Stream] to a `Stream<T>`, regardless of its
-  /// original generic type, by asserting that its events are instances of `T`
-  /// whenever they're provided. If they're not, the stream throws a
-  /// [CastError].
-  static Stream<T> typed<T>(Stream stream) => stream.cast();
-}
diff --git a/packages/async/lib/src/delegate/stream_consumer.dart b/packages/async/lib/src/delegate/stream_consumer.dart
deleted file mode 100644
index ba83040..0000000
--- a/packages/async/lib/src/delegate/stream_consumer.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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<T> consumer) : _consumer = consumer;
-
-  DelegatingStreamConsumer._(this._consumer);
-
-  /// Creates a wrapper that coerces the type of [consumer].
-  ///
-  /// Unlike [new StreamConsumer], this only requires its argument to be an
-  /// instance of `StreamConsumer`, not `StreamConsumer<T>`. This means that
-  /// calls to [addStream] may throw a [CastError] if the argument type doesn't
-  /// match the reified type of [consumer].
-  static StreamConsumer<T> typed<T>(StreamConsumer consumer) =>
-      consumer is StreamConsumer<T>
-          ? consumer
-          : new DelegatingStreamConsumer._(consumer);
-
-  Future addStream(Stream<T> stream) => _consumer.addStream(stream);
-
-  Future close() => _consumer.close();
-}
diff --git a/packages/async/lib/src/delegate/stream_sink.dart b/packages/async/lib/src/delegate/stream_sink.dart
deleted file mode 100644
index 198df8a..0000000
--- a/packages/async/lib/src/delegate/stream_sink.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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<T> sink) : _sink = sink;
-
-  DelegatingStreamSink._(this._sink);
-
-  /// Creates a wrapper that coerces the type of [sink].
-  ///
-  /// Unlike [new StreamSink], this only requires its argument to be an instance
-  /// of `StreamSink`, not `StreamSink<T>`. This means that calls to [add] may
-  /// throw a [CastError] if the argument type doesn't match the reified type of
-  /// [sink].
-  static StreamSink<T> typed<T>(StreamSink sink) =>
-      sink is StreamSink<T> ? sink : new DelegatingStreamSink._(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/packages/async/lib/src/delegate/stream_subscription.dart b/packages/async/lib/src/delegate/stream_subscription.dart
deleted file mode 100644
index 6bef924..0000000
--- a/packages/async/lib/src/delegate/stream_subscription.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../typed/stream_subscription.dart';
-
-/// Simple delegating wrapper around a [StreamSubscription].
-///
-/// Subclasses can override individual methods.
-class DelegatingStreamSubscription<T> implements StreamSubscription<T> {
-  final StreamSubscription<T> _source;
-
-  /// Create delegating subscription forwarding calls to [sourceSubscription].
-  DelegatingStreamSubscription(StreamSubscription<T> sourceSubscription)
-      : _source = sourceSubscription;
-
-  /// Creates a wrapper which throws if [subscription]'s events aren't instances
-  /// of `T`.
-  ///
-  /// This soundly converts a [StreamSubscription] to a `StreamSubscription<T>`,
-  /// regardless of its original generic type, by asserting that its events are
-  /// instances of `T` whenever they're provided. If they're not, the
-  /// subscription throws a [CastError].
-  static StreamSubscription<T> typed<T>(StreamSubscription subscription) =>
-      subscription is StreamSubscription<T>
-          ? subscription
-          : new TypeSafeStreamSubscription<T>(subscription);
-
-  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<E> asFuture<E>([E futureValue]) => _source.asFuture(futureValue);
-
-  bool get isPaused => _source.isPaused;
-}
diff --git a/packages/async/lib/src/future_group.dart b/packages/async/lib/src/future_group.dart
deleted file mode 100644
index 0bf3158..0000000
--- a/packages/async/lib/src/future_group.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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 has no pending 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 null;
-
-      _pending--;
-      _values[index] = value;
-
-      if (_pending != 0) return null;
-      if (_onIdleController != null) _onIdleController.add(null);
-
-      if (!_closed) return null;
-      if (_onIdleController != null) _onIdleController.close();
-      _completer.complete(_values);
-    }).catchError((error, stackTrace) {
-      if (_completer.isCompleted) return null;
-      _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/packages/async/lib/src/lazy_stream.dart b/packages/async/lib/src/lazy_stream.dart
deleted file mode 100644
index f07c387..0000000
--- a/packages/async/lib/src/lazy_stream.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 "delegate/stream.dart";
-import "stream_completer.dart";
-import "utils.dart";
-
-/// A [Stream] wrapper that forwards to another [Stream] that's initialized
-/// lazily.
-///
-/// This class allows a concrete `Stream` to be created only once it has a
-/// listener. It's useful to wrapping APIs that do expensive computation to
-/// produce a `Stream`.
-class LazyStream<T> extends Stream<T> {
-  /// The callback that's called to create the inner stream.
-  FutureOrCallback<Stream<T>> _callback;
-
-  /// Creates a single-subscription `Stream` that calls [callback] when it gets
-  /// a listener and forwards to the returned stream.
-  LazyStream(FutureOr<Stream<T>> callback()) : _callback = callback {
-    // Explicitly check for null because we null out [_callback] internally.
-    if (_callback == null) throw new ArgumentError.notNull('callback');
-  }
-
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    if (_callback == null) {
-      throw new StateError("Stream has already been listened to.");
-    }
-
-    // Null out the callback before we invoke it to ensure that even while
-    // running it, this can't be called twice.
-    var callback = _callback;
-    _callback = null;
-    var result = callback();
-
-    Stream<T> stream;
-    if (result is Future<Stream<T>>) {
-      stream = StreamCompleter.fromFuture(result.then((stream) {
-        return DelegatingStream.typed<T>(stream);
-      }));
-    } else {
-      stream = DelegatingStream.typed<T>(result as Stream);
-    }
-
-    return stream.listen(onData,
-        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
-  }
-}
diff --git a/packages/async/lib/src/null_stream_sink.dart b/packages/async/lib/src/null_stream_sink.dart
deleted file mode 100644
index c83790c..0000000
--- a/packages/async/lib/src/null_stream_sink.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// A [StreamSink] that discards all events.
-///
-/// The sink silently drops events until [close] is called, at which point it
-/// throws [StateError]s when events are added. This is the same behavior as a
-/// sink whose remote end has closed, such as when a [WebSocket] connection has
-/// been closed.
-///
-/// This can be used when a sink is needed but no events are actually intended
-/// to be added. The [new NullStreamSink.error] constructor can be used to
-/// represent errors when creating a sink, since [StreamSink.done] exposes sink
-/// errors. For example:
-///
-/// ```dart
-/// StreamSink<List<int>> openForWrite(String filename) {
-///   try {
-///     return new RandomAccessSink(new File(filename).openSync());
-///   } on IOException catch (error, stackTrace) {
-///     return new NullStreamSink.error(error, stackTrace);
-///   }
-/// }
-/// ```
-class NullStreamSink<T> implements StreamSink<T> {
-  final Future done;
-
-  /// Whether the sink has been closed.
-  var _closed = false;
-
-  /// Whether an [addStream] call is pending.
-  ///
-  /// We don't actually add any events from streams, but it does return the
-  /// [StreamSubscription.cancel] future so to be [StreamSink]-complaint we
-  /// reject events until that completes.
-  var _addingStream = false;
-
-  /// Creates a null sink.
-  ///
-  /// If [done] is passed, it's used as the [Sink.done] future. Otherwise, a
-  /// completed future is used.
-  NullStreamSink({Future done}) : done = done ?? new Future.value();
-
-  /// Creates a null sink whose [done] future emits [error].
-  ///
-  /// Note that this error will not be considered uncaught.
-  NullStreamSink.error(error, [StackTrace stackTrace])
-      : done = new Future.error(error, stackTrace)
-          // Don't top-level the error. This gives the user a change to call
-          // [close] or [done], and matches the behavior of a remote endpoint
-          // experiencing an error.
-          ..catchError((_) {});
-
-  void add(T data) {
-    _checkEventAllowed();
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    _checkEventAllowed();
-  }
-
-  Future addStream(Stream<T> stream) {
-    _checkEventAllowed();
-
-    _addingStream = true;
-    var future = stream.listen(null).cancel() ?? new Future.value();
-    return future.whenComplete(() {
-      _addingStream = false;
-    });
-  }
-
-  /// Throws a [StateError] if [close] has been called or an [addStream] call is
-  /// pending.
-  void _checkEventAllowed() {
-    if (_closed) throw new StateError("Cannot add to a closed sink.");
-    if (_addingStream) {
-      throw new StateError("Cannot add to a sink while adding a stream.");
-    }
-  }
-
-  Future close() {
-    _closed = true;
-    return done;
-  }
-}
diff --git a/packages/async/lib/src/restartable_timer.dart b/packages/async/lib/src/restartable_timer.dart
deleted file mode 100644
index 7b05821..0000000
--- a/packages/async/lib/src/restartable_timer.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// A non-periodic timer that can be restarted any number of times.
-///
-/// Once restarted (via [reset]), the timer counts down from its original
-/// duration again.
-class RestartableTimer implements Timer {
-  /// The duration of the timer.
-  final Duration _duration;
-
-  /// The callback to call when the timer fires.
-  final ZoneCallback _callback;
-
-  /// The timer for the current or most recent countdown.
-  ///
-  /// This timer is canceled and overwritten every time this [RestartableTimer]
-  /// is reset.
-  Timer _timer;
-
-  /// Creates a new timer.
-  ///
-  /// The [callback] function is invoked after the given [duration]. Unlike a
-  /// normal non-periodic [Timer], [callback] may be called more than once.
-  RestartableTimer(this._duration, this._callback) {
-    _timer = new Timer(_duration, _callback);
-  }
-
-  bool get isActive => _timer.isActive;
-
-  /// Restarts the timer so that it counts down from its original duration
-  /// again.
-  ///
-  /// This restarts the timer even if it has already fired or has been canceled.
-  void reset() {
-    _timer.cancel();
-    _timer = new Timer(_duration, _callback);
-  }
-
-  void cancel() {
-    _timer.cancel();
-  }
-
-  @override
-  // TODO: Dart 2.0 requires this method to be implemented.
-  // See https://github.com/dart-lang/sdk/issues/31664
-  // ignore: override_on_non_overriding_getter
-  int get tick {
-    throw new UnimplementedError("tick");
-  }
-}
diff --git a/packages/async/lib/src/result/capture_sink.dart b/packages/async/lib/src/result/capture_sink.dart
deleted file mode 100644
index c85b553..0000000
--- a/packages/async/lib/src/result/capture_sink.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-
-/// Used by [Result.captureSink].
-class CaptureSink<T> implements EventSink<T> {
-  final EventSink<Result<T>> _sink;
-
-  CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
-
-  void add(T value) {
-    _sink.add(new Result.value(value));
-  }
-
-  void addError(Object error, [StackTrace stackTrace]) {
-    _sink.add(new Result.error(error, stackTrace));
-  }
-
-  void close() {
-    _sink.close();
-  }
-}
diff --git a/packages/async/lib/src/result/capture_transformer.dart b/packages/async/lib/src/result/capture_transformer.dart
deleted file mode 100644
index 5933f0c..0000000
--- a/packages/async/lib/src/result/capture_transformer.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-import 'capture_sink.dart';
-
-/// 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. Exposed by [Result.captureStream].
-class CaptureStreamTransformer<T> extends StreamTransformerBase<T, Result<T>> {
-  const CaptureStreamTransformer();
-
-  Stream<Result<T>> bind(Stream<T> source) {
-    return new Stream<Result<T>>.eventTransformed(source, _createSink);
-  }
-
-  // Since Stream.eventTransformed is not generic, this method can be static.
-  static EventSink _createSink(EventSink<Result> sink) => new CaptureSink(sink);
-}
diff --git a/packages/async/lib/src/result/error.dart b/packages/async/lib/src/result/error.dart
deleted file mode 100644
index 45e06a2..0000000
--- a/packages/async/lib/src/result/error.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-import 'value.dart';
-
-/// A result representing a thrown error.
-class ErrorResult implements Result<Null> {
-  /// The error object that was thrown.
-  final error;
-
-  /// The stack trace corresponding to where [error] was thrown.
-  final StackTrace stackTrace;
-
-  bool get isValue => false;
-  bool get isError => true;
-  ValueResult<Null> get asValue => null;
-  ErrorResult get asError => this;
-
-  ErrorResult(this.error, this.stackTrace);
-
-  void complete(Completer completer) {
-    completer.completeError(error, stackTrace);
-  }
-
-  void addTo(EventSink sink) {
-    sink.addError(error, stackTrace);
-  }
-
-  Future<Null> get asFuture => new Future<Null>.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);
-    }
-  }
-
-  int get hashCode => error.hashCode ^ stackTrace.hashCode ^ 0x1d61823f;
-
-  /// This is equal only to an error result with equal [error] and [stackTrace].
-  bool operator ==(Object other) =>
-      other is ErrorResult &&
-      error == other.error &&
-      stackTrace == other.stackTrace;
-}
diff --git a/packages/async/lib/src/result/future.dart b/packages/async/lib/src/result/future.dart
deleted file mode 100644
index ff30546..0000000
--- a/packages/async/lib/src/result/future.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../delegate/future.dart';
-import 'result.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;
-
-  ResultFuture(Future<T> future) : super(future) {
-    Result.capture(future).then((result) {
-      _result = result;
-    });
-  }
-}
diff --git a/packages/async/lib/src/result/release_sink.dart b/packages/async/lib/src/result/release_sink.dart
deleted file mode 100644
index a0715a1..0000000
--- a/packages/async/lib/src/result/release_sink.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-
-/// Used by [Result.releaseSink].
-class ReleaseSink<T> implements EventSink<Result<T>> {
-  final EventSink _sink;
-
-  ReleaseSink(EventSink<T> sink) : _sink = sink;
-
-  void add(Result<T> result) {
-    result.addTo(_sink);
-  }
-
-  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/packages/async/lib/src/result/release_transformer.dart b/packages/async/lib/src/result/release_transformer.dart
deleted file mode 100644
index 01865cc..0000000
--- a/packages/async/lib/src/result/release_transformer.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-import 'release_sink.dart';
-
-/// A transformer that releases result events as data and error events.
-class ReleaseStreamTransformer<T> extends StreamTransformerBase<Result<T>, T> {
-  const ReleaseStreamTransformer();
-
-  Stream<T> bind(Stream<Result<T>> source) {
-    return new Stream<T>.eventTransformed(source, _createSink);
-  }
-
-  // Since Stream.eventTransformed is not generic, this method can be static.
-  static EventSink<Result> _createSink(EventSink sink) => new ReleaseSink(sink);
-}
diff --git a/packages/async/lib/src/result/result.dart b/packages/async/lib/src/result/result.dart
deleted file mode 100644
index 98b5aa4..0000000
--- a/packages/async/lib/src/result/result.dart
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'capture_sink.dart';
-import 'capture_transformer.dart';
-import 'error.dart';
-import 'release_sink.dart';
-import 'release_transformer.dart';
-import 'value.dart';
-import '../stream_sink_transformer.dart';
-
-/// The result of a computation.
-///
-/// 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].
-///
-/// A [Future] represents a potential result, one that might not have been
-/// computed yet, and a [Result] is always a completed and available result.
-abstract class Result<T> {
-  /// 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. This is the transformer used by [captureStream].
-  static const StreamTransformer<Object, Result<Object>>
-      captureStreamTransformer = const CaptureStreamTransformer<Object>();
-
-  /// A stream transformer that releases a stream of result events.
-  ///
-  /// The result of the transformation is a stream of values and error events.
-  /// This is the transformer used by [releaseStream].
-  static const StreamTransformer<Result<Object>, Object>
-      releaseStreamTransformer = const ReleaseStreamTransformer<Object>();
-
-  /// A sink transformer that captures events into [Result]s.
-  ///
-  /// The result of the transformation is a sink that only forwards [Result]
-  /// values and no error events.
-  static const StreamSinkTransformer<Object, Result<Object>>
-      captureSinkTransformer =
-      const StreamSinkTransformer<Object, Result<Object>>.fromStreamTransformer(
-          const CaptureStreamTransformer<Object>());
-
-  /// A sink transformer that releases result events.
-  ///
-  /// The result of the transformation is a sink that forwards of values and
-  /// error events.
-  static const StreamSinkTransformer<Result<Object>, Object>
-      releaseSinkTransformer =
-      const StreamSinkTransformer<Result<Object>, Object>.fromStreamTransformer(
-          const ReleaseStreamTransformer<Object>());
-
-  /// Creates 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<T>(computation());
-    } catch (e, s) {
-      return new ErrorResult(e, s);
-    }
-  }
-
-  /// Creates a `Result` holding a value.
-  ///
-  /// Alias for [ValueResult.ValueResult].
-  factory Result.value(T value) = ValueResult<T>;
-
-  /// Creates a `Result` holding an error.
-  ///
-  /// Alias for [ErrorResult.ErrorResult].
-  factory Result.error(Object error, [StackTrace stackTrace]) =>
-      new ErrorResult(error, stackTrace);
-
-  /// Captures 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<T>> capture<T>(Future<T> future) {
-    return future.then((value) => new ValueResult(value),
-        onError: (error, stackTrace) => new ErrorResult(error, stackTrace));
-  }
-
-  /// Captures each future in [elements],
-  ///
-  /// Returns a (future of) a list of results for each element in [elements],
-  /// in iteration order.
-  /// Each future in [elements] is [capture]d and each non-future is
-  /// wrapped as a [Result.value].
-  /// The returned future will never have an error.
-  static Future<List<Result<T>>> captureAll<T>(Iterable<FutureOr<T>> elements) {
-    var results = <Result<T>>[];
-    int pending = 0;
-    var completer;
-    for (var element in elements) {
-      if (element is Future<T>) {
-        int i = results.length;
-        results.add(null);
-        pending++;
-        Result.capture<T>(element).then((result) {
-          results[i] = result;
-          if (--pending == 0) {
-            completer.complete(results);
-          }
-        });
-      } else {
-        results.add(new Result<T>.value(element));
-      }
-    }
-    if (pending == 0) {
-      return new Future<List<Result<T>>>.value(results);
-    }
-    completer = new Completer<List<Result<T>>>();
-    return completer.future;
-  }
-
-  /// Releases 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<T> release<T>(Future<Result<T>> future) =>
-      future.then<T>((result) => result.asFuture);
-
-  /// Captures 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.
-  static Stream<Result<T>> captureStream<T>(Stream<T> source) =>
-      source.transform(new CaptureStreamTransformer<T>());
-
-  /// Releases 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.
-  static Stream<T> releaseStream<T>(Stream<Result<T>> source) =>
-      source.transform(new ReleaseStreamTransformer<T>());
-
-  /// Releases results added to the returned sink as data and errors on [sink].
-  ///
-  /// A [Result] added to the returned sink is added as a data or error event
-  /// on [sink]. Errors added to the returned sink are forwarded directly to
-  /// [sink] and so is the [EventSink.close] calls.
-  static EventSink<Result<T>> releaseSink<T>(EventSink<T> sink) =>
-      new ReleaseSink<T>(sink);
-
-  /// Captures the events of the returned sink into results on [sink].
-  ///
-  /// Data and error events added to the returned sink are captured into
-  /// [Result] values and added as data events on the provided [sink].
-  /// No error events are ever added to [sink].
-  ///
-  /// When the returned sink is closed, so is [sink].
-  static EventSink<T> captureSink<T>(EventSink<Result<T>> sink) =>
-      new CaptureSink<T>(sink);
-
-  /// 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<T> flatten<T>(Result<Result<T>> result) {
-    if (result.isValue) return result.asValue.value;
-    return result.asError;
-  }
-
-  /// Converts a sequence of results to a result of a list.
-  ///
-  /// Returns either a list of values if [results] doesn't contain any errors,
-  /// or the first error result in [results].
-  static Result<List<T>> flattenAll<T>(Iterable<Result<T>> results) {
-    var values = <T>[];
-    for (var result in results) {
-      if (result.isValue) {
-        values.add(result.asValue.value);
-      } else {
-        return result.asError;
-      }
-    }
-    return new Result<List<T>>.value(values);
-  }
-
-  /// 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, returns itself.
-  ///
-  /// Otherwise returns `null`.
-  ValueResult<T> get asValue;
-
-  /// If this is an error result, returns itself.
-  ///
-  /// Otherwise returns `null`.
-  ErrorResult get asError;
-
-  /// Completes a completer with this result.
-  void complete(Completer<T> completer);
-
-  /// Adds this result to an [EventSink].
-  ///
-  /// Calls the sink's `add` or `addError` method as appropriate.
-  void addTo(EventSink<T> sink);
-
-  /// A future that has been completed with this result as a value or an error.
-  Future<T> get asFuture;
-}
diff --git a/packages/async/lib/src/result/value.dart b/packages/async/lib/src/result/value.dart
deleted file mode 100644
index edc41fb..0000000
--- a/packages/async/lib/src/result/value.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'result.dart';
-import 'error.dart';
-
-/// A result representing a returned value.
-class ValueResult<T> implements Result<T> {
-  /// The result of a successful computation.
-  final T value;
-
-  bool get isValue => true;
-  bool get isError => false;
-  ValueResult<T> get asValue => this;
-  ErrorResult get asError => null;
-
-  ValueResult(this.value);
-
-  void complete(Completer<T> completer) {
-    completer.complete(value);
-  }
-
-  void addTo(EventSink<T> sink) {
-    sink.add(value);
-  }
-
-  Future<T> get asFuture => new Future.value(value);
-
-  int get hashCode => value.hashCode ^ 0x323f1d61;
-
-  bool operator ==(Object other) =>
-      other is ValueResult && value == other.value;
-}
diff --git a/packages/async/lib/src/single_subscription_transformer.dart b/packages/async/lib/src/single_subscription_transformer.dart
deleted file mode 100644
index f590860..0000000
--- a/packages/async/lib/src/single_subscription_transformer.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// A transformer that converts a broadcast stream into a single-subscription
-/// stream.
-///
-/// This buffers the broadcast stream's events, which means that it starts
-/// listening to a stream as soon as it's bound.
-///
-/// This also casts the source stream's events to type `T`. If the cast fails,
-/// the result stream will emit a [CastError]. This behavior is deprecated, and
-/// should not be relied upon.
-class SingleSubscriptionTransformer<S, T> extends StreamTransformerBase<S, T> {
-  const SingleSubscriptionTransformer();
-
-  Stream<T> bind(Stream<S> stream) {
-    var subscription;
-    var controller = new StreamController<T>(
-        sync: true, onCancel: () => subscription.cancel());
-    subscription = stream.listen((value) {
-      // TODO(nweiz): When we release a new major version, get rid of the second
-      // type parameter and avoid this conversion.
-      try {
-        controller.add(value as T);
-      } on CastError catch (error, stackTrace) {
-        controller.addError(error, stackTrace);
-      }
-    }, onError: controller.addError, onDone: controller.close);
-    return controller.stream;
-  }
-}
diff --git a/packages/async/lib/src/stream_completer.dart b/packages/async/lib/src/stream_completer.dart
deleted file mode 100644
index 4311de5..0000000
--- a/packages/async/lib/src/stream_completer.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-/// 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 _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<T> fromFuture<T>(Future<Stream<T>> streamFuture) {
-    var completer = new StreamCompleter<T>();
-    streamFuture.then(completer.setSourceStream, onError: completer.setError);
-    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.
-  ///
-  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
-  /// most once. Trying to call any 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].
-  ///
-  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
-  /// most once. Trying to call any of them again will fail.
-  void setEmpty() {
-    if (_stream._isSourceStreamSet) {
-      throw new StateError("Source stream already set");
-    }
-    _stream._setEmpty();
-  }
-
-  /// Completes this to a stream that emits [error] and then closes.
-  ///
-  /// This is useful when the process of creating the data for the stream fails.
-  ///
-  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
-  /// most once. Trying to call any of them again will fail.
-  void setError(error, [StackTrace stackTrace]) {
-    setSourceStream(new Stream.fromFuture(new Future.error(error, stackTrace)));
-  }
-}
-
-/// 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<T> _controller;
-
-  /// Source stream for the events provided by this stream.
-  ///
-  /// Set when the completer sets the source stream using [_setSourceStream]
-  /// or [_setEmpty].
-  Stream<T> _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/packages/async/lib/src/stream_group.dart b/packages/async/lib/src/stream_group.dart
deleted file mode 100644
index 6361a5c..0000000
--- a/packages/async/lib/src/stream_group.dart
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// 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<T> merge<T>(Iterable<Stream<T>> streams) {
-    var group = new StreamGroup<T>();
-    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<T> _listenToStream(Stream<T> 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/packages/async/lib/src/stream_queue.dart b/packages/async/lib/src/stream_queue.dart
deleted file mode 100644
index 0c81aec..0000000
--- a/packages/async/lib/src/stream_queue.dart
+++ /dev/null
@@ -1,982 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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:collection/collection.dart';
-
-import "cancelable_operation.dart";
-import "result/result.dart";
-import "subscription_stream.dart";
-import "stream_completer.dart";
-import "stream_splitter.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.
-abstract 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, every time a
-  // new event arrives, and when the event source closes.
-  //
-  // 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. It may trigger a call itself by
-  // calling [_updateRequests].
-  // 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.
-
-  /// Whether the event source 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;
-
-  /// The number of events dispatched by this queue.
-  ///
-  /// This counts error events. It doesn't count done events, or events
-  /// dispatched to a stream returned by [rest].
-  int get eventsDispatched => _eventsReceived - _eventQueue.length;
-
-  /// The number of events received by this queue.
-  var _eventsReceived = 0;
-
-  /// Queue of events not used by a request yet.
-  final QueueList<Result<T>> _eventQueue = new QueueList();
-
-  /// 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].
-  factory StreamQueue(Stream<T> source) = _StreamQueue<T>;
-
-  StreamQueue._();
-
-  /// 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.
-  /// Another alternative is to use `take(1)` which returns either zero or
-  /// one events.
-  Future<bool> get hasNext {
-    if (!_isClosed) {
-      var hasNextRequest = new _HasNextRequest<T>();
-      _addRequest(hasNextRequest);
-      return hasNextRequest.future;
-    }
-    throw _failClosed();
-  }
-
-  /// Look at the next [count] data events without consuming them.
-  ///
-  /// Works like [take] except that the events are left in the queue.
-  /// If one of the next [count] events is an error, the returned future
-  /// completes with this error, and the error is still left in the queue.
-  Future<List<T>> lookAhead(int count) {
-    if (count < 0) throw new RangeError.range(count, 0, null, "count");
-    if (!_isClosed) {
-      var request = new _LookAheadRequest<T>(count);
-      _addRequest(request);
-      return request.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();
-  }
-
-  /// Looks at the next (yet unrequested) event from the stream.
-  ///
-  /// Like [next] except that the event is not consumed.
-  /// If the next event is an error event, it stays in the queue.
-  Future<T> get peek {
-    if (!_isClosed) {
-      var nextRequest = new _PeekRequest<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<T>(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();
-  }
-
-  /// Requests a transaction that can conditionally consume events.
-  ///
-  /// The transaction can create copies of this queue at the current position
-  /// using [StreamQueueTransaction.newQueue]. Each of these queues is
-  /// independent of one another and of the parent queue. The transaction
-  /// finishes when one of two methods is called:
-  ///
-  /// * [StreamQueueTransaction.commit] updates the parent queue's position to
-  ///   match that of one of the copies.
-  ///
-  /// * [StreamQueueTransaction.reject] causes the parent queue to continue as
-  ///   though [startTransaction] hadn't been called.
-  ///
-  /// Until the transaction finishes, this queue won't emit any events.
-  ///
-  /// See also [withTransaction] and [cancelable].
-  ///
-  /// ```dart
-  /// /// Consumes all empty lines from the beginning of [lines].
-  /// Future consumeEmptyLines(StreamQueue<String> lines) async {
-  ///   while (await lines.hasNext) {
-  ///     var transaction = lines.startTransaction();
-  ///     var queue = transaction.newQueue();
-  ///     if ((await queue.next).isNotEmpty) {
-  ///       transaction.reject();
-  ///       return;
-  ///     } else {
-  ///       transaction.commit(queue);
-  ///     }
-  ///   }
-  /// }
-  /// ```
-  StreamQueueTransaction<T> startTransaction() {
-    if (_isClosed) throw _failClosed();
-
-    var request = new _TransactionRequest(this);
-    _addRequest(request);
-    return request.transaction;
-  }
-
-  /// Passes a copy of this queue to [callback], and updates this queue to match
-  /// the copy's position if [callback] returns `true`.
-  ///
-  /// This queue won't emit any events until [callback] returns. If it returns
-  /// `false`, this queue continues as though [withTransaction] hadn't been
-  /// called. If it throws an error, this updates this queue to match the copy's
-  /// position and throws the error from the returned `Future`.
-  ///
-  /// Returns the same value as [callback].
-  ///
-  /// See also [startTransaction] and [cancelable].
-  ///
-  /// ```dart
-  /// /// Consumes all empty lines from the beginning of [lines].
-  /// Future consumeEmptyLines(StreamQueue<String> lines) async {
-  ///   while (await lines.hasNext) {
-  ///     // Consume a line if it's empty, otherwise return.
-  ///     if (!await lines.withTransaction(
-  ///         (queue) async => (await queue.next).isEmpty)) {
-  ///       return;
-  ///     }
-  ///   }
-  /// }
-  /// ```
-  Future<bool> withTransaction(Future<bool> callback(StreamQueue<T> queue)) {
-    var transaction = startTransaction();
-
-    /// Avoid async/await to ensure that [startTransaction] is called
-    /// synchronously and so ends up in the right place in the request queue.
-    var queue = transaction.newQueue();
-    return callback(queue).then((result) {
-      if (result) {
-        transaction.commit(queue);
-      } else {
-        transaction.reject();
-      }
-      return result;
-    }, onError: (error) {
-      transaction.commit(queue);
-      throw error;
-    });
-  }
-
-  /// Passes a copy of this queue to [callback], and updates this queue to match
-  /// the copy's position once [callback] completes.
-  ///
-  /// If the returned [CancelableOperation] is canceled, this queue instead
-  /// continues as though [cancelable] hadn't been called. Otherwise, it emits
-  /// the same value or error as [callback].
-  ///
-  /// See also [startTransaction] and [withTransaction].
-  ///
-  /// ```dart
-  /// final _stdinQueue = new StreamQueue(stdin);
-  ///
-  /// /// Returns an operation that completes when the user sends a line to
-  /// /// standard input.
-  /// ///
-  /// /// If the operation is canceled, stops waiting for user input.
-  /// CancelableOperation<String> nextStdinLine() =>
-  ///     _stdinQueue.cancelable((queue) => queue.next);
-  /// ```
-  CancelableOperation<S> cancelable<S>(
-      Future<S> callback(StreamQueue<T> queue)) {
-    var transaction = startTransaction();
-    var completer = new CancelableCompleter<S>(onCancel: () {
-      transaction.reject();
-    });
-
-    var queue = transaction.newQueue();
-    completer.complete(callback(queue).whenComplete(() {
-      if (!completer.isCanceled) transaction.commit(queue);
-    }));
-
-    return completer.operation;
-  }
-
-  /// Cancels the underlying event source.
-  ///
-  /// 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 source is instead canceled
-  /// immediately. Any pending events are completed as though the underlying
-  /// stream had closed.
-  ///
-  /// The returned future completes with the result of calling
-  /// `cancel`.
-  ///
-  /// After calling `cancel`, no further events can be requested.
-  /// None of [lookAhead], [next], [peek], [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<T>(this);
-      _addRequest(request);
-      return request.future;
-    }
-
-    if (_isDone && _eventQueue.isEmpty) return new Future.value();
-    return _cancel();
-  }
-
-  // ------------------------------------------------------------------
-  // Methods that may be called from the request implementations to
-  // control the event stream.
-
-  /// Matches events with requests.
-  ///
-  /// Called after receiving an event or when the event source closes.
-  ///
-  /// May be called by requests which have returned `false` (saying they
-  /// are not yet done) so they can be checked again before any new
-  /// events arrive.
-  /// Any request returing `false` from `update` when `isDone` is `true`
-  /// *must* call `_updateRequests` when they are ready to continue
-  /// (since no further events will trigger the call).
-  void _updateRequests() {
-    while (_requestQueue.isNotEmpty) {
-      if (_requestQueue.first.update(_eventQueue, _isDone)) {
-        _requestQueue.removeFirst();
-      } else {
-        return;
-      }
-    }
-
-    if (!_isDone) {
-      _pause();
-    }
-  }
-
-  /// Extracts a stream from the event source and makes this stream queue
-  /// unusable.
-  ///
-  /// Can only be used by the very last request (the stream queue must
-  /// be closed by that request).
-  /// Only used by [rest].
-  Stream<T> _extractStream();
-
-  /// Requests that the event source pauses events.
-  ///
-  /// This is called automatically when the request queue is empty.
-  ///
-  /// The event source is restarted by the next call to [_ensureListening].
-  void _pause();
-
-  /// Ensures that we are listening on events from the event source.
-  ///
-  /// Starts listening for the first time or resumes after a [_pause].
-  ///
-  /// Is called automatically if a request requires more events.
-  void _ensureListening();
-
-  /// Cancels the underlying event source.
-  Future _cancel();
-
-  // ------------------------------------------------------------------
-  // Methods called by the event source to add events or say that it's
-  // done.
-
-  /// Called when the event source adds a new data or error event.
-  /// Always calls [_updateRequests] after adding.
-  void _addResult(Result<T> result) {
-    _eventsReceived++;
-    _eventQueue.add(result);
-    _updateRequests();
-  }
-
-  /// Called when the event source is done.
-  /// Always calls [_updateRequests] after adding.
-  void _close() {
-    _isDone = true;
-    _updateRequests();
-  }
-
-  // ------------------------------------------------------------------
-  // Internal helper methods.
-
-  /// 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");
-  }
-
-  /// Adds a new request to the queue.
-  ///
-  /// If the request queue is empty and the request can be completed
-  /// immediately, it skips the queue.
-  void _addRequest(_EventRequest<T> request) {
-    if (_requestQueue.isEmpty) {
-      if (request.update(_eventQueue, _isDone)) return;
-      _ensureListening();
-    }
-    _requestQueue.add(request);
-  }
-}
-
-/// The default implementation of [StreamQueue].
-///
-/// This queue gets its events from a stream which is listened
-/// to when a request needs events.
-class _StreamQueue<T> extends StreamQueue<T> {
-  /// Source of events.
-  final Stream<T> _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<T> _subscription;
-
-  _StreamQueue(this._sourceStream) : super._();
-
-  Future _cancel() {
-    if (_isDone) return null;
-    if (_subscription == null) _subscription = _sourceStream.listen(null);
-    var future = _subscription.cancel();
-    _close();
-    return future;
-  }
-
-  void _ensureListening() {
-    if (_isDone) return;
-    if (_subscription == null) {
-      _subscription = _sourceStream.listen((data) {
-        _addResult(new Result.value(data));
-      }, onError: (error, StackTrace stackTrace) {
-        _addResult(new Result.error(error, stackTrace));
-      }, onDone: () {
-        _subscription = null;
-        this._close();
-      });
-    } else {
-      _subscription.resume();
-    }
-  }
-
-  void _pause() {
-    _subscription.pause();
-  }
-
-  Stream<T> _extractStream() {
-    assert(_isClosed);
-    if (_isDone) {
-      return new Stream<T>.empty();
-    }
-    _isDone = true;
-
-    if (_subscription == null) {
-      return _sourceStream;
-    }
-
-    var subscription = _subscription;
-    _subscription = null;
-
-    var wasPaused = subscription.isPaused;
-    var result = new SubscriptionStream<T>(subscription);
-    // Resume after creating stream because that pauses the subscription too.
-    // This way there won't be a short resumption in the middle.
-    if (wasPaused) subscription.resume();
-    return result;
-  }
-}
-
-/// A transaction on a [StreamQueue], created by [StreamQueue.startTransaction].
-///
-/// Copies of the parent queue may be created using [newQueue]. Calling [commit]
-/// moves the parent queue to a copy's position, and calling [reject] causes it
-/// to continue as though [StreamQueue.startTransaction] was never called.
-class StreamQueueTransaction<T> {
-  /// The parent queue on which this transaction is active.
-  final StreamQueue<T> _parent;
-
-  /// The splitter that produces copies of the parent queue's stream.
-  final StreamSplitter<T> _splitter;
-
-  /// Queues created using [newQueue].
-  final _queues = new Set<StreamQueue>();
-
-  /// Whether [commit] has been called.
-  var _committed = false;
-
-  /// Whether [reject] has been called.
-  var _rejected = false;
-
-  StreamQueueTransaction._(this._parent, Stream<T> source)
-      : _splitter = new StreamSplitter(source);
-
-  /// Creates a new copy of the parent queue.
-  ///
-  /// This copy starts at the parent queue's position when
-  /// [StreamQueue.startTransaction] was called. Its position can be committed
-  /// to the parent queue using [commit].
-  StreamQueue<T> newQueue() {
-    var queue = new StreamQueue(_splitter.split());
-    _queues.add(queue);
-    return queue;
-  }
-
-  /// Commits a queue created using [newQueue].
-  ///
-  /// The parent queue's position is updated to be the same as [queue]'s.
-  /// Further requests on all queues created by this transaction, including
-  /// [queue], will complete as though [cancel] were called with `immediate:
-  /// true`.
-  ///
-  /// Throws a [StateError] if [commit] or [reject] have already been called, or
-  /// if there are pending requests on [queue].
-  void commit(StreamQueue<T> queue) {
-    _assertActive();
-    if (!_queues.contains(queue)) {
-      throw new ArgumentError("Queue doesn't belong to this transaction.");
-    } else if (queue._requestQueue.isNotEmpty) {
-      throw new StateError("A queue with pending requests can't be committed.");
-    }
-    _committed = true;
-
-    // Remove all events from the parent queue that were consumed by the
-    // child queue.
-    for (var j = 0; j < queue.eventsDispatched; j++) {
-      _parent._eventQueue.removeFirst();
-    }
-
-    _done();
-  }
-
-  /// Rejects this transaction without updating the parent queue.
-  ///
-  /// The parent will continue as though [StreamQueue.startTransaction] hadn't
-  /// been called. Further requests on all queues created by this transaction
-  /// will complete as though [cancel] were called with `immediate: true`.
-  ///
-  /// Throws a [StateError] if [commit] or [reject] have already been called.
-  void reject() {
-    _assertActive();
-    _rejected = true;
-    _done();
-  }
-
-  // Cancels all [_queues], removes the [_TransactionRequest] from [_parent]'s
-  // request queue, and runs the next request.
-  void _done() {
-    _splitter.close();
-    for (var queue in _queues) {
-      queue._cancel();
-    }
-    // If this is the active request in the queue, mark it as finished.
-    var currentRequest = _parent._requestQueue.first;
-    if (currentRequest is _TransactionRequest &&
-        currentRequest.transaction == this) {
-      _parent._requestQueue.removeFirst();
-      _parent._updateRequests();
-    }
-  }
-
-  /// Throws a [StateError] if [accept] or [reject] has already been called.
-  void _assertActive() {
-    if (_committed) {
-      throw new StateError("This transaction has already been accepted.");
-    } else if (_rejected) {
-      throw new StateError("This transaction has already been rejected.");
-    }
-  }
-}
-
-/// 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<T> {
-  /// Handle available events.
-  ///
-  /// The available events are provided as a queue. The `update` 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.
-  /// If the function returns `false` when the stream has already closed
-  /// ([isDone] is true), then the request must call
-  /// [StreamQueue._updateRequests] itself when it's ready to continue.
-  bool update(QueueList<Result<T>> events, bool isDone);
-}
-
-/// Request for a [StreamQueue.next] call.
-///
-/// Completes the returned future when receiving the first event,
-/// and is then complete.
-class _NextRequest<T> implements _EventRequest<T> {
-  /// Completer for the future returned by [StreamQueue.next].
-  final _completer = new Completer<T>();
-
-  _NextRequest();
-
-  Future<T> get future => _completer.future;
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    if (events.isNotEmpty) {
-      events.removeFirst().complete(_completer);
-      return true;
-    }
-    if (isDone) {
-      _completer.completeError(
-          new StateError("No elements"), StackTrace.current);
-      return true;
-    }
-    return false;
-  }
-}
-
-/// Request for a [StreamQueue.peek] call.
-///
-/// Completes the returned future when receiving the first event,
-/// and is then complete, but doesn't consume the event.
-class _PeekRequest<T> implements _EventRequest<T> {
-  /// Completer for the future returned by [StreamQueue.next].
-  final _completer = new Completer<T>();
-
-  _PeekRequest();
-
-  Future<T> get future => _completer.future;
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    if (events.isNotEmpty) {
-      events.first.complete(_completer);
-      return true;
-    }
-    if (isDone) {
-      _completer.completeError(
-          new StateError("No elements"), StackTrace.current);
-      return true;
-    }
-    return false;
-  }
-}
-
-/// Request for a [StreamQueue.skip] call.
-class _SkipRequest<T> implements _EventRequest<T> {
-  /// Completer for the future returned by the skip call.
-  final _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<int> get future => _completer.future;
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    while (_eventsToSkip > 0) {
-      if (events.isEmpty) {
-        if (isDone) break;
-        return false;
-      }
-      _eventsToSkip--;
-
-      var event = events.removeFirst();
-      if (event.isError) {
-        _completer.completeError(event.asError.error, event.asError.stackTrace);
-        return true;
-      }
-    }
-    _completer.complete(_eventsToSkip);
-    return true;
-  }
-}
-
-/// Common superclass for [_TakeRequest] and [_LookAheadRequest].
-abstract class _ListRequest<T> implements _EventRequest<T> {
-  /// Completer for the future returned by the take call.
-  final _completer = new Completer<List<T>>();
-
-  /// List collecting events until enough have been seen.
-  final _list = <T>[];
-
-  /// Number of events to capture.
-  ///
-  /// The request [isComplete] when the length of [_list] reaches
-  /// this value.
-  final int _eventsToTake;
-
-  _ListRequest(this._eventsToTake);
-
-  /// The future completed when the correct number of events have been captured.
-  Future<List<T>> get future => _completer.future;
-}
-
-/// Request for a [StreamQueue.take] call.
-class _TakeRequest<T> extends _ListRequest<T> {
-  _TakeRequest(int eventsToTake) : super(eventsToTake);
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    while (_list.length < _eventsToTake) {
-      if (events.isEmpty) {
-        if (isDone) break;
-        return false;
-      }
-
-      var event = events.removeFirst();
-      if (event.isError) {
-        event.asError.complete(_completer);
-        return true;
-      }
-      _list.add(event.asValue.value);
-    }
-    _completer.complete(_list);
-    return true;
-  }
-}
-
-/// Request for a [StreamQueue.lookAhead] call.
-class _LookAheadRequest<T> extends _ListRequest<T> {
-  _LookAheadRequest(int eventsToTake) : super(eventsToTake);
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    while (_list.length < _eventsToTake) {
-      if (events.length == _list.length) {
-        if (isDone) break;
-        return false;
-      }
-      var event = events.elementAt(_list.length);
-      if (event.isError) {
-        event.asError.complete(_completer);
-        return true;
-      }
-      _list.add(event.asValue.value);
-    }
-    _completer.complete(_list);
-    return true;
-  }
-}
-
-/// 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<T> implements _EventRequest<T> {
-  /// Completer for the future returned by the `cancel` call.
-  /// TODO(lrn); make this Completer<void> when that is implemented.
-  final _completer = new Completer();
-
-  /// 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 update(QueueList<Result<T>> events, bool isDone) {
-    if (_streamQueue._isDone) {
-      _completer.complete();
-    } else {
-      _streamQueue._ensureListening();
-      _completer.complete(_streamQueue._extractStream().listen(null).cancel());
-    }
-    return true;
-  }
-}
-
-/// 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<T> {
-  /// Completer for the stream returned by the `rest` call.
-  final _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<T> _streamQueue;
-
-  _RestRequest(this._streamQueue);
-
-  /// The stream which will contain the remaining events of [_streamQueue].
-  Stream<T> get stream => _completer.stream;
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    if (events.isEmpty) {
-      if (_streamQueue._isDone) {
-        _completer.setEmpty();
-      } else {
-        _completer.setSourceStream(_streamQueue._extractStream());
-      }
-    } 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(_streamQueue._extractStream(), cancelOnError: false)
-          .whenComplete(controller.close);
-      _completer.setSourceStream(controller.stream);
-    }
-    return true;
-  }
-}
-
-/// 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<T> {
-  final _completer = new Completer<bool>();
-
-  Future<bool> get future => _completer.future;
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    if (events.isNotEmpty) {
-      _completer.complete(true);
-      return true;
-    }
-    if (isDone) {
-      _completer.complete(false);
-      return true;
-    }
-    return false;
-  }
-}
-
-/// Request for a [StreamQueue.startTransaction] call.
-///
-/// This request isn't complete until the user calls
-/// [StreamQueueTransaction.commit] or [StreamQueueTransaction.reject], at which
-/// point it manually removes itself from the request queue and calls
-/// [StreamQueue._updateRequests].
-class _TransactionRequest<T> implements _EventRequest<T> {
-  /// The transaction created by this request.
-  StreamQueueTransaction<T> get transaction => _transaction;
-  StreamQueueTransaction<T> _transaction;
-
-  /// The controller that passes events to [transaction].
-  final _controller = new StreamController<T>(sync: true);
-
-  /// The number of events passed to [_controller] so far.
-  var _eventsSent = 0;
-
-  _TransactionRequest(StreamQueue<T> parent) {
-    _transaction = new StreamQueueTransaction._(parent, _controller.stream);
-  }
-
-  bool update(QueueList<Result<T>> events, bool isDone) {
-    while (_eventsSent < events.length) {
-      events[_eventsSent++].addTo(_controller);
-    }
-    if (isDone && !_controller.isClosed) _controller.close();
-    return transaction._committed || _transaction._rejected;
-  }
-}
diff --git a/packages/async/lib/src/stream_sink_completer.dart b/packages/async/lib/src/stream_sink_completer.dart
deleted file mode 100644
index 4219126..0000000
--- a/packages/async/lib/src/stream_sink_completer.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'null_stream_sink.dart';
-
-/// A [sink] where the destination is provided later.
-///
-/// The [sink] is a normal sink that you can add events to to immediately, but
-/// until [setDestinationSink] is called, the events will be buffered.
-///
-/// The same effect can be achieved by using a [StreamController] and adding it
-/// to the sink using [Sink.addStream] when the destination sink is ready. This
-/// class attempts to shortcut some of the overhead when possible. For example,
-/// if the [sink] only has events added after the destination sink has been set,
-/// those events are added directly to the sink.
-class StreamSinkCompleter<T> {
-  /// The sink for this completer.
-  ///
-  /// When a destination sink is provided, events that have been passed to the
-  /// sink will be forwarded to the destination.
-  ///
-  /// Events can be added to the sink either before or after a destination sink
-  /// is set.
-  final StreamSink<T> sink = new _CompleterSink<T>();
-
-  /// Returns [sink] typed as a [_CompleterSink].
-  _CompleterSink<T> get _sink => sink;
-
-  /// Convert a `Future<StreamSink>` to a `StreamSink`.
-  ///
-  /// This creates a sink using a sink completer, and sets the destination sink
-  /// to the result of the future when the future completes.
-  ///
-  /// If the future completes with an error, the returned sink will instead
-  /// be closed. Its [Sink.done] future will contain the error.
-  static StreamSink<T> fromFuture<T>(Future<StreamSink<T>> sinkFuture) {
-    var completer = new StreamSinkCompleter<T>();
-    sinkFuture.then(completer.setDestinationSink, onError: completer.setError);
-    return completer.sink;
-  }
-
-  /// Sets a sink as the destination for events from the [StreamSinkCompleter]'s
-  /// [sink].
-  ///
-  /// The completer's [sink] will act exactly as [destinationSink].
-  ///
-  /// If the destination sink is set before events are added to [sink], further
-  /// events are forwarded directly to [destinationSink].
-  ///
-  /// If events are added to [sink] before setting the destination sink, they're
-  /// buffered until the destination is available.
-  ///
-  /// A destination sink may be set at most once.
-  ///
-  /// Either of [setDestinationSink] or [setError] may be called at most once.
-  /// Trying to call either of them again will fail.
-  void setDestinationSink(StreamSink<T> destinationSink) {
-    if (_sink._destinationSink != null) {
-      throw new StateError("Destination sink already set");
-    }
-    _sink._setDestinationSink(destinationSink);
-  }
-
-  /// Completes this to a closed sink whose [Sink.done] future emits [error].
-  ///
-  /// This is useful when the process of loading the sink fails.
-  ///
-  /// Either of [setDestinationSink] or [setError] may be called at most once.
-  /// Trying to call either of them again will fail.
-  void setError(error, [StackTrace stackTrace]) {
-    setDestinationSink(new NullStreamSink.error(error, stackTrace));
-  }
-}
-
-/// [StreamSink] completed by [StreamSinkCompleter].
-class _CompleterSink<T> implements StreamSink<T> {
-  /// Controller for an intermediate sink.
-  ///
-  /// Created if the user adds events to this sink before the destination sink
-  /// is set.
-  StreamController<T> _controller;
-
-  /// Completer for [done].
-  ///
-  /// Created if the user requests the [done] future before the destination sink
-  /// is set.
-  Completer _doneCompleter;
-
-  /// Destination sink for the events added to this sink.
-  ///
-  /// Set when [StreamSinkCompleter.setDestinationSink] is called.
-  StreamSink<T> _destinationSink;
-
-  /// Whether events should be sent directly to [_destinationSink], as opposed
-  /// to going through [_controller].
-  bool get _canSendDirectly => _controller == null && _destinationSink != null;
-
-  Future get done {
-    if (_doneCompleter != null) return _doneCompleter.future;
-    if (_destinationSink == null) {
-      _doneCompleter = new Completer.sync();
-      return _doneCompleter.future;
-    }
-    return _destinationSink.done;
-  }
-
-  void add(T event) {
-    if (_canSendDirectly) {
-      _destinationSink.add(event);
-    } else {
-      _ensureController();
-      _controller.add(event);
-    }
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    if (_canSendDirectly) {
-      _destinationSink.addError(error, stackTrace);
-    } else {
-      _ensureController();
-      _controller.addError(error, stackTrace);
-    }
-  }
-
-  Future addStream(Stream<T> stream) {
-    if (_canSendDirectly) return _destinationSink.addStream(stream);
-
-    _ensureController();
-    return _controller.addStream(stream, cancelOnError: false);
-  }
-
-  Future close() {
-    if (_canSendDirectly) {
-      _destinationSink.close();
-    } else {
-      _ensureController();
-      _controller.close();
-    }
-    return done;
-  }
-
-  /// Create [_controller] if it doesn't yet exist.
-  void _ensureController() {
-    if (_controller == null) _controller = new StreamController(sync: true);
-  }
-
-  /// Sets the destination sink to which events from this sink will be provided.
-  ///
-  /// If set before the user adds events, events will be added directly to the
-  /// destination sink. If the user adds events earlier, an intermediate sink is
-  /// created using a stream controller, and the destination sink is linked to
-  /// it later.
-  void _setDestinationSink(StreamSink<T> sink) {
-    assert(_destinationSink == null);
-    _destinationSink = sink;
-
-    // If the user has already added data, it's buffered in the controller, so
-    // we add it to the sink.
-    if (_controller != null) {
-      // Catch any error that may come from [addStream] or [sink.close]. They'll
-      // be reported through [done] anyway.
-      sink
-          .addStream(_controller.stream)
-          .whenComplete(sink.close)
-          .catchError((_) {});
-    }
-
-    // If the user has already asked when the sink is done, connect the sink's
-    // done callback to that completer.
-    if (_doneCompleter != null) {
-      _doneCompleter.complete(sink.done);
-    }
-  }
-}
diff --git a/packages/async/lib/src/stream_sink_transformer.dart b/packages/async/lib/src/stream_sink_transformer.dart
deleted file mode 100644
index 503d28a..0000000
--- a/packages/async/lib/src/stream_sink_transformer.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'stream_sink_transformer/handler_transformer.dart';
-import 'stream_sink_transformer/stream_transformer_wrapper.dart';
-import 'stream_sink_transformer/typed.dart';
-
-/// A [StreamSinkTransformer] transforms the events being passed to a sink.
-///
-/// This works on the same principle as a [StreamTransformer]. Each transformer
-/// defines a [bind] method that takes in the original [StreamSink] and returns
-/// the transformed version. However, where a [StreamTransformer] transforms
-/// events after they leave the stream, this transforms them before they enter
-/// the sink.
-///
-/// Transformers must be able to have `bind` called used multiple times.
-abstract class StreamSinkTransformer<S, T> {
-  /// Creates a [StreamSinkTransformer] that transforms events and errors
-  /// using [transformer].
-  ///
-  /// This is equivalent to piping all events from the outer sink through a
-  /// stream transformed by [transformer] and from there into the inner sink.
-  const factory StreamSinkTransformer.fromStreamTransformer(
-      StreamTransformer<S, T> transformer) = StreamTransformerWrapper<S, T>;
-
-  /// Creates a [StreamSinkTransformer] that delegates events to the given
-  /// handlers.
-  ///
-  /// The handlers work exactly as they do for [StreamTransformer.fromHandlers].
-  /// They're called for each incoming event, and any actions on the sink
-  /// they're passed are forwarded to the inner sink. If a handler is omitted,
-  /// the event is passed through unaltered.
-  factory StreamSinkTransformer.fromHandlers(
-      {void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)}) {
-    return new HandlerTransformer<S, T>(handleData, handleError, handleDone);
-  }
-
-  /// Transforms the events passed to [sink].
-  ///
-  /// Creates a new sink. When events are passed to the returned sink, it will
-  /// transform them and pass the transformed versions to [sink].
-  StreamSink<S> bind(StreamSink<T> sink);
-
-  /// Creates a wrapper that coerces the type of [transformer].
-  ///
-  /// This soundly converts a [StreamSinkTransformer] to a
-  /// `StreamSinkTransformer<S, T>`, regardless of its original generic type.
-  /// This means that calls to [StreamSink.add] on the returned sink may throw a
-  /// [CastError] if the argument type doesn't match the reified type of the
-  /// sink.
-  static StreamSinkTransformer<S, T> typed<S, T>(
-          StreamSinkTransformer transformer) =>
-      transformer is StreamSinkTransformer<S, T>
-          ? transformer
-          : new TypeSafeStreamSinkTransformer(transformer);
-}
diff --git a/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart b/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart
deleted file mode 100644
index dba8240..0000000
--- a/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../stream_sink_transformer.dart';
-import '../delegate/stream_sink.dart';
-
-/// The type of the callback for handling data events.
-typedef void HandleData<S, T>(S data, EventSink<T> sink);
-
-/// The type of the callback for handling error events.
-typedef void HandleError<T>(
-    Object error, StackTrace stackTrace, EventSink<T> sink);
-
-/// The type of the callback for handling done events.
-typedef void HandleDone<T>(EventSink<T> sink);
-
-/// A [StreamSinkTransformer] that delegates events to the given handlers.
-class HandlerTransformer<S, T> implements StreamSinkTransformer<S, T> {
-  /// The handler for data events.
-  final HandleData<S, T> _handleData;
-
-  /// The handler for error events.
-  final HandleError<T> _handleError;
-
-  /// The handler for done events.
-  final HandleDone<T> _handleDone;
-
-  HandlerTransformer(this._handleData, this._handleError, this._handleDone);
-
-  StreamSink<S> bind(StreamSink<T> sink) => new _HandlerSink<S, T>(this, sink);
-}
-
-/// A sink created by [HandlerTransformer].
-class _HandlerSink<S, T> implements StreamSink<S> {
-  /// The transformer that created this sink.
-  final HandlerTransformer<S, T> _transformer;
-
-  /// The original sink that's being transformed.
-  final StreamSink<T> _inner;
-
-  /// The wrapper for [_inner] whose [StreamSink.close] method can't emit
-  /// errors.
-  final StreamSink<T> _safeCloseInner;
-
-  Future get done => _inner.done;
-
-  _HandlerSink(this._transformer, StreamSink<T> inner)
-      : _inner = inner,
-        _safeCloseInner = new _SafeCloseSink<T>(inner);
-
-  void add(S event) {
-    if (_transformer._handleData == null) {
-      _inner.add(event as T);
-    } else {
-      _transformer._handleData(event, _safeCloseInner);
-    }
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    if (_transformer._handleError == null) {
-      _inner.addError(error, stackTrace);
-    } else {
-      _transformer._handleError(error, stackTrace, _safeCloseInner);
-    }
-  }
-
-  Future addStream(Stream<S> stream) {
-    return _inner.addStream(stream.transform(
-        new StreamTransformer<S, T>.fromHandlers(
-            handleData: _transformer._handleData,
-            handleError: _transformer._handleError,
-            handleDone: _closeSink)));
-  }
-
-  Future close() {
-    if (_transformer._handleDone == null) return _inner.close();
-
-    _transformer._handleDone(_safeCloseInner);
-    return _inner.done;
-  }
-}
-
-/// A wrapper for [StreamSink]s that swallows any errors returned by [close].
-///
-/// [HandlerTransformer] passes this to its handlers to ensure that when they
-/// call [close], they don't leave any dangling [Future]s behind that might emit
-/// unhandleable errors.
-class _SafeCloseSink<T> extends DelegatingStreamSink<T> {
-  _SafeCloseSink(StreamSink<T> inner) : super(inner);
-
-  Future close() => super.close().catchError((_) {});
-}
-
-/// A function to pass as a [StreamTransformer]'s `handleDone` callback.
-void _closeSink(EventSink sink) {
-  sink.close();
-}
diff --git a/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart b/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
deleted file mode 100644
index 32ac648..0000000
--- a/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../stream_sink_transformer.dart';
-
-/// A [StreamSinkTransformer] that wraps a pre-existing [StreamTransformer].
-class StreamTransformerWrapper<S, T> implements StreamSinkTransformer<S, T> {
-  /// The wrapped transformer.
-  final StreamTransformer<S, T> _transformer;
-
-  const StreamTransformerWrapper(this._transformer);
-
-  StreamSink<S> bind(StreamSink<T> sink) =>
-      new _StreamTransformerWrapperSink<S, T>(_transformer, sink);
-}
-
-/// A sink created by [StreamTransformerWrapper].
-class _StreamTransformerWrapperSink<S, T> implements StreamSink<S> {
-  /// The controller through which events are passed.
-  ///
-  /// This is used to create a stream that can be transformed by the wrapped
-  /// transformer.
-  final _controller = new StreamController<S>(sync: true);
-
-  /// The original sink that's being transformed.
-  final StreamSink<T> _inner;
-
-  Future get done => _inner.done;
-
-  _StreamTransformerWrapperSink(
-      StreamTransformer<S, T> transformer, this._inner) {
-    _controller.stream
-        .transform(transformer)
-        .listen(_inner.add, onError: _inner.addError, onDone: () {
-      // Ignore any errors that come from this call to [_inner.close]. The
-      // user can access them through [done] or the value returned from
-      // [this.close], and we don't want them to get top-leveled.
-      _inner.close().catchError((_) {});
-    });
-  }
-
-  void add(S event) {
-    _controller.add(event);
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    _controller.addError(error, stackTrace);
-  }
-
-  Future addStream(Stream<S> stream) => _controller.addStream(stream);
-
-  Future close() {
-    _controller.close();
-    return _inner.done;
-  }
-}
diff --git a/packages/async/lib/src/stream_sink_transformer/typed.dart b/packages/async/lib/src/stream_sink_transformer/typed.dart
deleted file mode 100644
index 303bc08..0000000
--- a/packages/async/lib/src/stream_sink_transformer/typed.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 '../delegate/stream_sink.dart';
-import '../stream_sink_transformer.dart';
-
-/// A wrapper that coerces the generic type of the sink returned by an inner
-/// transformer to `S`.
-class TypeSafeStreamSinkTransformer<S, T>
-    implements StreamSinkTransformer<S, T> {
-  final StreamSinkTransformer _inner;
-
-  TypeSafeStreamSinkTransformer(this._inner);
-
-  StreamSink<S> bind(StreamSink<T> sink) =>
-      DelegatingStreamSink.typed(_inner.bind(sink));
-}
diff --git a/packages/async/lib/src/stream_splitter.dart b/packages/async/lib/src/stream_splitter.dart
deleted file mode 100644
index ac4260d..0000000
--- a/packages/async/lib/src/stream_splitter.dart
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 'future_group.dart';
-import 'result/result.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<T>> splitFrom<T>(Stream<T> stream, [int count]) {
-    if (count == null) count = 2;
-    var splitter = new StreamSplitter<T>(stream);
-    var streams = new List<Stream>.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 = new StreamController<T>(
-        onListen: _onListen, onPause: _onPause, onResume: _onResume);
-    controller.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/packages/async/lib/src/stream_subscription_transformer.dart b/packages/async/lib/src/stream_subscription_transformer.dart
deleted file mode 100644
index 1443b18..0000000
--- a/packages/async/lib/src/stream_subscription_transformer.dart
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'async_memoizer.dart';
-
-typedef Future _AsyncHandler<T>(StreamSubscription<T> inner);
-
-typedef void _VoidHandler<T>(StreamSubscription<T> inner);
-
-/// Creates a [StreamTransformer] that modifies the behavior of subscriptions to
-/// a stream.
-///
-/// When [StreamSubscription.cancel], [StreamSubscription.pause], or
-/// [StreamSubscription.resume] is called, the corresponding handler is invoked.
-/// By default, handlers just forward to the underlying subscription.
-///
-/// Guarantees that none of the [StreamSubscription] callbacks and none of the
-/// callbacks passed to `subscriptionTransformer()` will be invoked once the
-/// transformed [StreamSubscription] has been canceled and `handleCancel()` has
-/// run. The [handlePause] and [handleResume] are invoked regardless of whether
-/// the subscription is paused already or not.
-///
-/// In order to preserve [StreamSubscription] guarantees, **all callbacks must
-/// synchronously call the corresponding method** on the inner
-/// [StreamSubscription]: [handleCancel] must call `cancel()`, [handlePause]
-/// must call `pause()`, and [handleResume] must call `resume()`.
-StreamTransformer<T, T> subscriptionTransformer<T>(
-    {Future handleCancel(StreamSubscription<T> inner),
-    void handlePause(StreamSubscription<T> inner),
-    void handleResume(StreamSubscription<T> inner)}) {
-  return new StreamTransformer((stream, cancelOnError) {
-    return new _TransformedSubscription(
-        stream.listen(null, cancelOnError: cancelOnError),
-        handleCancel ?? (inner) => inner.cancel(),
-        handlePause ??
-            (inner) {
-              inner.pause();
-            },
-        handleResume ??
-            (inner) {
-              inner.resume();
-            });
-  });
-}
-
-/// A [StreamSubscription] wrapper that calls callbacks for subscription
-/// methods.
-class _TransformedSubscription<T> implements StreamSubscription<T> {
-  /// The wrapped subscription.
-  StreamSubscription<T> _inner;
-
-  /// The callback to run when [cancel] is called.
-  final _AsyncHandler<T> _handleCancel;
-
-  /// The callback to run when [pause] is called.
-  final _VoidHandler<T> _handlePause;
-
-  /// The callback to run when [resume] is called.
-  final _VoidHandler<T> _handleResume;
-
-  bool get isPaused => _inner?.isPaused ?? false;
-
-  _TransformedSubscription(
-      this._inner, this._handleCancel, this._handlePause, this._handleResume);
-
-  void onData(void handleData(T data)) {
-    _inner?.onData(handleData);
-  }
-
-  void onError(Function handleError) {
-    _inner?.onError(handleError);
-  }
-
-  void onDone(void handleDone()) {
-    _inner?.onDone(handleDone);
-  }
-
-  Future cancel() => _cancelMemoizer.runOnce(() {
-        var inner = _inner;
-        _inner.onData(null);
-        _inner.onDone(null);
-
-        // Setting onError to null will cause errors to be top-leveled.
-        _inner.onError((_, __) {});
-        _inner = null;
-        return _handleCancel(inner);
-      });
-  final _cancelMemoizer = new AsyncMemoizer();
-
-  void pause([Future resumeFuture]) {
-    if (_cancelMemoizer.hasRun) return;
-    if (resumeFuture != null) resumeFuture.whenComplete(resume);
-    _handlePause(_inner);
-  }
-
-  void resume() {
-    if (_cancelMemoizer.hasRun) return;
-    _handleResume(_inner);
-  }
-
-  Future<E> asFuture<E>([E futureValue]) =>
-      _inner?.asFuture(futureValue) ?? new Completer<E>().future;
-}
diff --git a/packages/async/lib/src/stream_zip.dart b/packages/async/lib/src/stream_zip.dart
deleted file mode 100644
index 3d5a811..0000000
--- a/packages/async/lib/src/stream_zip.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-/// A stream that combines the values of other streams.
-///
-/// This emits lists of collected values from each input stream. The first list
-/// contains the first value emitted by each stream, the second contains the
-/// second value, and so on. The lists have the same ordering as the iterable
-/// passed to [new StreamZip].
-///
-/// Any errors from any of the streams are forwarded directly to this stream.
-class StreamZip<T> extends Stream<List<T>> {
-  final Iterable<Stream<T>> _streams;
-
-  StreamZip(Iterable<Stream<T>> streams) : _streams = streams;
-
-  StreamSubscription<List<T>> listen(void onData(List<T> data),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
-    var subscriptions = <StreamSubscription<T>>[];
-    StreamController<List<T>> controller;
-    List<T> current;
-    int dataCount = 0;
-
-    /// Called for each data from a subscription in [subscriptions].
-    void handleData(int index, T data) {
-      current[index] = data;
-      dataCount++;
-      if (dataCount == subscriptions.length) {
-        var 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 (var 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<T>>(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/packages/async/lib/src/subscription_stream.dart b/packages/async/lib/src/subscription_stream.dart
deleted file mode 100644
index a235663..0000000
--- a/packages/async/lib/src/subscription_stream.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 "delegate/stream_subscription.dart";
-
-/// A [Stream] adapter for a [StreamSubscription].
-///
-/// This class allows a `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<T> _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<T> 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 = cancelOnError
-        ? new _CancelOnErrorSubscriptionWrapper<T>(subscription)
-        : 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<T> 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/packages/async/lib/src/typed/future.dart b/packages/async/lib/src/typed/future.dart
deleted file mode 100644
index 4630af7..0000000
--- a/packages/async/lib/src/typed/future.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-class TypeSafeFuture<T> implements Future<T> {
-  final Future _future;
-
-  TypeSafeFuture(this._future);
-
-  Stream<T> asStream() => _future.then((value) => value as T).asStream();
-
-  Future<T> catchError(Function onError, {bool test(Object error)}) async =>
-      new TypeSafeFuture<T>(_future.catchError(onError, test: test));
-
-  Future<S> then<S>(dynamic onValue(T value), {Function onError}) =>
-      _future.then((value) => onValue(value as T), onError: onError);
-
-  Future<T> whenComplete(action()) =>
-      new TypeSafeFuture<T>(_future.whenComplete(action));
-
-  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
-      new TypeSafeFuture<T>(_future.timeout(timeLimit, onTimeout: onTimeout));
-}
diff --git a/packages/async/lib/src/typed/stream_subscription.dart b/packages/async/lib/src/typed/stream_subscription.dart
deleted file mode 100644
index 0fab039..0000000
--- a/packages/async/lib/src/typed/stream_subscription.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-class TypeSafeStreamSubscription<T> implements StreamSubscription<T> {
-  final StreamSubscription _subscription;
-
-  bool get isPaused => _subscription.isPaused;
-
-  TypeSafeStreamSubscription(this._subscription);
-
-  void onData(void handleData(T data)) {
-    _subscription.onData((data) => handleData(data as T));
-  }
-
-  void onError(Function handleError) {
-    _subscription.onError(handleError);
-  }
-
-  void onDone(void handleDone()) {
-    _subscription.onDone(handleDone);
-  }
-
-  void pause([Future resumeFuture]) {
-    _subscription.pause(resumeFuture);
-  }
-
-  void resume() {
-    _subscription.resume();
-  }
-
-  Future cancel() => _subscription.cancel();
-
-  Future<E> asFuture<E>([E futureValue]) => _subscription.asFuture(futureValue);
-}
diff --git a/packages/async/lib/src/typed_stream_transformer.dart b/packages/async/lib/src/typed_stream_transformer.dart
deleted file mode 100644
index cb63311..0000000
--- a/packages/async/lib/src/typed_stream_transformer.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'delegate/stream.dart';
-
-/// Creates a wrapper that coerces the type of [transformer].
-///
-/// This soundly converts a [StreamTransformer] to a `StreamTransformer<S, T>`,
-/// regardless of its original generic type, by asserting that the events
-/// emitted by the transformed stream are instances of `T` whenever they're
-/// provided. If they're not, the stream throws a [CastError].
-StreamTransformer<S, T> typedStreamTransformer<S, T>(
-        StreamTransformer transformer) =>
-    transformer is StreamTransformer<S, T>
-        ? transformer
-        : new _TypeSafeStreamTransformer(transformer);
-
-/// A wrapper that coerces the type of the stream returned by an inner
-/// transformer.
-class _TypeSafeStreamTransformer<S, T> extends StreamTransformerBase<S, T> {
-  final StreamTransformer _inner;
-
-  _TypeSafeStreamTransformer(this._inner);
-
-  Stream<T> bind(Stream<S> stream) =>
-      DelegatingStream.typed(_inner.bind(stream));
-}
diff --git a/packages/async/lib/src/utils.dart b/packages/async/lib/src/utils.dart
deleted file mode 100644
index 2aab40e..0000000
--- a/packages/async/lib/src/utils.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-/// A generic typedef for a function that takes one type and returns another.
-typedef F UnaryFunction<E, F>(E argument);
-
-/// A typedef for a function that takes no arguments and returns a Future or a
-/// value.
-typedef FutureOr<T> FutureOrCallback<T>();
diff --git a/packages/async/pubspec.yaml b/packages/async/pubspec.yaml
deleted file mode 100644
index e8dafaa..0000000
--- a/packages/async/pubspec.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: async
-version: 2.0.6
-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
-environment:
-  sdk: ">=2.0.0-dev.23.0 <2.0.0"
-dependencies:
-  collection: "^1.5.0"
-dev_dependencies:
-  fake_async: "^0.1.2"
-  stack_trace: "^1.0.0"
-  test: "^0.12.0"
-  # For building and testing with DDC
-  build_runner: ^0.7.11
-  build_web_compilers: ^0.3.1
-  build_test: ^0.10.1
diff --git a/packages/async/test/async_cache_test.dart b/packages/async/test/async_cache_test.dart
deleted file mode 100644
index 747835b..0000000
--- a/packages/async/test/async_cache_test.dart
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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:fake_async/fake_async.dart';
-import 'package:test/test.dart';
-
-void main() {
-  AsyncCache<String> cache;
-
-  setUp(() {
-    // Create a cache that is fresh for an hour.
-    cache = new AsyncCache(const Duration(hours: 1));
-  });
-
-  test('should fetch via a callback when no cache exists', () async {
-    expect(await cache.fetch(() async => 'Expensive'), 'Expensive');
-  });
-
-  test('should not fetch via callback when a cache exists', () async {
-    await cache.fetch(() async => 'Expensive');
-    expect(await cache.fetch(expectAsync0(() {}, count: 0)), 'Expensive');
-  });
-
-  test('should not fetch via callback when a future is in-flight', () async {
-    // No actual caching is done, just avoid duplicate requests.
-    cache = new AsyncCache.ephemeral();
-
-    var completer = new Completer<String>();
-    expect(cache.fetch(() => completer.future), completion('Expensive'));
-    expect(cache.fetch(expectAsync0(() {}, count: 0)), completion('Expensive'));
-    await completer.complete('Expensive');
-  });
-
-  test('should fetch via a callback again when cache expires', () {
-    new FakeAsync().run((fakeAsync) async {
-      var timesCalled = 0;
-      call() async => 'Called ${++timesCalled}';
-      expect(await cache.fetch(call), 'Called 1');
-      expect(await cache.fetch(call), 'Called 1', reason: 'Cache still fresh');
-
-      fakeAsync.elapse(const Duration(hours: 1) - const Duration(seconds: 1));
-      expect(await cache.fetch(call), 'Called 1', reason: 'Cache still fresh');
-
-      fakeAsync.elapse(const Duration(seconds: 1));
-      expect(await cache.fetch(call), 'Called 2');
-      expect(await cache.fetch(call), 'Called 2', reason: 'Cache fresh again');
-
-      fakeAsync.elapse(const Duration(hours: 1));
-      expect(await cache.fetch(call), 'Called 3');
-    });
-  });
-
-  test('should fetch via a callback when manually invalidated', () async {
-    var timesCalled = 0;
-    call() async => 'Called ${++timesCalled}';
-    expect(await cache.fetch(call), 'Called 1');
-    await cache.invalidate();
-    expect(await cache.fetch(call), 'Called 2');
-    await cache.invalidate();
-    expect(await cache.fetch(call), 'Called 3');
-  });
-
-  test('should fetch a stream via a callback', () async {
-    expect(
-        await cache.fetchStream(expectAsync0(() {
-          return new Stream.fromIterable(['1', '2', '3']);
-        })).toList(),
-        ['1', '2', '3']);
-  });
-
-  test('should not fetch stream via callback when a cache exists', () async {
-    await cache.fetchStream(() async* {
-      yield '1';
-      yield '2';
-      yield '3';
-    }).toList();
-    expect(await cache.fetchStream(expectAsync0(() {}, count: 0)).toList(),
-        ['1', '2', '3']);
-  });
-
-  test('should not fetch stream via callback when request in flight', () async {
-    // Unlike the above test, we want to verify that we don't make multiple
-    // calls if a cache is being filled currently, and instead wait for that
-    // cache to be completed.
-    var controller = new StreamController<String>();
-    Stream<String> call() => controller.stream;
-    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
-    controller.add('1');
-    controller.add('2');
-    await new Future.value();
-    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
-    controller.add('3');
-    await controller.close();
-  });
-
-  test('should fetch stream via a callback again when cache expires', () {
-    new FakeAsync().run((fakeAsync) async {
-      var timesCalled = 0;
-      Stream<String> call() {
-        return new Stream.fromIterable(['Called ${++timesCalled}']);
-      }
-
-      expect(await cache.fetchStream(call).toList(), ['Called 1']);
-      expect(await cache.fetchStream(call).toList(), ['Called 1'],
-          reason: 'Cache still fresh');
-
-      fakeAsync.elapse(const Duration(hours: 1) - const Duration(seconds: 1));
-      expect(await cache.fetchStream(call).toList(), ['Called 1'],
-          reason: 'Cache still fresh');
-
-      fakeAsync.elapse(const Duration(seconds: 1));
-      expect(await cache.fetchStream(call).toList(), ['Called 2']);
-      expect(await cache.fetchStream(call).toList(), ['Called 2'],
-          reason: 'Cache fresh again');
-
-      fakeAsync.elapse(const Duration(hours: 1));
-      expect(await cache.fetchStream(call).toList(), ['Called 3']);
-    });
-  });
-
-  test('should fetch via a callback when manually invalidated', () async {
-    var timesCalled = 0;
-    Stream<String> call() {
-      return new Stream.fromIterable(['Called ${++timesCalled}']);
-    }
-
-    expect(await cache.fetchStream(call).toList(), ['Called 1']);
-    await cache.invalidate();
-    expect(await cache.fetchStream(call).toList(), ['Called 2']);
-    await cache.invalidate();
-    expect(await cache.fetchStream(call).toList(), ['Called 3']);
-  });
-
-  test('should cancel a cached stream without affecting others', () async {
-    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
-
-    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
-
-    // Listens to the stream for the initial value, then cancels subscription.
-    expect(await cache.fetchStream(call).first, '1');
-  });
-
-  test('should pause a cached stream without affecting others', () async {
-    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
-
-    StreamSubscription sub;
-    sub = cache.fetchStream(call).listen(expectAsync1((event) {
-      if (event == '1') sub.pause();
-    }));
-    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
-  });
-}
diff --git a/packages/async/test/async_memoizer_test.dart b/packages/async/test/async_memoizer_test.dart
deleted file mode 100644
index dc008f1..0000000
--- a/packages/async/test/async_memoizer_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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: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.future, completion(equals("value")));
-    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.future, completion(equals("value")));
-    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.future, throwsA("error"));
-    expect(cache.runOnce(() async => throw "error"), throwsA("error"));
-    expect(cache.runOnce(() {}), throwsA("error"));
-  });
-}
diff --git a/packages/async/test/byte_collection_test.dart b/packages/async/test/byte_collection_test.dart
deleted file mode 100644
index b87b074..0000000
--- a/packages/async/test/byte_collection_test.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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:async/async.dart";
-
-void main() {
-  group("collectBytes", () {
-    test("simple list and overflow", () {
-      var result = collectBytes(new Stream.fromIterable([
-        [0],
-        [1],
-        [2],
-        [256]
-      ]));
-      expect(result, completion([0, 1, 2, 0]));
-    });
-
-    test("no events", () {
-      var result = collectBytes(new Stream.fromIterable([]));
-      expect(result, completion([]));
-    });
-
-    test("empty events", () {
-      var result = collectBytes(new Stream.fromIterable([[], []]));
-      expect(result, completion([]));
-    });
-
-    test("error event", () {
-      var result = collectBytes(new Stream.fromIterable(
-          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
-      expect(result, throwsA("badness"));
-    });
-  });
-
-  group("collectBytes", () {
-    test("simple list and overflow", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([
-        [0],
-        [1],
-        [2],
-        [256]
-      ]));
-      expect(result.value, completion([0, 1, 2, 0]));
-    });
-
-    test("no events", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([]));
-      expect(result.value, completion([]));
-    });
-
-    test("empty events", () {
-      var result = collectBytesCancelable(new Stream.fromIterable([[], []]));
-      expect(result.value, completion([]));
-    });
-
-    test("error event", () {
-      var result = collectBytesCancelable(new Stream.fromIterable(
-          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
-      expect(result.value, throwsA("badness"));
-    });
-
-    test("cancelled", () async {
-      var sc = new StreamController<List<int>>();
-      var result = collectBytesCancelable(sc.stream);
-      // Value never completes.
-      result.value.whenComplete(expectAsync0(() {}, count: 0));
-
-      expect(sc.hasListener, isTrue);
-      sc.add([1, 2]);
-      await nextTimerTick();
-      expect(sc.hasListener, isTrue);
-      sc.add([3, 4]);
-      await nextTimerTick();
-      expect(sc.hasListener, isTrue);
-      result.cancel();
-      expect(sc.hasListener, isFalse); // Cancelled immediately.
-      var replacement = await result.valueOrCancellation();
-      expect(replacement, isNull);
-      await nextTimerTick();
-      sc.close();
-      await nextTimerTick();
-    });
-  });
-}
-
-Future nextTimerTick() => new Future(() {});
diff --git a/packages/async/test/cancelable_operation_test.dart b/packages/async/test/cancelable_operation_test.dart
deleted file mode 100644
index bded402..0000000
--- a/packages/async/test/cancelable_operation_test.dart
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-import 'utils.dart';
-
-void main() {
-  group("without being canceled", () {
-    var completer;
-    setUp(() {
-      completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
-    });
-
-    test("sends values to the future", () {
-      expect(completer.operation.value, completion(equals(1)));
-      expect(completer.isCompleted, isFalse);
-      completer.complete(1);
-      expect(completer.isCompleted, isTrue);
-    });
-
-    test("sends errors to the future", () {
-      expect(completer.operation.value, throwsA("error"));
-      expect(completer.isCompleted, isFalse);
-      completer.completeError("error");
-      expect(completer.isCompleted, isTrue);
-    });
-
-    test("sends values in a future to the future", () {
-      expect(completer.operation.value, 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.operation.value, throwsA("error"));
-      expect(completer.isCompleted, isFalse);
-      completer.complete(new Future.error("error"));
-      expect(completer.isCompleted, isTrue);
-    });
-
-    test("sends values to valueOrCancellation", () {
-      expect(completer.operation.valueOrCancellation(), completion(equals(1)));
-      completer.complete(1);
-    });
-
-    test("sends errors to valueOrCancellation", () {
-      expect(completer.operation.valueOrCancellation(), throwsA("error"));
-      completer.completeError("error");
-    });
-
-    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.operation.value, 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("CancelableOperation.fromFuture", () {
-      test("forwards values", () {
-        var operation = new CancelableOperation.fromFuture(new Future.value(1));
-        expect(operation.value, completion(equals(1)));
-      });
-
-      test("forwards errors", () {
-        var operation =
-            new CancelableOperation.fromFuture(new Future.error("error"));
-        expect(operation.value, throwsA("error"));
-      });
-    });
-  });
-
-  group("when canceled", () {
-    test("causes the future never to fire", () async {
-      var completer = new CancelableCompleter();
-      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
-      completer.operation.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(onCancel: expectAsync0(() {
-        expect(completer.isCanceled, isTrue);
-        canceled = true;
-      }));
-
-      expect(canceled, isFalse);
-      expect(completer.isCanceled, isFalse);
-      expect(completer.isCompleted, isFalse);
-      completer.operation.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(onCancel: expectAsync0(() {
-        return new Future.value(1);
-      }));
-      expect(completer.operation.cancel(), completion(equals(1)));
-      expect(completer.operation.cancel(), completion(equals(1)));
-      expect(completer.operation.cancel(), completion(equals(1)));
-    });
-
-    test("returns a future even if onCancel doesn't", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
-      expect(completer.operation.cancel(), completes);
-    });
-
-    test("doesn't call onCancel if the completer has completed", () {
-      var completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
-      completer.complete(1);
-      expect(completer.operation.value, completion(equals(1)));
-      expect(completer.operation.cancel(), completes);
-    });
-
-    test(
-        "does call onCancel if the completer has completed to an unfired "
-        "Future", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
-      completer.complete(new Completer().future);
-      expect(completer.operation.cancel(), completes);
-    });
-
-    test(
-        "doesn't call onCancel if the completer has completed to a fired "
-        "Future", () async {
-      var completer =
-          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
-      completer.complete(new Future.value(1));
-      await completer.operation.value;
-      expect(completer.operation.cancel(), completes);
-    });
-
-    test("can be completed once after being canceled", () async {
-      var completer = new CancelableCompleter();
-      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
-      await completer.operation.cancel();
-      completer.complete(1);
-      expect(() => completer.complete(1), throwsStateError);
-    });
-
-    test("fires valueOrCancellation with the given value", () {
-      var completer = new CancelableCompleter();
-      expect(completer.operation.valueOrCancellation(1), completion(equals(1)));
-      completer.operation.cancel();
-    });
-
-    test("pipes an error through valueOrCancellation", () {
-      var completer = new CancelableCompleter(onCancel: () {
-        throw "error";
-      });
-      expect(completer.operation.valueOrCancellation(1), throwsA("error"));
-      completer.operation.cancel();
-    });
-
-    test("valueOrCancellation waits on the onCancel future", () async {
-      var innerCompleter = new Completer();
-      var completer =
-          new CancelableCompleter(onCancel: () => innerCompleter.future);
-
-      var fired = false;
-      completer.operation.valueOrCancellation().then((_) {
-        fired = true;
-      });
-
-      completer.operation.cancel();
-      await flushMicrotasks();
-      expect(fired, isFalse);
-
-      innerCompleter.complete();
-      await flushMicrotasks();
-      expect(fired, isTrue);
-    });
-  });
-
-  group("asStream()", () {
-    test("emits a value and then closes", () {
-      var completer = new CancelableCompleter();
-      expect(completer.operation.asStream().toList(), completion(equals([1])));
-      completer.complete(1);
-    });
-
-    test("emits an error and then closes", () {
-      var completer = new CancelableCompleter();
-      var queue = new StreamQueue(completer.operation.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(onCancel: expectAsync0(() {}));
-      var sub =
-          completer.operation.asStream().listen(expectAsync1((_) {}, count: 0));
-      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
-      sub.cancel();
-      expect(completer.isCanceled, isTrue);
-    });
-  });
-}
diff --git a/packages/async/test/future_group_test.dart b/packages/async/test/future_group_test.dart
deleted file mode 100644
index af04799..0000000
--- a/packages/async/test/future_group_test.dart
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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(expectAsync1((_) {
-        expect(futureFired, isFalse);
-        idle = true;
-      }), onDone: expectAsync0(() {
-        expect(idle, isTrue);
-        expect(futureFired, isFalse);
-        onIdleDone = true;
-      }));
-
-      futureGroup.future.then(expectAsync1((_) {
-        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/packages/async/test/lazy_stream_test.dart b/packages/async/test/lazy_stream_test.dart
deleted file mode 100644
index 8da1366..0000000
--- a/packages/async/test/lazy_stream_test.dart
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-import "utils.dart";
-
-main() {
-  test("disallows a null callback", () {
-    expect(() => new LazyStream(null), throwsArgumentError);
-  });
-
-  test("calls the callback when the stream is listened", () async {
-    var callbackCalled = false;
-    var stream = new LazyStream(expectAsync0(() {
-      callbackCalled = true;
-      return new Stream.empty();
-    }));
-
-    await flushMicrotasks();
-    expect(callbackCalled, isFalse);
-
-    stream.listen(null);
-    expect(callbackCalled, isTrue);
-  });
-
-  test("calls the callback when the stream is listened", () async {
-    var callbackCalled = false;
-    var stream = new LazyStream(expectAsync0(() {
-      callbackCalled = true;
-      return new Stream.empty();
-    }));
-
-    await flushMicrotasks();
-    expect(callbackCalled, isFalse);
-
-    stream.listen(null);
-    expect(callbackCalled, isTrue);
-  });
-
-  test("forwards to a synchronously-provided stream", () async {
-    var controller = new StreamController<int>();
-    var stream = new LazyStream(expectAsync0(() => controller.stream));
-
-    var events = [];
-    stream.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("forwards to an asynchronously-provided stream", () async {
-    var controller = new StreamController<int>();
-    var stream = new LazyStream(expectAsync0(() async => controller.stream));
-
-    var events = [];
-    stream.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 lazy stream can't be listened to multiple times", () {
-    var stream = new LazyStream(expectAsync0(() => new Stream.empty()));
-    expect(stream.isBroadcast, isFalse);
-
-    stream.listen(null);
-    expect(() => stream.listen(null), throwsStateError);
-    expect(() => stream.listen(null), throwsStateError);
-  });
-
-  test("a lazy stream can't be listened to from within its callback", () {
-    var stream;
-    stream = new LazyStream(expectAsync0(() {
-      expect(() => stream.listen(null), throwsStateError);
-      return new Stream.empty();
-    }));
-    stream.listen(null);
-  });
-}
diff --git a/packages/async/test/null_stream_sink_test.dart b/packages/async/test/null_stream_sink_test.dart
deleted file mode 100644
index 244f99c..0000000
--- a/packages/async/test/null_stream_sink_test.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-import "utils.dart";
-
-void main() {
-  group("constructors", () {
-    test("done defaults to a completed future", () {
-      var sink = new NullStreamSink();
-      expect(sink.done, completes);
-    });
-
-    test("a custom future may be passed to done", () async {
-      var completer = new Completer();
-      var sink = new NullStreamSink(done: completer.future);
-
-      var doneFired = false;
-      sink.done.then((_) {
-        doneFired = true;
-      });
-      await flushMicrotasks();
-      expect(doneFired, isFalse);
-
-      completer.complete();
-      await flushMicrotasks();
-      expect(doneFired, isTrue);
-    });
-
-    test("NullStreamSink.error passes an error to done", () {
-      var sink = new NullStreamSink.error("oh no");
-      expect(sink.done, throwsA("oh no"));
-    });
-  });
-
-  group("events", () {
-    test("are silently dropped before close", () {
-      var sink = new NullStreamSink();
-      sink.add(1);
-      sink.addError("oh no");
-    });
-
-    test("throw StateErrors after close", () {
-      var sink = new NullStreamSink();
-      expect(sink.close(), completes);
-
-      expect(() => sink.add(1), throwsStateError);
-      expect(() => sink.addError("oh no"), throwsStateError);
-      expect(() => sink.addStream(new Stream.empty()), throwsStateError);
-    });
-
-    group("addStream", () {
-      test("listens to the stream then cancels immediately", () async {
-        var sink = new NullStreamSink();
-        var canceled = false;
-        var controller = new StreamController(onCancel: () {
-          canceled = true;
-        });
-
-        expect(sink.addStream(controller.stream), completes);
-        await flushMicrotasks();
-        expect(canceled, isTrue);
-      });
-
-      test("returns the cancel future", () async {
-        var completer = new Completer();
-        var sink = new NullStreamSink();
-        var controller = new StreamController(onCancel: () => completer.future);
-
-        var addStreamFired = false;
-        sink.addStream(controller.stream).then((_) {
-          addStreamFired = true;
-        });
-        await flushMicrotasks();
-        expect(addStreamFired, isFalse);
-
-        completer.complete();
-        await flushMicrotasks();
-        expect(addStreamFired, isTrue);
-      });
-
-      test("pipes errors from the cancel future through addStream", () async {
-        var sink = new NullStreamSink();
-        var controller = new StreamController(onCancel: () => throw "oh no");
-        expect(sink.addStream(controller.stream), throwsA("oh no"));
-      });
-
-      test("causes events to throw StateErrors until the future completes",
-          () async {
-        var sink = new NullStreamSink();
-        var future = sink.addStream(new Stream.empty());
-        expect(() => sink.add(1), throwsStateError);
-        expect(() => sink.addError("oh no"), throwsStateError);
-        expect(() => sink.addStream(new Stream.empty()), throwsStateError);
-
-        await future;
-        sink.add(1);
-        sink.addError("oh no");
-        expect(sink.addStream(new Stream.empty()), completes);
-      });
-    });
-  });
-
-  test("close returns the done future", () {
-    var sink = new NullStreamSink.error("oh no");
-    expect(sink.close(), throwsA("oh no"));
-  });
-}
diff --git a/packages/async/test/restartable_timer_test.dart b/packages/async/test/restartable_timer_test.dart
deleted file mode 100644
index 4f59f62..0000000
--- a/packages/async/test/restartable_timer_test.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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:async/async.dart';
-import 'package:fake_async/fake_async.dart';
-import 'package:test/test.dart';
-
-main() {
-  test("runs the callback once the duration has elapsed", () {
-    new FakeAsync().run((async) {
-      var fired = false;
-      new RestartableTimer(new Duration(seconds: 5), () {
-        fired = true;
-      });
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-
-      async.elapse(new Duration(seconds: 1));
-      expect(fired, isTrue);
-    });
-  });
-
-  test("doesn't run the callback if the timer is canceled", () {
-    new FakeAsync().run((async) {
-      var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
-        fired = true;
-      });
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-      timer.cancel();
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-    });
-  });
-
-  test("resets the duration if the timer is reset before it fires", () {
-    new FakeAsync().run((async) {
-      var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
-        fired = true;
-      });
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-      timer.reset();
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-
-      async.elapse(new Duration(seconds: 1));
-      expect(fired, isTrue);
-    });
-  });
-
-  test("re-runs the callback if the timer is reset after firing", () {
-    new FakeAsync().run((async) {
-      var fired = 0;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
-        fired++;
-      });
-
-      async.elapse(new Duration(seconds: 5));
-      expect(fired, equals(1));
-      timer.reset();
-
-      async.elapse(new Duration(seconds: 5));
-      expect(fired, equals(2));
-      timer.reset();
-
-      async.elapse(new Duration(seconds: 5));
-      expect(fired, equals(3));
-    });
-  });
-
-  test("runs the callback if the timer is reset after being canceled", () {
-    new FakeAsync().run((async) {
-      var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
-        fired = true;
-      });
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-      timer.cancel();
-
-      async.elapse(new Duration(seconds: 4));
-      expect(fired, isFalse);
-      timer.reset();
-
-      async.elapse(new Duration(seconds: 5));
-      expect(fired, isTrue);
-    });
-  });
-
-  test("only runs the callback once if the timer isn't reset", () {
-    new FakeAsync().run((async) {
-      new RestartableTimer(
-          new Duration(seconds: 5), expectAsync0(() {}, count: 1));
-      async.elapse(new Duration(seconds: 10));
-    });
-  });
-}
diff --git a/packages/async/test/result/result_captureAll_test.dart b/packages/async/test/result/result_captureAll_test.dart
deleted file mode 100644
index 172e38a..0000000
--- a/packages/async/test/result/result_captureAll_test.dart
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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" show Random;
-import "package:async/async.dart";
-import "package:test/test.dart";
-
-final someStack = StackTrace.current;
-Result<int> res(int n) => new Result<int>.value(n);
-Result err(n) => new ErrorResult("$n", someStack);
-
-/// Helper function creating an iterable of futures.
-Iterable<Future<int>> futures(int count, {bool throwWhen(int index)}) sync* {
-  for (int i = 0; i < count; i++) {
-    if (throwWhen != null && throwWhen(i)) {
-      yield new Future<int>.error("$i", someStack);
-    } else {
-      yield new Future<int>.value(i);
-    }
-  }
-}
-
-main() {
-  test("empty", () async {
-    var all = await Result.captureAll<int>(futures(0));
-    expect(all, []);
-  });
-
-  group("futures only,", () {
-    test("single", () async {
-      var all = await Result.captureAll<int>(futures(1));
-      expect(all, [res(0)]);
-    });
-
-    test("multiple", () async {
-      var all = await Result.captureAll<int>(futures(3));
-      expect(all, [res(0), res(1), res(2)]);
-    });
-
-    test("error only", () async {
-      var all =
-          await Result.captureAll<int>(futures(1, throwWhen: (_) => true));
-      expect(all, [err(0)]);
-    });
-
-    test("multiple error only", () async {
-      var all =
-          await Result.captureAll<int>(futures(3, throwWhen: (_) => true));
-      expect(all, [err(0), err(1), err(2)]);
-    });
-
-    test("mixed error and value", () async {
-      var all =
-          await Result.captureAll<int>(futures(4, throwWhen: (x) => x.isOdd));
-      expect(all, [res(0), err(1), res(2), err(3)]);
-    });
-
-    test("completion permutation 1-2-3", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[0].complete(1);
-      await 0;
-      cs[1].complete(2);
-      await 0;
-      cs[2].completeError("3", someStack);
-    });
-
-    test("completion permutation 1-3-2", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[0].complete(1);
-      await 0;
-      cs[2].completeError("3", someStack);
-      await 0;
-      cs[1].complete(2);
-    });
-
-    test("completion permutation 2-1-3", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[1].complete(2);
-      await 0;
-      cs[0].complete(1);
-      await 0;
-      cs[2].completeError("3", someStack);
-    });
-
-    test("completion permutation 2-3-1", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[1].complete(2);
-      await 0;
-      cs[2].completeError("3", someStack);
-      await 0;
-      cs[0].complete(1);
-    });
-
-    test("completion permutation 3-1-2", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[2].completeError("3", someStack);
-      await 0;
-      cs[0].complete(1);
-      await 0;
-      cs[1].complete(2);
-    });
-
-    test("completion permutation 3-2-1", () async {
-      var cs = new List.generate(3, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      expect(all, completion([res(1), res(2), err(3)]));
-      await 0;
-      cs[2].completeError("3", someStack);
-      await 0;
-      cs[1].complete(2);
-      await 0;
-      cs[0].complete(1);
-    });
-
-    var seed = new Random().nextInt(0x100000000);
-    int n = 25; // max 32, otherwise rnd.nextInt(1<<n) won't work.
-    test("randomized #$n seed:${seed.toRadixString(16)}", () async {
-      var cs = new List.generate(n, (_) => new Completer<int>());
-      var all = Result.captureAll<int>(cs.map((c) => c.future));
-      var rnd = new Random(seed);
-      var throwFlags = rnd.nextInt(1 << n); // Bit-flag for throwing.
-      bool throws(index) => (throwFlags & (1 << index)) != 0;
-      var expected = new List.generate(n, (x) => throws(x) ? err(x) : res(x));
-
-      expect(all, completion(expected));
-
-      var completeFunctions = new List<Function()>.generate(n, (i) {
-        var c = cs[i];
-        return () =>
-            throws(i) ? c.completeError("$i", someStack) : c.complete(i);
-      });
-      completeFunctions.shuffle(rnd);
-      for (int i = 0; i < n; i++) {
-        await 0;
-        completeFunctions[i]();
-      }
-    });
-  });
-  group("values only,", () {
-    test("single", () async {
-      var all = await Result.captureAll<int>(<int>[1]);
-      expect(all, [res(1)]);
-    });
-    test("multiple", () async {
-      var all = await Result.captureAll<int>(<int>[1, 2, 3]);
-      expect(all, [res(1), res(2), res(3)]);
-    });
-  });
-  group("mixed futures and values,", () {
-    test("no error", () async {
-      var all = await Result.captureAll<int>(<FutureOr<int>>[
-        1,
-        new Future<int>(() => 2),
-        3,
-        new Future<int>.value(4),
-      ]);
-      expect(all, [res(1), res(2), res(3), res(4)]);
-    });
-    test("error", () async {
-      var all = await Result.captureAll<int>(<FutureOr<int>>[
-        1,
-        new Future<int>(() => 2),
-        3,
-        new Future<int>(() async => await new Future.error("4", someStack)),
-        new Future<int>.value(5)
-      ]);
-      expect(all, [res(1), res(2), res(3), err(4), res(5)]);
-    });
-  });
-}
diff --git a/packages/async/test/result/result_flattenAll_test.dart b/packages/async/test/result/result_flattenAll_test.dart
deleted file mode 100644
index caaf668..0000000
--- a/packages/async/test/result/result_flattenAll_test.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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:async/async.dart";
-import "package:test/test.dart";
-
-final someStack = StackTrace.current;
-Result<T> res<T>(T n) => new Result<T>.value(n);
-Result err(n) => new ErrorResult("$n", someStack);
-
-/// Helper function creating an iterable of results.
-Iterable<Result<int>> results(int count, {bool throwWhen(int index)}) sync* {
-  for (int i = 0; i < count; i++) {
-    if (throwWhen != null && throwWhen(i)) {
-      yield err(i);
-    } else {
-      yield res(i);
-    }
-  }
-}
-
-main() {
-  expectAll(result, expectation) {
-    if (expectation.isError) {
-      expect(result, expectation);
-    } else {
-      expect(result.isValue, true);
-      expect(result.asValue.value, expectation.asValue.value);
-    }
-  }
-
-  test("empty", () {
-    expectAll(Result.flattenAll<int>(results(0)), res([]));
-  });
-  test("single value", () {
-    expectAll(Result.flattenAll<int>(results(1)), res([0]));
-  });
-  test("single error", () {
-    expectAll(
-        Result.flattenAll<int>(results(1, throwWhen: (_) => true)), err(0));
-  });
-  test("multiple values", () {
-    expectAll(Result.flattenAll<int>(results(5)), res([0, 1, 2, 3, 4]));
-  });
-  test("multiple errors", () {
-    expectAll(Result.flattenAll<int>(results(5, throwWhen: (x) => x.isOdd)),
-        err(1)); // First error is result.
-  });
-  test("error last", () {
-    expectAll(
-        Result.flattenAll<int>(results(5, throwWhen: (x) => x == 4)), err(4));
-  });
-}
diff --git a/packages/async/test/result/result_future_test.dart b/packages/async/test/result/result_future_test.dart
deleted file mode 100644
index d8b4e01..0000000
--- a/packages/async/test/result/result_future_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/async/test/result/result_test.dart b/packages/async/test/result/result_test.dart
deleted file mode 100644
index 210ae3f..0000000
--- a/packages/async/test/result/result_test.dart
+++ /dev/null
@@ -1,358 +0,0 @@
-// 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/async.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);
-    var c = new Completer<int>();
-    c.future.then(expectAsync1((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);
-    var c = new Completer<bool>();
-    c.future.then((bool v) {
-      fail("Unexpected value $v");
-    }, onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
-      expect(s, same(stack));
-    }));
-    result.complete(c);
-  });
-
-  test("add sink value", () {
-    var result = new ValueResult<int>(42);
-    EventSink<int> sink = new TestSink(onData: expectAsync1((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: expectAsync2((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(expectAsync1((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: expectAsync2((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(expectAsync1((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(expectAsync1((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(expectAsync1((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: expectAsync2((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: expectAsync2((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(expectAsync1(listener, count: 3), onError: (e, s) {
-      fail("Unexpected error: $e");
-    }, onDone: expectAsync0(() {}), 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);
-    var 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(expectAsync1(dataListener, count: 2),
-        onError: expectAsync2(errorListener, count: 2),
-        onDone: expectAsync0(() {}));
-    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(expectAsync1((v) {
-      expect(v, equals(42));
-    }), onError: expectAsync2((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", () {
-    ErrorResult result = new Result.error("error", stack);
-    bool called = false;
-    result.handle((error) {
-      called = true;
-      expect(error, "error");
-    });
-    expect(called, isTrue);
-  });
-
-  test("handle binary", () {
-    ErrorResult 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", () {
-    ErrorResult 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", () {
-    ErrorResult 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/packages/async/test/single_subscription_transformer_test.dart b/packages/async/test/single_subscription_transformer_test.dart
deleted file mode 100644
index 74e462b..0000000
--- a/packages/async/test/single_subscription_transformer_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-import 'utils.dart';
-
-void main() {
-  test("buffers events as soon as it's bound", () async {
-    var controller = new StreamController.broadcast();
-    var stream =
-        controller.stream.transform(const SingleSubscriptionTransformer());
-
-    // Add events before [stream] has a listener to be sure it buffers them.
-    controller.add(1);
-    controller.add(2);
-    await flushMicrotasks();
-
-    expect(stream.toList(), completion(equals([1, 2, 3, 4])));
-    await flushMicrotasks();
-
-    controller.add(3);
-    controller.add(4);
-    controller.close();
-  });
-
-  test("cancels the subscription to the broadcast stream when it's canceled",
-      () async {
-    var canceled = false;
-    var controller = new StreamController.broadcast(onCancel: () {
-      canceled = true;
-    });
-    var stream =
-        controller.stream.transform(const SingleSubscriptionTransformer());
-    await flushMicrotasks();
-    expect(canceled, isFalse);
-
-    var subscription = stream.listen(null);
-    await flushMicrotasks();
-    expect(canceled, isFalse);
-
-    subscription.cancel();
-    await flushMicrotasks();
-    expect(canceled, isTrue);
-  });
-}
diff --git a/packages/async/test/stream_completer_test.dart b/packages/async/test/stream_completer_test.dart
deleted file mode 100644
index 2e9ff9b..0000000
--- a/packages/async/test/stream_completer_test.dart
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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();
-    StreamController 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);
-    Object 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);
-  });
-
-  group("setError()", () {
-    test("produces a stream that emits a single error", () {
-      var completer = new StreamCompleter();
-      completer.stream.listen(unreachable("data"),
-          onError: expectAsync2((error, stackTrace) {
-        expect(error, equals("oh no"));
-      }), onDone: expectAsync0(() {}));
-
-      completer.setError("oh no");
-    });
-
-    test("produces a stream that emits a single error on a later listen",
-        () async {
-      var completer = new StreamCompleter();
-      completer.setError("oh no");
-      await flushMicrotasks();
-
-      completer.stream.listen(unreachable("data"),
-          onError: expectAsync2((error, stackTrace) {
-        expect(error, equals("oh no"));
-      }), onDone: expectAsync0(() {}));
-    });
-  });
-}
-
-Stream<int> createStream() async* {
-  yield 1;
-  await flushMicrotasks();
-  yield 2;
-  await flushMicrotasks();
-  yield 3;
-  await flushMicrotasks();
-  yield 4;
-}
diff --git a/packages/async/test/stream_group_test.dart b/packages/async/test/stream_group_test.dart
deleted file mode 100644
index 65ddb42..0000000
--- a/packages/async/test/stream_group_test.dart
+++ /dev/null
@@ -1,724 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  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: expectAsync0(() {
-          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: expectAsync0(() {}, 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), completion(null));
-        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), completion(null));
-        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/packages/async/test/stream_queue_test.dart b/packages/async/test/stream_queue_test.dart
deleted file mode 100644
index 8bd9d23..0000000
--- a/packages/async/test/stream_queue_test.dart
+++ /dev/null
@@ -1,1192 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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";
-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<int>();
-      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("eventsDispatched", () {
-    test("increments after a next future completes", () async {
-      var events = new StreamQueue<int>(createStream());
-
-      expect(events.eventsDispatched, equals(0));
-      await flushMicrotasks();
-      expect(events.eventsDispatched, equals(0));
-
-      var next = events.next;
-      expect(events.eventsDispatched, equals(0));
-
-      await next;
-      expect(events.eventsDispatched, equals(1));
-
-      await events.next;
-      expect(events.eventsDispatched, equals(2));
-    });
-
-    test("increments multiple times for multi-value requests", () async {
-      var events = new StreamQueue<int>(createStream());
-      await events.take(3);
-      expect(events.eventsDispatched, equals(3));
-    });
-
-    test("increments multiple times for an accepted transaction", () async {
-      var events = new StreamQueue<int>(createStream());
-      await events.withTransaction((queue) async {
-        await queue.next;
-        await queue.next;
-        return true;
-      });
-      expect(events.eventsDispatched, equals(2));
-    });
-
-    test("doesn't increment for rest requests", () async {
-      var events = new StreamQueue<int>(createStream());
-      await events.rest.toList();
-      expect(events.eventsDispatched, equals(0));
-    });
-  });
-
-  group("lookAhead operation", () {
-    test("as simple list of events", () async {
-      var events = new StreamQueue<int>(createStream());
-      expect(await events.lookAhead(4), [1, 2, 3, 4]);
-      expect(await events.next, 1);
-      expect(await events.lookAhead(2), [2, 3]);
-      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.lookAhead(0), completion([]));
-      expect(events.next, completion(1));
-      expect(events.lookAhead(0), completion([]));
-      expect(events.next, completion(2));
-      expect(events.lookAhead(0), completion([]));
-      expect(events.next, completion(3));
-      expect(events.lookAhead(0), completion([]));
-      expect(events.next, completion(4));
-      expect(events.lookAhead(0), completion([]));
-      expect(events.lookAhead(5), completion([]));
-      expect(events.next, throwsStateError);
-      await events.cancel();
-    });
-
-    test("with bad arguments throws", () async {
-      var events = new StreamQueue<int>(createStream());
-      expect(() => events.lookAhead(-1), throwsArgumentError);
-      expect(await events.next, 1); // Did not consume event.
-      expect(() => events.lookAhead(-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.lookAhead(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.lookAhead(6), [3, 4]);
-      await events.cancel();
-    });
-
-    test("error", () async {
-      var events = new StreamQueue<int>(createErrorStream());
-      expect(events.lookAhead(4), throwsA("To err is divine!"));
-      expect(events.take(4), throwsA("To err is divine!"));
-      expect(await events.next, 4);
-      await events.cancel();
-    });
-  });
-
-  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.
-      Func1Required<int> 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<int>(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("peek operation", () {
-    test("peeks one event", () async {
-      var events = new StreamQueue<int>(createStream());
-      expect(await events.peek, 1);
-      expect(await events.next, 1);
-      expect(await events.peek, 2);
-      expect(await events.take(2), [2, 3]);
-      expect(await events.peek, 4);
-      expect(await events.next, 4);
-      // Throws at end.
-      expect(events.peek, throws);
-      await events.cancel();
-    });
-    test("multiple requests at the same time", () async {
-      var events = new StreamQueue<int>(createStream());
-      var result = await Future.wait(
-          [events.peek, events.peek, events.next, events.peek, events.peek]);
-      expect(result, [1, 1, 1, 2, 2]);
-      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.peek, throwsA("To err is divine!"));
-      // Error stays in queue.
-      expect(events.peek, throwsA("To err is divine!"));
-      expect(events.next, throwsA("To err is divine!"));
-      expect(await events.next, 4);
-      await events.cancel();
-    });
-  });
-
-  group("cancel operation", () {
-    test("closes the events, prevents any other operation", () async {
-      var events = new StreamQueue<int>(createStream());
-      await events.cancel();
-      expect(() => events.lookAhead(1), throwsStateError);
-      expect(() => events.next, throwsStateError);
-      expect(() => events.peek, 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<int>(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<int>(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<int>();
-        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<int>(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<int>(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<int>(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 = <int>[];
-      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 = <int>[];
-      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<int>();
-      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<int>();
-      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 = <Object>[];
-      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("startTransaction operation produces a transaction that", () {
-    StreamQueue<int> events;
-    StreamQueueTransaction<int> transaction;
-    StreamQueue<int> queue1;
-    StreamQueue<int> queue2;
-    setUp(() async {
-      events = new StreamQueue(createStream());
-      expect(await events.next, 1);
-      transaction = events.startTransaction();
-      queue1 = transaction.newQueue();
-      queue2 = transaction.newQueue();
-    });
-
-    group("emits queues that", () {
-      test("independently emit events", () async {
-        expect(await queue1.next, 2);
-        expect(await queue2.next, 2);
-        expect(await queue2.next, 3);
-        expect(await queue1.next, 3);
-        expect(await queue1.next, 4);
-        expect(await queue2.next, 4);
-        expect(await queue1.hasNext, isFalse);
-        expect(await queue2.hasNext, isFalse);
-      });
-
-      test("queue requests for events", () async {
-        expect(queue1.next, completion(2));
-        expect(queue2.next, completion(2));
-        expect(queue2.next, completion(3));
-        expect(queue1.next, completion(3));
-        expect(queue1.next, completion(4));
-        expect(queue2.next, completion(4));
-        expect(queue1.hasNext, completion(isFalse));
-        expect(queue2.hasNext, completion(isFalse));
-      });
-
-      test("independently emit errors", () async {
-        events = new StreamQueue(createErrorStream());
-        expect(await events.next, 1);
-        transaction = events.startTransaction();
-        queue1 = transaction.newQueue();
-        queue2 = transaction.newQueue();
-
-        expect(queue1.next, completion(2));
-        expect(queue2.next, completion(2));
-        expect(queue2.next, throwsA("To err is divine!"));
-        expect(queue1.next, throwsA("To err is divine!"));
-        expect(queue1.next, completion(4));
-        expect(queue2.next, completion(4));
-        expect(queue1.hasNext, completion(isFalse));
-        expect(queue2.hasNext, completion(isFalse));
-      });
-    });
-
-    group("when rejected", () {
-      test("further original requests use the previous state", () async {
-        expect(await queue1.next, 2);
-        expect(await queue2.next, 2);
-        expect(await queue2.next, 3);
-
-        await flushMicrotasks();
-        transaction.reject();
-
-        expect(await events.next, 2);
-        expect(await events.next, 3);
-        expect(await events.next, 4);
-        expect(await events.hasNext, isFalse);
-      });
-
-      test("pending original requests use the previous state", () async {
-        expect(await queue1.next, 2);
-        expect(await queue2.next, 2);
-        expect(await queue2.next, 3);
-        expect(events.next, completion(2));
-        expect(events.next, completion(3));
-        expect(events.next, completion(4));
-        expect(events.hasNext, completion(isFalse));
-
-        await flushMicrotasks();
-        transaction.reject();
-      });
-
-      test("further child requests act as though the stream was closed",
-          () async {
-        expect(await queue1.next, 2);
-        transaction.reject();
-
-        expect(await queue1.hasNext, isFalse);
-        expect(queue1.next, throwsStateError);
-      });
-
-      test("pending child requests act as though the stream was closed",
-          () async {
-        expect(await queue1.next, 2);
-        expect(queue1.hasNext, completion(isFalse));
-        expect(queue1.next, throwsStateError);
-        transaction.reject();
-      });
-
-      // Regression test.
-      test("pending child rest requests emit no more events", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
-        var transaction = events.startTransaction();
-        var queue = transaction.newQueue();
-
-        // This should emit no more events after the transaction is rejected.
-        queue.rest.listen(expectAsync1((_) {}, count: 3),
-            onDone: expectAsync0(() {}, count: 0));
-
-        controller.add(1);
-        controller.add(2);
-        controller.add(3);
-        await flushMicrotasks();
-
-        transaction.reject();
-        await flushMicrotasks();
-
-        // These shouldn't affect the result of `queue.rest.toList()`.
-        controller.add(4);
-        controller.add(5);
-      });
-
-      test("child requests' cancel() may still be called explicitly", () async {
-        transaction.reject();
-        await queue1.cancel();
-      });
-
-      test("calls to commit() or reject() fail", () async {
-        transaction.reject();
-        expect(transaction.reject, throwsStateError);
-        expect(() => transaction.commit(queue1), throwsStateError);
-      });
-
-      test("before the transaction emits any events, does nothing", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
-
-        // Queue a request before the transaction, but don't let it complete
-        // until we're done with the transaction.
-        expect(events.next, completion(equals(1)));
-        events.startTransaction().reject();
-        expect(events.next, completion(equals(2)));
-
-        await flushMicrotasks();
-        controller.add(1);
-        await flushMicrotasks();
-        controller.add(2);
-        await flushMicrotasks();
-        controller.close();
-      });
-    });
-
-    group("when committed", () {
-      test("further original requests use the committed state", () async {
-        expect(await queue1.next, 2);
-        await flushMicrotasks();
-        transaction.commit(queue1);
-        expect(await events.next, 3);
-      });
-
-      test("pending original requests use the committed state", () async {
-        expect(await queue1.next, 2);
-        expect(events.next, completion(3));
-        await flushMicrotasks();
-        transaction.commit(queue1);
-      });
-
-      test("further child requests act as though the stream was closed",
-          () async {
-        expect(await queue2.next, 2);
-        transaction.commit(queue2);
-
-        expect(await queue1.hasNext, isFalse);
-        expect(queue1.next, throwsStateError);
-      });
-
-      test("pending child requests act as though the stream was closed",
-          () async {
-        expect(await queue2.next, 2);
-        expect(queue1.hasNext, completion(isFalse));
-        expect(queue1.next, throwsStateError);
-        transaction.commit(queue2);
-      });
-
-      test("further requests act as though the stream was closed", () async {
-        expect(await queue1.next, 2);
-        transaction.commit(queue1);
-
-        expect(await queue1.hasNext, isFalse);
-        expect(queue1.next, throwsStateError);
-      });
-
-      test("cancel() may still be called explicitly", () async {
-        expect(await queue1.next, 2);
-        transaction.commit(queue1);
-        await queue1.cancel();
-      });
-
-      test("throws if there are pending requests", () async {
-        expect(await queue1.next, 2);
-        expect(queue1.hasNext, completion(isTrue));
-        expect(() => transaction.commit(queue1), throwsStateError);
-      });
-
-      test("calls to commit() or reject() fail", () async {
-        transaction.commit(queue1);
-        expect(transaction.reject, throwsStateError);
-        expect(() => transaction.commit(queue1), throwsStateError);
-      });
-
-      test("before the transaction emits any events, does nothing", () async {
-        var controller = new StreamController();
-        var events = new StreamQueue(controller.stream);
-
-        // Queue a request before the transaction, but don't let it complete
-        // until we're done with the transaction.
-        expect(events.next, completion(equals(1)));
-        var transaction = events.startTransaction();
-        transaction.commit(transaction.newQueue());
-        expect(events.next, completion(equals(2)));
-
-        await flushMicrotasks();
-        controller.add(1);
-        await flushMicrotasks();
-        controller.add(2);
-        await flushMicrotasks();
-        controller.close();
-      });
-    });
-  });
-
-  group("withTransaction operation", () {
-    StreamQueue<int> events;
-    setUp(() async {
-      events = new StreamQueue(createStream());
-      expect(await events.next, 1);
-    });
-
-    test("passes a copy of the parent queue", () async {
-      await events.withTransaction(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-        expect(await queue.next, 3);
-        expect(await queue.next, 4);
-        expect(await queue.hasNext, isFalse);
-        return true;
-      }));
-    });
-
-    test(
-        "the parent queue continues from the child position if it returns "
-        "true", () async {
-      await events.withTransaction(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-        return true;
-      }));
-
-      expect(await events.next, 3);
-    });
-
-    test(
-        "the parent queue continues from its original position if it returns "
-        "false", () async {
-      await events.withTransaction(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-        return false;
-      }));
-
-      expect(await events.next, 2);
-    });
-
-    test("the parent queue continues from the child position if it throws", () {
-      expect(events.withTransaction(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-        throw "oh no";
-      })), throwsA("oh no"));
-
-      expect(events.next, completion(3));
-    });
-
-    test("returns whether the transaction succeeded", () {
-      expect(events.withTransaction((_) async => true), completion(isTrue));
-      expect(events.withTransaction((_) async => false), completion(isFalse));
-    });
-  });
-
-  group("cancelable operation", () {
-    StreamQueue<int> events;
-    setUp(() async {
-      events = new StreamQueue(createStream());
-      expect(await events.next, 1);
-    });
-
-    test("passes a copy of the parent queue", () async {
-      await events.cancelable(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-        expect(await queue.next, 3);
-        expect(await queue.next, 4);
-        expect(await queue.hasNext, isFalse);
-      })).value;
-    });
-
-    test("the parent queue continues from the child position by default",
-        () async {
-      await events.cancelable(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-      })).value;
-
-      expect(await events.next, 3);
-    });
-
-    test(
-        "the parent queue continues from the child position if an error is "
-        "thrown", () async {
-      expect(
-          events.cancelable(expectAsync1((queue) async {
-            expect(await queue.next, 2);
-            throw "oh no";
-          })).value,
-          throwsA("oh no"));
-
-      expect(events.next, completion(3));
-    });
-
-    test("the parent queue continues from the original position if canceled",
-        () async {
-      var operation = events.cancelable(expectAsync1((queue) async {
-        expect(await queue.next, 2);
-      }));
-      operation.cancel();
-
-      expect(await events.next, 2);
-    });
-
-    test("forwards the value from the callback", () async {
-      expect(
-          await events.cancelable(expectAsync1((queue) async {
-            expect(await queue.next, 2);
-            return "value";
-          })).value,
-          "value");
-    });
-  });
-
-  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)));
-  });
-}
-
-typedef T Func1Required<T>(T value);
-
-Stream<int> createStream() async* {
-  yield 1;
-  await flushMicrotasks();
-  yield 2;
-  await flushMicrotasks();
-  yield 3;
-  await flushMicrotasks();
-  yield 4;
-}
-
-Stream<int> createErrorStream() {
-  var 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/packages/async/test/stream_sink_completer_test.dart b/packages/async/test/stream_sink_completer_test.dart
deleted file mode 100644
index 3c8b576..0000000
--- a/packages/async/test/stream_sink_completer_test.dart
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-import "utils.dart";
-
-main() {
-  var completer;
-  setUp(() {
-    completer = new StreamSinkCompleter();
-  });
-
-  group("when a stream is linked before events are added", () {
-    test("data events are forwarded", () {
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      completer.sink..add(1)..add(2)..add(3)..add(4);
-
-      expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asValue.value, equals(2));
-      expect(sink.results[2].asValue.value, equals(3));
-      expect(sink.results[3].asValue.value, equals(4));
-    });
-
-    test("error events are forwarded", () {
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      completer.sink..addError("oh no")..addError("that's bad");
-
-      expect(sink.results[0].asError.error, equals("oh no"));
-      expect(sink.results[1].asError.error, equals("that's bad"));
-    });
-
-    test("addStream is forwarded", () async {
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-
-      var controller = new StreamController();
-      completer.sink.addStream(controller.stream);
-
-      controller.add(1);
-      controller.addError("oh no");
-      controller.add(2);
-      controller.addError("that's bad");
-      await flushMicrotasks();
-
-      expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asError.error, equals("oh no"));
-      expect(sink.results[2].asValue.value, equals(2));
-      expect(sink.results[3].asError.error, equals("that's bad"));
-      expect(sink.isClosed, isFalse);
-
-      controller.close();
-      await flushMicrotasks();
-      expect(sink.isClosed, isFalse);
-    });
-
-    test("close() is forwarded", () {
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      completer.sink.close();
-      expect(sink.isClosed, isTrue);
-    });
-
-    test("the future from the inner close() is returned", () async {
-      var closeCompleter = new Completer();
-      var sink = new TestSink(onDone: () => closeCompleter.future);
-      completer.setDestinationSink(sink);
-
-      var closeCompleted = false;
-      completer.sink.close().then(expectAsync1((_) {
-        closeCompleted = true;
-      }));
-
-      await flushMicrotasks();
-      expect(closeCompleted, isFalse);
-
-      closeCompleter.complete();
-      await flushMicrotasks();
-      expect(closeCompleted, isTrue);
-    });
-
-    test("errors are forwarded from the inner close()", () {
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
-    });
-
-    test("errors aren't top-leveled if only close() is listened to", () async {
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-      expect(completer.sink.close(), throwsA("oh no"));
-
-      // Give the event loop a chance to top-level errors if it's going to.
-      await flushMicrotasks();
-    });
-
-    test("errors aren't top-leveled if only done is listened to", () async {
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-      completer.sink.close();
-      expect(completer.sink.done, throwsA("oh no"));
-
-      // Give the event loop a chance to top-level errors if it's going to.
-      await flushMicrotasks();
-    });
-  });
-
-  group("when a stream is linked after events are added", () {
-    test("data events are forwarded", () async {
-      completer.sink..add(1)..add(2)..add(3)..add(4);
-      await flushMicrotasks();
-
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      await flushMicrotasks();
-
-      expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asValue.value, equals(2));
-      expect(sink.results[2].asValue.value, equals(3));
-      expect(sink.results[3].asValue.value, equals(4));
-    });
-
-    test("error events are forwarded", () async {
-      completer.sink..addError("oh no")..addError("that's bad");
-      await flushMicrotasks();
-
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      await flushMicrotasks();
-
-      expect(sink.results[0].asError.error, equals("oh no"));
-      expect(sink.results[1].asError.error, equals("that's bad"));
-    });
-
-    test("addStream is forwarded", () async {
-      var controller = new StreamController();
-      completer.sink.addStream(controller.stream);
-
-      controller.add(1);
-      controller.addError("oh no");
-      controller.add(2);
-      controller.addError("that's bad");
-      controller.close();
-      await flushMicrotasks();
-
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      await flushMicrotasks();
-
-      expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asError.error, equals("oh no"));
-      expect(sink.results[2].asValue.value, equals(2));
-      expect(sink.results[3].asError.error, equals("that's bad"));
-      expect(sink.isClosed, isFalse);
-    });
-
-    test("close() is forwarded", () async {
-      completer.sink.close();
-      await flushMicrotasks();
-
-      var sink = new TestSink();
-      completer.setDestinationSink(sink);
-      await flushMicrotasks();
-
-      expect(sink.isClosed, isTrue);
-    });
-
-    test("the future from the inner close() is returned", () async {
-      var closeCompleted = false;
-      completer.sink.close().then(expectAsync1((_) {
-        closeCompleted = true;
-      }));
-      await flushMicrotasks();
-
-      var closeCompleter = new Completer();
-      var sink = new TestSink(onDone: () => closeCompleter.future);
-      completer.setDestinationSink(sink);
-      await flushMicrotasks();
-      expect(closeCompleted, isFalse);
-
-      closeCompleter.complete();
-      await flushMicrotasks();
-      expect(closeCompleted, isTrue);
-    });
-
-    test("errors are forwarded from the inner close()", () async {
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
-      await flushMicrotasks();
-
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-    });
-
-    test("errors aren't top-leveled if only close() is listened to", () async {
-      expect(completer.sink.close(), throwsA("oh no"));
-      await flushMicrotasks();
-
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-
-      // Give the event loop a chance to top-level errors if it's going to.
-      await flushMicrotasks();
-    });
-
-    test("errors aren't top-leveled if only done is listened to", () async {
-      completer.sink.close();
-      expect(completer.sink.done, throwsA("oh no"));
-      await flushMicrotasks();
-
-      var sink = new TestSink(onDone: () => throw "oh no");
-      completer.setDestinationSink(sink);
-
-      // Give the event loop a chance to top-level errors if it's going to.
-      await flushMicrotasks();
-    });
-  });
-
-  test("the sink is closed, the destination is set, then done is read",
-      () async {
-    expect(completer.sink.close(), completes);
-    await flushMicrotasks();
-
-    completer.setDestinationSink(new TestSink());
-    await flushMicrotasks();
-
-    expect(completer.sink.done, completes);
-  });
-
-  test("done is read, the destination is set, then the sink is closed",
-      () async {
-    expect(completer.sink.done, completes);
-    await flushMicrotasks();
-
-    completer.setDestinationSink(new TestSink());
-    await flushMicrotasks();
-
-    expect(completer.sink.close(), completes);
-  });
-
-  group("fromFuture()", () {
-    test("with a successful completion", () async {
-      var futureCompleter = new Completer<StreamSink>();
-      var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
-      sink.add(1);
-      sink.add(2);
-      sink.add(3);
-      sink.close();
-
-      var testSink = new TestSink();
-      futureCompleter.complete(testSink);
-      await testSink.done;
-
-      expect(testSink.results[0].asValue.value, equals(1));
-      expect(testSink.results[1].asValue.value, equals(2));
-      expect(testSink.results[2].asValue.value, equals(3));
-    });
-
-    test("with an error", () async {
-      var futureCompleter = new Completer<StreamSink>();
-      var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
-      expect(sink.done, throwsA("oh no"));
-      futureCompleter.completeError("oh no");
-    });
-  });
-
-  group("setError()", () {
-    test("produces a closed sink with the error", () {
-      completer.setError("oh no");
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
-    });
-
-    test("produces an error even if done was accessed earlier", () async {
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
-      await flushMicrotasks();
-
-      completer.setError("oh no");
-    });
-  });
-
-  test("doesn't allow the destination sink to be set multiple times", () {
-    completer.setDestinationSink(new TestSink());
-    expect(
-        () => completer.setDestinationSink(new TestSink()), throwsStateError);
-    expect(
-        () => completer.setDestinationSink(new TestSink()), throwsStateError);
-  });
-}
diff --git a/packages/async/test/stream_sink_transformer_test.dart b/packages/async/test/stream_sink_transformer_test.dart
deleted file mode 100644
index 208a03a..0000000
--- a/packages/async/test/stream_sink_transformer_test.dart
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// 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";
-import "package:test/test.dart";
-
-import "utils.dart";
-
-void main() {
-  var controller;
-  setUp(() {
-    controller = new StreamController();
-  });
-
-  group("fromStreamTransformer", () {
-    test("transforms data events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleData: (i, sink) {
-        sink.add(i * 2);
-      }));
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(results.add, onDone: expectAsync0(() {
-        expect(results, equals([2, 4, 6]));
-      }));
-
-      sink.add(1);
-      sink.add(2);
-      sink.add(3);
-      sink.close();
-    });
-
-    test("transforms error events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(
-              handleError: (i, stackTrace, sink) {
-        sink.addError((i as num) * 2, stackTrace);
-      }));
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(expectAsync1((_) {}, count: 0),
-          onError: (error, stackTrace) {
-        results.add(error);
-      }, onDone: expectAsync0(() {
-        expect(results, equals([2, 4, 6]));
-      }));
-
-      sink.addError(1);
-      sink.addError(2);
-      sink.addError(3);
-      sink.close();
-    });
-
-    test("transforms done events", () {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleDone: (sink) {
-        sink.add(1);
-        sink.close();
-      }));
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(results.add, onDone: expectAsync0(() {
-        expect(results, equals([1]));
-      }));
-
-      sink.close();
-    });
-
-    test("forwards the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers());
-      var innerSink = new CompleterStreamSink();
-      var sink = transformer.bind(innerSink);
-
-      // The futures shouldn't complete until the inner sink's close future
-      // completes.
-      var doneResult = new ResultFuture(sink.done);
-      doneResult.catchError((_) {});
-      var closeResult = new ResultFuture(sink.close());
-      closeResult.catchError((_) {});
-      await flushMicrotasks();
-      expect(doneResult.isComplete, isFalse);
-      expect(closeResult.isComplete, isFalse);
-
-      // Once the inner sink is completed, the futures should fire.
-      innerSink.completer.complete();
-      await flushMicrotasks();
-      expect(doneResult.isComplete, isTrue);
-      expect(closeResult.isComplete, isTrue);
-    });
-
-    test("doesn't top-level the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromStreamTransformer(
-          new StreamTransformer.fromHandlers(handleData: (_, sink) {
-        sink.close();
-      }));
-      var innerSink = new CompleterStreamSink();
-      var sink = transformer.bind(innerSink);
-
-      // This will close the inner sink, but it shouldn't top-level the error.
-      sink.add(1);
-      innerSink.completer.completeError("oh no");
-      await flushMicrotasks();
-
-      // The error should be piped through done and close even if they're called
-      // after the underlying sink is closed.
-      expect(sink.done, throwsA("oh no"));
-      expect(sink.close(), throwsA("oh no"));
-    });
-  });
-
-  group("fromHandlers", () {
-    test("transforms data events", () {
-      var transformer =
-          new StreamSinkTransformer.fromHandlers(handleData: (i, sink) {
-        sink.add(i * 2);
-      });
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(results.add, onDone: expectAsync0(() {
-        expect(results, equals([2, 4, 6]));
-      }));
-
-      sink.add(1);
-      sink.add(2);
-      sink.add(3);
-      sink.close();
-    });
-
-    test("transforms error events", () {
-      var transformer = new StreamSinkTransformer.fromHandlers(
-          handleError: (i, stackTrace, sink) {
-        sink.addError((i as num) * 2, stackTrace);
-      });
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(expectAsync1((_) {}, count: 0),
-          onError: (error, stackTrace) {
-        results.add(error);
-      }, onDone: expectAsync0(() {
-        expect(results, equals([2, 4, 6]));
-      }));
-
-      sink.addError(1);
-      sink.addError(2);
-      sink.addError(3);
-      sink.close();
-    });
-
-    test("transforms done events", () {
-      var transformer =
-          new StreamSinkTransformer.fromHandlers(handleDone: (sink) {
-        sink.add(1);
-        sink.close();
-      });
-      var sink = transformer.bind(controller.sink);
-
-      var results = [];
-      controller.stream.listen(results.add, onDone: expectAsync0(() {
-        expect(results, equals([1]));
-      }));
-
-      sink.close();
-    });
-
-    test("forwards the future from inner.close", () async {
-      var transformer = new StreamSinkTransformer.fromHandlers();
-      var innerSink = new CompleterStreamSink();
-      var sink = transformer.bind(innerSink);
-
-      // The futures shouldn't complete until the inner sink's close future
-      // completes.
-      var doneResult = new ResultFuture(sink.done);
-      doneResult.catchError((_) {});
-      var closeResult = new ResultFuture(sink.close());
-      closeResult.catchError((_) {});
-      await flushMicrotasks();
-      expect(doneResult.isComplete, isFalse);
-      expect(closeResult.isComplete, isFalse);
-
-      // Once the inner sink is completed, the futures should fire.
-      innerSink.completer.complete();
-      await flushMicrotasks();
-      expect(doneResult.isComplete, isTrue);
-      expect(closeResult.isComplete, isTrue);
-    });
-
-    test("doesn't top-level the future from inner.close", () async {
-      var transformer =
-          new StreamSinkTransformer.fromHandlers(handleData: (_, sink) {
-        sink.close();
-      });
-      var innerSink = new CompleterStreamSink();
-      var sink = transformer.bind(innerSink);
-
-      // This will close the inner sink, but it shouldn't top-level the error.
-      sink.add(1);
-      innerSink.completer.completeError("oh no");
-      await flushMicrotasks();
-
-      // The error should be piped through done and close even if they're called
-      // after the underlying sink is closed.
-      expect(sink.done, throwsA("oh no"));
-      expect(sink.close(), throwsA("oh no"));
-    });
-  });
-}
diff --git a/packages/async/test/stream_splitter_test.dart b/packages/async/test/stream_splitter_test.dart
deleted file mode 100644
index 68a6b74..0000000
--- a/packages/async/test/stream_splitter_test.dart
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  StreamController<int> 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(
-        expectAsync1((value) {
-          expect(count, anyOf(0, 2));
-          expect(value, equals(count + 1));
-          count++;
-        }, count: 2), onError: expectAsync1((error) {
-      expect(count, equals(1));
-      expect(error, equals("error"));
-      count++;
-    }), onDone: expectAsync0(() {
-      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/packages/async/test/stream_zip_test.dart b/packages/async/test/stream_zip_test.dart
deleted file mode 100644
index 71d8eee..0000000
--- a/packages/async/test/stream_zip_test.dart
+++ /dev/null
@@ -1,324 +0,0 @@
-// 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/async.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<Stream> streams, Iterable expectedData) {
-    List data = [];
-    Stream zip = new StreamZip(streams);
-    zip.listen(data.add, onDone: expectAsync0(() {
-      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 = expectAsync0(() {
-      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(expectAsync1((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/packages/async/test/stream_zip_zone_test.dart b/packages/async/test/stream_zip_zone_test.dart
deleted file mode 100644
index a0773a6..0000000
--- a/packages/async/test/stream_zip_zone_test.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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(expectAsync1((v) {
-        expect(v, 42);
-        expect(Zone.current, newZone1);
-        outer.run(() {
-          sub.onData(expectAsync1((v) {
-            expect(v, 37);
-            expect(Zone.current, newZone1);
-            runZoned(() {
-              sub.onData(expectAsync1((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/packages/async/test/subscription_stream_test.dart b/packages/async/test/subscription_stream_test.dart
deleted file mode 100644
index 6e2c9d5..0000000
--- a/packages/async/test/subscription_stream_test.dart
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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();
-    StreamSubscription<int> 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;
-        var onCancel; // Completes if source stream is canceled before done.
-        setUp(() {
-          var cancelCompleter = new Completer();
-          var source = createErrorStream(cancelCompleter);
-          onCancel = cancelCompleter.future;
-          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) {
-            await onCancel;
-            // And [done] won't complete at all.
-            bool isDone = false;
-            done.future.then((_) {
-              isDone = true;
-            });
-            await new Future.delayed(const Duration(milliseconds: 5));
-            expect(isDone, false);
-          } 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([Completer onCancel]) async* {
-  bool canceled = true;
-  try {
-    yield 1;
-    await flushMicrotasks();
-    yield 2;
-    await flushMicrotasks();
-    yield* new Future<int>.error("To err is divine!").asStream();
-    await flushMicrotasks();
-    yield 4;
-    await flushMicrotasks();
-    canceled = false;
-  } finally {
-    // Completes before the "done", but should be after all events.
-    if (canceled && onCancel != null) {
-      await flushMicrotasks();
-      onCancel.complete();
-    }
-  }
-}
-
-Stream<int> createLongStream() async* {
-  for (int i = 0; i < 200; i++) yield i;
-}
diff --git a/packages/async/test/subscription_transformer_test.dart b/packages/async/test/subscription_transformer_test.dart
deleted file mode 100644
index dbbf597..0000000
--- a/packages/async/test/subscription_transformer_test.dart
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-import 'utils.dart';
-
-void main() {
-  group("with no callbacks", () {
-    test("forwards cancellation", () async {
-      var isCanceled = false;
-      var cancelCompleter = new Completer();
-      var controller = new StreamController(onCancel: expectAsync0(() {
-        isCanceled = true;
-        return cancelCompleter.future;
-      }));
-      var subscription = controller.stream
-          .transform(subscriptionTransformer())
-          .listen(expectAsync1((_) {}, count: 0));
-
-      var cancelFired = false;
-      subscription.cancel().then(expectAsync1((_) {
-        cancelFired = true;
-      }));
-
-      await flushMicrotasks();
-      expect(isCanceled, isTrue);
-      expect(cancelFired, isFalse);
-
-      cancelCompleter.complete();
-      await flushMicrotasks();
-      expect(cancelFired, isTrue);
-
-      // This shouldn't call the onCancel callback again.
-      expect(subscription.cancel(), completes);
-    });
-
-    test("forwards pausing and resuming", () async {
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer())
-          .listen(expectAsync1((_) {}, count: 0));
-
-      subscription.pause();
-      await flushMicrotasks();
-      expect(controller.isPaused, isTrue);
-
-      subscription.pause();
-      await flushMicrotasks();
-      expect(controller.isPaused, isTrue);
-
-      subscription.resume();
-      await flushMicrotasks();
-      expect(controller.isPaused, isTrue);
-
-      subscription.resume();
-      await flushMicrotasks();
-      expect(controller.isPaused, isFalse);
-    });
-
-    test("forwards pausing with a resume future", () async {
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer())
-          .listen(expectAsync1((_) {}, count: 0));
-
-      var completer = new Completer();
-      subscription.pause(completer.future);
-      await flushMicrotasks();
-      expect(controller.isPaused, isTrue);
-
-      completer.complete();
-      await flushMicrotasks();
-      expect(controller.isPaused, isFalse);
-    });
-  });
-
-  group("with a cancel callback", () {
-    test("invokes the callback when the subscription is canceled", () async {
-      var isCanceled = false;
-      var callbackInvoked = false;
-      var controller = new StreamController(onCancel: expectAsync0(() {
-        isCanceled = true;
-      }));
-      var subscription = controller.stream.transform(
-          subscriptionTransformer(handleCancel: expectAsync1((inner) {
-        callbackInvoked = true;
-        inner.cancel();
-      }))).listen(expectAsync1((_) {}, count: 0));
-
-      await flushMicrotasks();
-      expect(callbackInvoked, isFalse);
-      expect(isCanceled, isFalse);
-
-      subscription.cancel();
-      await flushMicrotasks();
-      expect(callbackInvoked, isTrue);
-      expect(isCanceled, isTrue);
-    });
-
-    test("invokes the callback once and caches its result", () async {
-      var completer = new Completer();
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer(
-              handleCancel: expectAsync1((inner) => completer.future)))
-          .listen(expectAsync1((_) {}, count: 0));
-
-      var cancelFired1 = false;
-      subscription.cancel().then(expectAsync1((_) {
-        cancelFired1 = true;
-      }));
-
-      var cancelFired2 = false;
-      subscription.cancel().then(expectAsync1((_) {
-        cancelFired2 = true;
-      }));
-
-      await flushMicrotasks();
-      expect(cancelFired1, isFalse);
-      expect(cancelFired2, isFalse);
-
-      completer.complete();
-      await flushMicrotasks();
-      expect(cancelFired1, isTrue);
-      expect(cancelFired2, isTrue);
-    });
-  });
-
-  group("with a pause callback", () {
-    test("invokes the callback when pause is called", () async {
-      var pauseCount = 0;
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer(
-              handlePause: expectAsync1((inner) {
-            pauseCount++;
-            inner.pause();
-          }, count: 3)))
-          .listen(expectAsync1((_) {}, count: 0));
-
-      await flushMicrotasks();
-      expect(pauseCount, equals(0));
-
-      subscription.pause();
-      await flushMicrotasks();
-      expect(pauseCount, equals(1));
-
-      subscription.pause();
-      await flushMicrotasks();
-      expect(pauseCount, equals(2));
-
-      subscription.resume();
-      subscription.resume();
-      await flushMicrotasks();
-      expect(pauseCount, equals(2));
-
-      subscription.pause();
-      await flushMicrotasks();
-      expect(pauseCount, equals(3));
-    });
-
-    test("doesn't invoke the callback when the subscription has been canceled",
-        () async {
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer(
-              handlePause: expectAsync1((_) {}, count: 0)))
-          .listen(expectAsync1((_) {}, count: 0));
-
-      subscription.cancel();
-      subscription.pause();
-      subscription.pause();
-      subscription.pause();
-    });
-  });
-
-  group("with a resume callback", () {
-    test("invokes the callback when resume is called", () async {
-      var resumeCount = 0;
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer(
-              handleResume: expectAsync1((inner) {
-            resumeCount++;
-            inner.resume();
-          }, count: 3)))
-          .listen(expectAsync1((_) {}, count: 0));
-
-      await flushMicrotasks();
-      expect(resumeCount, equals(0));
-
-      subscription.resume();
-      await flushMicrotasks();
-      expect(resumeCount, equals(1));
-
-      subscription.pause();
-      subscription.pause();
-      await flushMicrotasks();
-      expect(resumeCount, equals(1));
-
-      subscription.resume();
-      await flushMicrotasks();
-      expect(resumeCount, equals(2));
-
-      subscription.resume();
-      await flushMicrotasks();
-      expect(resumeCount, equals(3));
-    });
-
-    test("invokes the callback when a resume future completes", () async {
-      var resumed = false;
-      var controller = new StreamController();
-      var subscription = controller.stream.transform(
-          subscriptionTransformer(handleResume: expectAsync1((inner) {
-        resumed = true;
-        inner.resume();
-      }))).listen(expectAsync1((_) {}, count: 0));
-
-      var completer = new Completer();
-      subscription.pause(completer.future);
-      await flushMicrotasks();
-      expect(resumed, isFalse);
-
-      completer.complete();
-      await flushMicrotasks();
-      expect(resumed, isTrue);
-    });
-
-    test("doesn't invoke the callback when the subscription has been canceled",
-        () async {
-      var controller = new StreamController();
-      var subscription = controller.stream
-          .transform(subscriptionTransformer(
-              handlePause: expectAsync1((_) {}, count: 0)))
-          .listen(expectAsync1((_) {}, count: 0));
-
-      subscription.cancel();
-      subscription.resume();
-      subscription.resume();
-      subscription.resume();
-    });
-  });
-
-  group("when the outer subscription is canceled but the inner is not", () {
-    StreamSubscription subscription;
-    setUp(() {
-      var controller = new StreamController();
-      subscription = controller.stream
-          .transform(subscriptionTransformer(handleCancel: (_) {}))
-          .listen(expectAsync1((_) {}, count: 0),
-              onError: expectAsync2((_, __) {}, count: 0),
-              onDone: expectAsync0(() {}, count: 0));
-      subscription.cancel();
-      controller.add(1);
-      controller.addError("oh no!");
-      controller.close();
-    });
-
-    test("doesn't call a new onData", () async {
-      subscription.onData(expectAsync1((_) {}, count: 0));
-      await flushMicrotasks();
-    });
-
-    test("doesn't call a new onError", () async {
-      subscription.onError(expectAsync2((_, __) {}, count: 0));
-      await flushMicrotasks();
-    });
-
-    test("doesn't call a new onDone", () async {
-      subscription.onDone(expectAsync0(() {}, count: 0));
-      await flushMicrotasks();
-    });
-
-    test("isPaused returns false", () {
-      expect(subscription.isPaused, isFalse);
-    });
-
-    test("asFuture never completes", () async {
-      subscription.asFuture().then(expectAsync1((_) {}, count: 0));
-      await flushMicrotasks();
-    });
-  });
-}
diff --git a/packages/async/test/typed_wrapper/future_test.dart b/packages/async/test/typed_wrapper/future_test.dart
deleted file mode 100644
index 0c8b00a..0000000
--- a/packages/async/test/typed_wrapper/future_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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/typed/future.dart";
-import "package:test/test.dart";
-
-import '../utils.dart';
-
-void main() {
-  group("with valid types, forwards", () {
-    var wrapper;
-    TypeSafeFuture<int> errorWrapper;
-    setUp(() {
-      wrapper = new TypeSafeFuture<int>(new Future<Object>.value(12));
-
-      var error = new Future<Object>.error("oh no");
-      error.catchError((_) {}); // Don't let the error cause the test to fail.
-      errorWrapper = new TypeSafeFuture<int>(error);
-    });
-
-    test("asStream()", () {
-      expect(wrapper.asStream().toList(), completion(equals([12])));
-      expect(errorWrapper.asStream().first, throwsA("oh no"));
-    });
-
-    test("catchError()", () {
-      expect(
-          wrapper.catchError(expectAsync1((_) {}, count: 0),
-              test: expectAsync1((_) {}, count: 0)),
-          completion(equals(12)));
-
-      expect(
-          errorWrapper.catchError(expectAsync1((error) {
-            expect(error, equals("oh no"));
-            return 42;
-          }), test: expectAsync1((error) {
-            expect(error, equals("oh no"));
-            return true;
-          })),
-          completion(equals(42)));
-    });
-
-    test("then()", () {
-      expect(
-          wrapper.then((value) => value.toString()), completion(equals("12")));
-      expect(
-          errorWrapper.then(expectAsync1((_) {}, count: 0)), throwsA("oh no"));
-    });
-
-    test("whenComplete()", () {
-      expect(wrapper.whenComplete(expectAsync0(() {})), completion(equals(12)));
-      expect(errorWrapper.whenComplete(expectAsync0(() {})), throwsA("oh no"));
-    });
-
-    test("timeout()", () {
-      expect(wrapper.timeout(new Duration(seconds: 1)), completion(equals(12)));
-      expect(errorWrapper.timeout(new Duration(seconds: 1)), throwsA("oh no"));
-
-      expect(
-          new TypeSafeFuture<int>(new Completer<Object>().future)
-              .timeout(Duration.ZERO),
-          throwsA(new isInstanceOf<TimeoutException>()));
-
-      expect(
-          new TypeSafeFuture<int>(new Completer<Object>().future)
-              .timeout(Duration.ZERO, onTimeout: expectAsync0(() => 15)),
-          completion(equals(15)));
-    });
-  });
-
-  group("with invalid types", () {
-    TypeSafeFuture<int> wrapper;
-    setUp(() {
-      wrapper = new TypeSafeFuture<int>(new Future<Object>.value("foo"));
-    });
-
-    group("throws a CastError for", () {
-      test("asStream()", () {
-        expect(wrapper.asStream().first, throwsCastError);
-      });
-
-      test("then()", () {
-        expect(
-            wrapper.then(expectAsync1((_) {}, count: 0),
-                onError: expectAsync1((_) {}, count: 0)),
-            throwsCastError);
-      });
-
-      test("whenComplete()", () {
-        expect(wrapper.whenComplete(expectAsync0(() {})).then((_) {}),
-            throwsCastError);
-      });
-
-      test("timeout()", () {
-        expect(wrapper.timeout(new Duration(seconds: 3)).then((_) {}),
-            throwsCastError);
-
-        expect(
-            new TypeSafeFuture<int>(new Completer<Object>().future)
-                .timeout(Duration.ZERO, onTimeout: expectAsync0(() => "foo"))
-                .then((_) {}),
-            throwsCastError);
-      });
-    });
-  });
-}
diff --git a/packages/async/test/typed_wrapper/stream_subscription_test.dart b/packages/async/test/typed_wrapper/stream_subscription_test.dart
deleted file mode 100644
index f52abe7..0000000
--- a/packages/async/test/typed_wrapper/stream_subscription_test.dart
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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/typed/stream_subscription.dart";
-import "package:test/test.dart";
-
-import '../utils.dart';
-
-void main() {
-  group("with valid types, forwards", () {
-    var controller;
-    var wrapper;
-    var isCanceled;
-    setUp(() {
-      controller = new StreamController<Object>(onCancel: () {
-        isCanceled = true;
-      });
-      wrapper =
-          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
-    });
-
-    test("onData()", () {
-      wrapper.onData(expectAsync1((data) {
-        expect(data, equals(1));
-      }));
-      controller.add(1);
-    });
-
-    test("onError()", () {
-      wrapper.onError(expectAsync1((error) {
-        expect(error, equals("oh no"));
-      }));
-      controller.addError("oh no");
-    });
-
-    test("onDone()", () {
-      wrapper.onDone(expectAsync0(() {}));
-      controller.close();
-    });
-
-    test("pause(), resume(), and isPaused", () async {
-      expect(wrapper.isPaused, isFalse);
-
-      wrapper.pause();
-      await flushMicrotasks();
-      expect(controller.isPaused, isTrue);
-      expect(wrapper.isPaused, isTrue);
-
-      wrapper.resume();
-      await flushMicrotasks();
-      expect(controller.isPaused, isFalse);
-      expect(wrapper.isPaused, isFalse);
-    });
-
-    test("cancel()", () async {
-      wrapper.cancel();
-      await flushMicrotasks();
-      expect(isCanceled, isTrue);
-    });
-
-    test("asFuture()", () {
-      expect(wrapper.asFuture(12), completion(equals(12)));
-      controller.close();
-    });
-  });
-
-  group("with invalid types,", () {
-    var controller;
-    var wrapper;
-    var isCanceled;
-    setUp(() {
-      controller = new StreamController<Object>(onCancel: () {
-        isCanceled = true;
-      });
-      wrapper =
-          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
-    });
-
-    group("throws a CastError for", () {
-      test("onData()", () {
-        expect(() {
-          // TODO(nweiz): Use the wrapper declared in setUp when sdk#26226 is
-          // fixed.
-          controller = new StreamController<Object>();
-          wrapper = new TypeSafeStreamSubscription<int>(
-              controller.stream.listen(null));
-
-          wrapper.onData(expectAsync1((_) {}, count: 0));
-          controller.add("foo");
-        }, throwsZonedCastError);
-      });
-    });
-
-    group("doesn't throw a CastError for", () {
-      test("onError()", () {
-        wrapper.onError(expectAsync1((error) {
-          expect(error, equals("oh no"));
-        }));
-        controller.add("foo");
-        controller.addError("oh no");
-      });
-
-      test("onDone()", () {
-        wrapper.onDone(expectAsync0(() {}));
-        controller.add("foo");
-        controller.close();
-      });
-
-      test("pause(), resume(), and isPaused", () async {
-        controller.add("foo");
-
-        expect(wrapper.isPaused, isFalse);
-
-        wrapper.pause();
-        await flushMicrotasks();
-        expect(controller.isPaused, isTrue);
-        expect(wrapper.isPaused, isTrue);
-
-        wrapper.resume();
-        await flushMicrotasks();
-        expect(controller.isPaused, isFalse);
-        expect(wrapper.isPaused, isFalse);
-      });
-
-      test("cancel()", () async {
-        controller.add("foo");
-
-        wrapper.cancel();
-        await flushMicrotasks();
-        expect(isCanceled, isTrue);
-      });
-
-      test("asFuture()", () {
-        expect(wrapper.asFuture(12), completion(equals(12)));
-        controller.add("foo");
-        controller.close();
-      });
-    });
-  });
-}
diff --git a/packages/async/test/utils.dart b/packages/async/test/utils.dart
deleted file mode 100644
index 9270886..0000000
--- a/packages/async/test/utils.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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.
-import "dart:async";
-
-import "package:async/async.dart";
-import "package:test/test.dart";
-
-/// A zero-millisecond timer should wait until after all microtasks.
-Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
-
-typedef void OptionalArgAction([a, b]);
-
-/// A generic unreachable callback function.
-///
-/// Returns a function that fails the test if it is ever called.
-OptionalArgAction unreachable(String name) =>
-    ([a, b]) => fail("Unreachable: $name");
-
-// TODO(nweiz): Use the version of this in test when test#418 is fixed.
-/// A matcher that runs a callback in its own zone and asserts that that zone
-/// emits an error that matches [matcher].
-Matcher throwsZoned(matcher) => predicate((callback) {
-      var firstError = true;
-      runZoned(callback,
-          onError: expectAsync2((error, stackTrace) {
-            if (firstError) {
-              expect(error, matcher);
-              firstError = false;
-            } else {
-              registerException(error, stackTrace);
-            }
-          }, max: -1));
-      return true;
-    });
-
-/// A matcher that runs a callback in its own zone and asserts that that zone
-/// emits a [CastError].
-final throwsZonedCastError = throwsZoned(new isInstanceOf<CastError>());
-
-/// A matcher that matches a callback or future that throws a [CastError].
-final throwsCastError = throwsA(new isInstanceOf<CastError>());
-
-/// 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!");
-  }
-}
-
-/// A dummy [StreamSink] for testing the routing of the [done] and [close]
-/// futures.
-///
-/// The [completer] field allows the user to control the future returned by
-/// [done] and [close].
-class CompleterStreamSink<T> implements StreamSink<T> {
-  final completer = new Completer();
-
-  Future get done => completer.future;
-
-  void add(T event) {}
-  void addError(error, [StackTrace stackTrace]) {}
-  Future addStream(Stream<T> stream) async {}
-  Future close() => completer.future;
-}
-
-/// A [StreamSink] that collects all events added to it as results.
-///
-/// This is used for testing code that interacts with sinks.
-class TestSink<T> implements StreamSink<T> {
-  /// The results corresponding to events that have been added to the sink.
-  final results = <Result<T>>[];
-
-  /// Whether [close] has been called.
-  bool get isClosed => _isClosed;
-  var _isClosed = false;
-
-  Future get done => _doneCompleter.future;
-  final _doneCompleter = new Completer();
-
-  final Function _onDone;
-
-  /// Creates a new sink.
-  ///
-  /// If [onDone] is passed, it's called when the user calls [close]. Its result
-  /// is piped to the [done] future.
-  TestSink({onDone()}) : _onDone = onDone ?? (() {});
-
-  void add(T event) {
-    results.add(new Result<T>.value(event));
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    results.add(new Result<T>.error(error, stackTrace));
-  }
-
-  Future addStream(Stream<T> stream) {
-    var completer = new Completer.sync();
-    stream.listen(add, onError: addError, onDone: completer.complete);
-    return completer.future;
-  }
-
-  Future close() {
-    _isClosed = true;
-    _doneCompleter.complete(new Future.microtask(_onDone));
-    return done;
-  }
-}
diff --git a/packages/barback/.analysis_options b/packages/barback/.analysis_options
deleted file mode 100644
index a10d4c5..0000000
--- a/packages/barback/.analysis_options
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/packages/barback/.gitignore b/packages/barback/.gitignore
deleted file mode 100644
index 7dbf035..0000000
--- a/packages/barback/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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/packages/barback/.status b/packages/barback/.status
deleted file mode 100644
index 8ea2f4a..0000000
--- a/packages/barback/.status
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for 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 ]
-build/test/too_many_open_files_test: Skip # 14220
-
-[ $browser ]
-*: Fail, OK # Uses dart:io.
diff --git a/packages/barback/CHANGELOG.md b/packages/barback/CHANGELOG.md
deleted file mode 100644
index d4cc690..0000000
--- a/packages/barback/CHANGELOG.md
+++ /dev/null
@@ -1,199 +0,0 @@
-## 0.15.2+15
-
-* Officially deprecated this package. Not supported in Dart 2.
-
-## 0.15.2+14
-
-* Update code to eliminate Future flattening in Dart 2.0.
-
-## 0.15.2+13
-
-* Enforce ordering of Futures with `Future.microtask` rather than async and
-  await to account for upcoming behavior changes with async methods.
-
-## 0.15.2+12
-
-* Declare support for `async` 2.0.0.
-
-## 0.15.2+11
-
-* Update `AssetNode.whenAvailable` to be a generic method to fix a new strong
-  mode error.
-
-## 0.15.2+10
-
-* Update `CancelableFuture` to match the new `Future.then` type signature. The
-  `onValue` parameter now has a return type of `FutureOr<S>` instead of
-  `S`.
-
-## 0.15.2+9
-
-* Fix all strong-mode warnings in Dart 1.18.
-
-## 0.15.2+8
-
-* Fix all strong-mode warnings in Dart 1.16.
-
-## 0.15.2+7
-
-* Add periodic fine-grained logging for long running transformers.
-
-## 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/packages/barback/LICENSE b/packages/barback/LICENSE
deleted file mode 100644
index ee99930..0000000
--- a/packages/barback/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/barback/README.md b/packages/barback/README.md
deleted file mode 100644
index 4973886..0000000
--- a/packages/barback/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-**DEPRECATED**
-
-The [pub][] transformer system will be removed in Dart 2.
-See the [Dart 2 Migration Guide](https://webdev.dartlang.org/dart-2) for
-guidance.
-
----
-
-Barback is an asset build system. It is the library underlying
-[pub][]'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][].
-
-[pub]: https://www.dartlang.org/tools/pub/get-started
-[here]: https://www.dartlang.org/tools/pub/assets-and-transformers
diff --git a/packages/barback/codereview.settings b/packages/barback/codereview.settings
deleted file mode 100644
index 836f17e..0000000
--- a/packages/barback/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-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/packages/barback/example/aggregate_transformer/README.md b/packages/barback/example/aggregate_transformer/README.md
deleted file mode 100644
index 3e7b12f..0000000
--- a/packages/barback/example/aggregate_transformer/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-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/packages/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html b/packages/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
deleted file mode 100644
index f3e3b63..0000000
--- a/packages/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-<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/packages/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html b/packages/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
deleted file mode 100644
index 3445186..0000000
--- a/packages/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-<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/packages/barback/example/aggregate_transformer/lib/transformer.dart b/packages/barback/example/aggregate_transformer/lib/transformer.dart
deleted file mode 100644
index f96701c..0000000
--- a/packages/barback/example/aggregate_transformer/lib/transformer.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/barback/example/aggregate_transformer/pubspec.yaml b/packages/barback/example/aggregate_transformer/pubspec.yaml
deleted file mode 100644
index c43247b..0000000
--- a/packages/barback/example/aggregate_transformer/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-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/packages/barback/example/lazy_transformer/README.md b/packages/barback/example/lazy_transformer/README.md
deleted file mode 100644
index 35c72cc..0000000
--- a/packages/barback/example/lazy_transformer/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-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/packages/barback/example/lazy_transformer/lib/message.txt b/packages/barback/example/lazy_transformer/lib/message.txt
deleted file mode 100644
index 7f95e57..0000000
--- a/packages/barback/example/lazy_transformer/lib/message.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-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/packages/barback/example/lazy_transformer/lib/transformer.dart b/packages/barback/example/lazy_transformer/lib/transformer.dart
deleted file mode 100644
index 02bfd8a..0000000
--- a/packages/barback/example/lazy_transformer/lib/transformer.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-  void 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/packages/barback/example/lazy_transformer/pubspec.yaml b/packages/barback/example/lazy_transformer/pubspec.yaml
deleted file mode 100644
index e01c5d1..0000000
--- a/packages/barback/example/lazy_transformer/pubspec.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-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/packages/barback/example/markdown_converter/README.md b/packages/barback/example/markdown_converter/README.md
deleted file mode 100644
index 84325dd..0000000
--- a/packages/barback/example/markdown_converter/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-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/packages/barback/example/markdown_converter/lib/images/bison.jpg b/packages/barback/example/markdown_converter/lib/images/bison.jpg
deleted file mode 100644
index 1a8c8b6..0000000
--- a/packages/barback/example/markdown_converter/lib/images/bison.jpg
+++ /dev/null
Binary files differ
diff --git a/packages/barback/example/markdown_converter/lib/index.markdown b/packages/barback/example/markdown_converter/lib/index.markdown
deleted file mode 100644
index 3bbe8bd..0000000
--- a/packages/barback/example/markdown_converter/lib/index.markdown
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# 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/packages/barback/example/markdown_converter/lib/test2.md b/packages/barback/example/markdown_converter/lib/test2.md
deleted file mode 100644
index 452a24d..0000000
--- a/packages/barback/example/markdown_converter/lib/test2.md
+++ /dev/null
@@ -1,7 +0,0 @@
-
-# Another first level header 
-
-* _Italics_ 
-* `literal`
-* **bold**
-
diff --git a/packages/barback/example/markdown_converter/lib/transformer.dart b/packages/barback/example/markdown_converter/lib/transformer.dart
deleted file mode 100644
index 8161768..0000000
--- a/packages/barback/example/markdown_converter/lib/transformer.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/barback/example/markdown_converter/pubspec.yaml b/packages/barback/example/markdown_converter/pubspec.yaml
deleted file mode 100644
index 5cd04d6..0000000
--- a/packages/barback/example/markdown_converter/pubspec.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-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/packages/barback/example/simple_transformer/README.md b/packages/barback/example/simple_transformer/README.md
deleted file mode 100644
index 84325dd..0000000
--- a/packages/barback/example/simple_transformer/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-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/packages/barback/example/simple_transformer/lib/test.txt b/packages/barback/example/simple_transformer/lib/test.txt
deleted file mode 100644
index 5da849b..0000000
--- a/packages/barback/example/simple_transformer/lib/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-ABC
diff --git a/packages/barback/example/simple_transformer/lib/transformer.dart b/packages/barback/example/simple_transformer/lib/transformer.dart
deleted file mode 100644
index 974a157..0000000
--- a/packages/barback/example/simple_transformer/lib/transformer.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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/packages/barback/example/simple_transformer/pubspec.yaml b/packages/barback/example/simple_transformer/pubspec.yaml
deleted file mode 100644
index aecd7ff..0000000
--- a/packages/barback/example/simple_transformer/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-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/packages/barback/lib/barback.dart b/packages/barback/lib/barback.dart
deleted file mode 100644
index bc766b0..0000000
--- a/packages/barback/lib/barback.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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.
-
-@Deprecated(
-    'See https://webdev.dartlang.org/dart-2 for details on how to migrate.')
-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/packages/barback/lib/src/asset/asset.dart b/packages/barback/lib/src/asset/asset.dart
deleted file mode 100644
index 15794e5..0000000
--- a/packages/barback/lib/src/asset/asset.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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/packages/barback/lib/src/asset/asset_forwarder.dart b/packages/barback/lib/src/asset/asset_forwarder.dart
deleted file mode 100644
index 03c493c..0000000
--- a/packages/barback/lib/src/asset/asset_forwarder.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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/packages/barback/lib/src/asset/asset_id.dart b/packages/barback/lib/src/asset/asset_id.dart
deleted file mode 100644
index ee62280..0000000
--- a/packages/barback/lib/src/asset/asset_id.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// 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);
-}
diff --git a/packages/barback/lib/src/asset/asset_node.dart b/packages/barback/lib/src/asset/asset_node.dart
deleted file mode 100644
index 629599c..0000000
--- a/packages/barback/lib/src/asset/asset_node.dart
+++ /dev/null
@@ -1,282 +0,0 @@
-// 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 '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<T> whenAvailable<T>(T 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<T> _waitForState<T>(
-      bool test(AssetState state), T callback(AssetState state)) {
-    if (test(state)) return new Future.sync(() => 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/packages/barback/lib/src/asset/asset_node_set.dart b/packages/barback/lib/src/asset/asset_node_set.dart
deleted file mode 100644
index da55c23..0000000
--- a/packages/barback/lib/src/asset/asset_node_set.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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);
-}
diff --git a/packages/barback/lib/src/asset/asset_set.dart b/packages/barback/lib/src/asset/asset_set.dart
deleted file mode 100644
index f4ad47c..0000000
--- a/packages/barback/lib/src/asset/asset_set.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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(Object asset) => asset is Asset && _assets[asset.id] == 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/packages/barback/lib/src/asset/internal_asset.dart b/packages/barback/lib/src/asset/internal_asset.dart
deleted file mode 100644
index ead30c4..0000000
--- a/packages/barback/lib/src/asset/internal_asset.dart
+++ /dev/null
@@ -1,186 +0,0 @@
-// 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 'package:async/async.dart';
-import 'package:collection/collection.dart';
-
-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, DelegatingList.typed(asset['contents'] as List));
-    case 'file':
-      return new FileAsset(id, asset['path']);
-    case 'string':
-      return new StringAsset(id, asset['contents']);
-    case 'stream':
-      return new StreamAsset(
-          id, DelegatingStream.typed(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()
-        .expand((chunk) => chunk)
-        .toList()
-        .then((bytes) => encoding.decode(bytes));
-  }
-
-  Stream<List<int>> read() => _replayer.getReplay();
-
-  String toString() => "Stream";
-}
diff --git a/packages/barback/lib/src/barback.dart b/packages/barback/lib/src/barback.dart
deleted file mode 100644
index d116939..0000000
--- a/packages/barback/lib/src/barback.dart
+++ /dev/null
@@ -1,116 +0,0 @@
-// 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/packages/barback/lib/src/build_result.dart b/packages/barback/lib/src/build_result.dart
deleted file mode 100644
index b19821c..0000000
--- a/packages/barback/lib/src/build_result.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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) {
-            stackTrace = error.stackTrace.terse;
-          } else if (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/packages/barback/lib/src/errors.dart b/packages/barback/lib/src/errors.dart
deleted file mode 100644
index 19dcb3b..0000000
--- a/packages/barback/lib/src/errors.dart
+++ /dev/null
@@ -1,193 +0,0 @@
-// 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.errors;
-    return [error];
-  });
-}
-
-/// 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/packages/barback/lib/src/graph/asset_cascade.dart b/packages/barback/lib/src/graph/asset_cascade.dart
deleted file mode 100644
index c9a93b2..0000000
--- a/packages/barback/lib/src/graph/asset_cascade.dart
+++ /dev/null
@@ -1,229 +0,0 @@
-// 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 'package:async/async.dart';
-
-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/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 DelegatingFuture.typed(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>(
-          new Future.sync(() => graph.provider.getAsset(id)));
-      _loadingSources[id].whenComplete(() {
-        _loadingSources.remove(id);
-      }).then((asset) {
-        _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/packages/barback/lib/src/graph/group_runner.dart b/packages/barback/lib/src/graph/group_runner.dart
deleted file mode 100644
index 1cb94ee..0000000
--- a/packages/barback/lib/src/graph/group_runner.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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<NodeStatus> _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/packages/barback/lib/src/graph/node_status.dart b/packages/barback/lib/src/graph/node_status.dart
deleted file mode 100644
index 71fdfec..0000000
--- a/packages/barback/lib/src/graph/node_status.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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;
-  }
-}
diff --git a/packages/barback/lib/src/graph/node_streams.dart b/packages/barback/lib/src/graph/node_streams.dart
deleted file mode 100644
index 8344792..0000000
--- a/packages/barback/lib/src/graph/node_streams.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/graph/package_graph.dart b/packages/barback/lib/src/graph/package_graph.dart
deleted file mode 100644
index 376765c..0000000
--- a/packages/barback/lib/src/graph/package_graph.dart
+++ /dev/null
@@ -1,293 +0,0 @@
-// 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 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<T> _inErrorZone<T>(FutureOr<T> body()) {
-    var completer = new Completer<T>.sync();
-    runZoned(() {
-      new Future.sync(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/packages/barback/lib/src/graph/phase.dart b/packages/barback/lib/src/graph/phase.dart
deleted file mode 100644
index fd5ad61..0000000
--- a/packages/barback/lib/src/graph/phase.dart
+++ /dev/null
@@ -1,402 +0,0 @@
-// 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 'package:collection/collection.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_transformer.dart';
-import '../transformer/transformer.dart';
-import '../transformer/transformer_group.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 new Future.sync(() {
-      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 = DelegatingSet.typed<TransformerGroup>(
-        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((asset) => request.complete(asset))
-        .catchError(request.completeError);
-  }
-
-  String toString() => "phase $_location.$_index";
-}
diff --git a/packages/barback/lib/src/graph/phase_forwarder.dart b/packages/barback/lib/src/graph/phase_forwarder.dart
deleted file mode 100644
index e70aff3..0000000
--- a/packages/barback/lib/src/graph/phase_forwarder.dart
+++ /dev/null
@@ -1,134 +0,0 @@
-// 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/packages/barback/lib/src/graph/phase_output.dart b/packages/barback/lib/src/graph/phase_output.dart
deleted file mode 100644
index 7967d6a..0000000
--- a/packages/barback/lib/src/graph/phase_output.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-// 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/packages/barback/lib/src/graph/static_asset_cascade.dart b/packages/barback/lib/src/graph/static_asset_cascade.dart
deleted file mode 100644
index 2c2df8e..0000000
--- a/packages/barback/lib/src/graph/static_asset_cascade.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 'package:async/async.dart';
-import 'package:collection/collection.dart';
-
-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 Stream<LogEntry> onLog = new StreamController.broadcast().stream;
-  final Stream<NodeStatus> onStatusChange =
-      new StreamController.broadcast().stream;
-  final Stream<AssetNode> onAsset = new StreamController.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(DelegatingList.typed(assets)));
-  }
-
-  Future<AssetNode> getAssetNode(AssetId id) {
-    return _sources.putIfAbsent(id, () {
-      return DelegatingFuture.typed(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/packages/barback/lib/src/graph/transform_node.dart b/packages/barback/lib/src/graph/transform_node.dart
deleted file mode 100644
index d2755ca..0000000
--- a/packages/barback/lib/src/graph/transform_node.dart
+++ /dev/null
@@ -1,929 +0,0 @@
-// 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 'package:async/async.dart';
-
-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';
-
-/// Every `_applyLogDuration`, we will issue a fine log entry letting the user
-/// know that the transform is still executing.
-const _applyLogDuration = const Duration(seconds: 10);
-
-/// 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;
-
-  /// Map to track pending requests for secondary inputs.
-  ///
-  /// Keys are the secondary inputs that have been requested but not yet
-  /// produced. Values are the number of requests for that input.
-  final _pendingSecondaryInputs = <AssetId, int>{};
-
-  /// 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();
-
-    new Future.sync(() {
-      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[id] = _pendingSecondaryInputs.containsKey(id)
-        ? _pendingSecondaryInputs[id] + 1
-        : 1;
-    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(() {
-      assert(_pendingSecondaryInputs.containsKey(id));
-      if (_pendingSecondaryInputs[id] == 1) {
-        _pendingSecondaryInputs.remove(id);
-      } else {
-        _pendingSecondaryInputs[id]--;
-      }
-      if (_pendingSecondaryInputs.isEmpty) _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();
-
-    var transformCounterTimer;
-
-    return DelegatingFuture.typed(new Future.sync(() {
-      _timeInTransformer.reset();
-      _timeAwaitingInputs.reset();
-      _timeInTransformer.start();
-
-      transformCounterTimer = new Timer.periodic(_applyLogDuration, (_) {
-        if (_streams.onLogController.isClosed ||
-            !_timeInTransformer.isRunning) {
-          return;
-        }
-
-        var message = new StringBuffer("Not yet complete after "
-            "${niceDuration(_timeInTransformer.elapsed)}");
-        if (_pendingSecondaryInputs.isNotEmpty) {
-          message.write(", waiting on input(s) "
-              "${_pendingSecondaryInputs.keys.join(", ")}");
-        }
-        _streams.onLogController.add(new LogEntry(
-            info, info.primaryId, LogLevel.FINE, message.toString(), null));
-      });
-
-      return transformer.apply(controller.transform);
-    }).whenComplete(() {
-      transformCounterTimer.cancel();
-      _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/packages/barback/lib/src/graph/transformer_classifier.dart b/packages/barback/lib/src/graph/transformer_classifier.dart
deleted file mode 100644
index fe14ef7..0000000
--- a/packages/barback/lib/src/graph/transformer_classifier.dart
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 '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<Null>.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++;
-    new Future.sync(() => 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/packages/barback/lib/src/internal_asset.dart b/packages/barback/lib/src/internal_asset.dart
deleted file mode 100644
index ab73901..0000000
--- a/packages/barback/lib/src/internal_asset.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/barback/lib/src/log.dart b/packages/barback/lib/src/log.dart
deleted file mode 100644
index f0240a4..0000000
--- a/packages/barback/lib/src/log.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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/packages/barback/lib/src/package_provider.dart b/packages/barback/lib/src/package_provider.dart
deleted file mode 100644
index ce6ee23..0000000
--- a/packages/barback/lib/src/package_provider.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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/packages/barback/lib/src/serialize.dart b/packages/barback/lib/src/serialize.dart
deleted file mode 100644
index c2f7ac4..0000000
--- a/packages/barback/lib/src/serialize.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// 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/packages/barback/lib/src/transformer/aggregate_transform.dart b/packages/barback/lib/src/transformer/aggregate_transform.dart
deleted file mode 100644
index ce20d43..0000000
--- a/packages/barback/lib/src/transformer/aggregate_transform.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 'package:async/async.dart';
-
-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 new Future.sync(() => _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 DelegatingFuture
-        .typed(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 {
-  final AggregateTransform transform;
-
-  /// The set of assets that the transformer has emitted.
-  AssetSet get outputs => transform._outputs;
-
-  bool get isDone => transform._inputController.isClosed;
-
-  AggregateTransformController(TransformNode node)
-      : transform = 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/packages/barback/lib/src/transformer/aggregate_transformer.dart b/packages/barback/lib/src/transformer/aggregate_transformer.dart
deleted file mode 100644
index 6873e99..0000000
--- a/packages/barback/lib/src/transformer/aggregate_transformer.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/barback_settings.dart b/packages/barback/lib/src/transformer/barback_settings.dart
deleted file mode 100644
index f68e315..0000000
--- a/packages/barback/lib/src/transformer/barback_settings.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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/packages/barback/lib/src/transformer/base_transform.dart b/packages/barback/lib/src/transformer/base_transform.dart
deleted file mode 100644
index 69492f0..0000000
--- a/packages/barback/lib/src/transformer/base_transform.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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.
-  BaseTransform get 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;
-
-  /// 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/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart b/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart
deleted file mode 100644
index e0f3956..0000000
--- a/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 {
-  final DeclaringAggregateTransform 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)
-      : transform = 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/packages/barback/lib/src/transformer/declaring_aggregate_transformer.dart b/packages/barback/lib/src/transformer/declaring_aggregate_transformer.dart
deleted file mode 100644
index cef8711..0000000
--- a/packages/barback/lib/src/transformer/declaring_aggregate_transformer.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/declaring_transform.dart b/packages/barback/lib/src/transformer/declaring_transform.dart
deleted file mode 100644
index 7ace38e..0000000
--- a/packages/barback/lib/src/transformer/declaring_transform.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/declaring_transformer.dart b/packages/barback/lib/src/transformer/declaring_transformer.dart
deleted file mode 100644
index d9e5adc..0000000
--- a/packages/barback/lib/src/transformer/declaring_transformer.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/lazy_aggregate_transformer.dart b/packages/barback/lib/src/transformer/lazy_aggregate_transformer.dart
deleted file mode 100644
index 891fc1e..0000000
--- a/packages/barback/lib/src/transformer/lazy_aggregate_transformer.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/lazy_transformer.dart b/packages/barback/lib/src/transformer/lazy_transformer.dart
deleted file mode 100644
index 657b65b..0000000
--- a/packages/barback/lib/src/transformer/lazy_transformer.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/transform.dart b/packages/barback/lib/src/transformer/transform.dart
deleted file mode 100644
index 8bc057a..0000000
--- a/packages/barback/lib/src/transformer/transform.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/lib/src/transformer/transform_logger.dart b/packages/barback/lib/src/transformer/transform_logger.dart
deleted file mode 100644
index 6fd62d6..0000000
--- a/packages/barback/lib/src/transformer/transform_logger.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// 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/packages/barback/lib/src/transformer/transformer.dart b/packages/barback/lib/src/transformer/transformer.dart
deleted file mode 100644
index f87f067..0000000
--- a/packages/barback/lib/src/transformer/transformer.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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/packages/barback/lib/src/transformer/transformer_group.dart b/packages/barback/lib/src/transformer/transformer_group.dart
deleted file mode 100644
index 17a2e57..0000000
--- a/packages/barback/lib/src/transformer/transformer_group.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart b/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
deleted file mode 100644
index 8d65ae0..0000000
--- a/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 '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 new Future.sync(() => 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 {
-  _DeclaringWrappingAggregateTransformer(DeclaringTransformer 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/packages/barback/lib/src/utils.dart b/packages/barback/lib/src/utils.dart
deleted file mode 100644
index c7d5555..0000000
--- a/packages/barback/lib/src/utils.dart
+++ /dev/null
@@ -1,351 +0,0 @@
-// 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:async/async.dart';
-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<S>> groupBy<S, T>(Iterable<S> iter, T fn(S element)) {
-  var map = <T, List<S>>{};
-  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<T> unionAll<T>(Iterable<Set<T>> 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<K2, V2> mapMap<K1, V1, K2, V2>(Map<K1, V1> map, K2 keyFn(K1 key, V1 value),
-        V2 valueFn(K1 key, V1 value)) =>
-    new Map.fromIterable(map.keys,
-        key: (key) => keyFn(key as K1, map[key]),
-        value: (key) => valueFn(key as K1, 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<K, V2> mapMapValues<K, V1, V2>(Map<K, V1> map, V2 fn(K key, V1 value)) =>
-    // TODO(nweiz): Don't explicitly type [key] when sdk#25490 is fixed.
-    mapMap(map, (K 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<K2, V> mapMapKeys<K1, V, K2>(Map<K1, V> map, K2 fn(K1 key, V value)) =>
-    // TODO(nweiz): Don't explicitly type [value] when sdk#25490 is fixed.
-    mapMap(map, fn, (_, V 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<T> mergeStreams<T>(Iterable<Stream<T>> 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<T>.broadcast(sync: true)
-      : new StreamController<T>(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));
-}
-
-/// Names [new Future.microtask] so that it is used consistently throughout this
-/// package.
-///
-/// Barback relies on ordering guarantees that aren't enforced by chaining
-/// futures explicitly so all Future creations must be microtasks instead of
-/// hitting the event loop to match [new Future.value]
-Future<T> newFuture<T>(T callback()) => new Future.microtask(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<T> futureStream<T>(Future<Stream<T>> future, {bool broadcast: false}) {
-  StreamSubscription<T> subscription;
-  StreamController<T> controller;
-
-  future = DelegatingFuture.typed(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<T>.broadcast(
-        sync: true, onListen: onListen, onCancel: onCancel);
-  } else {
-    controller = new StreamController<T>(
-        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<T> callbackStream<T>(Stream<T> callback()) {
-  StreamSubscription<T> subscription;
-  StreamController<T> controller;
-  controller = new StreamController<T>(
-      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<T> broadcastToSingleSubscription<T>(Stream<T> 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<T>(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/packages/barback/lib/src/utils/cancelable_future.dart b/packages/barback/lib/src/utils/cancelable_future.dart
deleted file mode 100644
index 78a391f..0000000
--- a/packages/barback/lib/src/utils/cancelable_future.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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<T> catchError(Function onError, {bool test(Object error)}) =>
-      _completer.future.catchError(onError, test: test);
-  Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) =>
-      _completer.future.then(onValue, onError: onError);
-  Future<T> whenComplete(action()) => _completer.future.whenComplete(action);
-  Future<T> timeout(Duration timeLimit, {void onTimeout()}) =>
-      _completer.future.timeout(timeLimit, onTimeout: onTimeout);
-
-  /// Cancels this future.
-  void cancel() {
-    _canceled = true;
-  }
-}
diff --git a/packages/barback/lib/src/utils/file_pool.dart b/packages/barback/lib/src/utils/file_pool.dart
deleted file mode 100644
index e322d65..0000000
--- a/packages/barback/lib/src/utils/file_pool.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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 '../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 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/packages/barback/lib/src/utils/multiset.dart b/packages/barback/lib/src/utils/multiset.dart
deleted file mode 100644
index 8843043..0000000
--- a/packages/barback/lib/src/utils/multiset.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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) =>
-            new Iterable<E>.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(Object 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/packages/barback/lib/src/utils/stream_pool.dart b/packages/barback/lib/src/utils/stream_pool.dart
deleted file mode 100644
index 04d1e5c..0000000
--- a/packages/barback/lib/src/utils/stream_pool.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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/packages/barback/lib/src/utils/stream_replayer.dart b/packages/barback/lib/src/utils/stream_replayer.dart
deleted file mode 100644
index 4a25085..0000000
--- a/packages/barback/lib/src/utils/stream_replayer.dart
+++ /dev/null
@@ -1,83 +0,0 @@
-// 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/packages/barback/pubspec.yaml b/packages/barback/pubspec.yaml
deleted file mode 100644
index a66e94f..0000000
--- a/packages/barback/pubspec.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-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+15
-
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://github.com/dart-lang/barback
-description: >
-  A DEPRECATED asset build system for Dart.
-
-  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:
-  async: ">=1.10.0 <3.0.0"
-  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: "^1.5.0"
-dev_dependencies:
-  scheduled_test: ">=0.9.0 <0.11.0"
-  unittest: ">=0.9.0 <0.10.0"
-environment:
-  sdk: ">=1.22.0 <2.0.0"
diff --git a/packages/barback/test/asset_id_test.dart b/packages/barback/test/asset_id_test.dart
deleted file mode 100644
index 8fb4b96..0000000
--- a/packages/barback/test/asset_id_test.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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/packages/barback/test/asset_set_test.dart b/packages/barback/test/asset_set_test.dart
deleted file mode 100644
index f339d7e..0000000
--- a/packages/barback/test/asset_set_test.dart
+++ /dev/null
@@ -1,159 +0,0 @@
-// 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/packages/barback/test/asset_test.dart b/packages/barback/test/asset_test.dart
deleted file mode 100644
index ce58229..0000000
--- a/packages/barback/test/asset_test.dart
+++ /dev/null
@@ -1,260 +0,0 @@
-// 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/packages/barback/test/barback_mode_test.dart b/packages/barback/test/barback_mode_test.dart
deleted file mode 100644
index 5c5233d..0000000
--- a/packages/barback/test/barback_mode_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// 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/packages/barback/test/cancelable_future_test.dart b/packages/barback/test/cancelable_future_test.dart
deleted file mode 100644
index 6535894..0000000
--- a/packages/barback/test/cancelable_future_test.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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/packages/barback/test/logger_test.dart b/packages/barback/test/logger_test.dart
deleted file mode 100644
index 342d68c..0000000
--- a/packages/barback/test/logger_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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/packages/barback/test/multiset_test.dart b/packages/barback/test/multiset_test.dart
deleted file mode 100644
index 18d2dc1..0000000
--- a/packages/barback/test/multiset_test.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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/packages/barback/test/package_graph/add_remove_transform_test.dart b/packages/barback/test/package_graph/add_remove_transform_test.dart
deleted file mode 100644
index ba14614..0000000
--- a/packages/barback/test/package_graph/add_remove_transform_test.dart
+++ /dev/null
@@ -1,510 +0,0 @@
-// 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();
-  });
-}
diff --git a/packages/barback/test/package_graph/collisions_test.dart b/packages/barback/test/package_graph/collisions_test.dart
deleted file mode 100644
index e7c794d..0000000
--- a/packages/barback/test/package_graph/collisions_test.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-// 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/packages/barback/test/package_graph/declaring_transformer_test.dart b/packages/barback/test/package_graph/declaring_transformer_test.dart
deleted file mode 100644
index aef3299..0000000
--- a/packages/barback/test/package_graph/declaring_transformer_test.dart
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/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();
-  });
-}
diff --git a/packages/barback/test/package_graph/errors_test.dart b/packages/barback/test/package_graph/errors_test.dart
deleted file mode 100644
index 8860483..0000000
--- a/packages/barback/test/package_graph/errors_test.dart
+++ /dev/null
@@ -1,284 +0,0 @@
-// 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("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/packages/barback/test/package_graph/get_all_assets_test.dart b/packages/barback/test/package_graph/get_all_assets_test.dart
deleted file mode 100644
index 7e60364..0000000
--- a/packages/barback/test/package_graph/get_all_assets_test.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// 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/packages/barback/test/package_graph/group_test.dart b/packages/barback/test/package_graph/group_test.dart
deleted file mode 100644
index e1d8dca..0000000
--- a/packages/barback/test/package_graph/group_test.dart
+++ /dev/null
@@ -1,681 +0,0 @@
-// 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 '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/packages/barback/test/package_graph/lazy_transformer_test.dart b/packages/barback/test/package_graph/lazy_transformer_test.dart
deleted file mode 100644
index e1f16bb..0000000
--- a/packages/barback/test/package_graph/lazy_transformer_test.dart
+++ /dev/null
@@ -1,592 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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: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/packages/barback/test/package_graph/many_parallel_transformers_test.dart b/packages/barback/test/package_graph/many_parallel_transformers_test.dart
deleted file mode 100644
index d8c0b7f..0000000
--- a/packages/barback/test/package_graph/many_parallel_transformers_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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/packages/barback/test/package_graph/repetition_test.dart b/packages/barback/test/package_graph/repetition_test.dart
deleted file mode 100644
index 2bb6180..0000000
--- a/packages/barback/test/package_graph/repetition_test.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-// 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: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/packages/barback/test/package_graph/source_test.dart b/packages/barback/test/package_graph/source_test.dart
deleted file mode 100644
index 8b8aecb..0000000
--- a/packages/barback/test/package_graph/source_test.dart
+++ /dev/null
@@ -1,166 +0,0 @@
-// 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/packages/barback/test/package_graph/transform/aggregate_test.dart b/packages/barback/test/package_graph/transform/aggregate_test.dart
deleted file mode 100644
index eaca547..0000000
--- a/packages/barback/test/package_graph/transform/aggregate_test.dart
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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: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)));
-    });
-  });
-}
diff --git a/packages/barback/test/package_graph/transform/concurrency_test.dart b/packages/barback/test/package_graph/transform/concurrency_test.dart
deleted file mode 100644
index 834ea9a..0000000
--- a/packages/barback/test/package_graph/transform/concurrency_test.dart
+++ /dev/null
@@ -1,724 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/barback/test/package_graph/transform/consume_input_test.dart b/packages/barback/test/package_graph/transform/consume_input_test.dart
deleted file mode 100644
index 4aac1d4..0000000
--- a/packages/barback/test/package_graph/transform/consume_input_test.dart
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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: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();
-  });
-}
diff --git a/packages/barback/test/package_graph/transform/cross_package_test.dart b/packages/barback/test/package_graph/transform/cross_package_test.dart
deleted file mode 100644
index f91c897..0000000
--- a/packages/barback/test/package_graph/transform/cross_package_test.dart
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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: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();
-  });
-}
diff --git a/packages/barback/test/package_graph/transform/declaring_aggregate_test.dart b/packages/barback/test/package_graph/transform/declaring_aggregate_test.dart
deleted file mode 100644
index 884a541..0000000
--- a/packages/barback/test/package_graph/transform/declaring_aggregate_test.dart
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/package_graph/transform/pass_through_test.dart b/packages/barback/test/package_graph/transform/pass_through_test.dart
deleted file mode 100644
index 5189c95..0000000
--- a/packages/barback/test/package_graph/transform/pass_through_test.dart
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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();
-  });
-}
diff --git a/packages/barback/test/package_graph/transform/transform_test.dart b/packages/barback/test/package_graph/transform/transform_test.dart
deleted file mode 100644
index e6f3dea..0000000
--- a/packages/barback/test/package_graph/transform/transform_test.dart
+++ /dev/null
@@ -1,575 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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: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/packages/barback/test/static_provider_test.dart b/packages/barback/test/static_provider_test.dart
deleted file mode 100644
index 7efeb37..0000000
--- a/packages/barback/test/static_provider_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/stream_pool_test.dart b/packages/barback/test/stream_pool_test.dart
deleted file mode 100644
index b7f4bf9..0000000
--- a/packages/barback/test/stream_pool_test.dart
+++ /dev/null
@@ -1,225 +0,0 @@
-// 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 bufferedSyncController;
-      var broadcastController;
-      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/packages/barback/test/stream_replayer_test.dart b/packages/barback/test/stream_replayer_test.dart
deleted file mode 100644
index a0b6f1a..0000000
--- a/packages/barback/test/stream_replayer_test.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// 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;
-    });
-    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/packages/barback/test/too_many_open_files_test.dart b/packages/barback/test/too_many_open_files_test.dart
deleted file mode 100644
index 0fca29a..0000000
--- a/packages/barback/test/too_many_open_files_test.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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 = <Future>[];
-  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);
-}
diff --git a/packages/barback/test/transformer/aggregate_many_to_many.dart b/packages/barback/test/transformer/aggregate_many_to_many.dart
deleted file mode 100644
index 92b0e91..0000000
--- a/packages/barback/test/transformer/aggregate_many_to_many.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/aggregate_many_to_one.dart b/packages/barback/test/transformer/aggregate_many_to_one.dart
deleted file mode 100644
index 6586f59..0000000
--- a/packages/barback/test/transformer/aggregate_many_to_one.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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) async {
-    var assets = await getPrimaryInputs(transform).toList();
-    assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
-    var contents =
-        await Future.wait(assets.map((asset) => asset.readAsString()));
-    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/packages/barback/test/transformer/bad.dart b/packages/barback/test/transformer/bad.dart
deleted file mode 100644
index 0cc3496..0000000
--- a/packages/barback/test/transformer/bad.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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/packages/barback/test/transformer/bad_log.dart b/packages/barback/test/transformer/bad_log.dart
deleted file mode 100644
index b84f105..0000000
--- a/packages/barback/test/transformer/bad_log.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/catch_asset_not_found.dart b/packages/barback/test/transformer/catch_asset_not_found.dart
deleted file mode 100644
index 8916b56..0000000
--- a/packages/barback/test/transformer/catch_asset_not_found.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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/packages/barback/test/transformer/check_content.dart b/packages/barback/test/transformer/check_content.dart
deleted file mode 100644
index 5cadfc1..0000000
--- a/packages/barback/test/transformer/check_content.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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/packages/barback/test/transformer/check_content_and_rename.dart b/packages/barback/test/transformer/check_content_and_rename.dart
deleted file mode 100644
index 6ffc635..0000000
--- a/packages/barback/test/transformer/check_content_and_rename.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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/packages/barback/test/transformer/conditionally_consume_primary.dart b/packages/barback/test/transformer/conditionally_consume_primary.dart
deleted file mode 100644
index e37aebf..0000000
--- a/packages/barback/test/transformer/conditionally_consume_primary.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/create_asset.dart b/packages/barback/test/transformer/create_asset.dart
deleted file mode 100644
index 0f23fc4..0000000
--- a/packages/barback/test/transformer/create_asset.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// 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/packages/barback/test/transformer/declare_assets.dart b/packages/barback/test/transformer/declare_assets.dart
deleted file mode 100644
index 85c5810..0000000
--- a/packages/barback/test/transformer/declare_assets.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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/packages/barback/test/transformer/declaring_aggregate_many_to_many.dart b/packages/barback/test/transformer/declaring_aggregate_many_to_many.dart
deleted file mode 100644
index 0917973..0000000
--- a/packages/barback/test/transformer/declaring_aggregate_many_to_many.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/declaring_aggregate_many_to_one.dart b/packages/barback/test/transformer/declaring_aggregate_many_to_one.dart
deleted file mode 100644
index bfdd750..0000000
--- a/packages/barback/test/transformer/declaring_aggregate_many_to_one.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/declaring_bad.dart b/packages/barback/test/transformer/declaring_bad.dart
deleted file mode 100644
index 3d023aa..0000000
--- a/packages/barback/test/transformer/declaring_bad.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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/packages/barback/test/transformer/declaring_check_content_and_rename.dart b/packages/barback/test/transformer/declaring_check_content_and_rename.dart
deleted file mode 100644
index 988d53c..0000000
--- a/packages/barback/test/transformer/declaring_check_content_and_rename.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 '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/packages/barback/test/transformer/declaring_rewrite.dart b/packages/barback/test/transformer/declaring_rewrite.dart
deleted file mode 100644
index fc44bfe..0000000
--- a/packages/barback/test/transformer/declaring_rewrite.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/emit_nothing.dart b/packages/barback/test/transformer/emit_nothing.dart
deleted file mode 100644
index 9cf5134..0000000
--- a/packages/barback/test/transformer/emit_nothing.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/has_input.dart b/packages/barback/test/transformer/has_input.dart
deleted file mode 100644
index bdf074c..0000000
--- a/packages/barback/test/transformer/has_input.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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/packages/barback/test/transformer/lazy_aggregate_many_to_many.dart b/packages/barback/test/transformer/lazy_aggregate_many_to_many.dart
deleted file mode 100644
index 8dfe2b8..0000000
--- a/packages/barback/test/transformer/lazy_aggregate_many_to_many.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/lazy_aggregate_many_to_one.dart b/packages/barback/test/transformer/lazy_aggregate_many_to_one.dart
deleted file mode 100644
index 6bd2519..0000000
--- a/packages/barback/test/transformer/lazy_aggregate_many_to_one.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/lazy_assets.dart b/packages/barback/test/transformer/lazy_assets.dart
deleted file mode 100644
index d57ccf2..0000000
--- a/packages/barback/test/transformer/lazy_assets.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/lazy_bad.dart b/packages/barback/test/transformer/lazy_bad.dart
deleted file mode 100644
index 93fc8d8..0000000
--- a/packages/barback/test/transformer/lazy_bad.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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/packages/barback/test/transformer/lazy_check_content_and_rename.dart b/packages/barback/test/transformer/lazy_check_content_and_rename.dart
deleted file mode 100644
index 4b1757d..0000000
--- a/packages/barback/test/transformer/lazy_check_content_and_rename.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 '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/packages/barback/test/transformer/lazy_many_to_one.dart b/packages/barback/test/transformer/lazy_many_to_one.dart
deleted file mode 100644
index 1153c9d..0000000
--- a/packages/barback/test/transformer/lazy_many_to_one.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/lazy_rewrite.dart b/packages/barback/test/transformer/lazy_rewrite.dart
deleted file mode 100644
index 35ce733..0000000
--- a/packages/barback/test/transformer/lazy_rewrite.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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/packages/barback/test/transformer/log.dart b/packages/barback/test/transformer/log.dart
deleted file mode 100644
index bfa8b93..0000000
--- a/packages/barback/test/transformer/log.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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 'package:barback/barback.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/packages/barback/test/transformer/many_to_one.dart b/packages/barback/test/transformer/many_to_one.dart
deleted file mode 100644
index efe5288..0000000
--- a/packages/barback/test/transformer/many_to_one.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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) async {
-    var primary = await getPrimary(transform);
-    var contents = await primary.readAsString();
-
-    // Get all of the included inputs.
-    var outputs = await 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());
-    }));
-
-    var id = transform.primaryInput.id.changeExtension(".out");
-    transform.addOutput(new Asset.fromString(id, outputs.join()));
-  }
-
-  String toString() => "many->1 $extension";
-}
diff --git a/packages/barback/test/transformer/mock.dart b/packages/barback/test/transformer/mock.dart
deleted file mode 100644
index b6120e2..0000000
--- a/packages/barback/test/transformer/mock.dart
+++ /dev/null
@@ -1,199 +0,0 @@
-// 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<Null>();
-
-  /// `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) async {
-    if (_getInput.containsKey(id)) await _getInput[id].future;
-    return await 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) async {
-    var result = await doIsPrimary(id);
-    if (_isPrimary.containsKey(id)) await _isPrimary[id].future;
-    return 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/packages/barback/test/transformer/mock_aggregate.dart b/packages/barback/test/transformer/mock_aggregate.dart
deleted file mode 100644
index b020637..0000000
--- a/packages/barback/test/transformer/mock_aggregate.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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<Null>();
-
-  /// `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) async {
-    if (_getInput.containsKey(id)) await _getInput[id].future;
-    return await 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) async {
-    var result = await doClassifyPrimary(id);
-    if (_classifyPrimary.containsKey(id)) await _classifyPrimary[id].future;
-    return 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/packages/barback/test/transformer/one_to_many.dart b/packages/barback/test/transformer/one_to_many.dart
deleted file mode 100644
index 05bea4d..0000000
--- a/packages/barback/test/transformer/one_to_many.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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) async {
-    var lines = await (await getPrimary(transform)).readAsString();
-    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/packages/barback/test/transformer/rewrite.dart b/packages/barback/test/transformer/rewrite.dart
deleted file mode 100644
index d25a552..0000000
--- a/packages/barback/test/transformer/rewrite.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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/packages/barback/test/transformer/sync_rewrite.dart b/packages/barback/test/transformer/sync_rewrite.dart
deleted file mode 100644
index 1a906a7..0000000
--- a/packages/barback/test/transformer/sync_rewrite.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. 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 '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/packages/barback/test/transformer_test.dart b/packages/barback/test/transformer_test.dart
deleted file mode 100644
index 119fc1e..0000000
--- a/packages/barback/test/transformer_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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: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();
-}
diff --git a/packages/barback/test/utils.dart b/packages/barback/test/utils.dart
deleted file mode 100644
index c69af30..0000000
--- a/packages/barback/test/utils.dart
+++ /dev/null
@@ -1,602 +0,0 @@
-// 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>> 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) {
-  var parsed = _parseAssets(assets);
-  schedule(
-      () => _barback.updateSources(parsed), "updating ${parsed.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) {
-  var parsed = _parseAssets(assets);
-  schedule(
-      () => _barback.removeSources(parsed), "removing ${parsed.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 as AssetId;
-  }).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) {
-        for (var error in result.errors) {
-          currentSchedule.signalError(error);
-        }
-        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) {
-    Iterable<Asset> 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),
-        (_, 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) async {
-    // 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);
-
-    if (_pauseCompleter != null) await _pauseCompleter.future;
-
-    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/packages/charcode/.analysis_options b/packages/charcode/.analysis_options
deleted file mode 100644
index b727f4d..0000000
--- a/packages/charcode/.analysis_options
+++ /dev/null
@@ -1,29 +0,0 @@
-analyzer:
-  strong-mode: true
-linter:
-  rules:
-     # Errors
-     - avoid_empty_else
-     - comment_references
-     - control_flow_in_finally
-     - empty_statements
-     - hash_and_equals
-     - test_types_in_equals
-     - throw_in_finally
-     - unrelated_type_equality_checks
-     - valid_regexps
-
-     # Style
-     - annotate_overrides
-     - avoid_init_to_null
-     - avoid_return_types_on_setters
-     - await_only_futures
-     - camel_case_types
-     - empty_catches
-     - empty_constructor_bodies
-     - library_names
-     - library_prefixes
-     - non_constant_identifier_names
-     - prefer_is_not_empty
-     - slash_for_doc_comments
-     - type_init_formals
diff --git a/packages/charcode/.gitignore b/packages/charcode/.gitignore
deleted file mode 100644
index 1d79863..0000000
--- a/packages/charcode/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.packages
-.pub
-pubspec.lock
diff --git a/packages/charcode/.status b/packages/charcode/.status
deleted file mode 100644
index 59f3573..0000000
--- a/packages/charcode/.status
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-# for 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/packages/charcode/.travis.yml b/packages/charcode/.travis.yml
deleted file mode 100644
index b1279b7..0000000
--- a/packages/charcode/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: dart
-script: ./tool/travis.sh
-sudo: false
diff --git a/packages/charcode/AUTHORS b/packages/charcode/AUTHORS
deleted file mode 100644
index e8063a8..0000000
--- a/packages/charcode/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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/packages/charcode/CHANGELOG.md b/packages/charcode/CHANGELOG.md
deleted file mode 100644
index 83c2884..0000000
--- a/packages/charcode/CHANGELOG.md
+++ /dev/null
@@ -1,9 +0,0 @@
-## 1.1.1
-
-- Spelling fixes.
-
-- Linting fixes.
-
-## 1.1.0
-
-- Initial version
diff --git a/packages/charcode/CONTRIBUTING.md b/packages/charcode/CONTRIBUTING.md
deleted file mode 100644
index 6f5e0ea..0000000
--- a/packages/charcode/CONTRIBUTING.md
+++ /dev/null
@@ -1,33 +0,0 @@
-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/packages/charcode/LICENSE b/packages/charcode/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/packages/charcode/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/charcode/README.md b/packages/charcode/README.md
deleted file mode 100644
index 4eedcbe..0000000
--- a/packages/charcode/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-Character code constants.
-
-[![Build Status](https://travis-ci.org/dart-lang/charcode.svg?branch=master)](https://travis-ci.org/dart-lang/charcode)
-[![Pub](https://img.shields.io/pub/v/charcode.svg)](https://pub.dartlang.org/packages/charcode)
-
-These libraries define symbolic names for some character codes.
-
-## Using
-
-Import either one of the libraries:
-
-```dart
-import "package:charcode/ascii.dart";
-import "package:charcode/html_entity.dart";
-```
-
-or import both libraries using the `charcode.dart` library:
-
-```dart
-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".
-Examples: `$plus`, `$exclamation`
-
-The `ascii.dart` library defines a symbolic name for each ASCII character.
-For some characters, it has more than one name. For example the common `$tab`
-and the official `$ht` for the horizontal tab.
-
-The `html_entity.dart` library defines a constant for each HTML 4.01 character
-entity, using the standard entity abbreviation, including 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 [request for character literals](http://dartbug.com/4415).
diff --git a/packages/charcode/codereview.settings b/packages/charcode/codereview.settings
deleted file mode 100644
index e031891..0000000
--- a/packages/charcode/codereview.settings
+++ /dev/null
@@ -1,4 +0,0 @@
-# This file is used by gcl to get repository specific information.
-CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/charcode/commit/
-CC_LIST: reviews@dartlang.org
diff --git a/packages/charcode/lib/ascii.dart b/packages/charcode/lib/ascii.dart
deleted file mode 100644
index 319ab73..0000000
--- a/packages/charcode/lib/ascii.dart
+++ /dev/null
@@ -1,508 +0,0 @@
-// 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 itself
-/// 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 usable 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/packages/charcode/lib/charcode.dart b/packages/charcode/lib/charcode.dart
deleted file mode 100644
index 6a702d7..0000000
--- a/packages/charcode/lib/charcode.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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/packages/charcode/lib/html_entity.dart b/packages/charcode/lib/html_entity.dart
deleted file mode 100644
index fa7c493..0000000
--- a/packages/charcode/lib/html_entity.dart
+++ /dev/null
@@ -1,769 +0,0 @@
-// 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/packages/charcode/pubspec.yaml b/packages/charcode/pubspec.yaml
deleted file mode 100644
index 9fe3ce3..0000000
--- a/packages/charcode/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: charcode
-version: 1.1.1
-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: https://github.com/dart-lang/charcode
-environment:
-  sdk: '>=1.0.0 <2.0.0'
diff --git a/packages/charcode/tool/travis.sh b/packages/charcode/tool/travis.sh
deleted file mode 100755
index c7c9d06..0000000
--- a/packages/charcode/tool/travis.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/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/charcode.dart
diff --git a/packages/collection/.gitignore b/packages/collection/.gitignore
deleted file mode 100644
index 98d6d21..0000000
--- a/packages/collection/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.buildlog
-.DS_Store
-.idea
-.pub/
-.dart_tool/
-.settings/
-build/
-packages
-.packages
-pubspec.lock
diff --git a/packages/collection/.test_config b/packages/collection/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/collection/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/collection/.travis.yml b/packages/collection/.travis.yml
deleted file mode 100644
index b4d1316..0000000
--- a/packages/collection/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-language: dart
-
-# Gives more resources on Travis (8GB Ram, 2 CPUs).
-# Do not remove without verifying w/ Travis.
-sudo: required
-addons:
-  chrome: stable
-
-# Build stages: https://docs.travis-ci.com/user/build-stages/.
-stages:
-  - presubmit
-  - build
-  - testing
-
-# 1. Run dartfmt, dartanalyzer, pub run test (VM).
-# 2. Then run a build.
-# 3. Then run tests compiled via dartdevc and dart2js.
-jobs:
-  include:
-    - stage: presubmit
-      script: ./tool/travis.sh dartfmt
-      dart: dev
-    - stage: presubmit
-      script: ./tool/travis.sh dartanalyzer
-      dart: dev
-    - stage: build
-      script: ./tool/travis.sh dartdevc_build
-      dart: dev
-    - stage: testing
-      script: ./tool/travis.sh vm_test
-      dart: dev
-    - stage: testing
-      script: ./tool/travis.sh dartdevc_test
-      dart: dev
-    - stage: testing
-      script: ./tool/travis.sh dart2js_test
-      dart: dev
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-# Incremental pub cache and builds.
-cache:
-  directories:
-    - $HOME/.pub-cache
-    - .dart_tool
-
-# Necessary for Chrome and Firefox to run
-before_install:
- - export DISPLAY=:99.0
- - sh -e /etc/init.d/xvfb start
- - "t=0; until (xdpyinfo -display :99 &> /dev/null || test $t -gt 10); do sleep 1; let t=$t+1; done"
diff --git a/packages/collection/AUTHORS b/packages/collection/AUTHORS
deleted file mode 100644
index e8063a8..0000000
--- a/packages/collection/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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/packages/collection/CHANGELOG.md b/packages/collection/CHANGELOG.md
deleted file mode 100644
index bc4b5e5..0000000
--- a/packages/collection/CHANGELOG.md
+++ /dev/null
@@ -1,185 +0,0 @@
-## 1.14.9
-
-* Fixed bugs where `QueueList`, `MapKeySet`, and `MapValueSet` did not adhere to
-  the contract laid out by `List.cast`, `Set.cast` and `Map.cast` respectively.
-  The returned instances of these methods now correctly forward to the existing
-  instance instead of always creating a new copy.
-
-## 1.14.8
-
-* Deprecated `Delegating{Name}.typed` static methods in favor of the new Dart 2
-  `cast` methods. For example, `DelegatingList.typed<String>(list)` can now be
-  written as `list.cast<String>()`. 
-
-## 1.14.7
-
-* Only the Dart 2 dev SDK (`>=2.0.0-dev.22.0`) is now supported.
-* Added support for all Dart 2 SDK methods that threw `UnimplementedError`.
-
-## 1.14.6
-
-* Make `DefaultEquality`'s `equals()` and `hash()` methods take any `Object`
-  rather than objects of type `E`. This makes `const DefaultEquality<Null>()`
-  usable as `Equality<E>` for any `E`, which means it can be used in a const
-  context which expects `Equality<E>`.
-
-  This makes the default arguments of various other const equality constructors
-  work in strong mode.
-
-## 1.14.5
-
-* Fix issue with `EmptyUnmodifiableSet`'s stubs that were introduced in 1.14.4.
-
-## 1.14.4
-
-* Add implementation stubs of upcoming Dart 2.0 core library methods, namely
-  new methods for classes that implement `Iterable`, `List`, `Map`, `Queue`, 
-  and `Set`.
-
-## 1.14.3
-
-* Fix `MapKeySet.lookup` to be a valid override in strong mode.
-
-## 1.14.2
-
-* Add type arguments to `SyntheticInvocation`.
-
-## 1.14.1
-
-* Make `Equality` implementations accept `null` as argument to `hash`.
-
-## 1.14.0
-
-* Add `CombinedListView`, a view of several lists concatenated together.
-* Add `CombinedIterableView`, a view of several iterables concatenated together.
-* Add `CombinedMapView`, a view of several maps concatenated together.
-
-## 1.13.0
-
-* Add `EqualityBy`
-
-## 1.12.0
-
-* Add `CaseInsensitiveEquality`.
-
-* Fix bug in `equalsIgnoreAsciiCase`.
-
-## 1.11.0
-
-* Add `EqualityMap` and `EqualitySet` classes which use `Equality` objects for
-  key and element equality, respectively.
-
-## 1.10.1
-
-* `Set.difference` now takes a `Set<Object>` as argument.
-
-## 1.9.1
-
-* Fix some documentation bugs.
-
-## 1.9.0
-
-* Add a top-level `stronglyConnectedComponents()` function that returns the
-  strongly connected components in a directed graph.
-
-## 1.8.0
-
-* Add a top-level `mapMap()` function that works like `Iterable.map()` on a
-  `Map`.
-
-* Add a top-level `mergeMaps()` function that creates a new map with the
-  combined contents of two existing maps.
-
-* Add a top-level `groupBy()` function that converts an `Iterable` to a `Map` by
-  grouping its elements using a function.
-
-* Add top-level `minBy()` and `maxBy()` functions that return the minimum and
-  maximum values in an `Iterable`, respectively, ordered by a derived value.
-
-* Add a top-level `transitiveClosure()` function that returns the transitive
-  closure of a directed graph.
-
-## 1.7.0
-
-* Add a `const UnmodifiableSetView.empty()` constructor.
-
-## 1.6.0
-
-* Add a `UnionSet` class that provides a view of the union of a set of sets.
-
-* Add a `UnionSetController` class that provides a convenient way to manage the
-  contents of a `UnionSet`.
-
-* Fix another incorrectly-declared generic type.
-
-## 1.5.1
-
-* Fix an incorrectly-declared generic type.
-
-## 1.5.0
-
-* Add `DelegatingIterable.typed()`, `DelegatingList.typed()`,
-  `DelegatingSet.typed()`, `DelegatingMap.typed()`, and
-  `DelegatingQueue.typed()` static methods. These wrap untyped instances of
-  these classes with the correct type parameter, and assert the types of values
-  as they're accessed.
-
-* Fix the types for `binarySearch()` and `lowerBound()` so they no longer
-  require all arguments to be comparable.
-
-* Add generic annotations to `insertionSort()` and `mergeSort()`.
-
-## 1.4.1
-
-* Fix all strong mode warnings.
-
-## 1.4.0
-
-* Add a `new PriorityQueue()` constructor that forwards to `new
-  HeapPriorityQueue()`.
-
-* Deprecate top-level libraries other than `package:collection/collection.dart`,
-  which exports these libraries' interfaces.
-
-## 1.3.0
-
-* Add `lowerBound` to binary search for values that might not be present.
-
-* Verify that the is valid for `CanonicalMap.[]`.
-
-## 1.2.0
-
-* Add string comparators that ignore ASCII case and sort numbers numerically.
-
-## 1.1.3
-
-* Fix type inconsistencies with `Map` and `Set`.
-
-## 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/packages/collection/CONTRIBUTING.md b/packages/collection/CONTRIBUTING.md
deleted file mode 100644
index e88abc6..0000000
--- a/packages/collection/CONTRIBUTING.md
+++ /dev/null
@@ -1,42 +0,0 @@
-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.
-
-### Presubmit testing
-* All code must pass analysis by the `dartanalyzer` (`dartanalyzer --fatal-warnings .`)
-* All code must be formatted by `dartfmt` (`dartfmt -w .`)
-  * _NOTE_: We currently require formatting by the `dev` channel SDK.
-* All code must pass unit tests for the VM, Dart2JS, and DartDevC (`pub run build_runner test`).
-  * _NOTE_: We currently use `build_runner` for compilation with DartDevC. It's
-    possible to run only Dart2JS and the VM without it using `pub run test`
-    directly.
-
-### File headers
-All files in the project must start with the following header.
-
-    // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-    // for 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/packages/collection/LICENSE b/packages/collection/LICENSE
deleted file mode 100644
index de31e1a..0000000
--- a/packages/collection/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/collection/README.md b/packages/collection/README.md
deleted file mode 100644
index a7985fa..0000000
--- a/packages/collection/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-Contains utility functions and classes in the style of `dart:collection` to make
-working with collections easier.
-
-## Algorithms
-
-The package 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 package provides a way to specify the 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` interface 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.
-
-Equalities are provided for `Iterable`s, `List`s, `Set`s, and `Map`s, as well as
-combinations of these, such as:
-
-```dart
-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 implementation of a priority queue.
-
-## Wrappers
-
-The package 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/packages/collection/analysis_options.yaml b/packages/collection/analysis_options.yaml
deleted file mode 100644
index 9d95259..0000000
--- a/packages/collection/analysis_options.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
-analyzer:
-  strong-mode: true
-  errors:
-    unused_element: error
-    unused_import: error
-    unused_local_variable: error
-    dead_code: error
-linter:
-  rules:
-    # Errors
-    - avoid_empty_else
-    - control_flow_in_finally
-    - empty_statements
-    - hash_and_equals
-    - implementation_imports
-    - test_types_in_equals
-    - throw_in_finally
-    - unrelated_type_equality_checks
-    - valid_regexps
-
-    # Style
-    - avoid_init_to_null
-    - avoid_return_types_on_setters
-    - await_only_futures
-    - camel_case_types
-    - directives_ordering
-    - empty_catches
-    - empty_constructor_bodies
-    - library_names
-    - library_prefixes
-    - non_constant_identifier_names
-    - only_throw_errors
-    - prefer_final_fields
-    - prefer_is_not_empty
-    - slash_for_doc_comments
-    - type_init_formals
diff --git a/packages/collection/codereview.settings b/packages/collection/codereview.settings
deleted file mode 100644
index 4afc2cf..0000000
--- a/packages/collection/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/collection/commit/
-CC_LIST: reviews@dartlang.org
diff --git a/packages/collection/dart_test.yaml b/packages/collection/dart_test.yaml
deleted file mode 100644
index d2b9d1d..0000000
--- a/packages/collection/dart_test.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-presets:
-  # When run with -P travis, we have different settings/options.
-  #
-  # 1: We don't use Chrome --headless:
-  # 2: We use --reporter expanded
-  # 3: We skip anything tagged "fails-on-travis".
-  travis:
-    # TODO(https://github.com/dart-lang/test/issues/772)
-    override_platforms:
-      chrome:
-        settings:
-          headless: false
-
-    # Don't run any tests that are tagged ["fails-on-travis"].
-    exclude_tags: "fails-on-travis"
-
-    # https://github.com/dart-lang/test/blob/master/doc/configuration.md#reporter
-    reporter: expanded
-
-platforms:
-  - chrome
-  - vm
diff --git a/packages/collection/lib/algorithms.dart b/packages/collection/lib/algorithms.dart
deleted file mode 100644
index 4d3ae8b..0000000
--- a/packages/collection/lib/algorithms.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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 `collection.dart` instead.
-@Deprecated("Will be removed in collection 2.0.0.")
-library dart.pkg.collection.algorithms;
-
-export "src/algorithms.dart";
diff --git a/packages/collection/lib/collection.dart b/packages/collection/lib/collection.dart
deleted file mode 100644
index 70f9fbc..0000000
--- a/packages/collection/lib/collection.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-export "src/algorithms.dart";
-export "src/canonicalized_map.dart";
-export "src/combined_wrappers/combined_iterable.dart";
-export "src/combined_wrappers/combined_list.dart";
-export "src/combined_wrappers/combined_map.dart";
-export "src/comparators.dart";
-export "src/equality.dart";
-export "src/equality_map.dart";
-export "src/equality_set.dart";
-export "src/functions.dart";
-export "src/iterable_zip.dart";
-export "src/priority_queue.dart";
-export "src/queue_list.dart";
-export "src/union_set.dart";
-export "src/union_set_controller.dart";
-export "src/unmodifiable_wrappers.dart";
-export "src/wrappers.dart";
diff --git a/packages/collection/lib/equality.dart b/packages/collection/lib/equality.dart
deleted file mode 100644
index 0f5b51d..0000000
--- a/packages/collection/lib/equality.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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 `collection.dart` instead.
-@Deprecated("Will be removed in collection 2.0.0.")
-library dart.pkg.collection.equality;
-
-export "src/equality.dart";
diff --git a/packages/collection/lib/iterable_zip.dart b/packages/collection/lib/iterable_zip.dart
deleted file mode 100644
index 34e18ef..0000000
--- a/packages/collection/lib/iterable_zip.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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 `collection.dart` instead.
-@Deprecated("Will be removed in collection 2.0.0.")
-library dart.pkg.collection.iterable_zip;
-
-export "src/iterable_zip.dart";
diff --git a/packages/collection/lib/priority_queue.dart b/packages/collection/lib/priority_queue.dart
deleted file mode 100644
index f2a4703..0000000
--- a/packages/collection/lib/priority_queue.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 `collection.dart` instead.
-@Deprecated("Will be removed in collection 2.0.0.")
-library dart.pkg.collection.priority_queue;
-
-export "src/priority_queue.dart";
diff --git a/packages/collection/lib/src/algorithms.dart b/packages/collection/lib/src/algorithms.dart
deleted file mode 100644
index 0d37d64..0000000
--- a/packages/collection/lib/src/algorithms.dart
+++ /dev/null
@@ -1,283 +0,0 @@
-// 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 "utils.dart";
-
-/// Returns a position of the [value] 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, this defaults to calling [Comparable.compareTo] on
-/// the objects. If any object is not [Comparable], this throws a [CastError].
-///
-/// Returns -1 if [value] is not in the list by default.
-int binarySearch<T>(List<T> sortedList, T value, {int compare(T a, T b)}) {
-  compare ??= defaultCompare<T>();
-  int min = 0;
-  int max = sortedList.length;
-  while (min < max) {
-    int mid = min + ((max - min) >> 1);
-    var element = sortedList[mid];
-    int comp = compare(element, value);
-    if (comp == 0) return mid;
-    if (comp < 0) {
-      min = mid + 1;
-    } else {
-      max = mid;
-    }
-  }
-  return -1;
-}
-
-/// Returns the first position in [sortedList] that does not compare less than
-/// [value].
-///
-/// If the list isn't sorted according to the [compare] function, the result
-/// is unpredictable.
-///
-/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
-/// the objects. If any object is not [Comparable], this throws a [CastError].
-///
-/// Returns [sortedList.length] if all the items in [sortedList] compare less
-/// than [value].
-int lowerBound<T>(List<T> sortedList, T value, {int compare(T a, T b)}) {
-  compare ??= defaultCompare<T>();
-  int min = 0;
-  int max = sortedList.length;
-  while (min < max) {
-    int mid = min + ((max - min) >> 1);
-    var element = sortedList[mid];
-    int comp = compare(element, value);
-    if (comp < 0) {
-      min = mid + 1;
-    } else {
-      max = mid;
-    }
-  }
-  return min;
-}
-
-/// 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]) {
-  var random = new math.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]) {
-  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 between [start] (inclusive) and [end] (exclusive) using
-/// insertion sort.
-///
-/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
-/// the objects. If any object is not [Comparable], this throws a [CastError].
-///
-/// 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<T>(List<T> list,
-    {int compare(T a, T b), int start: 0, int end}) {
-  // If the same method could have both positional and named optional
-  // parameters, this should be (list, [start, end], {compare}).
-  compare ??= defaultCompare<T>();
-  end ??= list.length;
-
-  for (int pos = start + 1; 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 between [start] (inclusive) and [end] (exclusive) using the
-/// merge sort algorithm.
-///
-/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
-/// the objects. If any object is not [Comparable], this throws a [CastError].
-///
-/// 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<T>(List<T> list,
-    {int start: 0, int end, int compare(T a, T b)}) {
-  end ??= list.length;
-  compare ??= defaultCompare<T>();
-
-  int length = end - start;
-  if (length < 2) return;
-  if (length < _MERGE_SORT_LIMIT) {
-    insertionSort(list, compare: compare, start: start, end: end);
-    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.
-  var scratchSpace = new List<T>(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<T>(List<T> list, int compare(T a, T b), int start,
-    int end, List<T> 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<T>(List<T> list, int compare(T a, T b), int start, int end,
-    List<T> 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<T>(
-    int compare(T a, T b),
-    List<T> firstList,
-    int firstStart,
-    int firstEnd,
-    List<T> secondList,
-    int secondStart,
-    int secondEnd,
-    List<T> 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/packages/collection/lib/src/canonicalized_map.dart b/packages/collection/lib/src/canonicalized_map.dart
deleted file mode 100644
index b28c6cc..0000000
--- a/packages/collection/lib/src/canonicalized_map.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 'utils.dart';
-
-typedef C _Canonicalize<C, K>(K key);
-
-typedef bool _IsValidKey(Object key);
-
-/// 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 _Canonicalize<C, K> _canonicalize;
-
-  final _IsValidKey _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 as K)];
-    return pair == null ? null : pair.last;
-  }
-
-  void operator []=(K key, V value) {
-    if (!_isValidKey(key)) return;
-    _base[_canonicalize(key)] = new Pair(key, value);
-  }
-
-  void addAll(Map<K, V> other) {
-    other.forEach((key, value) => this[key] = value);
-  }
-
-  void addEntries(Iterable<MapEntry<K, V>> entries) =>
-      _base.addEntries(entries.map(
-          (e) => new MapEntry(_canonicalize(e.key), new Pair(e.key, e.value))));
-
-  Map<K2, V2> cast<K2, V2>() => _base.cast<K2, V2>();
-
-  void clear() {
-    _base.clear();
-  }
-
-  bool containsKey(Object key) {
-    if (!_isValidKey(key)) return false;
-    return _base.containsKey(_canonicalize(key as K));
-  }
-
-  bool containsValue(Object value) =>
-      _base.values.any((pair) => pair.last == value);
-
-  Iterable<MapEntry<K, V>> get entries =>
-      _base.entries.map((e) => new MapEntry(e.value.first, e.value.last));
-
-  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;
-
-  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> transform(K key, V value)) =>
-      _base.map((_, pair) => transform(pair.first, pair.last));
-
-  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 as K));
-    return pair == null ? null : pair.last;
-  }
-
-  void removeWhere(bool test(K key, V value)) =>
-      _base.removeWhere((_, pair) => test(pair.first, pair.last));
-
-  Map<K2, V2> retype<K2, V2>() => _base.retype<K2, V2>();
-
-  V update(K key, V update(V value), {V ifAbsent()}) => _base
-      .update(_canonicalize(key), (pair) => new Pair(key, update(pair.last)),
-          ifAbsent: ifAbsent == null ? null : () => new Pair(key, ifAbsent()))
-      .last;
-
-  void updateAll(V update(K key, V value)) => _base.updateAll(
-      (_, pair) => new Pair(pair.first, update(pair.first, pair.last)));
-
-  Iterable<V> get values => _base.values.map((pair) => pair.last);
-
-  String toString() {
-    // Detect toString() cycles.
-    if (_isToStringVisiting(this)) {
-      return '{...}';
-    }
-
-    var result = new StringBuffer();
-    try {
-      _toStringVisiting.add(this);
-      result.write('{');
-      bool first = true;
-      forEach((k, v) {
-        if (!first) {
-          result.write(', ');
-        }
-        first = false;
-        result.write('$k: $v');
-      });
-      result.write('}');
-    } finally {
-      assert(identical(_toStringVisiting.last, this));
-      _toStringVisiting.removeLast();
-    }
-
-    return result.toString();
-  }
-
-  bool _isValidKey(Object key) =>
-      (key == null || key is K) &&
-      (_isValidKeyFn == null || _isValidKeyFn(key));
-}
-
-/// A collection used to identify cyclic maps during toString() calls.
-final List _toStringVisiting = [];
-
-/// Check if we are currently visiting `o` in a toString() call.
-bool _isToStringVisiting(o) => _toStringVisiting.any((e) => identical(o, e));
diff --git a/packages/collection/lib/src/combined_wrappers/combined_iterable.dart b/packages/collection/lib/src/combined_wrappers/combined_iterable.dart
deleted file mode 100644
index 511876e..0000000
--- a/packages/collection/lib/src/combined_wrappers/combined_iterable.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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 view of several iterables combined sequentially into a single iterable.
-///
-/// All methods and accessors treat the [CombinedIterableView] as if it were a
-/// single concatenated iterable, but the underlying implementation is based on
-/// lazily accessing individual iterable instances. This means that if the
-/// underlying iterables change, the [CombinedIterableView] will reflect those
-/// changes.
-class CombinedIterableView<T> extends IterableBase<T> {
-  /// The iterables that this combines.
-  final Iterable<Iterable<T>> _iterables;
-
-  /// Creates a combined view of [iterables].
-  const CombinedIterableView(this._iterables);
-
-  Iterator<T> get iterator =>
-      new _CombinedIterator<T>(_iterables.map((i) => i.iterator).iterator);
-
-  // Special cased contains/isEmpty/length since many iterables have an
-  // efficient implementation instead of running through the entire iterator.
-
-  bool contains(Object element) => _iterables.any((i) => i.contains(element));
-
-  bool get isEmpty => _iterables.every((i) => i.isEmpty);
-
-  int get length => _iterables.fold(0, (length, i) => length + i.length);
-}
-
-/// The iterator for [CombinedIterableView].
-///
-/// This moves through each iterable's iterators in sequence.
-class _CombinedIterator<T> implements Iterator<T> {
-  /// The iterators that this combines.
-  ///
-  /// Because this comes from a call to [Iterable.map], it's lazy and will
-  /// avoid instantiating unnecessary iterators.
-  final Iterator<Iterator<T>> _iterators;
-
-  _CombinedIterator(this._iterators);
-
-  T get current => _iterators.current?.current;
-
-  bool moveNext() {
-    var current = _iterators.current;
-    if (current != null && current.moveNext()) {
-      return true;
-    }
-    return _iterators.moveNext() && moveNext();
-  }
-}
diff --git a/packages/collection/lib/src/combined_wrappers/combined_list.dart b/packages/collection/lib/src/combined_wrappers/combined_list.dart
deleted file mode 100644
index d2e0349..0000000
--- a/packages/collection/lib/src/combined_wrappers/combined_list.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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 view of several lists combined into a single list.
-///
-/// All methods and accessors treat the [CombinedListView] list as if it were a
-/// single concatenated list, but the underlying implementation is based on
-/// lazily accessing individual list instances. This means that if the
-/// underlying lists change, the [CombinedListView] will reflect those changes.
-///
-/// The index operator (`[]`) and [length] property of a [CombinedListView] are
-/// both `O(lists)` rather than `O(1)`. A [CombinedListView] is unmodifiable.
-class CombinedListView<T> extends ListBase<T>
-    implements UnmodifiableListView<T> {
-  static void _throw() {
-    throw new UnsupportedError('Cannot modify an unmodifiable List');
-  }
-
-  /// The lists that this combines.
-  final List<List<T>> _lists;
-
-  /// Creates a combined view of [lists].
-  CombinedListView(this._lists);
-
-  set length(int length) {
-    _throw();
-  }
-
-  int get length => _lists.fold(0, (length, list) => length + list.length);
-
-  T operator [](int index) {
-    var initialIndex = index;
-    for (var i = 0; i < _lists.length; i++) {
-      var list = _lists[i];
-      if (index < list.length) {
-        return list[index];
-      }
-      index -= list.length;
-    }
-    throw new RangeError.index(initialIndex, this, 'index', null, length);
-  }
-
-  void operator []=(int index, T value) {
-    _throw();
-  }
-
-  void clear() {
-    _throw();
-  }
-
-  bool remove(Object element) {
-    _throw();
-    return null;
-  }
-
-  void removeWhere(bool filter(T element)) {
-    _throw();
-  }
-
-  void retainWhere(bool filter(T element)) {
-    _throw();
-  }
-}
diff --git a/packages/collection/lib/src/combined_wrappers/combined_map.dart b/packages/collection/lib/src/combined_wrappers/combined_map.dart
deleted file mode 100644
index 8c2760b..0000000
--- a/packages/collection/lib/src/combined_wrappers/combined_map.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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 'combined_iterable.dart';
-
-/// Returns a new map that represents maps flattened into a single map.
-///
-/// All methods and accessors treat the new map as-if it were a single
-/// concatenated map, but the underlying implementation is based on lazily
-/// accessing individual map instances. In the occasion where a key occurs in
-/// multiple maps the first value is returned.
-///
-/// The resulting map has an index operator (`[]`) and `length` property that
-/// are both `O(maps)`, rather than `O(1)`, and the map is unmodifiable - but
-/// underlying changes to these maps are still accessible from the resulting
-/// map.
-class CombinedMapView<K, V> extends UnmodifiableMapBase<K, V> {
-  final Iterable<Map<K, V>> _maps;
-
-  /// Create a new combined view into multiple maps.
-  ///
-  /// The iterable is accessed lazily so it should be collection type like
-  /// [List] or [Set] rather than a lazy iterable produced by `map()` et al.
-  CombinedMapView(this._maps);
-
-  V operator [](Object key) {
-    for (var map in _maps) {
-      // Avoid two hash lookups on a positive hit.
-      var value = map[key];
-      if (value != null || map.containsKey(value)) {
-        return value;
-      }
-    }
-    return null;
-  }
-
-  /// The keys of [this].
-  ///
-  /// The returned iterable has efficient `length` and `contains` operations,
-  /// based on [length] and [containsKey] of the individual maps.
-  ///
-  /// The order of iteration is defined by the individual `Map` implementations,
-  /// but must be consistent between changes to the maps.
-  ///
-  /// Unlike most [Map] implementations, modifying an individual map while
-  /// iterating the keys will _sometimes_ throw. This behavior may change in
-  /// the future.
-  Iterable<K> get keys => new CombinedIterableView<K>(_maps.map((m) => m.keys));
-}
diff --git a/packages/collection/lib/src/comparators.dart b/packages/collection/lib/src/comparators.dart
deleted file mode 100644
index 5fc55b2..0000000
--- a/packages/collection/lib/src/comparators.dart
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file

-// for details. All rights reserved. Use of this source code is governed by a

-// BSD-style license that can be found in the LICENSE file.

-

-// Character constants.

-const int _zero = 0x30;

-const int _upperCaseA = 0x41;

-const int _upperCaseZ = 0x5a;

-const int _lowerCaseA = 0x61;

-const int _lowerCaseZ = 0x7a;

-const int _asciiCaseBit = 0x20;

-

-/// Checks if strings [a] and [b] differ only on the case of ASCII letters.

-///

-/// Strings are equal if they have the same length, and the characters at

-/// each index are the same, or they are ASCII letters where one is upper-case

-/// and the other is the lower-case version of the same letter.

-///

-/// The comparison does not ignore the case of non-ASCII letters, so

-/// an upper-case ae-ligature (Æ) is different from

-/// a lower case ae-ligature (æ).

-///

-/// Ignoring non-ASCII letters is not generally a good idea, but it makes sense

-/// for situations where the strings are known to be ASCII. Examples could

-/// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar

-/// strings with a known structure.

-bool equalsIgnoreAsciiCase(String a, String b) {

-  if (a.length != b.length) return false;

-  for (int i = 0; i < a.length; i++) {

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar == bChar) continue;

-    // Quick-check for whether this may be different cases of the same letter.

-    if (aChar ^ bChar != _asciiCaseBit) return false;

-    // If it's possible, then check if either character is actually an ASCII

-    // letter.

-    int aCharLowerCase = aChar | _asciiCaseBit;

-    if (_lowerCaseA <= aCharLowerCase && aCharLowerCase <= _lowerCaseZ) {

-      continue;

-    }

-    return false;

-  }

-  return true;

-}

-

-/// Hash code for a string which is compatible with [equalsIgnoreAsciiCase].

-///

-/// The hash code is unaffected by changing the case of ASCII letters, but

-/// the case of non-ASCII letters do affect the result.

-int hashIgnoreAsciiCase(String string) {

-  // Jenkins hash code ( http://en.wikipedia.org/wiki/Jenkins_hash_function).

-  // adapted to smi values.

-  // Same hash used by dart2js for strings, modified to ignore ASCII letter

-  // case.

-  int hash = 0;

-  for (int i = 0; i < string.length; i++) {

-    int char = string.codeUnitAt(i);

-    // Convert lower-case ASCII letters to upper case.upper

-    // This ensures that strings that differ only in case will have the

-    // same hash code.

-    if (_lowerCaseA <= char && char <= _lowerCaseZ) char -= _asciiCaseBit;

-    hash = 0x1fffffff & (hash + char);

-    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));

-    hash >>= 6;

-  }

-  hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));

-  hash >>= 11;

-  return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));

-}

-

-/// Compares [a] and [b] lexically, converting ASCII letters to upper case.

-///

-/// Comparison treats all lower-case ASCII letters as upper-case letters,

-/// but does no case conversion for non-ASCII letters.

-///

-/// If two strings differ only on the case of ASCII letters, the one with the

-/// capital letter at the first difference will compare as less than the other

-/// string. This tie-breaking ensures that the comparison is a total ordering

-/// on strings and is compatible with equality.

-///

-/// Ignoring non-ASCII letters is not generally a good idea, but it makes sense

-/// for situations where the strings are known to be ASCII. Examples could

-/// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar

-/// strings with a known structure.

-int compareAsciiUpperCase(String a, String b) {

-  int defaultResult = 0; // Returned if no difference found.

-  for (int i = 0; i < a.length; i++) {

-    if (i >= b.length) return 1;

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar == bChar) continue;

-    // Upper-case if letters.

-    int aUpperCase = aChar;

-    int bUpperCase = bChar;

-    if (_lowerCaseA <= aChar && aChar <= _lowerCaseZ) {

-      aUpperCase -= _asciiCaseBit;

-    }

-    if (_lowerCaseA <= bChar && bChar <= _lowerCaseZ) {

-      bUpperCase -= _asciiCaseBit;

-    }

-    if (aUpperCase != bUpperCase) return (aUpperCase - bUpperCase).sign;

-    if (defaultResult == 0) defaultResult = (aChar - bChar);

-  }

-  if (b.length > a.length) return -1;

-  return defaultResult.sign;

-}

-

-/// Compares [a] and [b] lexically, converting ASCII letters to lower case.

-///

-/// Comparison treats all upper-case ASCII letters as lower-case letters,

-/// but does no case conversion for non-ASCII letters.

-///

-/// If two strings differ only on the case of ASCII letters, the one with the

-/// capital letter at the first difference will compare as less than the other

-/// string. This tie-breaking ensures that the comparison is a total ordering

-/// on strings.

-///

-/// Ignoring non-ASCII letters is not generally a good idea, but it makes sense

-/// for situations where the strings are known to be ASCII. Examples could

-/// be Dart identifiers, base-64 or hex encoded strings, GUIDs or similar

-/// strings with a known structure.

-int compareAsciiLowerCase(String a, String b) {

-  int defaultResult = 0;

-  for (int i = 0; i < a.length; i++) {

-    if (i >= b.length) return 1;

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar == bChar) continue;

-    int aLowerCase = aChar;

-    int bLowerCase = bChar;

-    // Upper case if ASCII letters.

-    if (_upperCaseA <= bChar && bChar <= _upperCaseZ) {

-      bLowerCase += _asciiCaseBit;

-    }

-    if (_upperCaseA <= aChar && aChar <= _upperCaseZ) {

-      aLowerCase += _asciiCaseBit;

-    }

-    if (aLowerCase != bLowerCase) return (aLowerCase - bLowerCase).sign;

-    if (defaultResult == 0) defaultResult = aChar - bChar;

-  }

-  if (b.length > a.length) return -1;

-  return defaultResult.sign;

-}

-

-/// Compares strings [a] and [b] according to [natural sort ordering][].

-///

-/// A natural sort ordering is a lexical ordering where embedded

-/// numerals (digit sequences) are treated as a single unit and ordered by

-/// numerical value.

-/// This means that `"a10b"` will be ordered after `"a7b"` in natural

-/// ordering, where lexical ordering would put the `1` before the `7`, ignoring

-/// that the `1` is part of a larger number.

-///

-/// Example:

-/// The following strings are in the order they would be sorted by using this

-/// comparison function:

-///

-///     "a", "a0", "a0b", "a1", "a01", "a9", "a10", "a100", "a100b", "aa"

-///

-/// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order

-int compareNatural(String a, String b) {

-  for (int i = 0; i < a.length; i++) {

-    if (i >= b.length) return 1;

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar != bChar) {

-      return _compareNaturally(a, b, i, aChar, bChar);

-    }

-  }

-  if (b.length > a.length) return -1;

-  return 0;

-}

-

-/// Compares strings [a] and [b] according to lower-case

-/// [natural sort ordering][].

-///

-/// ASCII letters are converted to lower case before being compared, like

-/// for [compareAsciiLowerCase], then the result is compared like for

-/// [compareNatural].

-///

-/// If two strings differ only on the case of ASCII letters, the one with the

-/// capital letter at the first difference will compare as less than the other

-/// string. This tie-breaking ensures that the comparison is a total ordering

-/// on strings.

-///

-/// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order

-int compareAsciiLowerCaseNatural(String a, String b) {

-  int defaultResult = 0; // Returned if no difference found.

-  for (int i = 0; i < a.length; i++) {

-    if (i >= b.length) return 1;

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar == bChar) continue;

-    int aLowerCase = aChar;

-    int bLowerCase = bChar;

-    if (_upperCaseA <= aChar && aChar <= _upperCaseZ) {

-      aLowerCase += _asciiCaseBit;

-    }

-    if (_upperCaseA <= bChar && bChar <= _upperCaseZ) {

-      bLowerCase += _asciiCaseBit;

-    }

-    if (aLowerCase != bLowerCase) {

-      return _compareNaturally(a, b, i, aLowerCase, bLowerCase);

-    }

-    if (defaultResult == 0) defaultResult = aChar - bChar;

-  }

-  if (b.length > a.length) return -1;

-  return defaultResult.sign;

-}

-

-/// Compares strings [a] and [b] according to upper-case

-/// [natural sort ordering][].

-///

-/// ASCII letters are converted to upper case before being compared, like

-/// for [compareAsciiUpperCase], then the result is compared like for

-/// [compareNatural].

-///

-/// If two strings differ only on the case of ASCII letters, the one with the

-/// capital letter at the first difference will compare as less than the other

-/// string. This tie-breaking ensures that the comparison is a total ordering

-/// on strings

-///

-/// [natural sort ordering]: https://en.wikipedia.org/wiki/Natural_sort_order

-int compareAsciiUpperCaseNatural(String a, String b) {

-  int defaultResult = 0;

-  for (int i = 0; i < a.length; i++) {

-    if (i >= b.length) return 1;

-    var aChar = a.codeUnitAt(i);

-    var bChar = b.codeUnitAt(i);

-    if (aChar == bChar) continue;

-    int aUpperCase = aChar;

-    int bUpperCase = bChar;

-    if (_lowerCaseA <= aChar && aChar <= _lowerCaseZ) {

-      aUpperCase -= _asciiCaseBit;

-    }

-    if (_lowerCaseA <= bChar && bChar <= _lowerCaseZ) {

-      bUpperCase -= _asciiCaseBit;

-    }

-    if (aUpperCase != bUpperCase) {

-      return _compareNaturally(a, b, i, aUpperCase, bUpperCase);

-    }

-    if (defaultResult == 0) defaultResult = aChar - bChar;

-  }

-  if (b.length > a.length) return -1;

-  return defaultResult.sign;

-}

-

-/// Check for numbers overlapping the current mismatched characters.

-///

-/// If both [aChar] and [bChar] are digits, use numerical comparison.

-/// Check if the previous characters is a non-zero number, and if not,

-/// skip - but count - leading zeros before comparing numbers.

-///

-/// If one is a digit and the other isn't, check if the previous character

-/// is a digit, and if so, the the one with the digit is the greater number.

-///

-/// Otherwise just returns the difference between [aChar] and [bChar].

-int _compareNaturally(String a, String b, int index, int aChar, int bChar) {

-  assert(aChar != bChar);

-  var aIsDigit = _isDigit(aChar);

-  var bIsDigit = _isDigit(bChar);

-  if (aIsDigit) {

-    if (bIsDigit) {

-      return _compareNumerically(a, b, aChar, bChar, index);

-    } else if (index > 0 && _isDigit(a.codeUnitAt(index - 1))) {

-      // aChar is the continuation of a longer number.

-      return 1;

-    }

-  } else if (bIsDigit && index > 0 && _isDigit(b.codeUnitAt(index - 1))) {

-    // bChar is the continuation of a longer number.

-    return -1;

-  }

-  // Characters are both non-digits, or not continuation of earlier number.

-  return (aChar - bChar).sign;

-}

-

-/// Compare numbers overlapping [aChar] and [bChar] numerically.

-///

-/// If the numbers have the same numerical value, but one has more leading

-/// zeros, the longer number is considered greater than the shorter one.

-///

-/// This ensures a total ordering on strings compatible with equality.

-int _compareNumerically(String a, String b, int aChar, int bChar, int index) {

-  // Both are digits. Find the first significant different digit, then find

-  // the length of the numbers.

-  if (_isNonZeroNumberSuffix(a, index)) {

-    // Part of a longer number, differs at this index, just count the length.

-    int result = _compareDigitCount(a, b, index, index);

-    if (result != 0) return result;

-    // If same length, the current character is the most significant differing

-    // digit.

-    return (aChar - bChar).sign;

-  }

-  // Not part of larger (non-zero) number, so skip leading zeros before

-  // comparing numbers.

-  int aIndex = index;

-  int bIndex = index;

-  if (aChar == _zero) {

-    do {

-      aIndex++;

-      if (aIndex == a.length) return -1; // number in a is zero, b is not.

-      aChar = a.codeUnitAt(aIndex);

-    } while (aChar == _zero);

-    if (!_isDigit(aChar)) return -1;

-  } else if (bChar == _zero) {

-    do {

-      bIndex++;

-      if (bIndex == b.length) return 1; // number in b is zero, a is not.

-      bChar = b.codeUnitAt(bIndex);

-    } while (bChar == _zero);

-    if (!_isDigit(bChar)) return 1;

-  }

-  if (aChar != bChar) {

-    int result = _compareDigitCount(a, b, aIndex, bIndex);

-    if (result != 0) return result;

-    return (aChar - bChar).sign;

-  }

-  // Same leading digit, one had more leading zeros.

-  // Compare digits until reaching a difference.

-  while (true) {

-    var aIsDigit = false;

-    var bIsDigit = false;

-    aChar = 0;

-    bChar = 0;

-    if (++aIndex < a.length) {

-      aChar = a.codeUnitAt(aIndex);

-      aIsDigit = _isDigit(aChar);

-    }

-    if (++bIndex < b.length) {

-      bChar = b.codeUnitAt(bIndex);

-      bIsDigit = _isDigit(bChar);

-    }

-    if (aIsDigit) {

-      if (bIsDigit) {

-        if (aChar == bChar) continue;

-        // First different digit found.

-        break;

-      }

-      // bChar is non-digit, so a has longer number.

-      return 1;

-    } else if (bIsDigit) {

-      return -1; // b has longer number.

-    } else {

-      // Neither is digit, so numbers had same numerical value.

-      // Fall back on number of leading zeros

-      // (reflected by difference in indices).

-      return (aIndex - bIndex).sign;

-    }

-  }

-  // At first differing digits.

-  int result = _compareDigitCount(a, b, aIndex, bIndex);

-  if (result != 0) return result;

-  return (aChar - bChar).sign;

-}

-

-/// Checks which of [a] and [b] has the longest sequence of digits.

-///

-/// Starts counting from `i + 1` and `j + 1` (assumes that `a[i]` and `b[j]` are

-/// both already known to be digits).

-int _compareDigitCount(String a, String b, int i, int j) {

-  while (++i < a.length) {

-    bool aIsDigit = _isDigit(a.codeUnitAt(i));

-    if (++j == b.length) return aIsDigit ? 1 : 0;

-    bool bIsDigit = _isDigit(b.codeUnitAt(j));

-    if (aIsDigit) {

-      if (bIsDigit) continue;

-      return 1;

-    } else if (bIsDigit) {

-      return -1;

-    } else {

-      return 0;

-    }

-  }

-  if (++j < b.length && _isDigit(b.codeUnitAt(j))) {

-    return -1;

-  }

-  return 0;

-}

-

-bool _isDigit(int charCode) => (charCode ^ _zero) <= 9;

-

-/// Check if the digit at [index] is continuing a non-zero number.

-///

-/// If there is no non-zero digits before, then leading zeros at [index]

-/// are also ignored when comparing numerically. If there is a non-zero digit

-/// before, then zeros at [index] are significant.

-bool _isNonZeroNumberSuffix(String string, int index) {

-  while (--index >= 0) {

-    int char = string.codeUnitAt(index);

-    if (char != _zero) return _isDigit(char);

-  }

-  return false;

-}

diff --git a/packages/collection/lib/src/empty_unmodifiable_set.dart b/packages/collection/lib/src/empty_unmodifiable_set.dart
deleted file mode 100644
index 436e88d..0000000
--- a/packages/collection/lib/src/empty_unmodifiable_set.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'unmodifiable_wrappers.dart';
-
-// Unfortunately, we can't use UnmodifiableSetMixin here, since const classes
-// can't use mixins.
-/// An unmodifiable, empty set that can have a const constructor.
-class EmptyUnmodifiableSet<E> extends IterableBase<E>
-    implements UnmodifiableSetView<E> {
-  static T _throw<T>() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Set");
-  }
-
-  Iterator<E> get iterator => new Iterable<E>.empty().iterator;
-  int get length => 0;
-
-  const EmptyUnmodifiableSet();
-
-  EmptyUnmodifiableSet<T> cast<T>() => new EmptyUnmodifiableSet<T>();
-  bool contains(Object element) => false;
-  bool containsAll(Iterable<Object> other) => other.isEmpty;
-  Iterable<E> followedBy(Iterable<E> other) => new Set.from(other);
-  E lookup(Object element) => null;
-  EmptyUnmodifiableSet<T> retype<T>() => new EmptyUnmodifiableSet<T>();
-  E singleWhere(bool test(E element), {E orElse()}) => super.singleWhere(test);
-  Iterable<T> whereType<T>() => new EmptyUnmodifiableSet<T>();
-  Set<E> toSet() => new Set();
-  Set<E> union(Set<E> other) => new Set.from(other);
-  Set<E> intersection(Set<Object> other) => new Set();
-  Set<E> difference(Set<Object> other) => new Set();
-
-  bool add(E value) => _throw();
-  void addAll(Iterable<E> elements) => _throw();
-  void clear() => _throw();
-  bool remove(Object element) => _throw();
-  void removeAll(Iterable<Object> elements) => _throw();
-  void removeWhere(bool test(E element)) => _throw();
-  void retainWhere(bool test(E element)) => _throw();
-  void retainAll(Iterable<Object> elements) => _throw();
-}
diff --git a/packages/collection/lib/src/equality.dart b/packages/collection/lib/src/equality.dart
deleted file mode 100644
index 855503e..0000000
--- a/packages/collection/lib/src/equality.dart
+++ /dev/null
@@ -1,464 +0,0 @@
-// 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 "comparators.dart";
-
-const int _HASH_MASK = 0x7fffffff;
-
-/// A generic equality relation on objects.
-abstract class Equality<E> {
-  const factory Equality() = DefaultEquality<E>;
-
-  /// 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);
-}
-
-typedef F _GetKey<E, F>(E object);
-
-/// Equality of objects based on derived values.
-///
-/// For example, given the class:
-/// ```dart
-/// abstract class Employee {
-///   int get employmentId;
-/// }
-/// ```
-///
-/// The following [Equality] considers employees with the same IDs to be equal:
-/// ```dart
-/// new EqualityBy((Employee e) => e.employmentId);
-/// ```
-///
-/// It's also possible to pass an additional equality instance that should be
-/// used to compare the value itself.
-class EqualityBy<E, F> implements Equality<E> {
-  // Returns a derived value F from an object E.
-  final _GetKey<E, F> _getKey;
-
-  // Determines equality between two values of F.
-  final Equality<F> _inner;
-
-  EqualityBy(F getKey(E object), [Equality<F> inner = const DefaultEquality()])
-      : _getKey = getKey,
-        _inner = inner;
-
-  bool equals(E e1, E e2) => _inner.equals(_getKey(e1), _getKey(e2));
-
-  int hash(E e) => _inner.hash(_getKey(e));
-
-  bool isValidKey(Object o) {
-    if (o is E) {
-      final value = _getKey(o);
-      return value is F && _inner.isValidKey(value);
-    }
-    return false;
-  }
-}
-
-/// 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.
-///
-/// Note that [equals] and [hash] take `Object`s rather than `E`s. This allows
-/// `E` to be inferred as `Null` in const contexts where `E` wouldn't be a
-/// compile-time constant, while still allowing the class to be used at runtime.
-class DefaultEquality<E> implements Equality<E> {
-  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<E> implements Equality<E> {
-  const IdentityEquality();
-  bool equals(E e1, E e2) => identical(e1, e2);
-  int hash(E 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.
-///
-/// The [equals] and [hash] methods accepts `null` values,
-/// even if the [isValidKey] returns `false` for `null`.
-/// The [hash] of `null` is `null.hashCode`.
-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;
-    var it1 = elements1.iterator;
-    var 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) {
-    if (elements == null) return null.hashCode;
-    // 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.
-///
-/// The [equals] and [hash] methods accepts `null` values,
-/// even if the [isValidKey] returns `false` for `null`.
-/// The [hash] of `null` is `null.hashCode`.
-class ListEquality<E> implements Equality<List<E>> {
-  final Equality<E> _elementEquality;
-  const ListEquality([Equality<E> elementEquality = const DefaultEquality()])
-      : _elementEquality = elementEquality;
-
-  bool equals(List<E> list1, List<E> list2) {
-    if (identical(list1, list2)) return true;
-    if (list1 == null || list2 == null) return false;
-    int length = list1.length;
-    if (length != list2.length) return false;
-    for (int i = 0; i < length; i++) {
-      if (!_elementEquality.equals(list1[i], list2[i])) return false;
-    }
-    return true;
-  }
-
-  int hash(List<E> list) {
-    if (list == null) return null.hashCode;
-    // 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 < list.length; i++) {
-      int c = _elementEquality.hash(list[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 elements1, T elements2) {
-    if (identical(elements1, elements2)) return true;
-    if (elements1 == null || elements2 == 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 elements1) {
-      int count = counts[e];
-      if (count == null) count = 0;
-      counts[e] = count + 1;
-      length++;
-    }
-    for (var e in elements2) {
-      int count = counts[e];
-      if (count == null || count == 0) return false;
-      counts[e] = count - 1;
-      length--;
-    }
-    return length == 0;
-  }
-
-  int hash(T elements) {
-    if (elements == null) return null.hashCode;
-    int hash = 0;
-    for (E element in elements) {
-      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.
-///
-/// The [equals] and [hash] methods accepts `null` values,
-/// even if the [isValidKey] returns `false` for `null`.
-/// The [hash] of `null` is `null.hashCode`.
-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) =>
-      other is _MapEntry &&
-      equality._keyEquality.equals(key, other.key) &&
-      equality._valueEquality.equals(value, other.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.
-///
-/// The [equals] and [hash] methods accepts `null` values,
-/// even if the [isValidKey] returns `false` for `null`.
-/// The [hash] of `null` is `null.hashCode`.
-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> map1, Map<K, V> map2) {
-    if (identical(map1, map2)) return true;
-    if (map1 == null || map2 == null) return false;
-    int length = map1.length;
-    if (length != map2.length) return false;
-    Map<_MapEntry, int> equalElementCounts = new HashMap();
-    for (K key in map1.keys) {
-      _MapEntry entry = new _MapEntry(this, key, map1[key]);
-      int count = equalElementCounts[entry];
-      if (count == null) count = 0;
-      equalElementCounts[entry] = count + 1;
-    }
-    for (K key in map2.keys) {
-      _MapEntry entry = new _MapEntry(this, key, map2[key]);
-      int count = equalElementCounts[entry];
-      if (count == null || count == 0) return false;
-      equalElementCounts[entry] = count - 1;
-    }
-    return true;
-  }
-
-  int hash(Map<K, V> map) {
-    if (map == null) return null.hashCode;
-    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 0;
-  }
-
-  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 important.
-///
-/// 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) {
-      return e2 is Set && new SetEquality(this).equals(e1, e2);
-    }
-    if (e1 is Map) {
-      return e2 is Map &&
-          new MapEquality(keys: this, values: this).equals(e1, e2);
-    }
-    if (!_unordered) {
-      if (e1 is List) {
-        return e2 is List && new ListEquality(this).equals(e1, e2);
-      }
-      if (e1 is Iterable) {
-        return e2 is Iterable && new IterableEquality(this).equals(e1, e2);
-      }
-    } else if (e1 is Iterable) {
-      if (e1 is List != e2 is List) return false;
-      return e2 is Iterable &&
-          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);
-}
-
-/// String equality that's insensitive to differences in ASCII case.
-///
-/// Non-ASCII characters are compared as-is, with no conversion.
-class CaseInsensitiveEquality implements Equality<String> {
-  const CaseInsensitiveEquality();
-
-  bool equals(String string1, String string2) =>
-      equalsIgnoreAsciiCase(string1, string2);
-
-  int hash(String string) => hashIgnoreAsciiCase(string);
-
-  bool isValidKey(Object object) => object is String;
-}
diff --git a/packages/collection/lib/src/equality_map.dart b/packages/collection/lib/src/equality_map.dart
deleted file mode 100644
index 14f074c..0000000
--- a/packages/collection/lib/src/equality_map.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'equality.dart';
-import 'wrappers.dart';
-
-/// A [Map] whose key equality is determined by an [Equality] object.
-class EqualityMap<K, V> extends DelegatingMap<K, V> {
-  /// Creates a map with equality based on [equality].
-  EqualityMap(Equality<K> equality)
-      : super(new LinkedHashMap(
-            equals: equality.equals,
-            hashCode: equality.hash,
-            isValidKey: equality.isValidKey));
-
-  /// Creates a map with equality based on [equality] that contains all
-  /// key-value pairs of [other].
-  ///
-  /// If [other] has multiple keys that are equivalent according to [equality],
-  /// the last one reached during iteration takes precedence.
-  EqualityMap.from(Equality<K> equality, Map<K, V> other)
-      : super(new LinkedHashMap(
-            equals: equality.equals,
-            hashCode: equality.hash,
-            isValidKey: equality.isValidKey)) {
-    addAll(other);
-  }
-}
diff --git a/packages/collection/lib/src/equality_set.dart b/packages/collection/lib/src/equality_set.dart
deleted file mode 100644
index 6f6a426..0000000
--- a/packages/collection/lib/src/equality_set.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'equality.dart';
-import 'wrappers.dart';
-
-/// A [Map] whose key equality is determined by an [Equality] object.
-class EqualitySet<E> extends DelegatingSet<E> {
-  /// Creates a set with equality based on [equality].
-  EqualitySet(Equality<E> equality)
-      : super(new LinkedHashSet(
-            equals: equality.equals,
-            hashCode: equality.hash,
-            isValidKey: equality.isValidKey));
-
-  /// Creates a set with equality based on [equality] that contains all
-  /// elements in [other].
-  ///
-  /// If [other] has multiple values that are equivalent according to
-  /// [equality], the first one reached during iteration takes precedence.
-  EqualitySet.from(Equality<E> equality, Iterable<E> other)
-      : super(new LinkedHashSet(
-            equals: equality.equals,
-            hashCode: equality.hash,
-            isValidKey: equality.isValidKey)) {
-    addAll(other);
-  }
-}
diff --git a/packages/collection/lib/src/functions.dart b/packages/collection/lib/src/functions.dart
deleted file mode 100644
index b4ff9a9..0000000
--- a/packages/collection/lib/src/functions.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'dart:math' as math;
-
-import 'utils.dart';
-
-// TODO(nweiz): When sdk#26488 is fixed, use overloads to ensure that if [key]
-// or [value] isn't passed, `K2`/`V2` defaults to `K1`/`V1`, respectively.
-/// Creates a new map from [map] with new keys and values.
-///
-/// The return values of [key] are used as the keys and the return values of
-/// [value] are used as the values for the new map.
-Map<K2, V2> mapMap<K1, V1, K2, V2>(Map<K1, V1> map,
-    {K2 key(K1 key, V1 value), V2 value(K1 key, V1 value)}) {
-  key ??= (mapKey, _) => mapKey as K2;
-  value ??= (_, mapValue) => mapValue as V2;
-
-  var result = <K2, V2>{};
-  map.forEach((mapKey, mapValue) {
-    result[key(mapKey, mapValue)] = value(mapKey, mapValue);
-  });
-  return result;
-}
-
-/// Returns a new map with all key/value pairs in both [map1] and [map2].
-///
-/// If there are keys that occur in both maps, the [value] function is used to
-/// select the value that goes into the resulting map based on the two original
-/// values. If [value] is omitted, the value from [map2] is used.
-Map<K, V> mergeMaps<K, V>(Map<K, V> map1, Map<K, V> map2,
-    {V value(V value1, V value2)}) {
-  var result = new Map<K, V>.from(map1);
-  if (value == null) return result..addAll(map2);
-
-  map2.forEach((key, mapValue) {
-    result[key] =
-        result.containsKey(key) ? value(result[key], mapValue) : mapValue;
-  });
-  return result;
-}
-
-/// Groups the elements in [values] by the value returned by [key].
-///
-/// Returns a map from keys computed by [key] to a list of all values for which
-/// [key] returns that key. The values appear in the list in the same relative
-/// order as in [values].
-Map<T, List<S>> groupBy<S, T>(Iterable<S> values, T key(S element)) {
-  var map = <T, List<S>>{};
-  for (var element in values) {
-    var list = map.putIfAbsent(key(element), () => []);
-    list.add(element);
-  }
-  return map;
-}
-
-/// Returns the element of [values] for which [orderBy] returns the minimum
-/// value.
-///
-/// The values returned by [orderBy] are compared using the [compare] function.
-/// If [compare] is omitted, values must implement [Comparable<T>] and they are
-/// compared using their [Comparable.compareTo].
-S minBy<S, T>(Iterable<S> values, T orderBy(S element),
-    {int compare(T value1, T value2)}) {
-  compare ??= defaultCompare<T>();
-
-  S minValue;
-  T minOrderBy;
-  for (var element in values) {
-    var elementOrderBy = orderBy(element);
-    if (minOrderBy == null || compare(elementOrderBy, minOrderBy) < 0) {
-      minValue = element;
-      minOrderBy = elementOrderBy;
-    }
-  }
-  return minValue;
-}
-
-/// Returns the element of [values] for which [orderBy] returns the maximum
-/// value.
-///
-/// The values returned by [orderBy] are compared using the [compare] function.
-/// If [compare] is omitted, values must implement [Comparable<T>] and they are
-/// compared using their [Comparable.compareTo].
-S maxBy<S, T>(Iterable<S> values, T orderBy(S element),
-    {int compare(T value1, T value2)}) {
-  compare ??= defaultCompare<T>();
-
-  S maxValue;
-  T maxOrderBy;
-  for (var element in values) {
-    var elementOrderBy = orderBy(element);
-    if (maxOrderBy == null || compare(elementOrderBy, maxOrderBy) > 0) {
-      maxValue = element;
-      maxOrderBy = elementOrderBy;
-    }
-  }
-  return maxValue;
-}
-
-/// Returns the [transitive closure][] of [graph].
-///
-/// [transitive closure]: https://en.wikipedia.org/wiki/Transitive_closure
-///
-/// Interprets [graph] as a directed graph with a vertex for each key and edges
-/// from each key to the values that the key maps to.
-///
-/// Assumes that every vertex in the graph has a key to represent it, even if
-/// that vertex has no outgoing edges. This isn't checked, but if it's not
-/// satisfied, the function may crash or provide unexpected output. For example,
-/// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is.
-Map<T, Set<T>> transitiveClosure<T>(Map<T, Iterable<T>> graph) {
-  // This uses [Warshall's algorithm][], modified not to add a vertex from each
-  // node to itself.
-  //
-  // [Warshall's algorithm]: https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Applications_and_generalizations.
-  var result = <T, Set<T>>{};
-  graph.forEach((vertex, edges) {
-    result[vertex] = new Set<T>.from(edges);
-  });
-
-  // Lists are faster to iterate than maps, so we create a list since we're
-  // iterating repeatedly.
-  var keys = graph.keys.toList();
-  for (var vertex1 in keys) {
-    for (var vertex2 in keys) {
-      for (var vertex3 in keys) {
-        if (result[vertex2].contains(vertex1) &&
-            result[vertex1].contains(vertex3)) {
-          result[vertex2].add(vertex3);
-        }
-      }
-    }
-  }
-
-  return result;
-}
-
-/// Returns the [strongly connected components][] of [graph], in topological
-/// order.
-///
-/// [strongly connected components]: https://en.wikipedia.org/wiki/Strongly_connected_component
-///
-/// Interprets [graph] as a directed graph with a vertex for each key and edges
-/// from each key to the values that the key maps to.
-///
-/// Assumes that every vertex in the graph has a key to represent it, even if
-/// that vertex has no outgoing edges. This isn't checked, but if it's not
-/// satisfied, the function may crash or provide unexpected output. For example,
-/// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is.
-List<Set<T>> stronglyConnectedComponents<T>(Map<T, Iterable<T>> graph) {
-  // This uses [Tarjan's algorithm][].
-  //
-  // [Tarjan's algorithm]: https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
-  var index = 0;
-  var stack = <T>[];
-  var result = <Set<T>>[];
-
-  // The order of these doesn't matter, so we use un-linked implementations to
-  // avoid unnecessary overhead.
-  var indices = new HashMap<T, int>();
-  var lowLinks = new HashMap<T, int>();
-  var onStack = new HashSet<T>();
-
-  strongConnect(T vertex) {
-    indices[vertex] = index;
-    lowLinks[vertex] = index;
-    index++;
-
-    stack.add(vertex);
-    onStack.add(vertex);
-
-    for (var successor in graph[vertex]) {
-      if (!indices.containsKey(successor)) {
-        strongConnect(successor);
-        lowLinks[vertex] = math.min(lowLinks[vertex], lowLinks[successor]);
-      } else if (onStack.contains(successor)) {
-        lowLinks[vertex] = math.min(lowLinks[vertex], lowLinks[successor]);
-      }
-    }
-
-    if (lowLinks[vertex] == indices[vertex]) {
-      var component = new Set<T>();
-      T neighbor;
-      do {
-        neighbor = stack.removeLast();
-        onStack.remove(neighbor);
-        component.add(neighbor);
-      } while (neighbor != vertex);
-      result.add(component);
-    }
-  }
-
-  for (var vertex in graph.keys) {
-    if (!indices.containsKey(vertex)) strongConnect(vertex);
-  }
-
-  // Tarjan's algorithm produces a reverse-topological sort, so we reverse it to
-  // get a normal topological sort.
-  return result.reversed.toList();
-}
diff --git a/packages/collection/lib/src/iterable_zip.dart b/packages/collection/lib/src/iterable_zip.dart
deleted file mode 100644
index b983437..0000000
--- a/packages/collection/lib/src/iterable_zip.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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";
-
-/// 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<T> extends IterableBase<List<T>> {
-  final Iterable<Iterable<T>> _iterables;
-
-  IterableZip(Iterable<Iterable<T>> iterables) : this._iterables = iterables;
-
-  /// Returns an iterator that combines values of the iterables' iterators
-  /// as long as they all have values.
-  Iterator<List<T>> get iterator {
-    var iterators = _iterables.map((x) => x.iterator).toList(growable: false);
-    // TODO(lrn): Return an empty iterator directly if iterators is empty?
-    return new _IteratorZip<T>(iterators);
-  }
-}
-
-class _IteratorZip<T> implements Iterator<List<T>> {
-  final List<Iterator<T>> _iterators;
-  List<T> _current;
-
-  _IteratorZip(List<Iterator<T>> 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<T> get current => _current;
-}
diff --git a/packages/collection/lib/src/priority_queue.dart b/packages/collection/lib/src/priority_queue.dart
deleted file mode 100644
index 89c3128..0000000
--- a/packages/collection/lib/src/priority_queue.dart
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 "utils.dart";
-
-/// 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> {
-  /// Creates an empty [PriorityQueue].
-  ///
-  /// The created [PriorityQueue] is a plain [HeapPriorityQueue].
-  ///
-  /// 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]. If this
-  /// is the case, `E` must implement [Comparable], and this is checked at
-  /// runtime for every comparison.
-  factory PriorityQueue([int comparison(E e1, E e2)]) = HeapPriorityQueue<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<E> 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]. If this
-  /// is the case, `E` must implement [Comparable], and this is checked at
-  /// runtime for every comparison.
-  HeapPriorityQueue([int comparison(E e1, E e2)])
-      : comparison = comparison ?? defaultCompare<E>();
-
-  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 instead 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/packages/collection/lib/src/queue_list.dart b/packages/collection/lib/src/queue_list.dart
deleted file mode 100644
index dcfee7c..0000000
--- a/packages/collection/lib/src/queue_list.dart
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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> {
-  /// Adapts [source] to be a `QueueList<T>`.
-  ///
-  /// Any time the class would produce an element that is not a [T], the element
-  /// access will throw.
-  ///
-  /// Any time a [T] value is attempted stored into the adapted class, the store
-  /// will throw unless the value is also an instance of [S].
-  ///
-  /// If all accessed elements of [source] are actually instances of [T] and if
-  /// all elements stored in the returned  are actually instance of [S],
-  /// then the returned instance can be used as a `QueueList<T>`.
-  static QueueList<T> _castFrom<S, T>(QueueList<S> source) {
-    return new _CastQueueList<S, T>(source);
-  }
-
-  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);
-  }
-
-  // An internal constructor for use by _CastQueueList.
-  QueueList._();
-
-  /// 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);
-      var 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) {
-      var 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);
-    }
-  }
-
-  QueueList<T> cast<T>() {
-    QueueList<Object> self = this;
-    if (self is QueueList<T>) {
-      return self;
-    }
-    return retype<T>();
-  }
-
-  QueueList<T> retype<T>() => QueueList._castFrom<E, T>(this);
-
-  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);
-
-  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;
-  }
-}
-
-class _CastQueueList<S, T> extends QueueList<T> {
-  final QueueList<S> _delegate;
-
-  _CastQueueList(this._delegate) : super._() {
-    _table = _delegate._table.cast<T>();
-  }
-
-  int get _head => _delegate._head;
-  set _head(int value) => _delegate._head = value;
-
-  int get _tail => _delegate._tail;
-  set _tail(int value) => _delegate._tail = value;
-}
diff --git a/packages/collection/lib/src/union_set.dart b/packages/collection/lib/src/union_set.dart
deleted file mode 100644
index 5d88b6b..0000000
--- a/packages/collection/lib/src/union_set.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'unmodifiable_wrappers.dart';
-
-/// A single set that provides a view of the union over a set of sets.
-///
-/// Since this is just a view, it reflects all changes in the underlying sets.
-///
-/// If an element is in multiple sets and the outer set is ordered, the version
-/// in the earliest inner set is preferred. Component sets are assumed to use
-/// `==` and `hashCode` for equality.
-class UnionSet<E> extends SetBase<E> with UnmodifiableSetMixin<E> {
-  /// The set of sets that this provides a view of.
-  final Set<Set<E>> _sets;
-
-  /// Whether the sets in [_sets] are guaranteed to be disjoint.
-  final bool _disjoint;
-
-  /// Creates a new set that's a view of the union of all sets in [sets].
-  ///
-  /// If any sets in [sets] change, this [UnionSet] reflects that change. If a
-  /// new set is added to [sets], this [UnionSet] reflects that as well.
-  ///
-  /// If [disjoint] is `true`, then all component sets must be disjoint. That
-  /// is, that they contain no elements in common. This makes many operations
-  /// including [length] more efficient. If the component sets turn out not to
-  /// be disjoint, some operations may behave inconsistently.
-  UnionSet(this._sets, {bool disjoint: false}) : _disjoint = disjoint;
-
-  /// Creates a new set that's a view of the union of all sets in [sets].
-  ///
-  /// If any sets in [sets] change, this [UnionSet] reflects that change.
-  /// However, unlike [new UnionSet], this creates a copy of its parameter, so
-  /// changes in [sets] aren't reflected in this [UnionSet].
-  ///
-  /// If [disjoint] is `true`, then all component sets must be disjoint. That
-  /// is, that they contain no elements in common. This makes many operations
-  /// including [length] more efficient. If the component sets turn out not to
-  /// be disjoint, some operations may behave inconsistently.
-  UnionSet.from(Iterable<Set<E>> sets, {bool disjoint: false})
-      : this(sets.toSet(), disjoint: disjoint);
-
-  int get length => _disjoint
-      ? _sets.fold(0, (length, set) => length + set.length)
-      : _iterable.length;
-
-  Iterator<E> get iterator => _iterable.iterator;
-
-  /// Returns an iterable over the contents of all the sets in [this].
-  Iterable<E> get _iterable =>
-      _disjoint ? _sets.expand((set) => set) : _dedupIterable;
-
-  /// Returns an iterable over the contents of all the sets in [this] that
-  /// de-duplicates elements.
-  ///
-  /// If the sets aren't guaranteed to be disjoint, this keeps track of the
-  /// elements we've already emitted so that we can de-duplicate them.
-  Iterable<E> get _dedupIterable {
-    var seen = new Set<E>();
-    return _sets.expand((set) => set).where((element) {
-      if (seen.contains(element)) return false;
-      seen.add(element);
-      return true;
-    });
-  }
-
-  bool contains(Object element) => _sets.any((set) => set.contains(element));
-
-  E lookup(Object element) {
-    if (element == null) return null;
-
-    return _sets
-        .map((set) => set.lookup(element))
-        .firstWhere((result) => result != null, orElse: () => null);
-  }
-
-  Set<E> toSet() {
-    var result = new Set<E>();
-    for (var set in _sets) {
-      result.addAll(set);
-    }
-    return result;
-  }
-}
diff --git a/packages/collection/lib/src/union_set_controller.dart b/packages/collection/lib/src/union_set_controller.dart
deleted file mode 100644
index 1d0eb74..0000000
--- a/packages/collection/lib/src/union_set_controller.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 'union_set.dart';
-
-/// A controller that exposes a view of the union of a collection of sets.
-///
-/// This is a convenience class for creating a [UnionSet] whose contents change
-/// over the lifetime of a class. For example:
-///
-/// ```dart
-/// class Engine {
-///   Set<Test> get activeTests => _activeTestsGroup.set;
-///   final _activeTestsGroup = new UnionSetController<Test>();
-///
-///   void addSuite(Suite suite) {
-///     _activeTestsGroup.add(suite.tests);
-///     _runSuite(suite);
-///     _activeTestsGroup.remove(suite.tests);
-///   }
-/// }
-/// ```
-class UnionSetController<E> {
-  /// The [UnionSet] that provides a view of the union of sets in [this].
-  UnionSet<E> get set => _set;
-  UnionSet<E> _set;
-
-  /// The sets whose union is exposed through [set].
-  final _sets = new Set<Set<E>>();
-
-  /// Creates a set of sets that provides a view of the union of those sets.
-  ///
-  /// If [disjoint] is `true`, this assumes that all component sets are
-  /// disjoint—that is, that they contain no elements in common. This makes
-  /// many operations including [length] more efficient.
-  UnionSetController({bool disjoint: false}) {
-    _set = new UnionSet<E>(_sets, disjoint: disjoint);
-  }
-
-  /// Adds the contents of [component] to [set].
-  ///
-  /// If the contents of [component] change over time, [set] will change
-  /// accordingly.
-  void add(Set<E> component) {
-    _sets.add(component);
-  }
-
-  /// Removes the contents of [component] to [set].
-  ///
-  /// If another set in [this] has overlapping elements with [component], those
-  /// elements will remain in [set].
-  bool remove(Set<E> component) => _sets.remove(component);
-}
diff --git a/packages/collection/lib/src/unmodifiable_wrappers.dart b/packages/collection/lib/src/unmodifiable_wrappers.dart
deleted file mode 100644
index b0b5440..0000000
--- a/packages/collection/lib/src/unmodifiable_wrappers.dart
+++ /dev/null
@@ -1,179 +0,0 @@
-// 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 'empty_unmodifiable_set.dart';
-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 T _throw<T>() {
-    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.
-  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);
-
-  /// An unmodifiable empty set.
-  ///
-  /// This is the same as `new UnmodifiableSetView(new Set())`, except that it
-  /// can be used in const contexts.
-  const factory UnmodifiableSetView.empty() = EmptyUnmodifiableSet<E>;
-}
-
-/// Mixin class that implements a throwing version of all set operations that
-/// change the Set.
-abstract class UnmodifiableSetMixin<E> implements Set<E> {
-  static T _throw<T>() {
-    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 T _throw<T>() {
-    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(Object key) => _throw();
-
-  /// Throws an [UnsupportedError];
-  /// operations that change the map are disallowed.
-  void clear() => _throw();
-
-  /// Throws an [UnsupportedError];
-  /// operations that change the map are disallowed.
-  set first(_) => _throw();
-
-  /// Throws an [UnsupportedError];
-  /// operations that change the map are disallowed.
-  set last(_) => _throw();
-}
diff --git a/packages/collection/lib/src/utils.dart b/packages/collection/lib/src/utils.dart
deleted file mode 100644
index 194f99c..0000000
--- a/packages/collection/lib/src/utils.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 pair of values.
-class Pair<E, F> {
-  E first;
-  F last;
-
-  Pair(this.first, this.last);
-}
-
-/// Returns a [Comparator] that asserts that its first argument is comparable.
-Comparator<T> defaultCompare<T>() =>
-    (value1, value2) => (value1 as Comparable).compareTo(value2);
diff --git a/packages/collection/lib/src/wrappers.dart b/packages/collection/lib/src/wrappers.dart
deleted file mode 100644
index cead501..0000000
--- a/packages/collection/lib/src/wrappers.dart
+++ /dev/null
@@ -1,682 +0,0 @@
-// 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 "dart:math" as math;
-
-import "unmodifiable_wrappers.dart";
-
-typedef K _KeyForValue<K, V>(V value);
-
-/// 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);
-
-  Iterable<T> cast<T>() => _base.cast<T>();
-
-  bool contains(Object element) => _base.contains(element);
-
-  E elementAt(int index) => _base.elementAt(index);
-
-  bool every(bool test(E element)) => _base.every(test);
-
-  Iterable<T> expand<T>(Iterable<T> f(E element)) => _base.expand(f);
-
-  E get first => _base.first;
-
-  E firstWhere(bool test(E element), {E orElse()}) =>
-      _base.firstWhere(test, orElse: orElse);
-
-  T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
-      _base.fold(initialValue, combine);
-
-  Iterable<E> followedBy(Iterable<E> other) => _base.followedBy(other);
-
-  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<T> map<T>(T f(E element)) => _base.map(f);
-
-  E reduce(E combine(E value, E element)) => _base.reduce(combine);
-
-  Iterable<T> retype<T>() => _base.retype<T>();
-
-  E get single => _base.single;
-
-  E singleWhere(bool test(E element), {E orElse()}) {
-    return _base.singleWhere(test, orElse: orElse);
-  }
-
-  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);
-
-  Iterable<T> whereType<T>() => _base.whereType<T>();
-
-  String toString() => _base.toString();
-}
-
-/// An [Iterable] that delegates all operations to a base iterable.
-///
-/// This class can be used to 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;
-
-  /// Creates a wrapper that forwards operations to [base].
-  const DelegatingIterable(Iterable<E> base) : _base = base;
-
-  /// Creates a wrapper that asserts the types of values in [base].
-  ///
-  /// This soundly converts an [Iterable] without a generic type to an
-  /// `Iterable<E>` by asserting that its elements are instances of `E` whenever
-  /// they're accessed. If they're not, it throws a [CastError].
-  ///
-  /// This forwards all operations to [base], so any changes in [base] will be
-  /// reflected in [this]. If [base] is already an `Iterable<E>`, it's returned
-  /// unmodified.
-  @Deprecated('Use iterable.cast<E> instead.')
-  static Iterable<E> typed<E>(Iterable base) => base.cast<E>();
-}
-
-/// A [List] that delegates all operations to a base list.
-///
-/// This class can be used to 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);
-
-  /// Creates a wrapper that asserts the types of values in [base].
-  ///
-  /// This soundly converts a [List] without a generic type to a `List<E>` by
-  /// asserting that its elements are instances of `E` whenever they're
-  /// accessed. If they're not, it throws a [CastError]. Note that even if an
-  /// operation throws a [CastError], it may still mutate the underlying
-  /// collection.
-  ///
-  /// This forwards all operations to [base], so any changes in [base] will be
-  /// reflected in [this]. If [base] is already a `List<E>`, it's returned
-  /// unmodified.
-  @Deprecated('Use list.cast<E> instead.')
-  static List<E> typed<E>(List base) => base.cast<E>();
-
-  List<E> get _listBase => _base;
-
-  E operator [](int index) => _listBase[index];
-
-  void operator []=(int index, E value) {
-    _listBase[index] = value;
-  }
-
-  List<E> operator +(List<E> other) => _listBase + other;
-
-  void add(E value) {
-    _listBase.add(value);
-  }
-
-  void addAll(Iterable<E> iterable) {
-    _listBase.addAll(iterable);
-  }
-
-  Map<int, E> asMap() => _listBase.asMap();
-
-  List<T> cast<T>() => _listBase.cast<T>();
-
-  void clear() {
-    _listBase.clear();
-  }
-
-  void fillRange(int start, int end, [E fillValue]) {
-    _listBase.fillRange(start, end, fillValue);
-  }
-
-  set first(E value) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
-    this[0] = value;
-  }
-
-  Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
-
-  int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
-
-  int indexWhere(bool test(E element), [int start = 0]) =>
-      _listBase.indexWhere(test, start);
-
-  void insert(int index, E element) {
-    _listBase.insert(index, element);
-  }
-
-  insertAll(int index, Iterable<E> iterable) {
-    _listBase.insertAll(index, iterable);
-  }
-
-  set last(E value) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
-    this[this.length - 1] = value;
-  }
-
-  int lastIndexOf(E element, [int start]) =>
-      _listBase.lastIndexOf(element, start);
-
-  int lastIndexWhere(bool test(E element), [int start]) =>
-      _listBase.lastIndexWhere(test, start);
-
-  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);
-  }
-
-  List<T> retype<T>() => _listBase.retype<T>();
-
-  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([math.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);
-}
-
-/// A [Set] that delegates all operations to a base set.
-///
-/// This class can be used to 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);
-
-  /// Creates a wrapper that asserts the types of values in [base].
-  ///
-  /// This soundly converts a [Set] without a generic type to a `Set<E>` by
-  /// asserting that its elements are instances of `E` whenever they're
-  /// accessed. If they're not, it throws a [CastError]. Note that even if an
-  /// operation throws a [CastError], it may still mutate the underlying
-  /// collection.
-  ///
-  /// This forwards all operations to [base], so any changes in [base] will be
-  /// reflected in [this]. If [base] is already a `Set<E>`, it's returned
-  /// unmodified.
-  @Deprecated('Use set.cast<E> instead.')
-  static Set<E> typed<E>(Set base) => base.cast<E>();
-
-  Set<E> get _setBase => _base;
-
-  bool add(E value) => _setBase.add(value);
-
-  void addAll(Iterable<E> elements) {
-    _setBase.addAll(elements);
-  }
-
-  Set<T> cast<T>() => _setBase.cast<T>();
-
-  void clear() {
-    _setBase.clear();
-  }
-
-  bool containsAll(Iterable<Object> other) => _setBase.containsAll(other);
-
-  Set<E> difference(Set<Object> other) => _setBase.difference(other);
-
-  Set<E> intersection(Set<Object> other) => _setBase.intersection(other);
-
-  E lookup(Object 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);
-  }
-
-  Set<T> retype<T>() => _setBase.retype<T>();
-
-  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());
-}
-
-/// A [Queue] that delegates all operations to a base queue.
-///
-/// This class can be used to 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);
-
-  /// Creates a wrapper that asserts the types of values in [base].
-  ///
-  /// This soundly converts a [Queue] without a generic type to a `Queue<E>` by
-  /// asserting that its elements are instances of `E` whenever they're
-  /// accessed. If they're not, it throws a [CastError]. Note that even if an
-  /// operation throws a [CastError], it may still mutate the underlying
-  /// collection.
-  ///
-  /// This forwards all operations to [base], so any changes in [base] will be
-  /// reflected in [this]. If [base] is already a `Queue<E>`, it's returned
-  /// unmodified.
-  @Deprecated('Use queue.cast<E> instead.')
-  static Queue<E> typed<E>(Queue base) => base.cast<E>();
-
-  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);
-  }
-
-  Queue<T> cast<T>() => _baseQueue.cast<T>();
-
-  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);
-  }
-
-  Queue<T> retype<T>() => _baseQueue.retype<T>();
-
-  E removeFirst() => _baseQueue.removeFirst();
-
-  E removeLast() => _baseQueue.removeLast();
-}
-
-/// A [Map] that delegates all operations to a base map.
-///
-/// This class can be used to 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;
-
-  /// Creates a wrapper that asserts the types of keys and values in [base].
-  ///
-  /// This soundly converts a [Map] without generic types to a `Map<K, V>` by
-  /// asserting that its keys are instances of `E` and its values are instances
-  /// of `V` whenever they're accessed. If they're not, it throws a [CastError].
-  /// Note that even if an operation throws a [CastError], it may still mutate
-  /// the underlying collection.
-  ///
-  /// This forwards all operations to [base], so any changes in [base] will be
-  /// reflected in [this]. If [base] is already a `Map<K, V>`, it's returned
-  /// unmodified.
-  @Deprecated('Use map.cast<K, V> instead.')
-  static Map<K, V> typed<K, V>(Map base) => base.cast<K, V>();
-
-  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 addEntries(Iterable<MapEntry<K, V>> entries) {
-    _base.addEntries(entries);
-  }
-
-  void clear() {
-    _base.clear();
-  }
-
-  Map<K2, V2> cast<K2, V2>() => _base.cast<K2, V2>();
-
-  bool containsKey(Object key) => _base.containsKey(key);
-
-  bool containsValue(Object value) => _base.containsValue(value);
-
-  Iterable<MapEntry<K, V>> get entries => _base.entries;
-
-  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;
-
-  Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> transform(K key, V value)) =>
-      _base.map(transform);
-
-  V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
-
-  V remove(Object key) => _base.remove(key);
-
-  void removeWhere(bool test(K key, V value)) => _base.removeWhere(test);
-
-  Map<K2, V2> retype<K2, V2>() => _base.retype<K2, V2>();
-
-  Iterable<V> get values => _base.values;
-
-  String toString() => _base.toString();
-
-  V update(K key, V update(V value), {V ifAbsent()}) =>
-      _base.update(key, update, ifAbsent: ifAbsent);
-
-  void updateAll(V update(K key, V value)) => _base.updateAll(update);
-}
-
-/// 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;
-
-  Set<T> cast<T>() {
-    if (this is MapKeySet<T>) {
-      return this as MapKeySet<T>;
-    }
-    return Set.castFrom<E, T>(this);
-  }
-
-  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<Object> 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(Object element) =>
-      throw new UnsupportedError("MapKeySet doesn't support lookup().");
-
-  Set<T> retype<T>() => Set.castFrom<E, T>(this);
-
-  /// 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 _KeyForValue<K, V> _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;
-
-  Set<T> cast<T>() {
-    if (this is Set<T>) {
-      return this as Set<T>;
-    }
-    return Set.castFrom<V, T>(this);
-  }
-
-  bool contains(Object element) {
-    if (element != null && element is! V) return false;
-    var key = _keyForValue(element as V);
-
-    return _baseMap.containsKey(key);
-  }
-
-  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<Object> 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(Object element) {
-    if (element != null && element is! V) return null;
-    var key = _keyForValue(element as V);
-
-    return _baseMap[key];
-  }
-
-  bool remove(Object element) {
-    if (element != null && element is! V) return false;
-    var key = _keyForValue(element as V);
-
-    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 as V);
-
-      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));
-
-  Set<T> retype<T>() => Set.castFrom<V, T>(this);
-
-  /// 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/packages/collection/lib/wrappers.dart b/packages/collection/lib/wrappers.dart
deleted file mode 100644
index 13031f5..0000000
--- a/packages/collection/lib/wrappers.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// 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 `collection.dart` instead.
-@Deprecated("Will be removed in collection 2.0.0.")
-library dart.pkg.collection.wrappers;
-
-export "src/canonicalized_map.dart";
-export "src/unmodifiable_wrappers.dart";
-export "src/wrappers.dart";
diff --git a/packages/collection/pubspec.yaml b/packages/collection/pubspec.yaml
deleted file mode 100644
index 21d0049..0000000
--- a/packages/collection/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: collection
-version: 1.14.9
-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:
-  # Required for Dart 2.0 collection changes.
-  sdk: '>=2.0.0-dev.22.0 <2.0.0'
-
-dev_dependencies:
-  build_runner: ^0.8.0
-  build_test: ^0.10.0
-  build_web_compilers: ^0.3.1
-  test: ^0.12.0
diff --git a/packages/collection/test/algorithms_test.dart b/packages/collection/test/algorithms_test.dart
deleted file mode 100644
index c7f5af1..0000000
--- a/packages/collection/test/algorithms_test.dart
+++ /dev/null
@@ -1,328 +0,0 @@
-// 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 'dart:math';
-
-import "package:collection/collection.dart";
-import "package:test/test.dart";
-
-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(<C>[], 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("lowerbound0", () {
-    expect(lowerBound([], 2), equals(0));
-  });
-
-  test("lowerbound1", () {
-    expect(lowerBound([5], 2), equals(0));
-    expect(lowerBound([5], 5), equals(0));
-    expect(lowerBound([5], 7), equals(1));
-  });
-
-  test("lowerbound3", () {
-    expect(lowerBound([0, 5, 10], -1), equals(0));
-    expect(lowerBound([0, 5, 10], 0), equals(0));
-    expect(lowerBound([0, 5, 10], 2), equals(1));
-    expect(lowerBound([0, 5, 10], 5), equals(1));
-    expect(lowerBound([0, 5, 10], 7), equals(2));
-    expect(lowerBound([0, 5, 10], 10), equals(2));
-    expect(lowerBound([0, 5, 10], 12), equals(3));
-  });
-
-  test("lowerboundRepeat", () {
-    expect(lowerBound([5, 5, 5], 5), equals(0));
-    expect(lowerBound([0, 5, 5, 5, 10], 5), equals(1));
-  });
-
-  test("lowerboundCompare0", () {
-    expect(lowerBound(<C>[], new C(2), compare: compareC), equals(0));
-  });
-
-  test("lowerboundCompare1", () {
-    var l1 = [new C(5)];
-    expect(lowerBound(l1, new C(2), compare: compareC), equals(0));
-    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
-    expect(lowerBound(l1, new C(7), compare: compareC), equals(1));
-  });
-
-  test("lowerboundCompare3", () {
-    var l3 = [new C(0), new C(5), new C(10)];
-    expect(lowerBound(l3, new C(-1), compare: compareC), equals(0));
-    expect(lowerBound(l3, new C(0), compare: compareC), equals(0));
-    expect(lowerBound(l3, new C(2), compare: compareC), equals(1));
-    expect(lowerBound(l3, new C(5), compare: compareC), equals(1));
-    expect(lowerBound(l3, new C(7), compare: compareC), equals(2));
-    expect(lowerBound(l3, new C(10), compare: compareC), equals(2));
-    expect(lowerBound(l3, new C(12), compare: compareC), equals(3));
-  });
-
-  test("lowerboundCompareRepeat", () {
-    var l1 = [new C(5), new C(5), new C(5)];
-    var l2 = [new C(0), new C(5), new C(5), new C(5), new C(10)];
-    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
-    expect(lowerBound(l2, new C(5), 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]) {
-      var list = new List<OC>(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<OC>(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/packages/collection/test/canonicalized_map_test.dart b/packages/collection/test/canonicalized_map_test.dart
deleted file mode 100644
index 4049d85..0000000
--- a/packages/collection/test/canonicalized_map_test.dart
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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", () {
-    CanonicalizedMap<int, String, String> map;
-
-    setUp(() {
-      map = new CanonicalizedMap(int.parse,
-          isValidKey: (s) => new RegExp(r"^\d+$").hasMatch(s as String));
-    });
-
-    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("set affects nothing for uncanonicalizable key", () {
-      map["foo"] = "value";
-      expect(map["foo"], isNull);
-      expect(map.containsKey("foo"), isFalse);
-      expect(map.length, equals(0));
-    });
-
-    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 new Exception("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"]));
-    });
-
-    test("entries returns all key-value pairs in the map", () {
-      map.addAll({
-        "1": "value 1",
-        "01": "value 01",
-        "2": "value 2",
-      });
-
-      var entries = map.entries.toList();
-      expect(entries[0].key, "01");
-      expect(entries[0].value, "value 01");
-      expect(entries[1].key, "2");
-      expect(entries[1].value, "value 2");
-    });
-
-    test("addEntries adds key-value pairs to the map", () {
-      map.addEntries([
-        new MapEntry("1", "value 1"),
-        new MapEntry("01", "value 01"),
-        new MapEntry("2", "value 2"),
-      ]);
-      expect(map, {"01": "value 01", "2": "value 2"});
-    });
-
-    test("retype returns a new map instance", () {
-      expect(map.retype<Pattern, Pattern>(), isNot(same(map)));
-    });
-  });
-
-  group("CanonicalizedMap builds an informative string representation", () {
-    var map;
-    setUp(() {
-      map = new CanonicalizedMap<int, String, dynamic>(int.parse,
-          isValidKey: (s) => new RegExp(r"^\d+$").hasMatch(s as String));
-    });
-
-    test("for an empty map", () {
-      expect(map.toString(), equals('{}'));
-    });
-
-    test("for a map with one value", () {
-      map.addAll({"1": "value 1"});
-      expect(map.toString(), equals('{1: value 1}'));
-    });
-
-    test("for a map with multiple values", () {
-      map.addAll(
-          {"1": "value 1", "01": "value 01", "2": "value 2", "03": "value 03"});
-      expect(
-          map.toString(), equals('{01: value 01, 2: value 2, 03: value 03}'));
-    });
-
-    test("for a map with a loop", () {
-      map.addAll({"1": "value 1", "2": map});
-      expect(map.toString(), equals('{1: value 1, 2: {...}}'));
-    });
-  });
-
-  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/packages/collection/test/combined_wrapper/iterable_test.dart b/packages/collection/test/combined_wrapper/iterable_test.dart
deleted file mode 100644
index 3301821..0000000
--- a/packages/collection/test/combined_wrapper/iterable_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  var iterable1 = new Iterable.generate(3);
-  var iterable2 = new Iterable.generate(3, (i) => i + 3);
-  var iterable3 = new Iterable.generate(3, (i) => i + 6);
-
-  test('should combine multiple iterables when iterating', () {
-    var combined = new CombinedIterableView([iterable1, iterable2, iterable3]);
-    expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
-  });
-
-  test('should combine multiple iterables with some empty ones', () {
-    var combined =
-        new CombinedIterableView([iterable1, [], iterable2, [], iterable3, []]);
-    expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
-  });
-
-  test('should function as an empty iterable when no iterables are passed', () {
-    var empty = new CombinedIterableView([]);
-    expect(empty, isEmpty);
-  });
-
-  test('should function as an empty iterable with all empty iterables', () {
-    var empty = new CombinedIterableView([[], [], []]);
-    expect(empty, isEmpty);
-  });
-
-  test('should reflect changes from the underlying iterables', () {
-    var list1 = [];
-    var list2 = [];
-    var combined = new CombinedIterableView([list1, list2]);
-    expect(combined, isEmpty);
-    list1.addAll([1, 2]);
-    list2.addAll([3, 4]);
-    expect(combined, [1, 2, 3, 4]);
-    expect(combined.last, 4);
-    expect(combined.first, 1);
-  });
-
-  test('should reflect changes from the iterable of iterables', () {
-    var iterables = <Iterable>[];
-    var combined = new CombinedIterableView(iterables);
-    expect(combined, isEmpty);
-    expect(combined, hasLength(0));
-
-    iterables.add(iterable1);
-    expect(combined, isNotEmpty);
-    expect(combined, hasLength(3));
-
-    iterables.clear();
-    expect(combined, isEmpty);
-    expect(combined, hasLength(0));
-  });
-}
diff --git a/packages/collection/test/combined_wrapper/list_test.dart b/packages/collection/test/combined_wrapper/list_test.dart
deleted file mode 100644
index 9e90925..0000000
--- a/packages/collection/test/combined_wrapper/list_test.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-import '../unmodifiable_collection_test.dart' as common;
-
-void main() {
-  var list1 = [1, 2, 3];
-  var list2 = [4, 5, 6];
-  var list3 = [7, 8, 9];
-  var concat = <int>[]..addAll(list1)..addAll(list2)..addAll(list3);
-
-  // In every way possible this should test the same as an UnmodifiableListView.
-  common.testUnmodifiableList(
-      concat, new CombinedListView([list1, list2, list3]), 'combineLists');
-
-  common.testUnmodifiableList(concat,
-      new CombinedListView([list1, [], list2, [], list3, []]), 'combineLists');
-
-  test('should function as an empty list when no lists are passed', () {
-    var empty = new CombinedListView([]);
-    expect(empty, isEmpty);
-    expect(empty.length, 0);
-    expect(() => empty[0], throwsRangeError);
-  });
-
-  test('should function as an empty list when only empty lists are passed', () {
-    var empty = new CombinedListView([[], [], []]);
-    expect(empty, isEmpty);
-    expect(empty.length, 0);
-    expect(() => empty[0], throwsRangeError);
-  });
-
-  test('should reflect underlying changes back to the combined list', () {
-    var backing1 = <int>[];
-    var backing2 = <int>[];
-    var combined = new CombinedListView([backing1, backing2]);
-    expect(combined, isEmpty);
-    backing1.addAll(list1);
-    expect(combined, list1);
-    backing2.addAll(list2);
-    expect(combined, backing1.toList()..addAll(backing2));
-  });
-
-  test('should reflect underlying changes from the list of lists', () {
-    var listOfLists = <List<int>>[];
-    var combined = new CombinedListView(listOfLists);
-    expect(combined, isEmpty);
-    listOfLists.add(list1);
-    expect(combined, list1);
-    listOfLists.add(list2);
-    expect(combined, []..addAll(list1)..addAll(list2));
-    listOfLists.clear();
-    expect(combined, isEmpty);
-  });
-
-  test('should reflect underlying changes with a single list', () {
-    var backing1 = <int>[];
-    var combined = new CombinedListView([backing1]);
-    expect(combined, isEmpty);
-    backing1.addAll(list1);
-    expect(combined, list1);
-  });
-}
diff --git a/packages/collection/test/combined_wrapper/map_test.dart b/packages/collection/test/combined_wrapper/map_test.dart
deleted file mode 100644
index ecafb4b..0000000
--- a/packages/collection/test/combined_wrapper/map_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for 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';
-
-import '../unmodifiable_collection_test.dart' as common;
-
-void main() {
-  var map1 = const {1: 1, 2: 2, 3: 3};
-  var map2 = const {4: 4, 5: 5, 6: 6};
-  var map3 = const {7: 7, 8: 8, 9: 9};
-  var concat = <int, int>{}..addAll(map1)..addAll(map2)..addAll(map3);
-
-  // In every way possible this should test the same as an UnmodifiableMapView.
-  common.testReadMap(
-      concat, new CombinedMapView([map1, map2, map3]), 'CombinedMapView');
-
-  common.testReadMap(
-      concat,
-      new CombinedMapView([map1, {}, map2, {}, map3, {}]),
-      'CombinedMapView (some empty)');
-
-  test('should function as an empty map when no maps are passed', () {
-    var empty = new CombinedMapView([]);
-    expect(empty, isEmpty);
-    expect(empty.length, 0);
-  });
-
-  test('should function as an empty map when only empty maps are passed', () {
-    var empty = new CombinedMapView([{}, {}, {}]);
-    expect(empty, isEmpty);
-    expect(empty.length, 0);
-  });
-
-  test('should reflect underlying changes back to the combined map', () {
-    var backing1 = <int, int>{};
-    var backing2 = <int, int>{};
-    var combined = new CombinedMapView([backing1, backing2]);
-    expect(combined, isEmpty);
-    backing1.addAll(map1);
-    expect(combined, map1);
-    backing2.addAll(map2);
-    expect(combined, new Map.from(backing1)..addAll(backing2));
-  });
-
-  test('should reflect underlying changes with a single map', () {
-    var backing1 = <int, int>{};
-    var combined = new CombinedMapView([backing1]);
-    expect(combined, isEmpty);
-    backing1.addAll(map1);
-    expect(combined, map1);
-  });
-}
diff --git a/packages/collection/test/comparators_test.dart b/packages/collection/test/comparators_test.dart
deleted file mode 100644
index 3df0812..0000000
--- a/packages/collection/test/comparators_test.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  List<String> strings = [
-    "",
-    "\x00",
-    " ",
-    "+",
-    "/",
-    "0",
-    "00",
-    "000",
-    "001",
-    "01",
-    "011",
-    "1",
-    "100",
-    "11",
-    "110",
-    "9",
-    ":",
-    "=",
-    "@",
-    "A",
-    "A0",
-    "A000A",
-    "A001A",
-    "A00A",
-    "A01A",
-    "A0A",
-    "A1A",
-    "AA",
-    "AAB",
-    "AB",
-    "Z",
-    "[",
-    "_",
-    "`",
-    "a",
-    "a0",
-    "a000a",
-    "a001a",
-    "a00a",
-    "a01a",
-    "a0a",
-    "a1a",
-    "aa",
-    "aab",
-    "ab",
-    "z",
-    "{",
-    "~"
-  ];
-
-  List<String> sortedBy(int compare(String a, String b)) => strings.toList()
-    ..shuffle()
-    ..sort(compare);
-
-  test("String.compareTo", () {
-    expect(sortedBy(null), strings);
-  });
-  test("compareAsciiLowerCase", () {
-    expect(sortedBy(compareAsciiLowerCase), sortedBy((a, b) {
-      int delta = a.toLowerCase().compareTo(b.toLowerCase());
-      if (delta != 0) return delta;
-      if (a == b) return 0;
-      return a.compareTo(b);
-    }));
-  });
-  test("compareAsciiUpperCase", () {
-    expect(sortedBy(compareAsciiUpperCase), sortedBy((a, b) {
-      int delta = a.toUpperCase().compareTo(b.toUpperCase());
-      if (delta != 0) return delta;
-      if (a == b) return 0;
-      return a.compareTo(b);
-    }));
-  });
-
-  // Replace any digit sequence by ("0", value, length) as char codes.
-  // This will sort alphabetically (by charcode) the way digits sort
-  // numerically, and the leading 0 means it sorts like a digit
-  // compared to non-digits.
-  replaceNumbers(String string) =>
-      string.replaceAllMapped(new RegExp(r"\d+"), (m) {
-        var digits = m[0];
-        return new String.fromCharCodes(
-            [0x30, int.parse(digits), digits.length]);
-      });
-
-  test("compareNatural", () {
-    expect(sortedBy(compareNatural),
-        sortedBy((a, b) => replaceNumbers(a).compareTo(replaceNumbers(b))));
-  });
-
-  test("compareAsciiLowerCaseNatural", () {
-    expect(sortedBy(compareAsciiLowerCaseNatural), sortedBy((a, b) {
-      int delta = replaceNumbers(a.toLowerCase())
-          .compareTo(replaceNumbers(b.toLowerCase()));
-      if (delta != 0) return delta;
-      if (a == b) return 0;
-      return a.compareTo(b);
-    }));
-  });
-
-  test("compareAsciiUpperCaseNatural", () {
-    expect(sortedBy(compareAsciiUpperCaseNatural), sortedBy((a, b) {
-      int delta = replaceNumbers(a.toUpperCase())
-          .compareTo(replaceNumbers(b.toUpperCase()));
-      if (delta != 0) return delta;
-      if (a == b) return 0;
-      return a.compareTo(b);
-    }));
-  });
-}
diff --git a/packages/collection/test/equality_map_test.dart b/packages/collection/test/equality_map_test.dart
deleted file mode 100644
index 8225efd..0000000
--- a/packages/collection/test/equality_map_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  test("uses the given equality", () {
-    var map = new EqualityMap(const IterableEquality());
-    expect(map, isEmpty);
-
-    map[[1, 2, 3]] = 1;
-    expect(map, containsPair([1, 2, 3], 1));
-
-    map[[1, 2, 3]] = 2;
-    expect(map, containsPair([1, 2, 3], 2));
-
-    map[[2, 3, 4]] = 3;
-    expect(map, containsPair([1, 2, 3], 2));
-    expect(map, containsPair([2, 3, 4], 3));
-  });
-
-  test("EqualityMap.from() prefers the lattermost equivalent key", () {
-    var map = new EqualityMap.from(const IterableEquality(), {
-      [1, 2, 3]: 1,
-      [2, 3, 4]: 2,
-      [1, 2, 3]: 3,
-      [2, 3, 4]: 4,
-      [1, 2, 3]: 5,
-      [1, 2, 3]: 6,
-    });
-
-    expect(map, containsPair([1, 2, 3], 6));
-    expect(map, containsPair([2, 3, 4], 4));
-  });
-}
diff --git a/packages/collection/test/equality_set_test.dart b/packages/collection/test/equality_set_test.dart
deleted file mode 100644
index a326b31..0000000
--- a/packages/collection/test/equality_set_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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() {
-  test("uses the given equality", () {
-    var set = new EqualitySet(const IterableEquality());
-    expect(set, isEmpty);
-
-    var list1 = [1, 2, 3];
-    expect(set.add(list1), isTrue);
-    expect(set, contains([1, 2, 3]));
-    expect(set, contains(same(list1)));
-
-    var list2 = [1, 2, 3];
-    expect(set.add(list2), isFalse);
-    expect(set, contains([1, 2, 3]));
-    expect(set, contains(same(list1)));
-    expect(set, isNot(contains(same(list2))));
-
-    var list3 = [2, 3, 4];
-    expect(set.add(list3), isTrue);
-    expect(set, contains(same(list1)));
-    expect(set, contains(same(list3)));
-  });
-
-  test("EqualitySet.from() prefers the lattermost equivalent value", () {
-    var list1 = [1, 2, 3];
-    var list2 = [2, 3, 4];
-    var list3 = [1, 2, 3];
-    var list4 = [2, 3, 4];
-    var list5 = [1, 2, 3];
-    var list6 = [1, 2, 3];
-
-    var set = new EqualitySet.from(
-        const IterableEquality(), [list1, list2, list3, list4, list5, list6]);
-
-    expect(set, contains(same(list1)));
-    expect(set, contains(same(list2)));
-    expect(set, isNot(contains(same(list3))));
-    expect(set, isNot(contains(same(list4))));
-    expect(set, isNot(contains(same(list5))));
-    expect(set, isNot(contains(same(list6))));
-  });
-}
diff --git a/packages/collection/test/equality_test.dart b/packages/collection/test/equality_test.dart
deleted file mode 100644
index ffc8655..0000000
--- a/packages/collection/test/equality_test.dart
+++ /dev/null
@@ -1,243 +0,0 @@
-// 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(Comparable 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<Map>.from(l1);
-  var s2 = new Set<Map>.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<Map>(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);
-  });
-
-  test("CaseInsensitiveEquality", () {
-    var equality = const CaseInsensitiveEquality();
-    expect(equality.equals("foo", "foo"), isTrue);
-    expect(equality.equals("fOo", "FoO"), isTrue);
-    expect(equality.equals("FoO", "fOo"), isTrue);
-    expect(equality.equals("foo", "bar"), isFalse);
-    expect(equality.equals("fÕÕ", "fõõ"), isFalse);
-
-    expect(equality.hash("foo"), equals(equality.hash("foo")));
-    expect(equality.hash("fOo"), equals(equality.hash("FoO")));
-    expect(equality.hash("FoO"), equals(equality.hash("fOo")));
-    expect(equality.hash("foo"), isNot(equals(equality.hash("bar"))));
-    expect(equality.hash("fÕÕ"), isNot(equals(equality.hash("fõõ"))));
-  });
-
-  group("EqualityBy should use a derived value for ", () {
-    var firstEquality = new EqualityBy<List<String>, String>((e) => e.first);
-    var firstInsensitiveEquality = new EqualityBy<List<String>, String>(
-        (e) => e.first, const CaseInsensitiveEquality());
-    var firstObjectEquality = new EqualityBy<List<Object>, Object>(
-        (e) => e.first, const IterableEquality());
-
-    test("equality", () {
-      expect(firstEquality.equals(["foo", "foo"], ["foo", "bar"]), isTrue);
-      expect(firstEquality.equals(["foo", "foo"], ["bar", "bar"]), isFalse);
-    });
-
-    test("equality with an inner equality", () {
-      expect(firstInsensitiveEquality.equals(["fOo"], ["FoO"]), isTrue);
-      expect(firstInsensitiveEquality.equals(["foo"], ["ffõõ"]), isFalse);
-    });
-
-    test("hash", () {
-      expect(firstEquality.hash(["foo", "bar"]), "foo".hashCode);
-    });
-
-    test("hash with an inner equality", () {
-      expect(firstInsensitiveEquality.hash(["fOo"]),
-          const CaseInsensitiveEquality().hash("foo"));
-    });
-
-    test("isValidKey", () {
-      expect(firstEquality.isValidKey(["foo"]), isTrue);
-      expect(firstEquality.isValidKey("foo"), isFalse);
-      expect(firstEquality.isValidKey([1]), isFalse);
-    });
-
-    test('isValidKey with an inner equality', () {
-      expect(firstObjectEquality.isValidKey([[]]), isTrue);
-      expect(firstObjectEquality.isValidKey([{}]), isFalse);
-    });
-  });
-
-  test("Equality accepts null", () {
-    var ie = new IterableEquality();
-    var le = new ListEquality();
-    var se = new SetEquality();
-    var me = new MapEquality();
-    expect(ie.equals(null, null), true);
-    expect(ie.equals([], null), false);
-    expect(ie.equals(null, []), false);
-    expect(ie.hash(null), null.hashCode);
-
-    expect(le.equals(null, null), true);
-    expect(le.equals([], null), false);
-    expect(le.equals(null, []), false);
-    expect(le.hash(null), null.hashCode);
-
-    expect(se.equals(null, null), true);
-    expect(se.equals(new Set(), null), false);
-    expect(se.equals(null, new Set()), false);
-    expect(se.hash(null), null.hashCode);
-
-    expect(me.equals(null, null), true);
-    expect(me.equals({}, null), false);
-    expect(me.equals(null, {}), false);
-    expect(me.hash(null), null.hashCode);
-  });
-}
-
-/// 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/packages/collection/test/functions_test.dart b/packages/collection/test/functions_test.dart
deleted file mode 100644
index a1e8f08..0000000
--- a/packages/collection/test/functions_test.dart
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:collection/collection.dart";
-
-void main() {
-  group("mapMap()", () {
-    test("with an empty map returns an empty map", () {
-      expect(
-          mapMap({},
-              key: expectAsync2((_, __) {}, count: 0),
-              value: expectAsync2((_, __) {}, count: 0)),
-          isEmpty);
-    });
-
-    test("with no callbacks, returns a copy of the map", () {
-      var map = {"foo": 1, "bar": 2};
-      var result = mapMap(map);
-      expect(result, equals({"foo": 1, "bar": 2}));
-
-      // The resulting map should be a copy.
-      result["foo"] = 3;
-      expect(map, equals({"foo": 1, "bar": 2}));
-    });
-
-    test("maps the map's keys", () {
-      expect(mapMap({"foo": 1, "bar": 2}, key: (key, value) => key[value]),
-          equals({"o": 1, "r": 2}));
-    });
-
-    test("maps the map's values", () {
-      expect(mapMap({"foo": 1, "bar": 2}, value: (key, value) => key[value]),
-          equals({"foo": "o", "bar": "r"}));
-    });
-
-    test("maps both the map's keys and values", () {
-      expect(
-          mapMap({"foo": 1, "bar": 2},
-              key: (key, value) => "$key$value",
-              value: (key, value) => key[value]),
-          equals({"foo1": "o", "bar2": "r"}));
-    });
-  });
-
-  group("mergeMaps()", () {
-    test("with empty maps returns an empty map", () {
-      expect(mergeMaps({}, {}, value: expectAsync2((_, __) {}, count: 0)),
-          isEmpty);
-    });
-
-    test("returns a map with all values in both input maps", () {
-      expect(mergeMaps({"foo": 1, "bar": 2}, {"baz": 3, "qux": 4}),
-          equals({"foo": 1, "bar": 2, "baz": 3, "qux": 4}));
-    });
-
-    test("the second map's values win by default", () {
-      expect(mergeMaps({"foo": 1, "bar": 2}, {"bar": 3, "baz": 4}),
-          equals({"foo": 1, "bar": 3, "baz": 4}));
-    });
-
-    test("uses the callback to merge values", () {
-      expect(
-          mergeMaps({"foo": 1, "bar": 2}, {"bar": 3, "baz": 4},
-              value: (value1, value2) => value1 + value2),
-          equals({"foo": 1, "bar": 5, "baz": 4}));
-    });
-  });
-
-  group("groupBy()", () {
-    test("returns an empty map for an empty iterable", () {
-      expect(groupBy([], expectAsync1((_) {}, count: 0)), isEmpty);
-    });
-
-    test("groups elements by the function's return value", () {
-      expect(
-          groupBy(["foo", "bar", "baz", "bop", "qux"], (string) => string[1]),
-          equals({
-            "o": ["foo", "bop"],
-            "a": ["bar", "baz"],
-            "u": ["qux"]
-          }));
-    });
-  });
-
-  group("minBy()", () {
-    test("returns null for an empty iterable", () {
-      expect(
-          minBy([], expectAsync1((_) {}, count: 0),
-              compare: expectAsync2((_, __) {}, count: 0)),
-          isNull);
-    });
-
-    test(
-        "returns the element for which the ordering function returns the "
-        "smallest value", () {
-      expect(
-          minBy([
-            {"foo": 3},
-            {"foo": 5},
-            {"foo": 4},
-            {"foo": 1},
-            {"foo": 2}
-          ], (map) => map["foo"]),
-          equals({"foo": 1}));
-    });
-
-    test("uses a custom comparator if provided", () {
-      expect(
-          minBy<Map<String, int>, Map<String, int>>([
-            {"foo": 3},
-            {"foo": 5},
-            {"foo": 4},
-            {"foo": 1},
-            {"foo": 2}
-          ], (map) => map,
-              compare: (map1, map2) => map1["foo"].compareTo(map2["foo"])),
-          equals({"foo": 1}));
-    });
-  });
-
-  group("maxBy()", () {
-    test("returns null for an empty iterable", () {
-      expect(
-          maxBy([], expectAsync1((_) {}, count: 0),
-              compare: expectAsync2((_, __) {}, count: 0)),
-          isNull);
-    });
-
-    test(
-        "returns the element for which the ordering function returns the "
-        "largest value", () {
-      expect(
-          maxBy([
-            {"foo": 3},
-            {"foo": 5},
-            {"foo": 4},
-            {"foo": 1},
-            {"foo": 2}
-          ], (map) => map["foo"]),
-          equals({"foo": 5}));
-    });
-
-    test("uses a custom comparator if provided", () {
-      expect(
-          maxBy<Map<String, int>, Map<String, int>>([
-            {"foo": 3},
-            {"foo": 5},
-            {"foo": 4},
-            {"foo": 1},
-            {"foo": 2}
-          ], (map) => map,
-              compare: (map1, map2) => map1["foo"].compareTo(map2["foo"])),
-          equals({"foo": 5}));
-    });
-  });
-
-  group("transitiveClosure()", () {
-    test("returns an empty map for an empty graph", () {
-      expect(transitiveClosure({}), isEmpty);
-    });
-
-    test("returns the input when there are no transitive connections", () {
-      expect(
-          transitiveClosure({
-            "foo": ["bar"],
-            "bar": [],
-            "bang": ["qux", "zap"],
-            "qux": [],
-            "zap": []
-          }),
-          equals({
-            "foo": ["bar"],
-            "bar": [],
-            "bang": ["qux", "zap"],
-            "qux": [],
-            "zap": []
-          }));
-    });
-
-    test("flattens transitive connections", () {
-      expect(
-          transitiveClosure({
-            "qux": [],
-            "bar": ["baz"],
-            "baz": ["qux"],
-            "foo": ["bar"]
-          }),
-          equals({
-            "foo": ["bar", "baz", "qux"],
-            "bar": ["baz", "qux"],
-            "baz": ["qux"],
-            "qux": []
-          }));
-    });
-
-    test("handles loops", () {
-      expect(
-          transitiveClosure({
-            "foo": ["bar"],
-            "bar": ["baz"],
-            "baz": ["foo"]
-          }),
-          equals({
-            "foo": ["bar", "baz", "foo"],
-            "bar": ["baz", "foo", "bar"],
-            "baz": ["foo", "bar", "baz"]
-          }));
-    });
-  });
-
-  group("stronglyConnectedComponents()", () {
-    test("returns an empty list for an empty graph", () {
-      expect(stronglyConnectedComponents({}), isEmpty);
-    });
-
-    test("returns one set for a singleton graph", () {
-      expect(
-          stronglyConnectedComponents({"a": []}),
-          equals([
-            new Set.from(["a"])
-          ]));
-    });
-
-    test("returns two sets for a two-element tree", () {
-      expect(
-          stronglyConnectedComponents({
-            "a": ["b"],
-            "b": []
-          }),
-          equals([
-            new Set.from(["a"]),
-            new Set.from(["b"])
-          ]));
-    });
-
-    test("returns one set for a two-element loop", () {
-      expect(
-          stronglyConnectedComponents({
-            "a": ["b"],
-            "b": ["a"]
-          }),
-          equals([
-            new Set.from(["a", "b"])
-          ]));
-    });
-
-    test("returns individual vertices for a tree", () {
-      expect(
-          stronglyConnectedComponents({
-            "foo": ["bar"],
-            "bar": ["baz", "bang"],
-            "baz": ["qux"],
-            "bang": ["zap"],
-            "qux": [],
-            "zap": []
-          }),
-          equals([
-            // This is expected to return *a* topological ordering, but this isn't
-            // the only valid one. If the function implementation changes in the
-            // future, this test may need to be updated.
-            new Set.from(["foo"]),
-            new Set.from(["bar"]),
-            new Set.from(["bang"]),
-            new Set.from(["zap"]),
-            new Set.from(["baz"]),
-            new Set.from(["qux"])
-          ]));
-    });
-
-    test("returns a single set for a fully cyclic graph", () {
-      expect(
-          stronglyConnectedComponents({
-            "foo": ["bar"],
-            "bar": ["baz"],
-            "baz": ["bang"],
-            "bang": ["foo"]
-          }),
-          equals([
-            new Set.from(["foo", "bar", "baz", "bang"])
-          ]));
-    });
-
-    test("returns separate sets for each strongly connected component", () {
-      // https://en.wikipedia.org/wiki/Strongly_connected_component#/media/File:Scc.png
-      expect(
-          stronglyConnectedComponents({
-            "a": ["b"],
-            "b": ["c", "e", "f"],
-            "c": ["d", "g"],
-            "d": ["c", "h"],
-            "e": ["a", "f"],
-            "f": ["g"],
-            "g": ["f"],
-            "h": ["g", "d"]
-          }),
-          equals([
-            // This is expected to return *a* topological ordering, but this isn't
-            // the only valid one. If the function implementation changes in the
-            // future, this test may need to be updated.
-            new Set.from(["a", "b", "e"]),
-            new Set.from(["c", "d", "h"]),
-            new Set.from(["f", "g"]),
-          ]));
-    });
-
-    test("always returns components in topological order", () {
-      expect(
-          stronglyConnectedComponents({
-            "bar": ["baz", "bang"],
-            "zap": [],
-            "baz": ["qux"],
-            "qux": [],
-            "foo": ["bar"],
-            "bang": ["zap"]
-          }),
-          equals([
-            // This is expected to return *a* topological ordering, but this isn't
-            // the only valid one. If the function implementation changes in the
-            // future, this test may need to be updated.
-            new Set.from(["foo"]),
-            new Set.from(["bar"]),
-            new Set.from(["bang"]),
-            new Set.from(["zap"]),
-            new Set.from(["baz"]),
-            new Set.from(["qux"])
-          ]));
-    });
-  });
-}
diff --git a/packages/collection/test/ignore_ascii_case_test.dart b/packages/collection/test/ignore_ascii_case_test.dart
deleted file mode 100644
index 5e3ee4f..0000000
--- a/packages/collection/test/ignore_ascii_case_test.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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 case-ignoring compare and equality.
-
-import "package:collection/collection.dart";
-import "package:test/test.dart";
-
-main() {
-  test("equality ignore ASCII case", () {
-    var strings = [
-      "0@`aopz[{",
-      "0@`aopz[{",
-      "0@`Aopz[{",
-      "0@`aOpz[{",
-      "0@`AOpz[{",
-      "0@`aoPz[{",
-      "0@`AoPz[{",
-      "0@`aOPz[{",
-      "0@`AOPz[{",
-      "0@`aopZ[{",
-      "0@`AopZ[{",
-      "0@`aOpZ[{",
-      "0@`AOpZ[{",
-      "0@`aoPZ[{",
-      "0@`AoPZ[{",
-      "0@`aOPZ[{",
-      "0@`AOPZ[{",
-    ];
-
-    for (var s1 in strings) {
-      for (var s2 in strings) {
-        var reason = "$s1 =?= $s2";
-        expect(equalsIgnoreAsciiCase(s1, s2), true, reason: reason);
-        expect(hashIgnoreAsciiCase(s1), hashIgnoreAsciiCase(s2),
-            reason: reason);
-      }
-    }
-
-    var upperCaseLetters = "@`abcdefghijklmnopqrstuvwxyz[{åÅ";
-    var lowerCaseLetters = "@`ABCDEFGHIJKLMNOPQRSTUVWXYZ[{åÅ";
-    expect(equalsIgnoreAsciiCase(upperCaseLetters, lowerCaseLetters), true);
-
-    testChars(String char1, String char2, bool areEqual) {
-      expect(equalsIgnoreAsciiCase(char1, char2), areEqual,
-          reason: "$char1 ${areEqual ? "=" : "!"}= $char2");
-    }
-
-    for (int i = 0; i < upperCaseLetters.length; i++) {
-      for (int j = 0; i < upperCaseLetters.length; i++) {
-        testChars(upperCaseLetters[i], upperCaseLetters[j], i == j);
-        testChars(lowerCaseLetters[i], upperCaseLetters[j], i == j);
-        testChars(upperCaseLetters[i], lowerCaseLetters[j], i == j);
-        testChars(lowerCaseLetters[i], lowerCaseLetters[j], i == j);
-      }
-    }
-  });
-}
diff --git a/packages/collection/test/iterable_zip_test.dart b/packages/collection/test/iterable_zip_test.dart
deleted file mode 100644
index 7b6db73..0000000
--- a/packages/collection/test/iterable_zip_test.dart
+++ /dev/null
@@ -1,217 +0,0 @@
-// 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:test/test.dart";
-
-import "package:collection/collection.dart";
-
-/// Iterable like [base] except that it throws when value equals [errorValue].
-Iterable iterError(Iterable base, int errorValue) {
-  // ignore: only_throw_errors
-  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/packages/collection/test/priority_queue_test.dart b/packages/collection/test/priority_queue_test.dart
deleted file mode 100644
index bcb892f..0000000
--- a/packages/collection/test/priority_queue_test.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-// 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:test/test.dart";
-
-import "package:collection/src/priority_queue.dart";
-
-void main() {
-  testDefault();
-  testInt(() => new HeapPriorityQueue<int>());
-  testCustom((comparator) => new HeapPriorityQueue<C>(comparator));
-}
-
-void testDefault() {
-  test('new PriorityQueue() returns a HeapPriorityQueue', () {
-    expect(
-        new PriorityQueue<int>(), new isInstanceOf<HeapPriorityQueue<int>>());
-  });
-  testInt(() => new PriorityQueue<int>());
-  testCustom((comparator) => new PriorityQueue<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(int comparator(C a, C b))) {
-  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.isNotEmpty) {
-      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<C> {
-  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/packages/collection/test/queue_list_test.dart b/packages/collection/test/queue_list_test.dart
deleted file mode 100644
index ed26a65..0000000
--- a/packages/collection/test/queue_list_test.dart
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-import "utils.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<dynamic>.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);
-    });
-  });
-
-  test("cast uses the same QueueList if possible", () {
-    var queue = new QueueList<String>();
-    expect(queue.cast<Pattern>(), same(queue));
-  }, skip: isDart2 ? false : 'Requires a Dart2 runtime');
-
-  test("cast does not throw on mutation when the type is valid", () {
-    var patternQueue = new QueueList<Pattern>()..addAll(['a', 'b']);
-    var stringQueue = patternQueue.cast<String>();
-    stringQueue.addAll(['c', 'd']);
-    expect(
-      stringQueue,
-      const isInstanceOf<QueueList<String>>(),
-      reason: 'Expected QueueList<String>, got ${stringQueue.runtimeType}',
-      skip: isDart2 ? false : 'Cast does nothing in Dart1',
-    );
-
-    expect(
-      stringQueue,
-      ['a', 'b', 'c', 'd'],
-      skip: isDart2 ? false : 'Cast does nothing in Dart1',
-    );
-
-    expect(patternQueue, stringQueue, reason: 'Should forward to original');
-  });
-
-  test("cast throws on mutation when the type is not valid", () {
-    QueueList<Object> stringQueue = new QueueList<String>();
-    var numQueue = stringQueue.cast<num>();
-    expect(
-      numQueue,
-      const isInstanceOf<QueueList<num>>(),
-      reason: 'Expected QueueList<num>, got ${numQueue.runtimeType}',
-      skip: isDart2 ? false : 'Cast does nothing in Dart1',
-    );
-    expect(
-      () => numQueue.add(1),
-      throwsCastError,
-      skip: isDart2 ? false : 'In Dart1 a TypeError is not thrown',
-    );
-  });
-
-  test("retype returns a new QueueList", () {
-    var queue = new QueueList<String>();
-    expect(queue.retype<Pattern>(), isNot(same(queue)));
-  });
-}
-
-/// 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(<dynamic>[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/packages/collection/test/union_set_controller_test.dart b/packages/collection/test/union_set_controller_test.dart
deleted file mode 100644
index 366b781..0000000
--- a/packages/collection/test/union_set_controller_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:collection/collection.dart";
-
-void main() {
-  var controller;
-  Set<int> innerSet;
-  setUp(() {
-    innerSet = new Set.from([1, 2, 3]);
-    controller = new UnionSetController<int>()..add(innerSet);
-  });
-
-  test("exposes a union set", () {
-    expect(controller.set, unorderedEquals([1, 2, 3]));
-
-    controller.add(new Set.from([3, 4, 5]));
-    expect(controller.set, unorderedEquals([1, 2, 3, 4, 5]));
-
-    controller.remove(innerSet);
-    expect(controller.set, unorderedEquals([3, 4, 5]));
-  });
-
-  test("exposes a disjoint union set", () {
-    expect(controller.set, unorderedEquals([1, 2, 3]));
-
-    controller.add(new Set.from([4, 5, 6]));
-    expect(controller.set, unorderedEquals([1, 2, 3, 4, 5, 6]));
-
-    controller.remove(innerSet);
-    expect(controller.set, unorderedEquals([4, 5, 6]));
-  });
-}
diff --git a/packages/collection/test/union_set_test.dart b/packages/collection/test/union_set_test.dart
deleted file mode 100644
index f2a792a..0000000
--- a/packages/collection/test/union_set_test.dart
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:collection/collection.dart";
-
-void main() {
-  group("with an empty outer set", () {
-    var set;
-    setUp(() {
-      set = new UnionSet<int>(new Set());
-    });
-
-    test("length returns 0", () {
-      expect(set.length, equals(0));
-    });
-
-    test("contains() returns false", () {
-      expect(set.contains(0), isFalse);
-      expect(set.contains(null), isFalse);
-      expect(set.contains("foo"), isFalse);
-    });
-
-    test("lookup() returns null", () {
-      expect(set.lookup(0), isNull);
-      expect(set.lookup(null), isNull);
-      expect(set.lookup("foo"), isNull);
-    });
-
-    test("toSet() returns an empty set", () {
-      expect(set.toSet(), isEmpty);
-      expect(set.toSet(), isNot(same(set)));
-    });
-
-    test("map() doesn't run on any elements", () {
-      expect(set.map(expectAsync1((_) {}, count: 0)), isEmpty);
-    });
-  });
-
-  group("with multiple disjoint sets", () {
-    var set;
-    setUp(() {
-      set = new UnionSet<int>.from([
-        new Set.from([1, 2]),
-        new Set.from([3, 4]),
-        new Set.from([5]),
-        new Set()
-      ], disjoint: true);
-    });
-
-    test("length returns the total length", () {
-      expect(set.length, equals(5));
-    });
-
-    test("contains() returns whether any set contains the element", () {
-      expect(set.contains(1), isTrue);
-      expect(set.contains(4), isTrue);
-      expect(set.contains(5), isTrue);
-      expect(set.contains(6), isFalse);
-    });
-
-    test("lookup() returns elements that are in any set", () {
-      expect(set.lookup(1), equals(1));
-      expect(set.lookup(4), equals(4));
-      expect(set.lookup(5), equals(5));
-      expect(set.lookup(6), isNull);
-    });
-
-    test("toSet() returns the union of all the sets", () {
-      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
-      expect(set.toSet(), isNot(same(set)));
-    });
-
-    test("map() maps the elements", () {
-      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
-    });
-  });
-
-  group("with multiple overlapping sets", () {
-    var set;
-    setUp(() {
-      set = new UnionSet<int>.from([
-        new Set.from([1, 2, 3]),
-        new Set.from([3, 4]),
-        new Set.from([5, 1]),
-        new Set()
-      ]);
-    });
-
-    test("length returns the total length", () {
-      expect(set.length, equals(5));
-    });
-
-    test("contains() returns whether any set contains the element", () {
-      expect(set.contains(1), isTrue);
-      expect(set.contains(4), isTrue);
-      expect(set.contains(5), isTrue);
-      expect(set.contains(6), isFalse);
-    });
-
-    test("lookup() returns elements that are in any set", () {
-      expect(set.lookup(1), equals(1));
-      expect(set.lookup(4), equals(4));
-      expect(set.lookup(5), equals(5));
-      expect(set.lookup(6), isNull);
-    });
-
-    test("lookup() returns the first element in an ordered context", () {
-      var duration1 = new Duration(seconds: 0);
-      var duration2 = new Duration(seconds: 0);
-      expect(duration1, equals(duration2));
-      expect(duration1, isNot(same(duration2)));
-
-      var set = new UnionSet.from([
-        new Set.from([duration1]),
-        new Set.from([duration2])
-      ]);
-
-      expect(set.lookup(new Duration(seconds: 0)), same(duration1));
-    });
-
-    test("toSet() returns the union of all the sets", () {
-      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
-      expect(set.toSet(), isNot(same(set)));
-    });
-
-    test("map() maps the elements", () {
-      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
-    });
-  });
-
-  group("after an inner set was modified", () {
-    var set;
-    setUp(() {
-      var innerSet = new Set<int>.from([3, 7]);
-      set = new UnionSet<int>.from([
-        new Set.from([1, 2]),
-        new Set.from([5]),
-        innerSet
-      ]);
-
-      innerSet.add(4);
-      innerSet.remove(7);
-    });
-
-    test("length returns the total length", () {
-      expect(set.length, equals(5));
-    });
-
-    test("contains() returns true for a new element", () {
-      expect(set.contains(4), isTrue);
-    });
-
-    test("contains() returns false for a removed element", () {
-      expect(set.contains(7), isFalse);
-    });
-
-    test("lookup() returns a new element", () {
-      expect(set.lookup(4), equals(4));
-    });
-
-    test("lookup() doesn't returns a removed element", () {
-      expect(set.lookup(7), isNull);
-    });
-
-    test("toSet() returns the union of all the sets", () {
-      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
-      expect(set.toSet(), isNot(same(set)));
-    });
-
-    test("map() maps the elements", () {
-      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
-    });
-  });
-
-  group("after the outer set was modified", () {
-    var set;
-    setUp(() {
-      var innerSet = new Set.from([6]);
-      var outerSet = new Set<Set<int>>.from([
-        new Set.from([1, 2]),
-        new Set.from([5]),
-        innerSet
-      ]);
-
-      set = new UnionSet<int>(outerSet);
-      outerSet.remove(innerSet);
-      outerSet.add(new Set.from([3, 4]));
-    });
-
-    test("length returns the total length", () {
-      expect(set.length, equals(5));
-    });
-
-    test("contains() returns true for a new element", () {
-      expect(set.contains(4), isTrue);
-    });
-
-    test("contains() returns false for a removed element", () {
-      expect(set.contains(6), isFalse);
-    });
-
-    test("lookup() returns a new element", () {
-      expect(set.lookup(4), equals(4));
-    });
-
-    test("lookup() doesn't returns a removed element", () {
-      expect(set.lookup(6), isNull);
-    });
-
-    test("toSet() returns the union of all the sets", () {
-      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
-      expect(set.toSet(), isNot(same(set)));
-    });
-
-    test("map() maps the elements", () {
-      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
-    });
-  });
-}
diff --git a/packages/collection/test/unmodifiable_collection_test.dart b/packages/collection/test/unmodifiable_collection_test.dart
deleted file mode 100644
index a6705f6..0000000
--- a/packages/collection/test/unmodifiable_collection_test.dart
+++ /dev/null
@@ -1,625 +0,0 @@
-// 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:collection/collection.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() {
-  var list = <int>[];
-  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");
-
-  var aSet = new Set<int>();
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "empty");
-  aSet = new Set();
-  testUnmodifiableSet(aSet, const UnmodifiableSetView.empty(), "const 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<int> original, List<int> 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<int> original, List<int> 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<int> original, Set<int> wrapped, String name) {
-  name = "unmodifiable-set-$name";
-  testIterable(original, wrapped, name);
-  testReadSet(original, wrapped, name);
-  testNoChangeSet(original, wrapped, name);
-}
-
-void testIterable(Iterable<int> original, Iterable<int> 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), throwsRangeError);
-    } 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, throwsStateError);
-    } else {
-      expect(wrapped.first, equals(original.first));
-    }
-  });
-
-  test("$name - firstWhere", () {
-    if (original.isEmpty) {
-      expect(() => wrapped.firstWhere((_) => true), throwsStateError);
-    } else {
-      expect(wrapped.firstWhere((_) => true),
-          equals(original.firstWhere((_) => true)));
-    }
-    expect(() => wrapped.firstWhere((_) => false), throwsStateError);
-  });
-
-  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, throwsStateError);
-    } else {
-      expect(wrapped.last, equals(original.last));
-    }
-  });
-
-  test("$name - lastWhere", () {
-    if (original.isEmpty) {
-      expect(() => wrapped.lastWhere((_) => true), throwsStateError);
-    } else {
-      expect(wrapped.lastWhere((_) => true),
-          equals(original.lastWhere((_) => true)));
-    }
-    expect(() => wrapped.lastWhere((_) => false), throwsStateError);
-  });
-
-  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), throwsStateError);
-    } 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, throwsStateError);
-    } else {
-      expect(wrapped.single, equals(original.single));
-    }
-  });
-
-  test("$name - singleWhere", () {
-    if (original.length != 1) {
-      expect(() => wrapped.singleWhere((_) => true), throwsStateError);
-    } else {
-      expect(wrapped.singleWhere((_) => true),
-          equals(original.singleWhere((_) => true)));
-    }
-    expect(() => wrapped.singleWhere((_) => false), throwsStateError);
-  });
-
-  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<int> original, List wrapped, String name) {
-  var copy = new List<int>.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;
-      }, throwsRangeError);
-    }
-  });
-
-  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);
-
-  void testThrows(String 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<int, int> original, Map<int, int> 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/packages/collection/test/utils.dart b/packages/collection/test/utils.dart
deleted file mode 100644
index 73926a3..0000000
--- a/packages/collection/test/utils.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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";
-
-final Matcher throwsCastError = throwsA(new isInstanceOf<CastError>());
-
-/// A hack to determine whether we are running in a Dart 2 runtime.
-final bool isDart2 = _isTypeArgString('');
-bool _isTypeArgString<T>(T arg) {
-  try {
-    return T == String;
-  } catch (_) {
-    return false;
-  }
-}
diff --git a/packages/collection/test/wrapper_test.dart b/packages/collection/test/wrapper_test.dart
deleted file mode 100644
index 0df053c..0000000
--- a/packages/collection/test/wrapper_test.dart
+++ /dev/null
@@ -1,670 +0,0 @@
-// 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);
-      }));
-
-  // dartanalyzer complains if this method is named `toString()`, since, if it
-  // truly overrides Object's `toString()`, it should return a String.
-  asString() => 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<Symbol, dynamic> namedArguments;
-  final int _type;
-  const SyntheticInvocation(this.memberName, this.positionalArguments,
-      this.namedArguments, this._type);
-
-  List<Type> get typeArguments => const <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);
-  toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;
-
-  Null cast<T>();
-  Null retype<T>();
-}
-
-// 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);
-  toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;
-}
-
-// 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 implemented 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;
-
-    // TODO: This currently fails because of the named parameter.
-    // 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.asString().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.asString().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", () {
-    Map<String, dynamic> map;
-    Set<String> 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", () {
-    Map<String, String> map;
-    Set<String> 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/packages/collection/tool/travis.sh b/packages/collection/tool/travis.sh
deleted file mode 100755
index 0e584b9..0000000
--- a/packages/collection/tool/travis.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2018 the Dart project authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#!/bin/bash
-
-if [ "$#" == "0" ]; then
-  echo -e '\033[31mAt least one task argument must be provided!\033[0m'
-  exit 1
-fi
-
-EXIT_CODE=0
-
-while (( "$#" )); do
-  TASK=$1
-  case $TASK in
-  dartfmt) echo
-    echo -e '\033[1mTASK: dartfmt\033[22m'
-    echo -e 'dartfmt -n --set-exit-if-changed .'
-    dartfmt -n --set-exit-if-changed . || EXIT_CODE=$?
-    ;;
-  dartanalyzer) echo
-    echo -e '\033[1mTASK: dartanalyzer\033[22m'
-    echo -e 'dartanalyzer --fatal-warnings .'
-    dartanalyzer --fatal-warnings . || EXIT_CODE=$?
-    ;;
-  vm_test) echo
-    echo -e '\033[1mTASK: vm_test\033[22m'
-    echo -e 'pub run test -P travis -p vm -x requires-dart2'
-    pub run test -p vm || EXIT_CODE=$?
-    ;;
-  dartdevc_build) echo
-    echo -e '\033[1mTASK: build\033[22m'
-    echo -e 'pub run build_runner build --fail-on-severe'
-    pub run build_runner build --fail-on-severe || EXIT_CODE=$?
-    ;;
-  dartdevc_test) echo
-    echo -e '\033[1mTASK: dartdevc_test\033[22m'
-    echo -e 'pub run build_runner test -- -P travis -p chrome'
-    pub run build_runner test -- -p chrome || EXIT_CODE=$?
-    ;;
-  dart2js_test) echo
-    echo -e '\033[1mTASK: dart2js_test\033[22m'
-    echo -e 'pub run test -P travis -p chrome -x requires-dart2'
-    pub run test -p chrome || EXIT_CODE=$?
-    ;;
-  *) echo -e "\033[31mNot expecting TASK '${TASK}'. Error!\033[0m"
-    EXIT_CODE=1
-    ;;
-  esac
-
-  shift
-done
-
-exit $EXIT_CODE
diff --git a/packages/csslib/.gitignore b/packages/csslib/.gitignore
deleted file mode 100644
index a6867f2..0000000
--- a/packages/csslib/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-# Don’t commit the following directories created by pub.
-.pub/
-build/
-packages
-.packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.js_
-*.js.deps
-*.js.map
-
-# Include when developing application packages.
-pubspec.lock
diff --git a/packages/csslib/.test_config b/packages/csslib/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/csslib/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/csslib/.travis.yml b/packages/csslib/.travis.yml
deleted file mode 100644
index b79391f..0000000
--- a/packages/csslib/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-language: dart
-sudo: false
-dart:
-  - dev
-  - stable
-dart_task:
-  - test: --platform vm
-  - test: --platform firefox -j 1
-  - test: --platform dartium
-    install_dartium: true
-  - dartanalyzer
-
-matrix:
-  include:
-    - dart: dev
-      dart_task: dartfmt
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-cache:
-  directories:
-    - $HOME/.pub-cache
diff --git a/packages/csslib/CHANGELOG.md b/packages/csslib/CHANGELOG.md
deleted file mode 100644
index 213cb82..0000000
--- a/packages/csslib/CHANGELOG.md
+++ /dev/null
@@ -1,117 +0,0 @@
-## 0.14.1
-
-* Deprecated `package:csslib/css.dart`.
-  Use `parser.dart` and `visitor.dart` instead.
-
-## 0.14.0
-
-### New features
-
-* Supports nested at-rules.
-* Supports nested HTML comments in CSS comments and vice-versa.
-
-### Breaking changes
-
-* The `List<RuleSet> rulesets` field on `MediaDirective`, `HostDirective`, and
-  `StyletDirective` has been replaced by `List<TreeNode> rules` to allow nested
-  at-rules in addition to rulesets.
-
-## 0.13.6
-
-* Adds support for `@viewport`.
-* Adds support for `-webkit-calc()` and `-moz-calc()`.
-* Adds support for querying media features without specifying an expression. For
-  example: `@media (transform-3d) { ... }`.
-* Prevents exception being thrown for invalid dimension terms, and instead
-  issues an error.
-
-## 0.13.5
-
-* Adds support for `@-moz-document`.
-* Adds support for `@supports`.
-
-## 0.13.4
-
-* Parses CSS 2.1 pseudo-elements as pseudo-elements instead of pseudo-classes.
-* Supports signed decimal numbers with no integer part.
-* Fixes parsing hexadecimal numbers when followed by an identifier.
-* Fixes parsing strings which contain unicode-range character sequences.
-
-## 0.13.3+1
-
-* Fixes analyzer error.
-
-## 0.13.3
-
-* Adds support for shadow host selectors `:host()` and `:host-context()`.
-* Adds support for shadow-piercing descendant combinator `>>>` and its alias
-  `/deep/` for backwards compatibility.
-* Adds support for non-functional IE filter properties (i.e. `filter: FlipH`).
-* Fixes emitted CSS for `@page` directive when body includes declarations and
-  page-margin boxes.
-* Exports `Message` from `parser.dart` so it's no longer necessary to import
-  `src/messages.dart` to use the parser API.
-
-## 0.13.2+2
-
-* Fix static warnings.
-
-## 0.13.2+1
-
-* Fix new strong mode error.
-
-## 0.13.2
-
-* Relax type of TreeNode.visit, to allow returning values from visitors.
-
-## 0.13.1
-
-* Fix two checked mode bugs introduced in 0.13.0.
-
-## 0.13.0
-
- * **BREAKING** Fix all [strong mode][] errors and warnings.
-   This involved adding more precise on some public APIs, which
-   is why it may break users.
-
-[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
-
-## 0.12.2
-
- * Fix to handle calc functions however, the expressions are treated as a
-   LiteralTerm and not fully parsed into the AST.
-
-## 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/packages/csslib/LICENSE b/packages/csslib/LICENSE
deleted file mode 100644
index ee99930..0000000
--- a/packages/csslib/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/csslib/README.md b/packages/csslib/README.md
deleted file mode 100644
index 8a71da4..0000000
--- a/packages/csslib/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-CSS parser library for Dart
-==========================
-
-This is a [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) parser written entirely in [Dart][dart].
-It can be used in the client/server/command line.
-
-This package is installed with [Pub][pub], see:
-[install instructions](https://pub.dartlang.org/packages/csslib#installing)
-for this package.
-
-Usage
------
-
-Parsing CSS is easy!
-```dart
-import 'package:csslib/parser.dart';
-
-main() {
-  var stylesheet = parse(
-      '.foo { color: red; left: 20px; top: 20px; width: 100px; height:200px }');
-  print(stylesheet.toDebugString());
-}
-```
-
-You can pass a String or list of bytes to `parse`.
-
-
-Running Tests
--------------
-
-Basic tests can be found in this repository:
-```bash
-pub run test
-```
-
-The full CSS test suite can be found in https://github.com/dart-lang/csslib-test-suite
-```bash
-cd ../csslib-test-suite
-./run.sh
-```
-
-[dart]: http://www.dartlang.org/
-[pub]: http://www.dartlang.org/docs/pub-package-manager/
diff --git a/packages/csslib/analysis_options.yaml b/packages/csslib/analysis_options.yaml
deleted file mode 100644
index a10d4c5..0000000
--- a/packages/csslib/analysis_options.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/packages/csslib/bin/css.dart b/packages/csslib/bin/css.dart
deleted file mode 100644
index f64faac..0000000
--- a/packages/csslib/bin/css.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/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/packages/csslib/codereview.settings b/packages/csslib/codereview.settings
deleted file mode 100644
index 904dba1..0000000
--- a/packages/csslib/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-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/packages/csslib/example/call_parser.dart b/packages/csslib/example/call_parser.dart
deleted file mode 100644
index 85325e4..0000000
--- a/packages/csslib/example/call_parser.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-// 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<css.Message> 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 = <css.Message>[];
-
-  // 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.isNotEmpty) {
-    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.isNotEmpty) {
-    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.isNotEmpty) {
-    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.isNotEmpty) {
-    print("Got ${errors.length} errors.\n");
-    for (var error in errors) {
-      print(error);
-    }
-  } else {
-    print(prettyPrint(selectorAst));
-  }
-}
diff --git a/packages/csslib/example/call_parser.html b/packages/csslib/example/call_parser.html
deleted file mode 100644
index 8dc02e4..0000000
--- a/packages/csslib/example/call_parser.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!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/packages/csslib/example/test.css b/packages/csslib/example/test.css
deleted file mode 100644
index 42aa048..0000000
--- a/packages/csslib/example/test.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.foo #abc {
-  color: red;
-  width: 300px;
-  left: 50px;
-  right: 50px;
-}
\ No newline at end of file
diff --git a/packages/csslib/lib/css.dart b/packages/csslib/lib/css.dart
deleted file mode 100644
index 98c9b2a..0000000
--- a/packages/csslib/lib/css.dart
+++ /dev/null
@@ -1,146 +0,0 @@
-// 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.
-
-@Deprecated('Will be removed in v0.15.0')
-library css;
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:path/path.dart' as path;
-import 'package:source_span/source_span.dart';
-
-import 'parser.dart';
-import 'src/messages.dart';
-import 'visitor.dart';
-
-void main(List<String> arguments) {
-  // TODO(jmesserly): fix this to return a proper exit code
-  var options = _parseOptions(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.fromString(contents, url: path.toUri(inputPath));
-
-    // Parse the CSS.
-    StyleSheet 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());
-}
-
-PreprocessorOptions _fromArgs(ArgResults args) => new PreprocessorOptions(
-    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>
-PreprocessorOptions _parseOptions(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 _fromArgs(results);
-  } on FormatException catch (e) {
-    print(e.message);
-    _showUsage(parser);
-    return null;
-  }
-}
-
-void _showUsage(ArgParser parser) {
-  print('Usage: css [options...] input.css');
-  print(parser.usage);
-}
diff --git a/packages/csslib/lib/parser.dart b/packages/csslib/lib/parser.dart
deleted file mode 100644
index db2068c..0000000
--- a/packages/csslib/lib/parser.dart
+++ /dev/null
@@ -1,2952 +0,0 @@
-// 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 'src/messages.dart';
-import 'src/options.dart';
-import 'visitor.dart';
-
-export 'src/messages.dart' show Message;
-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';
-
-enum ClauseType {
-  none,
-  conjunction,
-  disjunction,
-}
-
-/** 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.fromString(source);
-
-  var tree = new _Parser(file, source).parse();
-
-  analyze([tree], errors: errors, options: options);
-
-  if (polyfill) {
-    var processCss = new PolyFill(messages);
-    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.fromString(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.fromString(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.fromString(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.
-  // TODO(rnystrom): baseUrl isn't used. Remove from API.
-  Parser(SourceFile file, String text, {int start: 0, String baseUrl})
-      : _parser = new _Parser(file, text, start: start);
-
-  StyleSheet parse() => _parser.parse();
-}
-
-// CSS2.1 pseudo-elements which were defined with a single ':'.
-final _legacyPseudoElements = new Set<String>.from(const [
-  'after',
-  'before',
-  'first-letter',
-  'first-line',
-]);
-
-/** A simple recursive descent parser for CSS. */
-class _Parser {
-  final Tokenizer tokenizer;
-
-  /**
-   * 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})
-      : this.file = file,
-        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.
-      final rule = processRule();
-      if (rule != null) {
-        productions.add(rule);
-      } 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 = <MediaQuery>[];
-
-    do {
-      var mediaQuery = processMediaQuery();
-      if (mediaQuery != null) {
-        mediaQueries.add(mediaQuery);
-      } else {
-        break;
-      }
-    } while (_maybeEat(TokenKind.COMMA));
-
-    return mediaQueries;
-  }
-
-  MediaQuery processMediaQuery() {
-    // 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 (unaryOp != TokenKind.MEDIA_OP_NOT ||
-            unaryOp != TokenKind.MEDIA_OP_ONLY) {
-          _warning("Only the unary operators NOT and ONLY allowed",
-              _makeSpan(start));
-        }
-      }
-      _next();
-      start = _peekToken.span;
-    }
-
-    var type;
-    // Get the media type.
-    if (_peekIdentifier()) type = identifier();
-
-    var exprs = <MediaExpression>[];
-
-    while (true) {
-      // Parse AND if query has a media_type or previous expression.
-      var andOp = exprs.isNotEmpty || type != null;
-      if (andOp) {
-        op = _peekToken.text;
-        opLen = op.length;
-        if (TokenKind.matchMediaOperator(op, 0, opLen) !=
-            TokenKind.MEDIA_OP_AND) {
-          break;
-        }
-        _next();
-      }
-
-      var expr = processMediaExpression(andOp);
-      if (expr == null) break;
-
-      exprs.add(expr);
-    }
-
-    if (unaryOp != -1 || type != null || exprs.length > 0) {
-      return new MediaQuery(unaryOp, type, exprs, _makeSpan(start));
-    }
-    return null;
-  }
-
-  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.
-        var exprs = _maybeEat(TokenKind.COLON)
-            ? processExpr()
-            : new Expressions(_makeSpan(_peekToken.span));
-        if (_maybeEat(TokenKind.RPAREN)) {
-          return new MediaExpression(
-              andOperator, feature, exprs, _makeSpan(start));
-        } 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'
-   *  -moz-document:      '@-moz-document' [ <url> | url-prefix(<string>) |
-   *                          domain(<string>) | regexp(<string) ]# '{'
-   *                        declarations
-   *                      '}'
-   *  supports:           '@supports' supports_condition group_rule_body
-   */
-  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> rules = [];
-        if (_maybeEat(TokenKind.LBRACE)) {
-          while (!_maybeEat(TokenKind.END_OF_FILE)) {
-            final rule = processRule();
-            if (rule == null) break;
-            rules.add(rule);
-          }
-
-          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, rules, _makeSpan(start));
-
-      case TokenKind.DIRECTIVE_HOST:
-        _next();
-
-        List<TreeNode> rules = [];
-        if (_maybeEat(TokenKind.LBRACE)) {
-          while (!_maybeEat(TokenKind.END_OF_FILE)) {
-            final rule = processRule();
-            if (rule == null) break;
-            rules.add(rule);
-          }
-
-          if (!_maybeEat(TokenKind.RBRACE)) {
-            _error('expected } after ruleset for @host', _peekToken.span);
-          }
-        } else {
-          _error('expected { after host before ruleset', _peekToken.span);
-        }
-        return new HostDirective(rules, _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)) {
-          final rule = processRule();
-          if (rule == null) {
-            break;
-          }
-          productions.add(rule);
-        }
-
-        _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;
-      case TokenKind.DIRECTIVE_MOZ_DOCUMENT:
-        return processDocumentDirective();
-      case TokenKind.DIRECTIVE_SUPPORTS:
-        return processSupportsDirective();
-      case TokenKind.DIRECTIVE_VIEWPORT:
-      case TokenKind.DIRECTIVE_MS_VIEWPORT:
-        return processViewportDirective();
-    }
-    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();
-
-    var params = <TreeNode>[];
-    // 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 = [];
-    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 = <Declaration>[];
-        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 = <List<Expression>>[];
-
-    // 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 = <Expression>[];
-      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);
-  }
-
-  DocumentDirective processDocumentDirective() {
-    var start = _peekToken.span;
-    _next(); // '@-moz-document'
-    var functions = <LiteralTerm>[];
-    do {
-      var function;
-
-      // Consume function token: IDENT '('
-      var ident = identifier();
-      _eat(TokenKind.LPAREN);
-
-      // Consume function arguments.
-      if (ident.name == 'url-prefix' || ident.name == 'domain') {
-        // @-moz-document allows the 'url-prefix' and 'domain' functions to
-        // omit quotations around their argument, contrary to the standard
-        // in which they must be strings. To support this we consume a
-        // string with optional quotation marks, then reapply quotation
-        // marks so they're present in the emitted CSS.
-        var argumentStart = _peekToken.span;
-        var value = processQuotedString(true);
-        // Don't quote the argument if it's empty. '@-moz-document url-prefix()'
-        // is a common pattern used for browser detection.
-        var argument = value.isNotEmpty ? '"$value"' : '';
-        var argumentSpan = _makeSpan(argumentStart);
-
-        _eat(TokenKind.RPAREN);
-
-        var arguments = new Expressions(_makeSpan(argumentSpan))
-          ..add(new LiteralTerm(argument, argument, argumentSpan));
-        function = new FunctionTerm(
-            ident.name, ident.name, arguments, _makeSpan(ident.span));
-      } else {
-        function = processFunction(ident);
-      }
-
-      functions.add(function);
-    } while (_maybeEat(TokenKind.COMMA));
-
-    _eat(TokenKind.LBRACE);
-    var groupRuleBody = processGroupRuleBody();
-    _eat(TokenKind.RBRACE);
-    return new DocumentDirective(functions, groupRuleBody, _makeSpan(start));
-  }
-
-  SupportsDirective processSupportsDirective() {
-    var start = _peekToken.span;
-    _next(); // '@supports'
-    var condition = processSupportsCondition();
-    _eat(TokenKind.LBRACE);
-    var groupRuleBody = processGroupRuleBody();
-    _eat(TokenKind.RBRACE);
-    return new SupportsDirective(condition, groupRuleBody, _makeSpan(start));
-  }
-
-  SupportsCondition processSupportsCondition() {
-    if (_peekKind(TokenKind.IDENTIFIER)) {
-      return processSupportsNegation();
-    }
-
-    var start = _peekToken.span;
-    var conditions = <SupportsConditionInParens>[];
-    var clauseType = ClauseType.none;
-
-    while (true) {
-      conditions.add(processSupportsConditionInParens());
-
-      var type;
-      var text = _peekToken.text.toLowerCase();
-
-      if (text == 'and') {
-        type = ClauseType.conjunction;
-      } else if (text == 'or') {
-        type = ClauseType.disjunction;
-      } else {
-        break; // Done parsing clause.
-      }
-
-      if (clauseType == ClauseType.none) {
-        clauseType = type; // First operand and operator of clause.
-      } else if (clauseType != type) {
-        _error("Operators can't be mixed without a layer of parentheses",
-            _peekToken.span);
-        break;
-      }
-
-      _next(); // Consume operator.
-    }
-
-    if (clauseType == ClauseType.conjunction) {
-      return new SupportsConjunction(conditions, _makeSpan(start));
-    } else if (clauseType == ClauseType.disjunction) {
-      return new SupportsDisjunction(conditions, _makeSpan(start));
-    } else {
-      return conditions.first;
-    }
-  }
-
-  SupportsNegation processSupportsNegation() {
-    var start = _peekToken.span;
-    var text = _peekToken.text.toLowerCase();
-    if (text != 'not') return null;
-    _next(); // 'not'
-    var condition = processSupportsConditionInParens();
-    return new SupportsNegation(condition, _makeSpan(start));
-  }
-
-  SupportsConditionInParens processSupportsConditionInParens() {
-    var start = _peekToken.span;
-    _eat(TokenKind.LPAREN);
-    // Try to parse a condition.
-    var condition = processSupportsCondition();
-    if (condition != null) {
-      _eat(TokenKind.RPAREN);
-      return new SupportsConditionInParens.nested(condition, _makeSpan(start));
-    }
-    // Otherwise, parse a declaration.
-    var declaration = processDeclaration([]);
-    _eat(TokenKind.RPAREN);
-    return new SupportsConditionInParens(declaration, _makeSpan(start));
-  }
-
-  ViewportDirective processViewportDirective() {
-    var start = _peekToken.span;
-    var name = _next().text;
-    var declarations = processDeclarations();
-    return new ViewportDirective(name, declarations, _makeSpan(start));
-  }
-
-  TreeNode processRule([SelectorGroup selectorGroup]) {
-    if (selectorGroup == null) {
-      final directive = processDirective();
-      if (directive != null) {
-        _maybeEat(TokenKind.SEMICOLON);
-        return directive;
-      }
-      selectorGroup = processSelectorGroup();
-    }
-    if (selectorGroup != null) {
-      return new RuleSet(
-          selectorGroup, processDeclarations(), selectorGroup.span);
-    }
-    return null;
-  }
-
-  List<TreeNode> processGroupRuleBody() {
-    var nodes = <TreeNode>[];
-    while (!(_peekKind(TokenKind.RBRACE) || _peekKind(TokenKind.END_OF_FILE))) {
-      var rule = processRule();
-      if (rule != null) {
-        nodes.add(rule);
-        continue;
-      }
-      break;
-    }
-    return nodes;
-  }
-
-  /**
-   * 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);
-
-    var decls = <TreeNode>[];
-    var dartStyles = []; // List of latest styles exposed to Dart.
-
-    do {
-      var selectorGroup = _nestedSelector();
-      while (selectorGroup != null) {
-        // Nested selector so process as a ruleset.
-        var ruleset = processRule(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() {
-    var groups = <DeclarationGroup>[];
-
-    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 null;
-  }
-
-  /**
-   * 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.isEmpty);
-      if (selectorItem != null) {
-        simpleSequences.add(selectorItem);
-      } else {
-        break;
-      }
-    }
-
-    if (simpleSequences.isEmpty) return null;
-
-    return new Selector(simpleSequences, _makeSpan(start));
-  }
-
-  /// Same as [processSelector] but reports an error for each combinator.
-  ///
-  /// This is a quick fix for parsing <compound-selectors> until the parser
-  /// supports Selector Level 4 grammar:
-  /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector
-  Selector processCompoundSelector() {
-    return processSelector()
-      ..simpleSelectorSequences.forEach((sequence) {
-        if (!sequence.isCombinatorNone) {
-          _error('compound selector can not contain combinator', sequence.span);
-        }
-      });
-  }
-
-  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:
-        // Parse > or >>>
-        _eat(TokenKind.GREATER);
-        if (_maybeEat(TokenKind.GREATER)) {
-          _eat(TokenKind.GREATER);
-          combinatorType = TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT;
-        } else {
-          combinatorType = TokenKind.COMBINATOR_GREATER;
-        }
-        break;
-      case TokenKind.TILDE:
-        _eat(TokenKind.TILDE);
-        combinatorType = TokenKind.COMBINATOR_TILDE;
-        break;
-      case TokenKind.SLASH:
-        // Parse /deep/
-        _eat(TokenKind.SLASH);
-        var ate = _maybeEat(TokenKind.IDENTIFIER);
-        var tok = ate ? _previousToken : _peekToken;
-        if (!(ate && tok.text == 'deep')) {
-          _error('expected deep, but found ${tok.text}', tok.span);
-        }
-        _eat(TokenKind.SLASH);
-        combinatorType = TokenKind.COMBINATOR_DEEP;
-        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;
-    }
-    var name = pseudoName.name.toLowerCase();
-
-    // Functional pseudo?
-    if (_peekToken.kind == TokenKind.LPAREN) {
-      if (!pseudoElement && name == 'not') {
-        _eat(TokenKind.LPAREN);
-
-        // Negation :   ':NOT(' S* negation_arg S* ')'
-        var negArg = simpleSelector();
-
-        _eat(TokenKind.RPAREN);
-        return new NegationSelector(negArg, _makeSpan(start));
-      } else if (!pseudoElement && (name == 'host' || name == 'host-context')) {
-        _eat(TokenKind.LPAREN);
-        var selector = processCompoundSelector();
-        _eat(TokenKind.RPAREN);
-        var span = _makeSpan(start);
-        return new PseudoClassFunctionSelector(pseudoName, selector, span);
-      } 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);
-      }
-    }
-
-    // Treat CSS2.1 pseudo-elements defined with pseudo class syntax as pseudo-
-    // elements for backwards compatibility.
-    return pseudoElement || _legacyPseudoElements.contains(name)
-        ? new PseudoElementSelector(pseudoName, _makeSpan(start),
-            isLegacy: !pseudoElement)
-        : 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 = <Expression>[];
-
-    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));
-    }
-    return null;
-  }
-
-  //  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);
-    }
-    return null;
-  }
-
-  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;
-    }
-    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);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * 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();
-            // Append identifier only if there's no delimiting whitespace.
-            if (_peekIdentifier() && _previousToken.end == _peekToken.start) {
-              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)) {
-          var calc = processCalc(nameValue);
-          if (calc != null) return calc;
-          // 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 as LiteralTerm).text, [], _makeSpan(start));
-          expr.expressions[0] = varUsage;
-          return expr.expressions;
-        }
-        break;
-    }
-
-    return t != null ? processDimension(t, value, _makeSpan(start)) : null;
-  }
-
-  /** 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) {
-    // Support non-functional filters (i.e. filter: FlipH)
-    var kind = _peek();
-    if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) {
-      var tok = tokenizer.makeIEFilter(
-          startAfterProgidColon.start.offset, _peekToken.start);
-      return new LiteralTerm(tok.text, tok.text, tok.span);
-    }
-
-    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());
-      }
-    }
-  }
-
-  //  TODO(terry): Hack to gobble up the calc expression as a string looking
-  //               for the matching RPAREN the expression is not parsed into the
-  //               AST.
-  //
-  //  grammar should be:
-  //
-  //    <calc()> = calc( <calc-sum> )
-  //    <calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*
-  //    <calc-product> = <calc-value> [ '*' <calc-value> | '/' <number> ]*
-  //    <calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
-  //
-  String processCalcExpression() {
-    var inString = tokenizer._inString;
-    tokenizer._inString = false;
-
-    // Gobble up everything until we hit our stop token.
-    var stringValue = new StringBuffer();
-    var left = 1;
-    var matchingParens = false;
-    while (_peek() != TokenKind.END_OF_FILE && !matchingParens) {
-      var token = _peek();
-      if (token == TokenKind.LPAREN)
-        left++;
-      else if (token == TokenKind.RPAREN) left--;
-
-      matchingParens = left == 0;
-      if (!matchingParens) stringValue.write(_next().text);
-    }
-
-    if (!matchingParens) {
-      _error("problem parsing function expected ), ", _peekToken.span);
-    }
-
-    tokenizer._inString = inString;
-
-    return stringValue.toString();
-  }
-
-  CalcTerm processCalc(Identifier func) {
-    var start = _peekToken.span;
-
-    var name = func.name;
-    if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') {
-      // TODO(terry): Implement expression parsing properly.
-      String expression = processCalcExpression();
-      var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start));
-
-      if (!_maybeEat(TokenKind.RPAREN)) {
-        _error("problem parsing function expected ), ", _peekToken.span);
-      }
-
-      return new CalcTerm(name, name, calcExpr, _makeSpan(start));
-    }
-
-    return null;
-  }
-
-  //  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 message 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 '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] as LiteralTerm).text;
-
-        // [0] - var name, [1] - OperatorComma, [2] - default value.
-        var defaultValues = expr.expressions.length >= 3
-            ? expr.expressions.sublist(2)
-            : <Expression>[];
-        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));
-    }
-  }
-
-  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/packages/csslib/lib/src/analyzer.dart b/packages/csslib/lib/src/analyzer.dart
deleted file mode 100644
index 0bfb2f3..0000000
--- a/packages/csslib/lib/src/analyzer.dart
+++ /dev/null
@@ -1,1013 +0,0 @@
-// 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.isNotEmpty) {
-        // 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 = <Selector>[];
-    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 = <SimpleSelectorSequence>[];
-
-    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.isNotEmpty &&
-              newSequence.last.simpleSelector.name.isNotEmpty;
-          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 = <SimpleSelectorSequence>[];
-    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.rules.indexOf(_ruleSet);
-    if (index != -1) {
-      node.rules.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);
-        mixinRuleset.rulesets.removeAt(index);
-        _messages.warning(
-            'Using declaration mixin ${node.name} as top-level mixin',
-            node.span);
-      }
-    } else {
-      if (currDef is MixinRulesetDirective) {
-        MixinRulesetDirective rulesetDirect = currDef as MixinRulesetDirective;
-        rulesetDirect.rulesets.removeWhere((entry) {
-          if (entry == node) {
-            _messages.warning('Undefined mixin ${node.name}', node.span);
-            return true;
-          }
-          return false;
-        });
-      }
-    }
-    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<List<Expression>> 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<Expression>> _varDefsAsCallArgs(var callArg) {
-    var defArgs = <List<Expression>>[];
-    if (callArg is List && callArg[0] is VarUsage) {
-      var varDef = varDefs[callArg[0].name];
-      var expressions = (varDef.expression as Expressions).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 = <Declaration>[];
-          if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
-            origRulesets.forEach((ruleset) {
-              rulesets.add(new IncludeMixinAtDeclaration(
-                  ruleset as IncludeDirective, 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<TreeNode> _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<TreeNode> 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;
-  final 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/packages/csslib/lib/src/css_printer.dart b/packages/csslib/lib/src/css_printer.dart
deleted file mode 100644
index 14c1f8c..0000000
--- a/packages/csslib/lib/src/css_printer.dart
+++ /dev/null
@@ -1,579 +0,0 @@
-// 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 visitCalcTerm(CalcTerm node) {
-    emit('${node.text}(');
-    node.expr.visit(this);
-    emit(')');
-  }
-
-  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}');
-    if (node.exprs.expressions.isNotEmpty) {
-      emit(':');
-      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(List<MediaQuery> queries) {
-    var queriesLen = queries.length;
-    for (var i = 0; i < queriesLen; i++) {
-      var query = queries[i];
-      if (i > 0) emit(',');
-      visitMediaQuery(query);
-    }
-  }
-
-  void visitDocumentDirective(DocumentDirective node) {
-    emit('$_newLine@-moz-document ');
-    node.functions.first.visit(this);
-    for (var function in node.functions.skip(1)) {
-      emit(',$_sp');
-      function.visit(this);
-    }
-    emit('$_sp{');
-    for (var ruleSet in node.groupRuleBody) {
-      ruleSet.visit(this);
-    }
-    emit('$_newLine}');
-  }
-
-  void visitSupportsDirective(SupportsDirective node) {
-    emit('$_newLine@supports ');
-    node.condition.visit(this);
-    emit('$_sp{');
-    for (var rule in node.groupRuleBody) {
-      rule.visit(this);
-    }
-    emit('$_newLine}');
-  }
-
-  void visitSupportsConditionInParens(SupportsConditionInParens node) {
-    emit('(');
-    node.condition.visit(this);
-    emit(')');
-  }
-
-  void visitSupportsNegation(SupportsNegation node) {
-    emit('not$_sp');
-    node.condition.visit(this);
-  }
-
-  void visitSupportsConjunction(SupportsConjunction node) {
-    node.conditions.first.visit(this);
-    for (var condition in node.conditions.skip(1)) {
-      emit('${_sp}and$_sp');
-      condition.visit(this);
-    }
-  }
-
-  void visitSupportsDisjunction(SupportsDisjunction node) {
-    node.conditions.first.visit(this);
-    for (var condition in node.conditions.skip(1)) {
-      emit('${_sp}or$_sp');
-      condition.visit(this);
-    }
-  }
-
-  void visitViewportDirective(ViewportDirective node) {
-    emit('@${node.name}$_sp{$_newLine');
-    node.declarations.visit(this);
-    emit('}');
-  }
-
-  void visitMediaDirective(MediaDirective node) {
-    emit('$_newLine@media');
-    emitMediaQueries(node.mediaQueries);
-    emit('$_sp{');
-    for (var ruleset in node.rules) {
-      ruleset.visit(this);
-    }
-    emit('$_newLine}');
-  }
-
-  void visitHostDirective(HostDirective node) {
-    emit('$_newLine@host$_sp{');
-    for (var ruleset in node.rules) {
-      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}' : '');
-    }
-
-    var declsMargin = node._declsMargin;
-    var declsMarginLength = declsMargin.length;
-    emit(' {$_newLine');
-    for (var i = 0; i < declsMarginLength; i++) {
-      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) {
-    emit('${node.property}:$_sp');
-    node._expression.visit(this);
-    if (node.important) {
-      emit('$_sp!important');
-    }
-  }
-
-  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.argument.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.isNotEmpty) {
-      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/packages/csslib/lib/src/messages.dart b/packages/csslib/lib/src/messages.dart
deleted file mode 100644
index 420c243..0000000
--- a/packages/csslib/lib/src/messages.dart
+++ /dev/null
@@ -1,128 +0,0 @@
-// 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/packages/csslib/lib/src/options.dart b/packages/csslib/lib/src/options.dart
deleted file mode 100644
index 56c358b..0000000
--- a/packages/csslib/lib/src/options.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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;
-
-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});
-}
diff --git a/packages/csslib/lib/src/polyfill.dart b/packages/csslib/lib/src/polyfill.dart
deleted file mode 100644
index 9bdcbe2..0000000
--- a/packages/csslib/lib/src/polyfill.dart
+++ /dev/null
@@ -1,258 +0,0 @@
-// 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;
-  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);
-
-  /**
-   * 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 = <Expression>[];
-
-    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.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.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/packages/csslib/lib/src/property.dart b/packages/csslib/lib/src/property.dart
deleted file mode 100644
index 69f5c54..0000000
--- a/packages/csslib/lib/src/property.dart
+++ /dev/null
@@ -1,1248 +0,0 @@
-// 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(false);
-          break;
-      }
-    }
-    return null;
-  }
-
-  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
-    return null;
-  }
-}
-
-// 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);
-}
-
-T _mergeVal<T>(T x, T y) => y != null ? y : x;
diff --git a/packages/csslib/lib/src/token.dart b/packages/csslib/lib/src/token.dart
deleted file mode 100644
index e30484d..0000000
--- a/packages/csslib/lib/src/token.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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/packages/csslib/lib/src/tokenizer.dart b/packages/csslib/lib/src/tokenizer.dart
deleted file mode 100644
index 0b0661a..0000000
--- a/packages/csslib/lib/src/tokenizer.dart
+++ /dev/null
@@ -1,471 +0,0 @@
-// 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 (_nextCharsAreNumber(ch)) 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 (_nextCharsAreNumber(ch)) {
-          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 finishHtmlComment();
-          } 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 (_inString &&
-            (ch == UNICODE_U || ch == UNICODE_LOWER_U) &&
-            (_peekChar() == UNICODE_PLUS)) {
-          // `_inString` is misleading. We actually DON'T want to enter this
-          // block while tokenizing a string, but the parser sets this value to
-          // false while it IS consuming tokens within a string.
-          //
-          // 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 = <int>[];
-
-    // 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 finishHtmlComment() {
-    while (true) {
-      int ch = _nextChar();
-      if (ch == 0) {
-        return _finishToken(TokenKind.INCOMPLETE_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);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  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);
-          }
-        }
-      }
-    }
-  }
-}
-
-/** 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/packages/csslib/lib/src/tokenizer_base.dart b/packages/csslib/lib/src/tokenizer_base.dart
deleted file mode 100644
index c2a448f..0000000
--- a/packages/csslib/lib/src/tokenizer_base.dart
+++ /dev/null
@@ -1,428 +0,0 @@
-// 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([int offset = 0]) {
-    if (_index + offset < _text.length) {
-      return _text.codeUnitAt(_index + offset);
-    } 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;
-    }
-  }
-
-  bool _nextCharsAreNumber(int first) {
-    if (TokenizerHelpers.isDigit(first)) return true;
-    var second = _peekChar();
-    if (first == TokenChar.DOT) return TokenizerHelpers.isDigit(second);
-    if (first == TokenChar.PLUS || first == TokenChar.MINUS) {
-      return TokenizerHelpers.isDigit(second) ||
-          (second == TokenChar.DOT && TokenizerHelpers.isDigit(_peekChar(1)));
-    }
-    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/packages/csslib/lib/src/tokenkind.dart b/packages/csslib/lib/src/tokenkind.dart
deleted file mode 100644
index 14cf3c9..0000000
--- a/packages/csslib/lib/src/tokenkind.dart
+++ /dev/null
@@ -1,792 +0,0 @@
-// 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 COMBINATOR_SHADOW_PIERCING_DESCENDANT = 518; // >>>
-  static const int COMBINATOR_DEEP = 519; // /deep/ (aliases >>>)
-
-  static const int UNARY_OP_NONE = 520; // 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;
-  static const int DIRECTIVE_MOZ_DOCUMENT = 658;
-  static const int DIRECTIVE_SUPPORTS = 659;
-  static const int DIRECTIVE_VIEWPORT = 660;
-  static const int DIRECTIVE_MS_VIEWPORT = 661;
-
-  // 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<String, dynamic>> _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'},
-    const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'},
-    const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'},
-    const {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'},
-    const {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'},
-  ];
-
-  static const List<Map<String, dynamic>> 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<String, dynamic>> 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/packages/csslib/lib/src/tree.dart b/packages/csslib/lib/src/tree.dart
deleted file mode 100644
index 7e1fe6d..0000000
--- a/packages/csslib/lib/src/tree.dart
+++ /dev/null
@@ -1,1591 +0,0 @@
-// 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';
-}
-
-// calc(...)
-// TODO(terry): Hack to handle calc however the expressions should be fully
-//              parsed and in the AST.
-class CalcTerm extends LiteralTerm {
-  final LiteralTerm expr;
-
-  CalcTerm(var value, String t, this.expr, SourceSpan span)
-      : super(value, t, span);
-
-  CalcTerm clone() => new CalcTerm(value, text, expr.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
-
-  String toString() => "$text($expr)";
-}
-
-// /*  ....   */
-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;
-  bool get isCombinatorDeep => combinator == TokenKind.COMBINATOR_DEEP;
-  bool get isCombinatorShadowPiercingDescendant =>
-      combinator == TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT;
-
-  String get _combinatorToString {
-    switch (combinator) {
-      case TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT:
-        return ' >>> ';
-      case TokenKind.COMBINATOR_DEEP:
-        return ' /deep/ ';
-      case TokenKind.COMBINATOR_DESCENDANT:
-        return ' ';
-      case TokenKind.COMBINATOR_GREATER:
-        return ' > ';
-      case TokenKind.COMBINATOR_PLUS:
-        return ' + ';
-      case TokenKind.COMBINATOR_TILDE:
-        return ' ~ ';
-      default:
-        return '';
-    }
-  }
-
-  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 null;
-  }
-
-  // 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';
-    }
-    return null;
-  }
-
-  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 {
-  // If true, this is a CSS2.1 pseudo-element with only a single ':'.
-  final bool isLegacy;
-
-  PseudoElementSelector(Identifier name, SourceSpan span,
-      {this.isLegacy: false})
-      : super(name, span);
-  visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
-
-  PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
-
-  String toString() => "${isLegacy ? ':' : '::'}$name";
-}
-
-// :pseudoClassFunction(argument)
-class PseudoClassFunctionSelector extends PseudoClassSelector {
-  final TreeNode _argument; // Selector, SelectorExpression
-
-  PseudoClassFunctionSelector(Identifier name, this._argument, SourceSpan span)
-      : super(name, span);
-
-  PseudoClassFunctionSelector clone() =>
-      new PseudoClassFunctionSelector(_name, _argument, span);
-
-  TreeNode get argument => _argument;
-  Selector get selector => _argument as Selector;
-  SelectorExpression get expression => _argument as SelectorExpression;
-
-  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 DocumentDirective extends Directive {
-  final List<LiteralTerm> functions;
-  final List<TreeNode> groupRuleBody;
-
-  DocumentDirective(this.functions, this.groupRuleBody, SourceSpan span)
-      : super(span);
-
-  DocumentDirective clone() {
-    var clonedFunctions = <LiteralTerm>[];
-    for (var function in functions) {
-      clonedFunctions.add(function.clone());
-    }
-    var clonedGroupRuleBody = <TreeNode>[];
-    for (var rule in groupRuleBody) {
-      clonedGroupRuleBody.add(rule.clone());
-    }
-    return new DocumentDirective(clonedFunctions, clonedGroupRuleBody, span);
-  }
-
-  visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
-}
-
-class SupportsDirective extends Directive {
-  final SupportsCondition condition;
-  final List<TreeNode> groupRuleBody;
-
-  SupportsDirective(this.condition, this.groupRuleBody, SourceSpan span)
-      : super(span);
-
-  SupportsDirective clone() {
-    var clonedCondition = condition.clone();
-    var clonedGroupRuleBody = <TreeNode>[];
-    for (var rule in groupRuleBody) {
-      clonedGroupRuleBody.add(rule.clone());
-    }
-    return new SupportsDirective(clonedCondition, clonedGroupRuleBody, span);
-  }
-
-  visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
-}
-
-abstract class SupportsCondition extends TreeNode {
-  SupportsCondition(SourceSpan span) : super(span);
-}
-
-class SupportsConditionInParens extends SupportsCondition {
-  /// A [Declaration] or nested [SupportsCondition].
-  final TreeNode condition;
-
-  SupportsConditionInParens(Declaration declaration, SourceSpan span)
-      : condition = declaration,
-        super(span);
-
-  SupportsConditionInParens.nested(SupportsCondition condition, SourceSpan span)
-      : condition = condition,
-        super(span);
-
-  SupportsConditionInParens clone() =>
-      new SupportsConditionInParens(condition.clone(), span);
-
-  visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this);
-}
-
-class SupportsNegation extends SupportsCondition {
-  final SupportsConditionInParens condition;
-
-  SupportsNegation(this.condition, SourceSpan span) : super(span);
-
-  SupportsNegation clone() => new SupportsNegation(condition.clone(), span);
-
-  visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
-}
-
-class SupportsConjunction extends SupportsCondition {
-  final List<SupportsConditionInParens> conditions;
-
-  SupportsConjunction(this.conditions, SourceSpan span) : super(span);
-
-  SupportsConjunction clone() {
-    var clonedConditions = <SupportsCondition>[];
-    for (var condition in conditions) {
-      clonedConditions.add(condition.clone());
-    }
-    return new SupportsConjunction(clonedConditions, span);
-  }
-
-  visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
-}
-
-class SupportsDisjunction extends SupportsCondition {
-  final List<SupportsConditionInParens> conditions;
-
-  SupportsDisjunction(this.conditions, SourceSpan span) : super(span);
-
-  SupportsDisjunction clone() {
-    var clonedConditions = <SupportsCondition>[];
-    for (var condition in conditions) {
-      clonedConditions.add(condition.clone());
-    }
-    return new SupportsDisjunction(clonedConditions, span);
-  }
-
-  visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
-}
-
-class ViewportDirective extends Directive {
-  final String name;
-  final DeclarationGroup declarations;
-
-  ViewportDirective(this.name, this.declarations, SourceSpan span)
-      : super(span);
-
-  ViewportDirective clone() =>
-      new ViewportDirective(name, declarations.clone(), span);
-
-  visit(VisitorBase visitor) => visitor.visitViewportDirective(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 = <MediaQuery>[];
-    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 = <MediaExpression>[];
-    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<TreeNode> rules;
-
-  MediaDirective(this.mediaQueries, this.rules, SourceSpan span) : super(span);
-
-  MediaDirective clone() {
-    var cloneQueries = <MediaQuery>[];
-    for (var mediaQuery in mediaQueries) {
-      cloneQueries.add(mediaQuery.clone());
-    }
-    var cloneRules = <TreeNode>[];
-    for (var rule in rules) {
-      cloneRules.add(rule.clone());
-    }
-    return new MediaDirective(cloneQueries, cloneRules, span);
-  }
-
-  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
-}
-
-class HostDirective extends Directive {
-  final List<TreeNode> rules;
-
-  HostDirective(this.rules, SourceSpan span) : super(span);
-
-  HostDirective clone() {
-    var cloneRules = <TreeNode>[];
-    for (var rule in rules) {
-      cloneRules.add(rule.clone());
-    }
-    return new HostDirective(cloneRules, 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 = <DeclarationGroup>[];
-    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';
-    }
-    return null;
-  }
-
-  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<TreeNode> rules;
-
-  StyletDirective(this.dartClassName, this.rules, SourceSpan span)
-      : super(span);
-
-  bool get isBuiltIn => false;
-  bool get isExtension => true;
-
-  StyletDirective clone() {
-    var cloneRules = <TreeNode>[];
-    for (var rule in rules) {
-      cloneRules.add(rule.clone());
-    }
-    return new StyletDirective(dartClassName, cloneRules, 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<TreeNode> definedArgs;
-  final bool varArgs;
-
-  MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
-      : super(span);
-
-  MixinDefinition clone() {
-    var cloneDefinedArgs = <TreeNode>[];
-    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<TreeNode> rulesets;
-
-  MixinRulesetDirective(String name, List<TreeNode> args, bool varArgs,
-      this.rulesets, SourceSpan span)
-      : super(name, args, varArgs, span);
-
-  MixinRulesetDirective clone() {
-    var clonedArgs = <VarDefinition>[];
-    for (var arg in definedArgs) {
-      clonedArgs.add(arg.clone());
-    }
-    var clonedRulesets = <TreeNode>[];
-    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<TreeNode> args, bool varArgs,
-      this.declarations, SourceSpan span)
-      : super(name, args, varArgs, span);
-
-  MixinDeclarationDirective clone() {
-    var clonedArgs = <TreeNode>[];
-    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<Expression>> args;
-
-  IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
-
-  IncludeDirective clone() {
-    var cloneArgs = <List<Expression>>[];
-    for (var arg in args) {
-      cloneArgs.add(arg.map((term) => term.clone()).toList());
-    }
-    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<TreeNode> 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<TreeNode> decls, SourceSpan span)
-      : super(decls, span);
-  MarginGroup clone() =>
-      new MarginGroup(margin_sym, super.clone().declarations, 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 = <Expression>[];
-    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/packages/csslib/lib/src/tree_base.dart b/packages/csslib/lib/src/tree_base.dart
deleted file mode 100644
index 3ead0bf..0000000
--- a/packages/csslib/lib/src/tree_base.dart
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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. */
-  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/packages/csslib/lib/src/tree_printer.dart b/packages/csslib/lib/src/tree_printer.dart
deleted file mode 100644
index 4f196c0..0000000
--- a/packages/csslib/lib/src/tree_printer.dart
+++ /dev/null
@@ -1,620 +0,0 @@
-// 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 visitCalcTerm(CalcTerm node) {
-    heading('CalcTerm', node);
-    output.depth++;
-    super.visitCalcTerm(node);
-    output.depth--;
-  }
-
-  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.rules);
-    super.visitMediaDirective(node);
-    output.depth--;
-  }
-
-  void visitDocumentDirective(DocumentDirective node) {
-    heading('DocumentDirective', node);
-    output.depth++;
-    output.writeNodeList('functions', node.functions);
-    output.writeNodeList('group rule body', node.groupRuleBody);
-    output.depth--;
-  }
-
-  void visitSupportsDirective(SupportsDirective node) {
-    heading('SupportsDirective', node);
-    output.depth++;
-    output.writeNode('condition', node.condition);
-    output.writeNodeList('group rule body', node.groupRuleBody);
-    output.depth--;
-  }
-
-  void visitSupportsConditionInParens(SupportsConditionInParens node) {
-    heading('SupportsConditionInParens', node);
-    output.depth++;
-    output.writeNode('condition', node.condition);
-    output.depth--;
-  }
-
-  void visitSupportsNegation(SupportsNegation node) {
-    heading('SupportsNegation', node);
-    output.depth++;
-    output.writeNode('condition', node.condition);
-    output.depth--;
-  }
-
-  void visitSupportsConjunction(SupportsConjunction node) {
-    heading('SupportsConjunction', node);
-    output.depth++;
-    output.writeNodeList('conditions', node.conditions);
-    output.depth--;
-  }
-
-  void visitSupportsDisjunction(SupportsDisjunction node) {
-    heading('SupportsDisjunction', node);
-    output.depth++;
-    output.writeNodeList('conditions', node.conditions);
-    output.depth--;
-  }
-
-  void visitViewportDirective(ViewportDirective node) {
-    heading('ViewportDirective', node);
-    output.depth++;
-    super.visitViewportDirective(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.rules);
-    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 if (node.isCombinatorShadowPiercingDescendant) {
-      output.writeValue('combinator', '>>>');
-    } else if (node.isCombinatorDeep) {
-      output.writeValue('combinator', '/deep/');
-    } 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++;
-    node.argument.visit(this);
-    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/packages/csslib/lib/src/validate.dart b/packages/csslib/lib/src/validate.dart
deleted file mode 100644
index e716e66..0000000
--- a/packages/csslib/lib/src/validate.dart
+++ /dev/null
@@ -1,124 +0,0 @@
-// 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) {
-    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/packages/csslib/lib/visitor.dart b/packages/csslib/lib/visitor.dart
deleted file mode 100644
index 6e3af18..0000000
--- a/packages/csslib/lib/visitor.dart
+++ /dev/null
@@ -1,491 +0,0 @@
-// 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 {
-  visitCalcTerm(CalcTerm node);
-  visitCssComment(CssComment node);
-  visitCommentDefinition(CommentDefinition node);
-  visitStyleSheet(StyleSheet node);
-  visitNoOp(NoOp node);
-  visitTopLevelProduction(TopLevelProduction node);
-  visitDirective(Directive node);
-  visitDocumentDirective(DocumentDirective node);
-  visitSupportsDirective(SupportsDirective node);
-  visitSupportsConditionInParens(SupportsConditionInParens node);
-  visitSupportsNegation(SupportsNegation node);
-  visitSupportsConjunction(SupportsConjunction node);
-  visitSupportsDisjunction(SupportsDisjunction node);
-  visitViewportDirective(ViewportDirective node);
-  visitMediaExpression(MediaExpression node);
-  visitMediaQuery(MediaQuery node);
-  visitMediaDirective(MediaDirective node);
-  visitHostDirective(HostDirective node);
-  visitPageDirective(PageDirective node);
-  visitCharsetDirective(CharsetDirective node);
-  visitImportDirective(ImportDirective node);
-  visitKeyFrameDirective(KeyFrameDirective node);
-  visitKeyFrameBlock(KeyFrameBlock node);
-  visitFontFaceDirective(FontFaceDirective node);
-  visitStyletDirective(StyletDirective node);
-  visitNamespaceDirective(NamespaceDirective node);
-  visitVarDefinitionDirective(VarDefinitionDirective node);
-  visitMixinDefinition(MixinDefinition node);
-  visitMixinRulesetDirective(MixinRulesetDirective node);
-  visitMixinDeclarationDirective(MixinDeclarationDirective node);
-  visitIncludeDirective(IncludeDirective node);
-  visitContentDirective(ContentDirective node);
-
-  visitRuleSet(RuleSet node);
-  visitDeclarationGroup(DeclarationGroup node);
-  visitMarginGroup(MarginGroup node);
-  visitDeclaration(Declaration node);
-  visitVarDefinition(VarDefinition node);
-  visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node);
-  visitExtendDeclaration(ExtendDeclaration node);
-  visitSelectorGroup(SelectorGroup node);
-  visitSelector(Selector node);
-  visitSimpleSelectorSequence(SimpleSelectorSequence node);
-  visitSimpleSelector(SimpleSelector node);
-  visitElementSelector(ElementSelector node);
-  visitNamespaceSelector(NamespaceSelector node);
-  visitAttributeSelector(AttributeSelector node);
-  visitIdSelector(IdSelector node);
-  visitClassSelector(ClassSelector node);
-  visitPseudoClassSelector(PseudoClassSelector node);
-  visitPseudoElementSelector(PseudoElementSelector node);
-  visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node);
-  visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node);
-  visitNegationSelector(NegationSelector node);
-  visitSelectorExpression(SelectorExpression node);
-
-  visitUnicodeRangeTerm(UnicodeRangeTerm node);
-  visitLiteralTerm(LiteralTerm node);
-  visitHexColorTerm(HexColorTerm node);
-  visitNumberTerm(NumberTerm node);
-  visitUnitTerm(UnitTerm node);
-  visitLengthTerm(LengthTerm node);
-  visitPercentageTerm(PercentageTerm node);
-  visitEmTerm(EmTerm node);
-  visitExTerm(ExTerm node);
-  visitAngleTerm(AngleTerm node);
-  visitTimeTerm(TimeTerm node);
-  visitFreqTerm(FreqTerm node);
-  visitFractionTerm(FractionTerm node);
-  visitUriTerm(UriTerm node);
-  visitResolutionTerm(ResolutionTerm node);
-  visitChTerm(ChTerm node);
-  visitRemTerm(RemTerm node);
-  visitViewportTerm(ViewportTerm node);
-  visitFunctionTerm(FunctionTerm node);
-  visitGroupTerm(GroupTerm node);
-  visitItemTerm(ItemTerm node);
-  visitIE8Term(IE8Term node);
-  visitOperatorSlash(OperatorSlash node);
-  visitOperatorComma(OperatorComma node);
-  visitOperatorPlus(OperatorPlus node);
-  visitOperatorMinus(OperatorMinus node);
-  visitVarUsage(VarUsage node);
-
-  visitExpressions(Expressions node);
-  visitBinaryExpression(BinaryExpression node);
-  visitUnaryExpression(UnaryExpression node);
-
-  visitIdentifier(Identifier node);
-  visitWildcard(Wildcard node);
-  visitThisOperator(ThisOperator node);
-  visitNegation(Negation node);
-
-  visitDartStyleExpression(DartStyleExpression node);
-  visitFontExpression(FontExpression node);
-  visitBoxExpression(BoxExpression node);
-  visitMarginExpression(MarginExpression node);
-  visitBorderExpression(BorderExpression node);
-  visitHeightExpression(HeightExpression node);
-  visitPaddingExpression(PaddingExpression node);
-  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);
-    }
-  }
-
-  visitTree(StyleSheet tree) => visitStyleSheet(tree);
-
-  visitStyleSheet(StyleSheet ss) {
-    _visitNodeList(ss.topLevels);
-  }
-
-  visitNoOp(NoOp node) {}
-
-  visitTopLevelProduction(TopLevelProduction node) {}
-
-  visitDirective(Directive node) {}
-
-  visitCalcTerm(CalcTerm node) {
-    visitLiteralTerm(node);
-    visitLiteralTerm(node.expr);
-  }
-
-  visitCssComment(CssComment node) {}
-
-  visitCommentDefinition(CommentDefinition node) {}
-
-  visitMediaExpression(MediaExpression node) {
-    visitExpressions(node.exprs);
-  }
-
-  visitMediaQuery(MediaQuery node) {
-    for (var mediaExpr in node.expressions) {
-      visitMediaExpression(mediaExpr);
-    }
-  }
-
-  visitDocumentDirective(DocumentDirective node) {
-    _visitNodeList(node.functions);
-    _visitNodeList(node.groupRuleBody);
-  }
-
-  visitSupportsDirective(SupportsDirective node) {
-    node.condition.visit(this);
-    _visitNodeList(node.groupRuleBody);
-  }
-
-  visitSupportsConditionInParens(SupportsConditionInParens node) {
-    node.condition.visit(this);
-  }
-
-  visitSupportsNegation(SupportsNegation node) {
-    node.condition.visit(this);
-  }
-
-  visitSupportsConjunction(SupportsConjunction node) {
-    _visitNodeList(node.conditions);
-  }
-
-  visitSupportsDisjunction(SupportsDisjunction node) {
-    _visitNodeList(node.conditions);
-  }
-
-  visitViewportDirective(ViewportDirective node) {
-    node.declarations.visit(this);
-  }
-
-  visitMediaDirective(MediaDirective node) {
-    _visitNodeList(node.mediaQueries);
-    _visitNodeList(node.rules);
-  }
-
-  visitHostDirective(HostDirective node) {
-    _visitNodeList(node.rules);
-  }
-
-  visitPageDirective(PageDirective node) {
-    for (var declGroup in node._declsMargin) {
-      if (declGroup is MarginGroup) {
-        visitMarginGroup(declGroup);
-      } else {
-        visitDeclarationGroup(declGroup);
-      }
-    }
-  }
-
-  visitCharsetDirective(CharsetDirective node) {}
-
-  visitImportDirective(ImportDirective node) {
-    for (var mediaQuery in node.mediaQueries) {
-      visitMediaQuery(mediaQuery);
-    }
-  }
-
-  visitKeyFrameDirective(KeyFrameDirective node) {
-    visitIdentifier(node.name);
-    _visitNodeList(node._blocks);
-  }
-
-  visitKeyFrameBlock(KeyFrameBlock node) {
-    visitExpressions(node._blockSelectors);
-    visitDeclarationGroup(node._declarations);
-  }
-
-  visitFontFaceDirective(FontFaceDirective node) {
-    visitDeclarationGroup(node._declarations);
-  }
-
-  visitStyletDirective(StyletDirective node) {
-    _visitNodeList(node.rules);
-  }
-
-  visitNamespaceDirective(NamespaceDirective node) {}
-
-  visitVarDefinitionDirective(VarDefinitionDirective node) {
-    visitVarDefinition(node.def);
-  }
-
-  visitMixinRulesetDirective(MixinRulesetDirective node) {
-    _visitNodeList(node.rulesets);
-  }
-
-  visitMixinDefinition(MixinDefinition node) {}
-
-  visitMixinDeclarationDirective(MixinDeclarationDirective node) {
-    visitDeclarationGroup(node.declarations);
-  }
-
-  visitIncludeDirective(IncludeDirective node) {
-    for (var index = 0; index < node.args.length; index++) {
-      var param = node.args[index];
-      _visitNodeList(param);
-    }
-  }
-
-  visitContentDirective(ContentDirective node) {
-    // TODO(terry): TBD
-  }
-
-  visitRuleSet(RuleSet node) {
-    visitSelectorGroup(node._selectorGroup);
-    visitDeclarationGroup(node._declarationGroup);
-  }
-
-  visitDeclarationGroup(DeclarationGroup node) {
-    _visitNodeList(node.declarations);
-  }
-
-  visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
-
-  visitDeclaration(Declaration node) {
-    visitIdentifier(node._property);
-    if (node._expression != null) node._expression.visit(this);
-  }
-
-  visitVarDefinition(VarDefinition node) {
-    visitIdentifier(node._property);
-    if (node._expression != null) node._expression.visit(this);
-  }
-
-  visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
-    visitIncludeDirective(node.include);
-  }
-
-  visitExtendDeclaration(ExtendDeclaration node) {
-    _visitNodeList(node.selectors);
-  }
-
-  visitSelectorGroup(SelectorGroup node) {
-    _visitNodeList(node.selectors);
-  }
-
-  visitSelector(Selector node) {
-    _visitNodeList(node.simpleSelectorSequences);
-  }
-
-  visitSimpleSelectorSequence(SimpleSelectorSequence node) {
-    node.simpleSelector.visit(this);
-  }
-
-  visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
-
-  visitNamespaceSelector(NamespaceSelector node) {
-    if (node._namespace != null) node._namespace.visit(this);
-    if (node.nameAsSimpleSelector != null) {
-      node.nameAsSimpleSelector.visit(this);
-    }
-  }
-
-  visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
-
-  visitAttributeSelector(AttributeSelector node) {
-    visitSimpleSelector(node);
-  }
-
-  visitIdSelector(IdSelector node) => visitSimpleSelector(node);
-
-  visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
-
-  visitPseudoClassSelector(PseudoClassSelector node) =>
-      visitSimpleSelector(node);
-
-  visitPseudoElementSelector(PseudoElementSelector node) =>
-      visitSimpleSelector(node);
-
-  visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
-      visitSimpleSelector(node);
-
-  visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
-      visitSimpleSelector(node);
-
-  visitNegationSelector(NegationSelector node) => visitSimpleSelector(node);
-
-  visitSelectorExpression(SelectorExpression node) {
-    _visitNodeList(node.expressions);
-  }
-
-  visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
-
-  visitLiteralTerm(LiteralTerm node) {}
-
-  visitHexColorTerm(HexColorTerm node) {}
-
-  visitNumberTerm(NumberTerm node) {}
-
-  visitUnitTerm(UnitTerm node) {}
-
-  visitLengthTerm(LengthTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitPercentageTerm(PercentageTerm node) {
-    visitLiteralTerm(node);
-  }
-
-  visitEmTerm(EmTerm node) {
-    visitLiteralTerm(node);
-  }
-
-  visitExTerm(ExTerm node) {
-    visitLiteralTerm(node);
-  }
-
-  visitAngleTerm(AngleTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitTimeTerm(TimeTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitFreqTerm(FreqTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitFractionTerm(FractionTerm node) {
-    visitLiteralTerm(node);
-  }
-
-  visitUriTerm(UriTerm node) {
-    visitLiteralTerm(node);
-  }
-
-  visitResolutionTerm(ResolutionTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitChTerm(ChTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitRemTerm(RemTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitViewportTerm(ViewportTerm node) {
-    visitUnitTerm(node);
-  }
-
-  visitFunctionTerm(FunctionTerm node) {
-    visitLiteralTerm(node);
-    visitExpressions(node._params);
-  }
-
-  visitGroupTerm(GroupTerm node) {
-    for (var term in node._terms) {
-      term.visit(this);
-    }
-  }
-
-  visitItemTerm(ItemTerm node) {
-    visitNumberTerm(node);
-  }
-
-  visitIE8Term(IE8Term node) {}
-
-  visitOperatorSlash(OperatorSlash node) {}
-
-  visitOperatorComma(OperatorComma node) {}
-
-  visitOperatorPlus(OperatorPlus node) {}
-
-  visitOperatorMinus(OperatorMinus node) {}
-
-  visitVarUsage(VarUsage node) {
-    _visitNodeList(node.defaultValues);
-  }
-
-  visitExpressions(Expressions node) {
-    _visitNodeList(node.expressions);
-  }
-
-  visitBinaryExpression(BinaryExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitUnaryExpression(UnaryExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitIdentifier(Identifier node) {}
-
-  visitWildcard(Wildcard node) {}
-
-  visitThisOperator(ThisOperator node) {}
-
-  visitNegation(Negation node) {}
-
-  visitDartStyleExpression(DartStyleExpression node) {}
-
-  visitFontExpression(FontExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitBoxExpression(BoxExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitMarginExpression(MarginExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitBorderExpression(BorderExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitHeightExpression(HeightExpression node) {
-    // TODO(terry): TB
-    throw new UnimplementedError();
-  }
-
-  visitPaddingExpression(PaddingExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-
-  visitWidthExpression(WidthExpression node) {
-    // TODO(terry): TBD
-    throw new UnimplementedError();
-  }
-}
diff --git a/packages/csslib/pubspec.yaml b/packages/csslib/pubspec.yaml
deleted file mode 100644
index 3660833..0000000
--- a/packages/csslib/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: csslib
-version: 0.14.1
-author: Dart Team <misc@dartlang.org>
-description: A library for parsing CSS.
-homepage: https://github.com/dart-lang/csslib
-environment:
-  sdk: '>=1.21.0 <2.0.0'
-dependencies:
-  args: '>=0.12.1 <2.0.0'
-  logging: '>=0.9.0 <0.12.0'
-  path: '>=0.9.0 <2.0.0'
-  source_span: '>=1.4.0 <2.0.0'
-dev_dependencies:
-  browser: '>=0.9.0 <0.11.0'
-  test: '>=0.12.0 <0.13.0'
diff --git a/packages/csslib/test/big_1_test.dart b/packages/csslib/test/big_1_test.dart
deleted file mode 100644
index 9a6a584..0000000
--- a/packages/csslib/test/big_1_test.dart
+++ /dev/null
@@ -1,1167 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-import 'testing.dart';
-
-compilePolyfillAndValidate(String input, String generated) {
-  var errors = <Message>[];
-  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/packages/csslib/test/compiler_test.dart b/packages/csslib/test/compiler_test.dart
deleted file mode 100644
index 5faabe2..0000000
--- a/packages/csslib/test/compiler_test.dart
+++ /dev/null
@@ -1,747 +0,0 @@
-// 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/src/messages.dart';
-import 'package:csslib/visitor.dart';
-import 'testing.dart';
-
-void testClass() {
-  var errors = <Message>[];
-  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] as RuleSet;
-  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 = <Message>[];
-  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] as RuleSet;
-  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 = <Message>[];
-  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] as RuleSet;
-  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 = <Message>[];
-  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] as RuleSet;
-  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 = <Message>[];
-  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] as RuleSet;
-  expect(ruleset.selectorGroup.selectors.length, 1);
-  expect(ruleset.declarationGroup.declarations.length, 0);
-
-  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
-
-  expect(simpleSeqs.length, 1);
-  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
-  var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector;
-  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 = <Message>[];
-  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] as RuleSet;
-  expect(ruleset.selectorGroup.selectors.length, 1);
-  expect(ruleset.declarationGroup.declarations.length, 0);
-
-  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
-
-  expect(simpleSeqs.length, 4);
-
-  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
-  var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector;
-  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");
-
-  expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true);
-  var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector;
-  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 = <Message>[];
-  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] as RuleSet;
-  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];
-  expect(selector40.simpleSelector is NamespaceSelector, true);
-  var simpleSelector40 = selector40.simpleSelector as NamespaceSelector;
-  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 = <Message>[];
-  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] as RuleSet;
-  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];
-  expect(selector3.simpleSelector is NamespaceSelector, true);
-  var simpleSelector3 = selector3.simpleSelector as NamespaceSelector;
-  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 = <Message>[];
-  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] as RuleSet;
-  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);
-
-  {
-    var selector0 = simpleSeqs[0];
-    expect(selector0.simpleSelector is NamespaceSelector, true);
-    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
-    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);
-
-  {
-    var selector0 = simpleSeqs[0];
-    expect(selector0.simpleSelector is NamespaceSelector, true);
-    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
-    expect(selector0.isCombinatorNone, true);
-    expect(simpleSelector0.isNamespaceWildcard, true);
-    expect("*", simpleSelector0.namespace);
-    var 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 = <Message>[];
-  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 = <Message>[];
-
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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/packages/csslib/test/debug_test.dart b/packages/csslib/test/debug_test.dart
deleted file mode 100644
index 94898eb..0000000
--- a/packages/csslib/test/debug_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-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/packages/csslib/test/declaration_test.dart b/packages/csslib/test/declaration_test.dart
deleted file mode 100644
index ab1f70d..0000000
--- a/packages/csslib/test/declaration_test.dart
+++ /dev/null
@@ -1,1396 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:csslib/visitor.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-void expectCss(String css, String expected) {
-  var errors = <Message>[];
-  var styleSheet = parseCss(css, errors: errors, opts: simpleOptions);
-  expect(styleSheet, isNotNull);
-  expect(errors, isEmpty);
-  expect(prettyPrint(styleSheet), expected);
-}
-
-void testSimpleTerms() {
-  var errors = <Message>[];
-  final String input = r'''
-@ import url("test.css");
-.foo {
-  background-color: #191919;
-  content: "u+0041";
-  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;
-  content: "u+0041";
-  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);
-
-  // Regression test to ensure invalid percentages don't throw an exception and
-  // instead print a useful error message when not in checked mode.
-  var css = '''
-.foo {
-  width: Infinity%;
-}''';
-  stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions);
-  expect(errors, isNotEmpty);
-  expect(errors.first.message, 'expected }, but found %');
-  expect(errors.first.span.text, '%');
-}
-
-/**
- * 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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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; } }
-@page { @top-left { margin: 8px; } width: 10px; }
-@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;
-}
-}
-@page {
-@top-left {
-  margin: 8px;
-}
-  width: 10px;
-}
-@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 = <Message>[];
-  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 AND (another: 100px) {
-      html {
-        font-size: 10em;
-      }
-    }''';
-  generated = '@media ONLY screen AND (min-device-width:4000px) '
-      'AND (min-device-height:2000px), screen AND (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 AND (min-device-width: 4000px) and
-    (min-device-height: 2000px), screen AND (another: 100px) {
-      html {
-        font-size: 10em;
-      }
-    }''';
-  generated = '@media screen, print AND (min-device-width:4000px) AND '
-      '(min-device-height:2000px), screen AND (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 AND (min-device-width: 4000px);''';
-  generated = '@import "test.css" ONLY screen, '
-      'NOT print AND (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);
-
-  var css = '@media (min-device-width:400px) {\n}';
-  expectCss(css, css);
-
-  css = '@media all AND (tranform-3d), (-webkit-transform-3d) {\n}';
-  expectCss(css, css);
-
-  // Test that AND operator is required between media type and expressions.
-  css = '@media screen (min-device-width:400px';
-  stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions);
-  expect(errors, isNotEmpty);
-  expect(
-      errors.first.message, contains('expected { after media before ruleset'));
-  expect(errors.first.span.text, '(');
-
-  // Test nested at-rules.
-  input = '''
-@media (min-width: 840px) {
-  .cell {
-    width: calc(33% - 16px);
-  }
-  @supports (display: grid) {
-    .cell {
-      grid-column-end: span 4;
-    }
-  }
-}''';
-  generated = '''@media (min-width:840px) {
-.cell {
-  width: calc(33% - 16px);
-}
-@supports (display: grid) {
-.cell {
-  grid-column-end: span 4;
-}
-}
-}''';
-  expectCss(input, generated);
-}
-
-void testMozDocument() {
-  var errors = <Message>[];
-  // Test empty url-prefix, commonly used for browser detection.
-  var css = '''
-@-moz-document url-prefix() {
-  div {
-    color: #000;
-  }
-}''';
-  var expected = '''@-moz-document url-prefix() {
-div {
-  color: #000;
-}
-}''';
-  var styleSheet = parseCss(css, errors: errors);
-  expect(styleSheet, isNotNull);
-  expect(errors, isEmpty);
-  expect(prettyPrint(styleSheet), expected);
-
-  // Test url-prefix with unquoted parameter
-  css = '''
-@-moz-document url-prefix(http://www.w3.org/Style/) {
-  div {
-    color: #000;
-  }
-}''';
-  expected = '''@-moz-document url-prefix("http://www.w3.org/Style/") {
-div {
-  color: #000;
-}
-}''';
-  styleSheet = parseCss(css, errors: errors);
-  expect(styleSheet, isNotNull);
-  expect(errors, isEmpty);
-  expect(prettyPrint(styleSheet), expected);
-
-  // Test domain with unquoted parameter
-  css = '''
-@-moz-document domain(google.com) {
-  div {
-    color: #000;
-  }
-}''';
-  expected = '''@-moz-document domain("google.com") {
-div {
-  color: #000;
-}
-}''';
-  styleSheet = parseCss(css, errors: errors);
-  expect(styleSheet, isNotNull);
-  expect(errors, isEmpty);
-  expect(prettyPrint(styleSheet), expected);
-
-  // Test all document functions combined.
-  css = '@-moz-document ' +
-      'url(http://www.w3.org/), ' +
-      "url-prefix('http://www.w3.org/Style/'), " +
-      'domain("google.com"), ' +
-      'regexp("https:.*") { div { color: #000; } }';
-  expected = '@-moz-document ' +
-      'url("http://www.w3.org/"), ' +
-      'url-prefix("http://www.w3.org/Style/"), ' +
-      'domain("google.com"), ' +
-      'regexp("https:.*") {\ndiv {\n  color: #000;\n}\n}';
-  styleSheet = parseCss(css, errors: errors);
-  expect(styleSheet, isNotNull);
-  expect(errors, isEmpty);
-  expect(prettyPrint(styleSheet), expected);
-}
-
-void testSupports() {
-  // Test single declaration condition.
-  var css = '''
-@supports (-webkit-appearance: none) {
-  div {
-    -webkit-appearance: none;
-  }
-}''';
-  var expected = '''@supports (-webkit-appearance: none) {
-div {
-  -webkit-appearance: none;
-}
-}''';
-  expectCss(css, expected);
-
-  // Test negation.
-  css = '''
-@supports not ( display: flex ) {
-  body { width: 100%; }
-}''';
-  expected = '''@supports not (display: flex) {
-body {
-  width: 100%;
-}
-}''';
-  expectCss(css, expected);
-
-  // Test clause with multiple conditions.
-  css = '''
-@supports (box-shadow: 0 0 2px black inset) or
-    (-moz-box-shadow: 0 0 2px black inset) or
-    (-webkit-box-shadow: 0 0 2px black inset) or
-    (-o-box-shadow: 0 0 2px black inset) {
-  .box {
-    box-shadow: 0 0 2px black inset;
-  }
-}''';
-  expected = '@supports (box-shadow: 0 0 2px #000 inset) or ' +
-      '(-moz-box-shadow: 0 0 2px #000 inset) or ' +
-      '(-webkit-box-shadow: 0 0 2px #000 inset) or ' +
-      '(-o-box-shadow: 0 0 2px #000 inset) {\n' +
-      '.box {\n' +
-      '  box-shadow: 0 0 2px #000 inset;\n' +
-      '}\n' +
-      '}';
-  expectCss(css, expected);
-
-  // Test conjunction and disjunction together.
-  css = '''
-@supports ((transition-property: color) or (animation-name: foo)) and
-    (transform: rotate(10deg)) {
-  div {
-    transition-property: color;
-    transform: rotate(10deg);
-  }
-}''';
-
-  expected = '@supports ' +
-      '((transition-property: color) or (animation-name: foo)) and ' +
-      '(transform: rotate(10deg)) {\n' +
-      'div {\n' +
-      '  transition-property: color;\n' +
-      '  transform: rotate(10deg);\n' +
-      '}\n' +
-      '}';
-  expectCss(css, expected);
-
-  // Test that operators can't be mixed without parentheses.
-  css = '@supports (a: 1) and (b: 2) or (c: 3) {}';
-  var errors = <Message>[];
-  var styleSheet = parseCss(css, errors: errors, opts: simpleOptions);
-  expect(styleSheet, isNotNull);
-  expect(errors, isNotEmpty);
-  expect(errors.first.message,
-      "Operators can't be mixed without a layer of parentheses");
-  expect(errors.first.span.text, 'or');
-}
-
-void testViewport() {
-  // No declarations.
-  var css = '@viewport {\n}';
-  expectCss(css, css);
-
-  // All declarations.
-  css = '''
-@viewport {
-  min-width: auto;
-  max-width: 800px;
-  width: 400px;
-  min-height: 50%;
-  max-height: 200px;
-  height: 100px 200px;
-  zoom: auto;
-  min-zoom: 0.75;
-  max-zoom: 40%;
-  user-zoom: fixed;
-  orientation: landscape;
-}''';
-  expectCss(css, css);
-
-  // Vendor specific.
-  css = '''
-@-ms-viewport {
-  width: device-width;
-}''';
-  expectCss(css, css);
-}
-
-void testFontFace() {
-  var errors = <Message>[];
-
-  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 = <Message>[];
-  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);
-}
-
-.test-background-with-multiple-properties {
-  background: #000 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'
-      '}\n'
-      '.test-background-with-multiple-properties {\n'
-      '  background: #000 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 = <Message>[];
-
-  // 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 = <Message>[];
-
-  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 = <Message>[];
-  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);
-
-  final input4 = '''
-div {
-  filter: FlipH;
-}''';
-
-  stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions);
-
-  expect(stylesheet != null, true);
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(prettyPrint(stylesheet), input4);
-}
-
-/**
- *  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 = <Message>[];
-
-  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 = <Message>[];
-
-  // 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(), '');
-}
-
-void testExpressionSpans() {
-  final input = r'''.foo { width: 50px; }''';
-  var stylesheet = parseCss(input);
-  var decl = (stylesheet.topLevels.single as RuleSet)
-      .declarationGroup
-      .declarations
-      .single;
-  // This passes
-  expect(decl.span.text, 'width: 50px');
-  // This currently fails
-  expect((decl as Declaration).expression.span.text, '50px');
-}
-
-void testComments() {
-  final css = '''/* This comment has a nested HTML comment...
-* <html>
-*   <!-- Nested HTML comment... -->
-*   <div></div>
-* </html>
-*/''';
-  expectCss(css, '');
-}
-
-void simpleCalc() {
-  final input = r'''.foo { height: calc(100% - 55px); }''';
-  var stylesheet = parseCss(input);
-  var decl = (stylesheet.topLevels.single as RuleSet)
-      .declarationGroup
-      .declarations
-      .single;
-  expect(decl.span.text, 'height: calc(100% - 55px)');
-}
-
-void complexCalc() {
-  final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }''';
-  var stylesheet = parseCss(input);
-  var decl = (stylesheet.topLevels.single as RuleSet)
-      .declarationGroup
-      .declarations
-      .single;
-  expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)');
-}
-
-void twoCalcs() {
-  final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }''';
-  var stylesheet = parseCss(input);
-  var decl = (stylesheet.topLevels.single as RuleSet)
-      .declarationGroup
-      .declarations
-      .single;
-  expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)');
-}
-
-void selectorWithCalcs() {
-  var errors = <Message>[];
-  final String input = r'''
-.foo {
-  width: calc(1em + 5 * 2em);
-  height: calc(1px + 2%) !important;
-  border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) red;
-  border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px);
-  margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px);
-}''';
-  final String generated = r'''
-.foo {
-  width: calc(1em + 5 * 2em);
-  height: calc(1px + 2%) !important;
-  border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) #f00;
-  border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px);
-  margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px);
-}''';
-
-  var stylesheet = parseCss(input, errors: errors);
-  expect(stylesheet != null, true);
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(prettyPrint(stylesheet), generated);
-}
-
-void vendorPrefixedCalc() {
-  var css = '''
-.foo {
-  width: -webkit-calc((100% - 15px*1) / 1);
-}''';
-  expectCss(css, css);
-
-  css = '''
-.foo {
-  width: -moz-calc((100% - 15px*1) / 1);
-}''';
-  expectCss(css, css);
-}
-
-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('Document', testMozDocument);
-  test('Supports', testSupports);
-  test('Viewport', testViewport);
-  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);
-  test('Expression spans', testExpressionSpans,
-      skip: 'expression spans are broken'
-          ' (https://github.com/dart-lang/csslib/issues/15)');
-  test('Comments', testComments);
-  group('calc function', () {
-    test('simple calc', simpleCalc);
-    test('single complex', complexCalc);
-    test('two calc terms for same declaration', twoCalcs);
-    test('selector with many calc declarations', selectorWithCalcs);
-    test('vendor prefixed calc', vendorPrefixedCalc);
-  });
-}
diff --git a/packages/csslib/test/error_test.dart b/packages/csslib/test/error_test.dart
deleted file mode 100644
index 013865e..0000000
--- a/packages/csslib/test/error_test.dart
+++ /dev/null
@@ -1,356 +0,0 @@
-// 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 = <Message>[];
-
-  // 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 = <Message>[];
-
-  // 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 = <Message>[];
-
-  // 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 = <Message>[];
-
-  // 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 = <Message>[];
-  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 = <Message>[];
-
-  // 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/packages/csslib/test/examples/base.css b/packages/csslib/test/examples/base.css
deleted file mode 100644
index d2f2793..0000000
--- a/packages/csslib/test/examples/base.css
+++ /dev/null
@@ -1,2057 +0,0 @@
-/* ==========================================================================
-
-// Base Stylesheet - http://getbase.org
-// Author: Matthew Hartman - http://www.matthewhartman.com.au/
-// Version: 3.3.0 - Last Updated: May 14, 2017
-
-========================================================================== */
-*, *:before, *:after {
-  box-sizing: border-box; }
-
-html {
-  font-family: sans-serif;
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%; }
-
-html, button, input, select, textarea {
-  font-family: inherit; }
-
-article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary {
-  display: block; }
-
-body, form, fieldset, legend, input, select, textarea, button {
-  margin: 0; }
-
-audio:not([controls]) {
-  display: none;
-  height: 0; }
-
-audio, canvas, progress, video {
-  display: inline-block; }
-
-progress {
-  vertical-align: baseline; }
-
-[hidden], template {
-  display: none; }
-
-img {
-  border-style: none; }
-
-svg:not(:root) {
-  overflow: hidden; }
-
-body {
-  font-family: sans-serif;
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 22px;
-  line-height: 1.375rem;
-  color: #000;
-  font-weight: 400;
-  background: #fff; }
-
-p {
-  margin: 0 0 20px 0; }
-
-a {
-  color: #000;
-  text-decoration: underline;
-  background-color: transparent;
-  -webkit-text-decoration-skip: objects; }
-  a:active, a:hover {
-    color: #000;
-    outline-width: 0;
-    text-decoration: none; }
-
-h1, h2, h3, h4, h5, h6 {
-  font-family: sans-serif;
-  margin: 0; }
-
-h1, .fs-1 {
-  font-size: 32px;
-  font-size: 2rem;
-  line-height: 38px;
-  line-height: 2.375rem; }
-
-h2, .fs-2 {
-  font-size: 26px;
-  font-size: 1.625rem;
-  line-height: 32px;
-  line-height: 2rem; }
-
-h3, .fs-3 {
-  font-size: 22px;
-  font-size: 1.375rem;
-  line-height: 28px;
-  line-height: 1.75rem; }
-
-h4, .fs-4 {
-  font-size: 18px;
-  font-size: 1.125rem;
-  line-height: 24px;
-  line-height: 1.5rem; }
-
-h5, .fs-5 {
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 22px;
-  line-height: 1.375rem; }
-
-h6, .fs-6 {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 20px;
-  line-height: 1.25rem; }
-
-h1 {
-  margin-bottom: .5em;
-  color: #000;
-  font-weight: 700; }
-
-h2 {
-  margin-bottom: .2em;
-  color: #000;
-  font-weight: 700; }
-
-h3 {
-  margin-bottom: .2em;
-  color: #000;
-  font-weight: 700; }
-
-h4 {
-  margin-bottom: .2em;
-  color: #000;
-  font-weight: 700; }
-
-h5 {
-  margin-bottom: .1em;
-  color: #000;
-  font-weight: 700; }
-
-h6 {
-  margin-bottom: .1em;
-  color: #000;
-  font-weight: 700; }
-
-b, strong, .strong {
-  font-weight: 700; }
-
-em, .em {
-  font-style: italic; }
-
-abbr[title], .abbr[title] {
-  border-bottom: none;
-  text-decoration: underline;
-  text-decoration: underline dotted; }
-
-dfn {
-  font-style: italic; }
-
-small, .small {
-  font-size: 13px;
-  font-size: 0.8125rem;
-  line-height: 16px;
-  line-height: 1rem; }
-
-mark, .mark {
-  background-color: #ff0;
-  color: #000; }
-
-sub, .sub, sup, .sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline; }
-
-sub, .sub {
-  bottom: -0.25em; }
-
-sup, .sup {
-  top: -0.5em; }
-
-del, .del {
-  text-decoration: line-through; }
-
-figure {
-  margin: 1em 40px; }
-
-hr, .hr {
-  box-sizing: content-box;
-  height: 1px;
-  background: #eee;
-  border: 0;
-  margin-top: 20px;
-  margin-bottom: 20px; }
-
-ul, ol {
-  margin: 20px 0;
-  padding: 0 0 0 40px; }
-
-dl:before, dl:after {
-  content: " ";
-  display: table; }
-
-dl:after {
-  clear: both; }
-
-dl dt {
-  float: left;
-  width: 25%;
-  display: block;
-  font-weight: 400; }
-
-dl dd {
-  overflow: hidden;
-  display: block; }
-
-blockquote,
-.blockquote {
-  font-family: sans-serif;
-  font-weight: 400;
-  font-style: italic;
-  margin: 20px 0; }
-  blockquote p,
-  .blockquote p {
-    font-size: 22px;
-    font-size: 1.375rem;
-    line-height: 28px;
-    line-height: 1.75rem;
-    margin-bottom: 20px; }
-  blockquote cite,
-  .blockquote cite {
-    font-size: 13px;
-    font-size: 0.8125rem;
-    line-height: 19px;
-    line-height: 1.1875rem;
-    font-weight: 700;
-    font-style: normal; }
-
-caption {
-  font-size: inherit;
-  line-height: normal;
-  font-weight: 700;
-  text-align: left;
-  padding: 10px;
-  border-bottom: 1px solid #d7d7d7; }
-
-table {
-  font-size: 14px;
-  font-size: 0.875rem;
-  border-collapse: collapse;
-  border-spacing: 0;
-  width: 100%;
-  margin: 0;
-  text-align: left; }
-  table thead td,
-  table thead th,
-  table tbody td,
-  table tbody th,
-  table tfoot td,
-  table tfoot th {
-    color: #585858;
-    padding: 10px;
-    border-bottom: 1px solid #e9e9e9; }
-
-code, kbd, pre, samp {
-  font-size: 13px;
-  font-size: 0.8125rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  word-wrap: break-word;
-  font-family: monospace, monospace;
-  color: #000;
-  background-color: transparent;
-  font-weight: normal;
-  padding: 0;
-  white-space: pre-wrap; }
-
-pre {
-  padding: 10px;
-  overflow: auto;
-  border: 1px solid #d7d7d7; }
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em; }
-
-legend {
-  box-sizing: border-box;
-  color: inherit;
-  display: table;
-  max-width: 100%;
-  padding: 0;
-  white-space: normal; }
-
-label,
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: #000;
-  font: inherit;
-  margin: 0; }
-
-[type="text"],
-[type="email"],
-[type="password"],
-[type="tel"],
-[type="number"],
-[type="date"] {
-  height: 36px;
-  padding: 10px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  -webkit-appearance: none;
-  -moz-appearance: textfield;
-  border-radius: 0; }
-  [type="text"]:focus,
-  [type="email"]:focus,
-  [type="password"]:focus,
-  [type="tel"]:focus,
-  [type="number"]:focus,
-  [type="date"]:focus {
-    background-color: #fff;
-    border-color: #f7c723;
-    outline: 0; }
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto; }
-
-[type="date"]::-webkit-inner-spin-button {
-  display: none;
-  -webkit-appearance: none; }
-
-[type="checkbox"],
-[type="radio"] {
-  box-sizing: border-box;
-  padding: 0; }
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto; }
-
-[type="search"] {
-  -webkit-appearance: textfield;
-  outline-offset: -2px; }
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none; }
-
-textarea {
-  padding: 10px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  overflow: auto;
-  border-radius: 0; }
-  textarea:focus {
-    background-color: #fff;
-    border-color: #f7c723;
-    outline: 0; }
-
-select {
-  text-transform: none;
-  height: 36px;
-  padding: 0 10px;
-  background-color: #fff;
-  border: 1px solid #ccc; }
-  select:focus {
-    background-color: #fff;
-    border-color: #f7c723;
-    outline: 0; }
-
-optgroup {
-  font-weight: 700; }
-
-button {
-  border-radius: 0;
-  overflow: visible;
-  text-transform: none;
-  cursor: pointer; }
-
-button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
-  -webkit-appearance: button;
-  border-radius: 0; }
-
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
-  border-style: none;
-  padding: 0; }
-
-button:-moz-focusring,
-[type="button"]:-moz-focusring,
-[type="reset"]:-moz-focusring,
-[type="submit"]:-moz-focusring {
-  outline: 1px dotted ButtonText; }
-
-button[disabled],
-html input[disabled] {
-  cursor: not-allowed; }
-
-input::-webkit-input-placeholder {
-  color: #999; }
-
-input:-moz-placeholder {
-  color: #999; }
-
-input::-moz-placeholder {
-  color: #999; }
-
-input:-ms-input-placeholder {
-  color: #999; }
-
-.button {
-  cursor: pointer;
-  border: 1px solid #d7d7d7;
-  background-color: #f3f3f3;
-  line-height: normal;
-  padding: 10px 20px;
-  text-decoration: none;
-  color: #363636;
-  display: inline-block;
-  transition: all 0.3s; }
-  .button:hover, .button:active {
-    text-decoration: none; }
-  .button:hover {
-    background: #f9f9f9; }
-
-.button-link {
-  color: #000;
-  text-decoration: underline;
-  border: 0;
-  background: transparent;
-  padding: 0; }
-  .button-link:hover {
-    text-decoration: none; }
-  .button-link:active {
-    outline: 0; }
-
-.clear:before, .clear:after {
-  content: " ";
-  display: table; }
-
-.clear:after {
-  clear: both; }
-
-.row:before, .row:after {
-  content: "";
-  display: table; }
-
-.row:after {
-  clear: both; }
-
-.row {
-  position: relative;
-  margin-left: -15px;
-  margin-right: -15px; }
-
-@media only screen and (min-width: 740px) {
-  .row-m {
-    position: relative;
-    margin-left: -15px;
-    margin-right: -15px; }
-    .row-m:before, .row-m:after {
-      content: "";
-      display: table; }
-    .row-m:after {
-      clear: both; }
-  .clear-m:before, .clear-m:after {
-    content: "";
-    display: table; }
-  .clear-m:after {
-    clear: both; } }
-
-@media only screen and (min-width: 980px) {
-  .row-l {
-    position: relative;
-    margin-left: -15px;
-    margin-right: -15px; }
-    .row-l:before, .row-l:after {
-      content: "";
-      display: table; }
-    .row-l:after {
-      clear: both; }
-  .clear-l:before, .clear-l:after {
-    content: "";
-    display: table; }
-  .clear-l:after {
-    clear: both; } }
-
-@media only screen and (min-width: 1140px) {
-  .row-xl {
-    position: relative;
-    margin-left: -15px;
-    margin-right: -15px; }
-    .row-xl:before, .row-xl:after {
-      content: "";
-      display: table; }
-    .row-xl:after {
-      clear: both; }
-  .clear-xl:before, .clear-xl:after {
-    content: "";
-    display: table; }
-  .clear-xl:after {
-    clear: both; } }
-
-.container, .container-full {
-  padding-left: 15px;
-  padding-right: 15px;
-  margin-left: auto;
-  margin-right: auto; }
-
-@media only screen and (min-width: 740px) {
-  .container {
-    width: 720px; }
-  .container-m, .container-full-m {
-    padding-left: 15px;
-    padding-right: 15px;
-    margin-left: auto;
-    margin-right: auto; }
-  .container-m {
-    width: 720px; }
-  .container-full-m {
-    width: auto; } }
-
-@media only screen and (min-width: 980px) {
-  .container {
-    width: 960px; }
-  .container-l, .container-full-l {
-    padding-left: 15px;
-    padding-right: 15px;
-    margin-left: auto;
-    margin-right: auto; }
-  .container-l {
-    width: 960px; }
-  .container-full-l {
-    width: auto; } }
-
-@media only screen and (min-width: 1140px) {
-  .container {
-    width: 1120px; }
-  .container-xl, .container-full-xl {
-    padding-left: 15px;
-    padding-right: 15px;
-    margin-left: auto;
-    margin-right: auto; }
-  .container-xl {
-    width: 1120px; }
-  .container-full-xl {
-    width: auto; } }
-
-.col-1,
-.col-2,
-.col-3,
-.col-4,
-.col-5,
-.col-6,
-.col-7,
-.col-8,
-.col-9,
-.col-10,
-.col-11,
-.col-12,
-.col-1-2,
-.col-1-3,
-.col-2-3,
-.col-1-4,
-.col-3-4,
-.col-1-5,
-.col-2-5,
-.col-3-5,
-.col-4-5 {
-  padding-left: 15px;
-  padding-right: 15px;
-  position: relative;
-  float: left; }
-
-.col-1 {
-  width: 8.33333%; }
-
-.col-2 {
-  width: 16.66667%; }
-
-.col-3 {
-  width: 25%; }
-
-.col-4 {
-  width: 33.33333%; }
-
-.col-5 {
-  width: 41.66667%; }
-
-.col-6 {
-  width: 50%; }
-
-.col-7 {
-  width: 58.33333%; }
-
-.col-8 {
-  width: 66.66667%; }
-
-.col-9 {
-  width: 75%; }
-
-.col-10 {
-  width: 83.33333%; }
-
-.col-11 {
-  width: 91.66667%; }
-
-.col-12 {
-  width: 100%; }
-
-.col-1-2 {
-  width: 50%; }
-
-.col-1-3 {
-  width: 33.33333%; }
-
-.col-2-3 {
-  width: 66.66667%; }
-
-.col-1-4 {
-  width: 25%; }
-
-.col-3-4 {
-  width: 75%; }
-
-.col-1-5 {
-  width: 20%; }
-
-.col-2-5 {
-  width: 40%; }
-
-.col-3-5 {
-  width: 60%; }
-
-.col-4-5 {
-  width: 80%; }
-
-.col-full {
-  width: 100%; }
-
-@media only screen and (min-width: 740px) {
-  .col-1-m,
-  .col-2-m,
-  .col-3-m,
-  .col-4-m,
-  .col-5-m,
-  .col-6-m,
-  .col-7-m,
-  .col-8-m,
-  .col-9-m,
-  .col-10-m,
-  .col-11-m,
-  .col-12-m,
-  .col-1-2-m,
-  .col-1-3-m,
-  .col-2-3-m,
-  .col-1-4-m,
-  .col-3-4-m,
-  .col-1-5-m,
-  .col-2-5-m,
-  .col-3-5-m,
-  .col-4-5-m {
-    padding-left: 15px;
-    padding-right: 15px;
-    position: relative;
-    float: -91.66667%; }
-  .col-1-m {
-    width: 8.33333%; }
-  .col-2-m {
-    width: 16.66667%; }
-  .col-3-m {
-    width: 25%; }
-  .col-4-m {
-    width: 33.33333%; }
-  .col-5-m {
-    width: 41.66667%; }
-  .col-6-m {
-    width: 50%; }
-  .col-7-m {
-    width: 58.33333%; }
-  .col-8-m {
-    width: 66.66667%; }
-  .col-9-m {
-    width: 75%; }
-  .col-10-m {
-    width: 83.33333%; }
-  .col-11-m {
-    width: 91.66667%; }
-  .col-12-m {
-    width: 100%; }
-  .col-1-2-m {
-    width: 50%; }
-  .col-1-3-m {
-    width: 33.33333%; }
-  .col-2-3-m {
-    width: 66.66667%; }
-  .col-1-4-m {
-    width: 25%; }
-  .col-3-4-m {
-    width: 75%; }
-  .col-1-5-m {
-    width: 20%; }
-  .col-2-5-m {
-    width: 40%; }
-  .col-3-5-m {
-    width: 60%; }
-  .col-4-5-m {
-    width: 80%; }
-  .col-full-m {
-    width: 100%; } }
-
-@media only screen and (min-width: 980px) {
-  .col-1-l,
-  .col-2-l,
-  .col-3-l,
-  .col-4-l,
-  .col-5-l,
-  .col-6-l,
-  .col-7-l,
-  .col-8-l,
-  .col-9-l,
-  .col-10-l,
-  .col-11-l,
-  .col-12-l,
-  .col-1-2-l,
-  .col-1-3-l,
-  .col-2-3-l,
-  .col-1-4-l,
-  .col-3-4-l,
-  .col-1-5-l,
-  .col-2-5-l,
-  .col-3-5-l,
-  .col-4-5-l {
-    padding-left: 15px;
-    padding-right: 15px;
-    position: relative;
-    float: -91.66667%; }
-  .col-1-l {
-    width: 8.33333%; }
-  .col-2-l {
-    width: 16.66667%; }
-  .col-3-l {
-    width: 25%; }
-  .col-4-l {
-    width: 33.33333%; }
-  .col-5-l {
-    width: 41.66667%; }
-  .col-6-l {
-    width: 50%; }
-  .col-7-l {
-    width: 58.33333%; }
-  .col-8-l {
-    width: 66.66667%; }
-  .col-9-l {
-    width: 75%; }
-  .col-10-l {
-    width: 83.33333%; }
-  .col-11-l {
-    width: 91.66667%; }
-  .col-12-l {
-    width: 100%; }
-  .col-1-2-l {
-    width: 50%; }
-  .col-1-3-l {
-    width: 33.33333%; }
-  .col-2-3-l {
-    width: 66.66667%; }
-  .col-1-4-l {
-    width: 25%; }
-  .col-3-4-l {
-    width: 75%; }
-  .col-1-5-l {
-    width: 20%; }
-  .col-2-5-l {
-    width: 40%; }
-  .col-3-5-l {
-    width: 60%; }
-  .col-4-5-l {
-    width: 80%; }
-  .col-full-l {
-    width: 100%; } }
-
-@media only screen and (min-width: 1140px) {
-  .col-1-xl,
-  .col-2-xl,
-  .col-3-xl,
-  .col-4-xl,
-  .col-5-xl,
-  .col-6-xl,
-  .col-7-xl,
-  .col-8-xl,
-  .col-9-xl,
-  .col-10-xl,
-  .col-11-xl,
-  .col-12-xl,
-  .col-1-2-xl,
-  .col-1-3-xl,
-  .col-2-3-xl,
-  .col-1-4-xl,
-  .col-3-4-xl,
-  .col-1-5-xl,
-  .col-2-5-xl,
-  .col-3-5-xl,
-  .col-4-5-xl {
-    padding-left: 15px;
-    padding-right: 15px;
-    position: relative;
-    float: -91.66667%; }
-  .col-1-xl {
-    width: 8.33333%; }
-  .col-2-xl {
-    width: 16.66667%; }
-  .col-3-xl {
-    width: 25%; }
-  .col-4-xl {
-    width: 33.33333%; }
-  .col-5-xl {
-    width: 41.66667%; }
-  .col-6-xl {
-    width: 50%; }
-  .col-7-xl {
-    width: 58.33333%; }
-  .col-8-xl {
-    width: 66.66667%; }
-  .col-9-xl {
-    width: 75%; }
-  .col-10-xl {
-    width: 83.33333%; }
-  .col-11-xl {
-    width: 91.66667%; }
-  .col-12-xl {
-    width: 100%; }
-  .col-1-2-xl {
-    width: 50%; }
-  .col-1-3-xl {
-    width: 33.33333%; }
-  .col-2-3-xl {
-    width: 66.66667%; }
-  .col-1-4-xl {
-    width: 25%; }
-  .col-3-4-xl {
-    width: 75%; }
-  .col-1-5-xl {
-    width: 20%; }
-  .col-2-5-xl {
-    width: 40%; }
-  .col-3-5-xl {
-    width: 60%; }
-  .col-4-5-xl {
-    width: 80%; }
-  .col-full-xl {
-    width: 100%; } }
-
-@-webkit-keyframes fadeIn {
-  0% {
-    opacity: 0; }
-  100% {
-    opacity: 1; } }
-
-@keyframes fadeIn {
-  0% {
-    opacity: 0; }
-  100% {
-    opacity: 1; } }
-
-.fade-in {
-  -webkit-animation-name: fadeIn;
-          animation-name: fadeIn; }
-
-@-webkit-keyframes fadeInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, -30px, 0);
-            transform: translate3d(0, -30px, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInDown {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, -30px, 0);
-            transform: translate3d(0, -30px, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-down {
-  -webkit-animation-name: fadeInDown;
-          animation-name: fadeInDown; }
-
-@-webkit-keyframes fadeInDownBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, -100%, 0);
-            transform: translate3d(0, -100%, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInDownBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, -100%, 0);
-            transform: translate3d(0, -100%, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-down-big {
-  -webkit-animation-name: fadeInDownBig;
-          animation-name: fadeInDownBig; }
-
-@-webkit-keyframes fadeInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(-30px, 0, 0);
-            transform: translate3d(-30px, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInLeft {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(-30px, 0, 0);
-            transform: translate3d(-30px, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-left {
-  -webkit-animation-name: fadeInLeft;
-          animation-name: fadeInLeft; }
-
-@-webkit-keyframes fadeInLeftBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(-100%, 0, 0);
-            transform: translate3d(-100%, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInLeftBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(-100%, 0, 0);
-            transform: translate3d(-100%, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-left-big {
-  -webkit-animation-name: fadeInLeftBig;
-          animation-name: fadeInLeftBig; }
-
-@-webkit-keyframes fadeInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(30px, 0, 0);
-            transform: translate3d(30px, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInRight {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(30px, 0, 0);
-            transform: translate3d(30px, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-right {
-  -webkit-animation-name: fadeInRight;
-          animation-name: fadeInRight; }
-
-@-webkit-keyframes fadeInRightBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(100%, 0, 0);
-            transform: translate3d(100%, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInRightBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(100%, 0, 0);
-            transform: translate3d(100%, 0, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-right-big {
-  -webkit-animation-name: fadeInRightBig;
-          animation-name: fadeInRightBig; }
-
-@-webkit-keyframes fadeInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, 30px, 0);
-            transform: translate3d(0, 30px, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInUp {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, 30px, 0);
-            transform: translate3d(0, 30px, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-up {
-  -webkit-animation-name: fadeInUp;
-          animation-name: fadeInUp; }
-
-@-webkit-keyframes fadeInUpBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, 100%, 0);
-            transform: translate3d(0, 100%, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-@keyframes fadeInUpBig {
-  0% {
-    opacity: 0;
-    -webkit-transform: translate3d(0, 100%, 0);
-            transform: translate3d(0, 100%, 0); }
-  100% {
-    opacity: 1;
-    -webkit-transform: none;
-            transform: none; } }
-
-.fade-in-up-big {
-  -webkit-animation-name: fadeInUpBig;
-          animation-name: fadeInUpBig; }
-
-@media print {
-  *,
-  *:before,
-  *:after {
-    background: transparent;
-    color: #000;
-    box-shadow: none;
-    text-shadow: none; }
-  a, a:visited {
-    text-decoration: underline; }
-  a[href]:after {
-    content: " (" attr(href) ")"; }
-  a[href^="#"]:after, a[href^="javascript:"]:after {
-    content: ""; }
-  pre, blockquote {
-    page-break-inside: avoid; }
-  thead {
-    display: table-header-group; }
-  tr {
-    page-break-inside: avoid; }
-  img {
-    page-break-inside: avoid;
-    max-width: 100%; }
-  p, h2, h3 {
-    orphans: 3;
-    widows: 3; }
-  h2, h3 {
-    page-break-after: avoid; }
-  abbr[title]:after {
-    content: " (" attr(title) ")"; } }
-
-.no-margin {
-  margin: 0; }
-
-.no-padding {
-  padding: 0; }
-
-.no-float {
-  float: none; }
-
-.no-background {
-  background: transparent; }
-
-.no-border {
-  border: 0; }
-
-.no-select {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  cursor: default; }
-
-.font-100 {
-  font-weight: 100; }
-
-.font-200 {
-  font-weight: 200; }
-
-.font-300 {
-  font-weight: 300; }
-
-.font-400 {
-  font-weight: 400; }
-
-.font-500 {
-  font-weight: 500; }
-
-.font-600 {
-  font-weight: 600; }
-
-.font-700 {
-  font-weight: 700; }
-
-.font-800 {
-  font-weight: 800; }
-
-.font-900 {
-  font-weight: 900; }
-
-.font-normal {
-  font-style: normal; }
-
-.font-italic {
-  font-style: italic; }
-
-.uppercase {
-  text-transform: uppercase; }
-
-.lowercase {
-  text-transform: lowercase; }
-
-.capitalize {
-  text-transform: capitalize; }
-
-.text-left {
-  text-align: left; }
-
-.text-right {
-  text-align: right; }
-
-.text-center {
-  text-align: center; }
-
-.text-justify {
-  text-align: justify; }
-
-.relative {
-  position: relative; }
-
-.absolute {
-  position: absolute; }
-
-.static {
-  position: static; }
-
-.fixed {
-  position: fixed; }
-
-.none {
-  display: none; }
-
-.block {
-  display: block; }
-
-.inline-block {
-  display: inline-block; }
-
-.inline {
-  display: inline; }
-
-.flex {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex; }
-
-.flex-row {
-  -webkit-box-orient: horizontal;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: row;
-          flex-direction: row; }
-
-.flex-column {
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column; }
-
-.flex-space-around {
-  -ms-flex-pack: distribute;
-      justify-content: space-around; }
-
-.flex-space-between {
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between; }
-
-.flex-start {
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start; }
-
-.flex-center {
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center; }
-
-.flex-end {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end; }
-
-.flex-wrap {
-  -ms-flex-wrap: wrap;
-      flex-wrap: wrap; }
-
-.flex-nowrap {
-  -ms-flex-wrap: nowrap;
-      flex-wrap: nowrap; }
-
-.left {
-  float: left; }
-
-.right {
-  float: right; }
-
-.center {
-  float: none;
-  margin-left: auto;
-  margin-right: auto; }
-
-.pad-top-5 {
-  padding-top: 5px; }
-
-.pad-top-10 {
-  padding-top: 10px; }
-
-.pad-top-15 {
-  padding-top: 15px; }
-
-.pad-top-20 {
-  padding-top: 20px; }
-
-.pad-top-25 {
-  padding-top: 25px; }
-
-.pad-top-30 {
-  padding-top: 30px; }
-
-.pad-top-35 {
-  padding-top: 35px; }
-
-.pad-top-40 {
-  padding-top: 40px; }
-
-.pad-top-45 {
-  padding-top: 45px; }
-
-.pad-top-50 {
-  padding-top: 50px; }
-
-.pad-top-55 {
-  padding-top: 55px; }
-
-.pad-top-60 {
-  padding-top: 60px; }
-
-.pad-bottom-5 {
-  padding-bottom: 5px; }
-
-.pad-bottom-10 {
-  padding-bottom: 10px; }
-
-.pad-bottom-15 {
-  padding-bottom: 15px; }
-
-.pad-bottom-20 {
-  padding-bottom: 20px; }
-
-.pad-bottom-25 {
-  padding-bottom: 25px; }
-
-.pad-bottom-30 {
-  padding-bottom: 30px; }
-
-.pad-bottom-35 {
-  padding-bottom: 35px; }
-
-.pad-bottom-40 {
-  padding-bottom: 40px; }
-
-.pad-bottom-45 {
-  padding-bottom: 45px; }
-
-.pad-bottom-50 {
-  padding-bottom: 50px; }
-
-.pad-bottom-55 {
-  padding-bottom: 55px; }
-
-.pad-bottom-60 {
-  padding-bottom: 60px; }
-
-.pad-5 {
-  padding: 5px; }
-
-.pad-10 {
-  padding: 10px; }
-
-.pad-15 {
-  padding: 15px; }
-
-.pad-20 {
-  padding: 20px; }
-
-.pad-25 {
-  padding: 25px; }
-
-.pad-30 {
-  padding: 30px; }
-
-.pad-35 {
-  padding: 35px; }
-
-.pad-40 {
-  padding: 40px; }
-
-.pad-45 {
-  padding: 45px; }
-
-.pad-50 {
-  padding: 50px; }
-
-.pad-55 {
-  padding: 55px; }
-
-.pad-60 {
-  padding: 60px; }
-
-.sr {
-  border: 0;
-  clip: rect(0 0 0 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px; }
-
-.list-unstyled {
-  list-style: none;
-  margin: 0;
-  padding: 0; }
-  .list-unstyled li {
-    margin: 0;
-    padding: 0; }
-
-.list-inline {
-  list-style: none;
-  margin: 0;
-  padding: 0; }
-  .list-inline li {
-    margin: 0;
-    padding: 0;
-    display: inline-block; }
-
-.img-fluid {
-  max-width: 100%; }
-
-.field {
-  width: 100%; }
-
-.form-group {
-  overflow: hidden; }
-  .form-group label {
-    display: inline-block;
-    padding-top: 8px; }
-
-.disabled, [disabled] {
-  pointer-events: none;
-  cursor: not-allowed;
-  opacity: .5; }
-
-.checkbox,
-.radio {
-  display: inline-block;
-  position: relative; }
-  .checkbox label,
-  .radio label {
-    padding-left: 20px;
-    padding-top: 0;
-    display: inline-block; }
-  .checkbox input[type="checkbox"],
-  .checkbox input[type="radio"],
-  .radio input[type="checkbox"],
-  .radio input[type="radio"] {
-    position: absolute;
-    top: 4px;
-    left: 0; }
-
-.select {
-  position: relative;
-  display: block; }
-  .select:before {
-    content: "";
-    border: 6px solid transparent;
-    border-top-color: #676767;
-    top: 50%;
-    right: 10px;
-    margin-top: -3px;
-    pointer-events: none;
-    position: absolute; }
-  .select select {
-    -webkit-appearance: none;
-    -moz-appearance: none;
-    height: 36px;
-    width: 100%;
-    padding: 0 10px;
-    line-height: normal;
-    border: 1px solid #ccc;
-    background: #fff;
-    display: block; }
-  .select select::-ms-expand {
-    display: none; }
-  .select select:focus {
-    border-color: #f7c723; }
-  .select select:-moz-focusring {
-    color: transparent;
-    text-shadow: 0 0 0 #000;
-    border-color: #f7c723; }
-
-.animation {
-  -webkit-animation-duration: 1s;
-          animation-duration: 1s;
-  -webkit-animation-fill-mode: both;
-          animation-fill-mode: both; }
-
-.animation-infinite {
-  -webkit-animation-iteration-count: infinite;
-  animation-iteration-count: infinite; }
-
-@media only screen and (min-width: 740px) {
-  .no-float-m {
-    float: none; }
-  .no-padding-m {
-    padding: 0; }
-  .no-margin-m {
-    margin: 0; }
-  .relative-m {
-    position: relative; }
-  .absolute-m {
-    position: absolute; }
-  .static-m {
-    position: static; }
-  .fixed-m {
-    position: fixed; }
-  .none-m {
-    display: none; }
-  .block-m {
-    display: block; }
-  .inline-block-m {
-    display: inline-block; }
-  .inline-m {
-    display: inline; }
-  .flex-m {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex; }
-  .flex-row-m {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row; }
-  .flex-column-m {
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column; }
-  .flex-space-around-m {
-    -ms-flex-pack: distribute;
-        justify-content: space-around; }
-  .flex-space-between-m {
-    -webkit-box-pack: justify;
-        -ms-flex-pack: justify;
-            justify-content: space-between; }
-  .flex-start-m {
-    -webkit-box-pack: start;
-        -ms-flex-pack: start;
-            justify-content: flex-start; }
-  .flex-center-m {
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center; }
-  .flex-end-m {
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end; }
-  .flex-wrap-m {
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap; }
-  .flex-nowrap-m {
-    -ms-flex-wrap: nowrap;
-        flex-wrap: nowrap; }
-  .left-m {
-    float: left; }
-  .right-m {
-    float: right; }
-  .center-m {
-    float: none;
-    margin-left: auto;
-    margin-right: auto; }
-  .text-left-m {
-    text-align: left; }
-  .text-right-m {
-    text-align: right; }
-  .text-center-m {
-    text-align: center; }
-  .text-justify-m {
-    text-align: justify; }
-  .no-col-m {
-    width: auto;
-    float: none; }
-  .no-push-m, .no-pull-m {
-    left: 0; }
-  .pad-top-0-m {
-    padding-top: 0; }
-  .pad-top-5-m {
-    padding-top: 5px; }
-  .pad-top-10-m {
-    padding-top: 10px; }
-  .pad-top-15-m {
-    padding-top: 15px; }
-  .pad-top-20-m {
-    padding-top: 20px; }
-  .pad-top-25-m {
-    padding-top: 25px; }
-  .pad-top-30-m {
-    padding-top: 30px; }
-  .pad-top-35-m {
-    padding-top: 35px; }
-  .pad-top-40-m {
-    padding-top: 40px; }
-  .pad-top-45-m {
-    padding-top: 45px; }
-  .pad-top-50-m {
-    padding-top: 50px; }
-  .pad-top-55-m {
-    padding-top: 55px; }
-  .pad-top-60-m {
-    padding-top: 60px; }
-  .pad-bottom-0-m {
-    padding-bottom: 0; }
-  .pad-bottom-5-m {
-    padding-bottom: 5px; }
-  .pad-bottom-10-m {
-    padding-bottom: 10px; }
-  .pad-bottom-15-m {
-    padding-bottom: 15px; }
-  .pad-bottom-20-m {
-    padding-bottom: 20px; }
-  .pad-bottom-25-m {
-    padding-bottom: 25px; }
-  .pad-bottom-30-m {
-    padding-bottom: 30px; }
-  .pad-bottom-35-m {
-    padding-bottom: 35px; }
-  .pad-bottom-40-m {
-    padding-bottom: 40px; }
-  .pad-bottom-45-m {
-    padding-bottom: 45px; }
-  .pad-bottom-50-m {
-    padding-bottom: 50px; }
-  .pad-bottom-55-m {
-    padding-bottom: 55px; }
-  .pad-bottom-60-m {
-    padding-bottom: 60px; }
-  .pad-0-m {
-    padding: 0; }
-  .pad-5-m {
-    padding: 5px; }
-  .pad-10-m {
-    padding: 10px; }
-  .pad-15-m {
-    padding: 15px; }
-  .pad-20-m {
-    padding: 20px; }
-  .pad-25-m {
-    padding: 25px; }
-  .pad-30-m {
-    padding: 30px; }
-  .pad-35-m {
-    padding: 35px; }
-  .pad-40-m {
-    padding: 40px; }
-  .pad-45-m {
-    padding: 45px; }
-  .pad-50-m {
-    padding: 50px; }
-  .pad-55-m {
-    padding: 55px; }
-  .pad-60-m {
-    padding: 60px; } }
-
-@media only screen and (min-width: 980px) {
-  .no-float-l {
-    float: none; }
-  .no-padding-l {
-    padding: 0; }
-  .no-margin-l {
-    margin: 0; }
-  .relative-l {
-    position: relative; }
-  .absolute-l {
-    position: absolute; }
-  .static-l {
-    position: static; }
-  .fixed-l {
-    position: fixed; }
-  .none-l {
-    display: none; }
-  .block-l {
-    display: block; }
-  .inline-block-l {
-    display: inline-block; }
-  .inline-l {
-    display: inline; }
-  .flex-l {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex; }
-  .flex-row-l {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row; }
-  .flex-column-l {
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column; }
-  .flex-space-around-l {
-    -ms-flex-pack: distribute;
-        justify-content: space-around; }
-  .flex-space-between-l {
-    -webkit-box-pack: justify;
-        -ms-flex-pack: justify;
-            justify-content: space-between; }
-  .flex-start-l {
-    -webkit-box-pack: start;
-        -ms-flex-pack: start;
-            justify-content: flex-start; }
-  .flex-center-l {
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center; }
-  .flex-end-l {
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end; }
-  .flex-wrap-l {
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap; }
-  .flex-nowrap-l {
-    -ms-flex-wrap: nowrap;
-        flex-wrap: nowrap; }
-  .left-l {
-    float: left; }
-  .right-l {
-    float: right; }
-  .center-l {
-    float: none;
-    margin-left: auto;
-    margin-right: auto; }
-  .text-left-l {
-    text-align: left; }
-  .text-right-l {
-    text-align: right; }
-  .text-center-l {
-    text-align: center; }
-  .text-justify-l {
-    text-align: justify; }
-  .no-col-l {
-    width: auto;
-    float: none; }
-  .no-push-l, .no-pull-l {
-    left: 0; }
-  .pad-top-0-l {
-    padding-top: 0; }
-  .pad-top-5-l {
-    padding-top: 5px; }
-  .pad-top-10-l {
-    padding-top: 10px; }
-  .pad-top-15-l {
-    padding-top: 15px; }
-  .pad-top-20-l {
-    padding-top: 20px; }
-  .pad-top-25-l {
-    padding-top: 25px; }
-  .pad-top-30-l {
-    padding-top: 30px; }
-  .pad-top-35-l {
-    padding-top: 35px; }
-  .pad-top-40-l {
-    padding-top: 40px; }
-  .pad-top-45-l {
-    padding-top: 45px; }
-  .pad-top-50-l {
-    padding-top: 50px; }
-  .pad-top-55-l {
-    padding-top: 55px; }
-  .pad-top-60-l {
-    padding-top: 60px; }
-  .pad-bottom-0-l {
-    padding-bottom: 0; }
-  .pad-bottom-5-l {
-    padding-bottom: 5px; }
-  .pad-bottom-10-l {
-    padding-bottom: 10px; }
-  .pad-bottom-15-l {
-    padding-bottom: 15px; }
-  .pad-bottom-20-l {
-    padding-bottom: 20px; }
-  .pad-bottom-25-l {
-    padding-bottom: 25px; }
-  .pad-bottom-30-l {
-    padding-bottom: 30px; }
-  .pad-bottom-35-l {
-    padding-bottom: 35px; }
-  .pad-bottom-40-l {
-    padding-bottom: 40px; }
-  .pad-bottom-45-l {
-    padding-bottom: 45px; }
-  .pad-bottom-50-l {
-    padding-bottom: 50px; }
-  .pad-bottom-55-l {
-    padding-bottom: 55px; }
-  .pad-bottom-60-l {
-    padding-bottom: 60px; }
-  .pad-0-l {
-    padding: 0; }
-  .pad-5-l {
-    padding: 5px; }
-  .pad-10-l {
-    padding: 10px; }
-  .pad-15-l {
-    padding: 15px; }
-  .pad-20-l {
-    padding: 20px; }
-  .pad-25-l {
-    padding: 25px; }
-  .pad-30-l {
-    padding: 30px; }
-  .pad-35-l {
-    padding: 35px; }
-  .pad-40-l {
-    padding: 40px; }
-  .pad-45-l {
-    padding: 45px; }
-  .pad-50-l {
-    padding: 50px; }
-  .pad-55-l {
-    padding: 55px; }
-  .pad-60-l {
-    padding: 60px; } }
-
-@media only screen and (min-width: 1140px) {
-  .no-float-xl {
-    float: none; }
-  .no-padding-xl {
-    padding: 0; }
-  .no-margin-xl {
-    margin: 0; }
-  .relative-xl {
-    position: relative; }
-  .absolute-xl {
-    position: absolute; }
-  .static-xl {
-    position: static; }
-  .fixed-xl {
-    position: fixed; }
-  .none-xl {
-    display: none; }
-  .block-xl {
-    display: block; }
-  .inline-block-xl {
-    display: inline-block; }
-  .inline-xl {
-    display: inline; }
-  .flex-xl {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex; }
-  .flex-row-xl {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row; }
-  .flex-column-xl {
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column; }
-  .flex-space-around-xl {
-    -ms-flex-pack: distribute;
-        justify-content: space-around; }
-  .flex-space-between-xl {
-    -webkit-box-pack: justify;
-        -ms-flex-pack: justify;
-            justify-content: space-between; }
-  .flex-start-xl {
-    -webkit-box-pack: start;
-        -ms-flex-pack: start;
-            justify-content: flex-start; }
-  .flex-center-xl {
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center; }
-  .flex-end-xl {
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end; }
-  .flex-wrap-xl {
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap; }
-  .flex-nowrap-xl {
-    -ms-flex-wrap: nowrap;
-        flex-wrap: nowrap; }
-  .left-xl {
-    float: left; }
-  .right-xl {
-    float: right; }
-  .center-xl {
-    float: none;
-    margin-left: auto;
-    margin-right: auto; }
-  .text-left-xl {
-    text-align: left; }
-  .text-right-xl {
-    text-align: right; }
-  .text-center-xl {
-    text-align: center; }
-  .text-justify-xl {
-    text-align: justify; }
-  .no-col-xl {
-    width: auto;
-    float: none; }
-  .no-push-xl, .no-pull-xl {
-    left: 0; }
-  .pad-top-0-xl {
-    padding-top: 0; }
-  .pad-top-5-xl {
-    padding-top: 5px; }
-  .pad-top-10-xl {
-    padding-top: 10px; }
-  .pad-top-15-xl {
-    padding-top: 15px; }
-  .pad-top-20-xl {
-    padding-top: 20px; }
-  .pad-top-25-xl {
-    padding-top: 25px; }
-  .pad-top-30-xl {
-    padding-top: 30px; }
-  .pad-top-35-xl {
-    padding-top: 35px; }
-  .pad-top-40-xl {
-    padding-top: 40px; }
-  .pad-top-45-xl {
-    padding-top: 45px; }
-  .pad-top-50-xl {
-    padding-top: 50px; }
-  .pad-top-55-xl {
-    padding-top: 55px; }
-  .pad-top-60-xl {
-    padding-top: 60px; }
-  .pad-bottom-0-xl {
-    padding-bottom: 0; }
-  .pad-bottom-5-xl {
-    padding-bottom: 5px; }
-  .pad-bottom-10-xl {
-    padding-bottom: 10px; }
-  .pad-bottom-15-xl {
-    padding-bottom: 15px; }
-  .pad-bottom-20-xl {
-    padding-bottom: 20px; }
-  .pad-bottom-25-xl {
-    padding-bottom: 25px; }
-  .pad-bottom-30-xl {
-    padding-bottom: 30px; }
-  .pad-bottom-35-xl {
-    padding-bottom: 35px; }
-  .pad-bottom-40-xl {
-    padding-bottom: 40px; }
-  .pad-bottom-45-xl {
-    padding-bottom: 45px; }
-  .pad-bottom-50-xl {
-    padding-bottom: 50px; }
-  .pad-bottom-55-xl {
-    padding-bottom: 55px; }
-  .pad-bottom-60-xl {
-    padding-bottom: 60px; }
-  .pad-0-xl {
-    padding: 0; }
-  .pad-5-xl {
-    padding: 5px; }
-  .pad-10-xl {
-    padding: 10px; }
-  .pad-15-xl {
-    padding: 15px; }
-  .pad-20-xl {
-    padding: 20px; }
-  .pad-25-xl {
-    padding: 25px; }
-  .pad-30-xl {
-    padding: 30px; }
-  .pad-35-xl {
-    padding: 35px; }
-  .pad-40-xl {
-    padding: 40px; }
-  .pad-45-xl {
-    padding: 45px; }
-  .pad-50-xl {
-    padding: 50px; }
-  .pad-55-xl {
-    padding: 55px; }
-  .pad-60-xl {
-    padding: 60px; } }
-
-@media print {
-  .no-float-print {
-    float: none; }
-  .no-padding-print {
-    padding: 0; }
-  .no-margin-print {
-    margin: 0; }
-  .none-print {
-    display: none; }
-  .block-print {
-    display: block; }
-  .inline-block-print {
-    display: inline-block; }
-  .inline-print {
-    display: inline; }
-  .text-left-print {
-    text-align: left; }
-  .text-right-print {
-    text-align: right; }
-  .text-center-print {
-    text-align: center; }
-  .text-justify-print {
-    text-align: justify; }
-  .no-col-print {
-    width: auto;
-    float: none; }
-  .no-push-print, .no-pull-print {
-    left: 0; }
-  .pad-top-0-print {
-    padding-top: 0; }
-  .pad-top-5-print {
-    padding-top: 5px; }
-  .pad-top-10-print {
-    padding-top: 10px; }
-  .pad-top-15-print {
-    padding-top: 15px; }
-  .pad-top-20-print {
-    padding-top: 20px; }
-  .pad-top-25-print {
-    padding-top: 25px; }
-  .pad-top-30-print {
-    padding-top: 30px; }
-  .pad-top-35-print {
-    padding-top: 35px; }
-  .pad-top-40-print {
-    padding-top: 40px; }
-  .pad-top-45-print {
-    padding-top: 45px; }
-  .pad-top-50-print {
-    padding-top: 50px; }
-  .pad-top-55-print {
-    padding-top: 55px; }
-  .pad-top-60-print {
-    padding-top: 60px; }
-  .pad-bottom-0-print {
-    padding-bottom: 0; }
-  .pad-bottom-5-print {
-    padding-bottom: 5px; }
-  .pad-bottom-10-print {
-    padding-bottom: 10px; }
-  .pad-bottom-15-print {
-    padding-bottom: 15px; }
-  .pad-bottom-20-print {
-    padding-bottom: 20px; }
-  .pad-bottom-25-print {
-    padding-bottom: 25px; }
-  .pad-bottom-30-print {
-    padding-bottom: 30px; }
-  .pad-bottom-35-print {
-    padding-bottom: 35px; }
-  .pad-bottom-40-print {
-    padding-bottom: 40px; }
-  .pad-bottom-45-print {
-    padding-bottom: 45px; }
-  .pad-bottom-50-print {
-    padding-bottom: 50px; }
-  .pad-bottom-55-print {
-    padding-bottom: 55px; }
-  .pad-bottom-60-print {
-    padding-bottom: 60px; }
-  .pad-0-print {
-    padding: 0; }
-  .pad-5-print {
-    padding: 5px; }
-  .pad-10-print {
-    padding: 10px; }
-  .pad-15-print {
-    padding: 15px; }
-  .pad-20-print {
-    padding: 20px; }
-  .pad-25-print {
-    padding: 25px; }
-  .pad-30-print {
-    padding: 30px; }
-  .pad-35-print {
-    padding: 35px; }
-  .pad-40-print {
-    padding: 40px; }
-  .pad-45-print {
-    padding: 45px; }
-  .pad-50-print {
-    padding: 50px; }
-  .pad-55-print {
-    padding: 55px; }
-  .pad-60-print {
-    padding: 60px; } }
-
-/*# sourceMappingURL=styles.css.map */
diff --git a/packages/csslib/test/examples/boilerplate.css b/packages/csslib/test/examples/boilerplate.css
deleted file mode 100644
index ebd0ebd..0000000
--- a/packages/csslib/test/examples/boilerplate.css
+++ /dev/null
@@ -1,282 +0,0 @@
-/*! HTML5 Boilerplate v5.3.0 | MIT License | https://html5boilerplate.com/ */
-
-/*
- * What follows is the result of much research on cross-browser styling.
- * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
- * Kroc Camen, and the H5BP dev community and team.
- */
-
-/* ==========================================================================
-   Base styles: opinionated defaults
-   ========================================================================== */
-
-html {
-    color: #222;
-    font-size: 1em;
-    line-height: 1.4;
-}
-
-/*
- * Remove text-shadow in selection highlight:
- * https://twitter.com/miketaylr/status/12228805301
- *
- * These selection rule sets have to be separate.
- * Customize the background color to match your design.
- */
-
-::-moz-selection {
-    background: #b3d4fc;
-    text-shadow: none;
-}
-
-::selection {
-    background: #b3d4fc;
-    text-shadow: none;
-}
-
-/*
- * A better looking default horizontal rule
- */
-
-hr {
-    display: block;
-    height: 1px;
-    border: 0;
-    border-top: 1px solid #ccc;
-    margin: 1em 0;
-    padding: 0;
-}
-
-/*
- * Remove the gap between audio, canvas, iframes,
- * images, videos and the bottom of their containers:
- * https://github.com/h5bp/html5-boilerplate/issues/440
- */
-
-audio,
-canvas,
-iframe,
-img,
-svg,
-video {
-    vertical-align: middle;
-}
-
-/*
- * Remove default fieldset styles.
- */
-
-fieldset {
-    border: 0;
-    margin: 0;
-    padding: 0;
-}
-
-/*
- * Allow only vertical resizing of textareas.
- */
-
-textarea {
-    resize: vertical;
-}
-
-/* ==========================================================================
-   Browser Upgrade Prompt
-   ========================================================================== */
-
-.browserupgrade {
-    margin: 0.2em 0;
-    background: #ccc;
-    color: #000;
-    padding: 0.2em 0;
-}
-
-/* ==========================================================================
-   Author's custom styles
-   ========================================================================== */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* ==========================================================================
-   Helper classes
-   ========================================================================== */
-
-/*
- * Hide visually and from screen readers
- */
-
-.hidden {
-    display: none !important;
-}
-
-/*
- * Hide only visually, but have it available for screen readers:
- * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility
- */
-
-.visuallyhidden {
-    border: 0;
-    clip: rect(0 0 0 0);
-    height: 1px;
-    margin: -1px;
-    overflow: hidden;
-    padding: 0;
-    position: absolute;
-    width: 1px;
-}
-
-/*
- * Extends the .visuallyhidden class to allow the element
- * to be focusable when navigated to via the keyboard:
- * https://www.drupal.org/node/897638
- */
-
-.visuallyhidden.focusable:active,
-.visuallyhidden.focusable:focus {
-    clip: auto;
-    height: auto;
-    margin: 0;
-    overflow: visible;
-    position: static;
-    width: auto;
-}
-
-/*
- * Hide visually and from screen readers, but maintain layout
- */
-
-.invisible {
-    visibility: hidden;
-}
-
-/*
- * Clearfix: contain floats
- *
- * For modern browsers
- * 1. The space content is one way to avoid an Opera bug when the
- *    `contenteditable` attribute is included anywhere else in the document.
- *    Otherwise it causes space to appear at the top and bottom of elements
- *    that receive the `clearfix` class.
- * 2. The use of `table` rather than `block` is only necessary if using
- *    `:before` to contain the top-margins of child elements.
- */
-
-.clearfix:before,
-.clearfix:after {
-    content: " "; /* 1 */
-    display: table; /* 2 */
-}
-
-.clearfix:after {
-    clear: both;
-}
-
-/* ==========================================================================
-   EXAMPLE Media Queries for Responsive Design.
-   These examples override the primary ('mobile first') styles.
-   Modify as content requires.
-   ========================================================================== */
-
-@media only screen and (min-width: 35em) {
-    /* Style adjustments for viewports that meet the condition */
-}
-
-@media print,
-       (-webkit-min-device-pixel-ratio: 1.25),
-       (min-resolution: 1.25dppx),
-       (min-resolution: 120dpi) {
-    /* Style adjustments for high resolution devices */
-}
-
-/* ==========================================================================
-   Print styles.
-   Inlined to avoid the additional HTTP request:
-   http://www.phpied.com/delay-loading-your-print-css/
-   ========================================================================== */
-
-@media print {
-    *,
-    *:before,
-    *:after,
-    *:first-letter,
-    *:first-line {
-        background: transparent !important;
-        color: #000 !important; /* Black prints faster:
-                                   http://www.sanbeiji.com/archives/953 */
-        box-shadow: none !important;
-        text-shadow: none !important;
-    }
-
-    a,
-    a:visited {
-        text-decoration: underline;
-    }
-
-    a[href]:after {
-        content: " (" attr(href) ")";
-    }
-
-    abbr[title]:after {
-        content: " (" attr(title) ")";
-    }
-
-    /*
-     * Don't show links that are fragment identifiers,
-     * or use the `javascript:` pseudo protocol
-     */
-
-    a[href^="#"]:after,
-    a[href^="javascript:"]:after {
-        content: "";
-    }
-
-    pre,
-    blockquote {
-        border: 1px solid #999;
-        page-break-inside: avoid;
-    }
-
-    /*
-     * Printing Tables:
-     * http://css-discuss.incutio.com/wiki/Printing_Tables
-     */
-
-    thead {
-        display: table-header-group;
-    }
-
-    tr,
-    img {
-        page-break-inside: avoid;
-    }
-
-    img {
-        max-width: 100% !important;
-    }
-
-    p,
-    h2,
-    h3 {
-        orphans: 3;
-        widows: 3;
-    }
-
-    h2,
-    h3 {
-        page-break-after: avoid;
-    }
-}
diff --git a/packages/csslib/test/examples/bootstrap.css b/packages/csslib/test/examples/bootstrap.css
deleted file mode 100644
index 1038ebc..0000000
--- a/packages/csslib/test/examples/bootstrap.css
+++ /dev/null
@@ -1,9320 +0,0 @@
-/*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
-html {
-  font-family: sans-serif;
-  line-height: 1.15;
-  -ms-text-size-adjust: 100%;
-  -webkit-text-size-adjust: 100%;
-}
-
-body {
-  margin: 0;
-}
-
-article,
-aside,
-footer,
-header,
-nav,
-section {
-  display: block;
-}
-
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-figcaption,
-figure,
-main {
-  display: block;
-}
-
-figure {
-  margin: 1em 40px;
-}
-
-hr {
-  -webkit-box-sizing: content-box;
-          box-sizing: content-box;
-  height: 0;
-  overflow: visible;
-}
-
-pre {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-a {
-  background-color: transparent;
-  -webkit-text-decoration-skip: objects;
-}
-
-a:active,
-a:hover {
-  outline-width: 0;
-}
-
-abbr[title] {
-  border-bottom: none;
-  text-decoration: underline;
-  text-decoration: underline dotted;
-}
-
-b,
-strong {
-  font-weight: inherit;
-}
-
-b,
-strong {
-  font-weight: bolder;
-}
-
-code,
-kbd,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-dfn {
-  font-style: italic;
-}
-
-mark {
-  background-color: #ff0;
-  color: #000;
-}
-
-small {
-  font-size: 80%;
-}
-
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-sup {
-  top: -0.5em;
-}
-
-audio,
-video {
-  display: inline-block;
-}
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-img {
-  border-style: none;
-}
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
-button,
-input,
-optgroup,
-select,
-textarea {
-  font-family: sans-serif;
-  font-size: 100%;
-  line-height: 1.15;
-  margin: 0;
-}
-
-button,
-input {
-  overflow: visible;
-}
-
-button,
-select {
-  text-transform: none;
-}
-
-button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
-  -webkit-appearance: button;
-}
-
-button::-moz-focus-inner,
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
-  border-style: none;
-  padding: 0;
-}
-
-button:-moz-focusring,
-[type="button"]:-moz-focusring,
-[type="reset"]:-moz-focusring,
-[type="submit"]:-moz-focusring {
-  outline: 1px dotted ButtonText;
-}
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-legend {
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  color: inherit;
-  display: table;
-  max-width: 100%;
-  padding: 0;
-  white-space: normal;
-}
-
-progress {
-  display: inline-block;
-  vertical-align: baseline;
-}
-
-textarea {
-  overflow: auto;
-}
-
-[type="checkbox"],
-[type="radio"] {
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  padding: 0;
-}
-
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-[type="search"] {
-  -webkit-appearance: textfield;
-  outline-offset: -2px;
-}
-
-[type="search"]::-webkit-search-cancel-button,
-[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-::-webkit-file-upload-button {
-  -webkit-appearance: button;
-  font: inherit;
-}
-
-details,
-menu {
-  display: block;
-}
-
-summary {
-  display: list-item;
-}
-
-canvas {
-  display: inline-block;
-}
-
-template {
-  display: none;
-}
-
-[hidden] {
-  display: none;
-}
-
-@media print {
-  *,
-  *::before,
-  *::after,
-  p::first-letter,
-  div::first-letter,
-  blockquote::first-letter,
-  li::first-letter,
-  p::first-line,
-  div::first-line,
-  blockquote::first-line,
-  li::first-line {
-    text-shadow: none !important;
-    -webkit-box-shadow: none !important;
-            box-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  abbr[title]::after {
-    content: " (" attr(title) ")";
-  }
-  pre {
-    white-space: pre-wrap !important;
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-  .navbar {
-    display: none;
-  }
-  .badge {
-    border: 1px solid #000;
-  }
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table td,
-  .table th {
-    background-color: #fff !important;
-  }
-  .table-bordered th,
-  .table-bordered td {
-    border: 1px solid #ddd !important;
-  }
-}
-
-html {
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-*,
-*::before,
-*::after {
-  -webkit-box-sizing: inherit;
-          box-sizing: inherit;
-}
-
-@-ms-viewport {
-  width: device-width;
-}
-
-html {
-  -ms-overflow-style: scrollbar;
-  -webkit-tap-highlight-color: transparent;
-}
-
-body {
-  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
-  font-size: 1rem;
-  font-weight: normal;
-  line-height: 1.5;
-  color: #292b2c;
-  background-color: #fff;
-}
-
-[tabindex="-1"]:focus {
-  outline: none !important;
-}
-
-h1, h2, h3, h4, h5, h6 {
-  margin-top: 0;
-  margin-bottom: .5rem;
-}
-
-p {
-  margin-top: 0;
-  margin-bottom: 1rem;
-}
-
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-}
-
-address {
-  margin-bottom: 1rem;
-  font-style: normal;
-  line-height: inherit;
-}
-
-ol,
-ul,
-dl {
-  margin-top: 0;
-  margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
-  margin-bottom: 0;
-}
-
-dt {
-  font-weight: bold;
-}
-
-dd {
-  margin-bottom: .5rem;
-  margin-left: 0;
-}
-
-blockquote {
-  margin: 0 0 1rem;
-}
-
-a {
-  color: #0275d8;
-  text-decoration: none;
-}
-
-a:focus, a:hover {
-  color: #014c8c;
-  text-decoration: underline;
-}
-
-a:not([href]):not([tabindex]) {
-  color: inherit;
-  text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
-  color: inherit;
-  text-decoration: none;
-}
-
-a:not([href]):not([tabindex]):focus {
-  outline: 0;
-}
-
-pre {
-  margin-top: 0;
-  margin-bottom: 1rem;
-  overflow: auto;
-}
-
-figure {
-  margin: 0 0 1rem;
-}
-
-img {
-  vertical-align: middle;
-}
-
-[role="button"] {
-  cursor: pointer;
-}
-
-a,
-area,
-button,
-[role="button"],
-input,
-label,
-select,
-summary,
-textarea {
-  -ms-touch-action: manipulation;
-      touch-action: manipulation;
-}
-
-table {
-  border-collapse: collapse;
-  background-color: transparent;
-}
-
-caption {
-  padding-top: 0.75rem;
-  padding-bottom: 0.75rem;
-  color: #636c72;
-  text-align: left;
-  caption-side: bottom;
-}
-
-th {
-  text-align: left;
-}
-
-label {
-  display: inline-block;
-  margin-bottom: .5rem;
-}
-
-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-}
-
-input,
-button,
-select,
-textarea {
-  line-height: inherit;
-}
-
-input[type="radio"]:disabled,
-input[type="checkbox"]:disabled {
-  cursor: not-allowed;
-}
-
-input[type="date"],
-input[type="time"],
-input[type="datetime-local"],
-input[type="month"] {
-  -webkit-appearance: listbox;
-}
-
-textarea {
-  resize: vertical;
-}
-
-fieldset {
-  min-width: 0;
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: .5rem;
-  font-size: 1.5rem;
-  line-height: inherit;
-}
-
-input[type="search"] {
-  -webkit-appearance: none;
-}
-
-output {
-  display: inline-block;
-}
-
-[hidden] {
-  display: none !important;
-}
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  margin-bottom: 0.5rem;
-  font-family: inherit;
-  font-weight: 500;
-  line-height: 1.1;
-  color: inherit;
-}
-
-h1, .h1 {
-  font-size: 2.5rem;
-}
-
-h2, .h2 {
-  font-size: 2rem;
-}
-
-h3, .h3 {
-  font-size: 1.75rem;
-}
-
-h4, .h4 {
-  font-size: 1.5rem;
-}
-
-h5, .h5 {
-  font-size: 1.25rem;
-}
-
-h6, .h6 {
-  font-size: 1rem;
-}
-
-.lead {
-  font-size: 1.25rem;
-  font-weight: 300;
-}
-
-.display-1 {
-  font-size: 6rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-2 {
-  font-size: 5.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-3 {
-  font-size: 4.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-.display-4 {
-  font-size: 3.5rem;
-  font-weight: 300;
-  line-height: 1.1;
-}
-
-hr {
-  margin-top: 1rem;
-  margin-bottom: 1rem;
-  border: 0;
-  border-top: 1px solid rgba(0, 0, 0, 0.1);
-}
-
-small,
-.small {
-  font-size: 80%;
-  font-weight: normal;
-}
-
-mark,
-.mark {
-  padding: 0.2em;
-  background-color: #fcf8e3;
-}
-
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-
-.list-inline {
-  padding-left: 0;
-  list-style: none;
-}
-
-.list-inline-item {
-  display: inline-block;
-}
-
-.list-inline-item:not(:last-child) {
-  margin-right: 5px;
-}
-
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-.blockquote {
-  padding: 0.5rem 1rem;
-  margin-bottom: 1rem;
-  font-size: 1.25rem;
-  border-left: 0.25rem solid #eceeef;
-}
-
-.blockquote-footer {
-  display: block;
-  font-size: 80%;
-  color: #636c72;
-}
-
-.blockquote-footer::before {
-  content: "\2014 \00A0";
-}
-
-.blockquote-reverse {
-  padding-right: 1rem;
-  padding-left: 0;
-  text-align: right;
-  border-right: 0.25rem solid #eceeef;
-  border-left: 0;
-}
-
-.blockquote-reverse .blockquote-footer::before {
-  content: "";
-}
-
-.blockquote-reverse .blockquote-footer::after {
-  content: "\00A0 \2014";
-}
-
-.img-fluid {
-  max-width: 100%;
-  height: auto;
-}
-
-.img-thumbnail {
-  padding: 0.25rem;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-radius: 0.25rem;
-  -webkit-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-  max-width: 100%;
-  height: auto;
-}
-
-.figure {
-  display: inline-block;
-}
-
-.figure-img {
-  margin-bottom: 0.5rem;
-  line-height: 1;
-}
-
-.figure-caption {
-  font-size: 90%;
-  color: #636c72;
-}
-
-code,
-kbd,
-pre,
-samp {
-  font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
-}
-
-code {
-  padding: 0.2rem 0.4rem;
-  font-size: 90%;
-  color: #bd4147;
-  background-color: #f7f7f9;
-  border-radius: 0.25rem;
-}
-
-a > code {
-  padding: 0;
-  color: inherit;
-  background-color: inherit;
-}
-
-kbd {
-  padding: 0.2rem 0.4rem;
-  font-size: 90%;
-  color: #fff;
-  background-color: #292b2c;
-  border-radius: 0.2rem;
-}
-
-kbd kbd {
-  padding: 0;
-  font-size: 100%;
-  font-weight: bold;
-}
-
-pre {
-  display: block;
-  margin-top: 0;
-  margin-bottom: 1rem;
-  font-size: 90%;
-  color: #292b2c;
-}
-
-pre code {
-  padding: 0;
-  font-size: inherit;
-  color: inherit;
-  background-color: transparent;
-  border-radius: 0;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-.container {
-  position: relative;
-  margin-left: auto;
-  margin-right: auto;
-  padding-right: 15px;
-  padding-left: 15px;
-}
-
-@media (min-width: 576px) {
-  .container {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 768px) {
-  .container {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 992px) {
-  .container {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 1200px) {
-  .container {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 576px) {
-  .container {
-    width: 540px;
-    max-width: 100%;
-  }
-}
-
-@media (min-width: 768px) {
-  .container {
-    width: 720px;
-    max-width: 100%;
-  }
-}
-
-@media (min-width: 992px) {
-  .container {
-    width: 960px;
-    max-width: 100%;
-  }
-}
-
-@media (min-width: 1200px) {
-  .container {
-    width: 1140px;
-    max-width: 100%;
-  }
-}
-
-.container-fluid {
-  position: relative;
-  margin-left: auto;
-  margin-right: auto;
-  padding-right: 15px;
-  padding-left: 15px;
-}
-
-@media (min-width: 576px) {
-  .container-fluid {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 768px) {
-  .container-fluid {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 992px) {
-  .container-fluid {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 1200px) {
-  .container-fluid {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-.row {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-wrap: wrap;
-      -ms-flex-wrap: wrap;
-          flex-wrap: wrap;
-  margin-right: -15px;
-  margin-left: -15px;
-}
-
-@media (min-width: 576px) {
-  .row {
-    margin-right: -15px;
-    margin-left: -15px;
-  }
-}
-
-@media (min-width: 768px) {
-  .row {
-    margin-right: -15px;
-    margin-left: -15px;
-  }
-}
-
-@media (min-width: 992px) {
-  .row {
-    margin-right: -15px;
-    margin-left: -15px;
-  }
-}
-
-@media (min-width: 1200px) {
-  .row {
-    margin-right: -15px;
-    margin-left: -15px;
-  }
-}
-
-.no-gutters {
-  margin-right: 0;
-  margin-left: 0;
-}
-
-.no-gutters > .col,
-.no-gutters > [class*="col-"] {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
-  position: relative;
-  width: 100%;
-  min-height: 1px;
-  padding-right: 15px;
-  padding-left: 15px;
-}
-
-@media (min-width: 576px) {
-  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 768px) {
-  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 992px) {
-  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-@media (min-width: 1200px) {
-  .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl {
-    padding-right: 15px;
-    padding-left: 15px;
-  }
-}
-
-.col {
-  -webkit-flex-basis: 0;
-      -ms-flex-preferred-size: 0;
-          flex-basis: 0;
-  -webkit-box-flex: 1;
-  -webkit-flex-grow: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  max-width: 100%;
-}
-
-.col-auto {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 auto;
-      -ms-flex: 0 0 auto;
-          flex: 0 0 auto;
-  width: auto;
-}
-
-.col-1 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 8.333333%;
-      -ms-flex: 0 0 8.333333%;
-          flex: 0 0 8.333333%;
-  max-width: 8.333333%;
-}
-
-.col-2 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 16.666667%;
-      -ms-flex: 0 0 16.666667%;
-          flex: 0 0 16.666667%;
-  max-width: 16.666667%;
-}
-
-.col-3 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 25%;
-      -ms-flex: 0 0 25%;
-          flex: 0 0 25%;
-  max-width: 25%;
-}
-
-.col-4 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 33.333333%;
-      -ms-flex: 0 0 33.333333%;
-          flex: 0 0 33.333333%;
-  max-width: 33.333333%;
-}
-
-.col-5 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 41.666667%;
-      -ms-flex: 0 0 41.666667%;
-          flex: 0 0 41.666667%;
-  max-width: 41.666667%;
-}
-
-.col-6 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 50%;
-      -ms-flex: 0 0 50%;
-          flex: 0 0 50%;
-  max-width: 50%;
-}
-
-.col-7 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 58.333333%;
-      -ms-flex: 0 0 58.333333%;
-          flex: 0 0 58.333333%;
-  max-width: 58.333333%;
-}
-
-.col-8 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 66.666667%;
-      -ms-flex: 0 0 66.666667%;
-          flex: 0 0 66.666667%;
-  max-width: 66.666667%;
-}
-
-.col-9 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 75%;
-      -ms-flex: 0 0 75%;
-          flex: 0 0 75%;
-  max-width: 75%;
-}
-
-.col-10 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 83.333333%;
-      -ms-flex: 0 0 83.333333%;
-          flex: 0 0 83.333333%;
-  max-width: 83.333333%;
-}
-
-.col-11 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 91.666667%;
-      -ms-flex: 0 0 91.666667%;
-          flex: 0 0 91.666667%;
-  max-width: 91.666667%;
-}
-
-.col-12 {
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 0 100%;
-      -ms-flex: 0 0 100%;
-          flex: 0 0 100%;
-  max-width: 100%;
-}
-
-.pull-0 {
-  right: auto;
-}
-
-.pull-1 {
-  right: 8.333333%;
-}
-
-.pull-2 {
-  right: 16.666667%;
-}
-
-.pull-3 {
-  right: 25%;
-}
-
-.pull-4 {
-  right: 33.333333%;
-}
-
-.pull-5 {
-  right: 41.666667%;
-}
-
-.pull-6 {
-  right: 50%;
-}
-
-.pull-7 {
-  right: 58.333333%;
-}
-
-.pull-8 {
-  right: 66.666667%;
-}
-
-.pull-9 {
-  right: 75%;
-}
-
-.pull-10 {
-  right: 83.333333%;
-}
-
-.pull-11 {
-  right: 91.666667%;
-}
-
-.pull-12 {
-  right: 100%;
-}
-
-.push-0 {
-  left: auto;
-}
-
-.push-1 {
-  left: 8.333333%;
-}
-
-.push-2 {
-  left: 16.666667%;
-}
-
-.push-3 {
-  left: 25%;
-}
-
-.push-4 {
-  left: 33.333333%;
-}
-
-.push-5 {
-  left: 41.666667%;
-}
-
-.push-6 {
-  left: 50%;
-}
-
-.push-7 {
-  left: 58.333333%;
-}
-
-.push-8 {
-  left: 66.666667%;
-}
-
-.push-9 {
-  left: 75%;
-}
-
-.push-10 {
-  left: 83.333333%;
-}
-
-.push-11 {
-  left: 91.666667%;
-}
-
-.push-12 {
-  left: 100%;
-}
-
-.offset-1 {
-  margin-left: 8.333333%;
-}
-
-.offset-2 {
-  margin-left: 16.666667%;
-}
-
-.offset-3 {
-  margin-left: 25%;
-}
-
-.offset-4 {
-  margin-left: 33.333333%;
-}
-
-.offset-5 {
-  margin-left: 41.666667%;
-}
-
-.offset-6 {
-  margin-left: 50%;
-}
-
-.offset-7 {
-  margin-left: 58.333333%;
-}
-
-.offset-8 {
-  margin-left: 66.666667%;
-}
-
-.offset-9 {
-  margin-left: 75%;
-}
-
-.offset-10 {
-  margin-left: 83.333333%;
-}
-
-.offset-11 {
-  margin-left: 91.666667%;
-}
-
-@media (min-width: 576px) {
-  .col-sm {
-    -webkit-flex-basis: 0;
-        -ms-flex-preferred-size: 0;
-            flex-basis: 0;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-sm-auto {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 auto;
-        -ms-flex: 0 0 auto;
-            flex: 0 0 auto;
-    width: auto;
-  }
-  .col-sm-1 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 8.333333%;
-        -ms-flex: 0 0 8.333333%;
-            flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-sm-2 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 16.666667%;
-        -ms-flex: 0 0 16.666667%;
-            flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-sm-3 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 25%;
-        -ms-flex: 0 0 25%;
-            flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-sm-4 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 33.333333%;
-        -ms-flex: 0 0 33.333333%;
-            flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-sm-5 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 41.666667%;
-        -ms-flex: 0 0 41.666667%;
-            flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-sm-6 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 50%;
-        -ms-flex: 0 0 50%;
-            flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-sm-7 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 58.333333%;
-        -ms-flex: 0 0 58.333333%;
-            flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-sm-8 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 66.666667%;
-        -ms-flex: 0 0 66.666667%;
-            flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-sm-9 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 75%;
-        -ms-flex: 0 0 75%;
-            flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-sm-10 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 83.333333%;
-        -ms-flex: 0 0 83.333333%;
-            flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-sm-11 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 91.666667%;
-        -ms-flex: 0 0 91.666667%;
-            flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-sm-12 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 100%;
-        -ms-flex: 0 0 100%;
-            flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .pull-sm-0 {
-    right: auto;
-  }
-  .pull-sm-1 {
-    right: 8.333333%;
-  }
-  .pull-sm-2 {
-    right: 16.666667%;
-  }
-  .pull-sm-3 {
-    right: 25%;
-  }
-  .pull-sm-4 {
-    right: 33.333333%;
-  }
-  .pull-sm-5 {
-    right: 41.666667%;
-  }
-  .pull-sm-6 {
-    right: 50%;
-  }
-  .pull-sm-7 {
-    right: 58.333333%;
-  }
-  .pull-sm-8 {
-    right: 66.666667%;
-  }
-  .pull-sm-9 {
-    right: 75%;
-  }
-  .pull-sm-10 {
-    right: 83.333333%;
-  }
-  .pull-sm-11 {
-    right: 91.666667%;
-  }
-  .pull-sm-12 {
-    right: 100%;
-  }
-  .push-sm-0 {
-    left: auto;
-  }
-  .push-sm-1 {
-    left: 8.333333%;
-  }
-  .push-sm-2 {
-    left: 16.666667%;
-  }
-  .push-sm-3 {
-    left: 25%;
-  }
-  .push-sm-4 {
-    left: 33.333333%;
-  }
-  .push-sm-5 {
-    left: 41.666667%;
-  }
-  .push-sm-6 {
-    left: 50%;
-  }
-  .push-sm-7 {
-    left: 58.333333%;
-  }
-  .push-sm-8 {
-    left: 66.666667%;
-  }
-  .push-sm-9 {
-    left: 75%;
-  }
-  .push-sm-10 {
-    left: 83.333333%;
-  }
-  .push-sm-11 {
-    left: 91.666667%;
-  }
-  .push-sm-12 {
-    left: 100%;
-  }
-  .offset-sm-0 {
-    margin-left: 0%;
-  }
-  .offset-sm-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-sm-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-sm-3 {
-    margin-left: 25%;
-  }
-  .offset-sm-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-sm-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-sm-6 {
-    margin-left: 50%;
-  }
-  .offset-sm-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-sm-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-sm-9 {
-    margin-left: 75%;
-  }
-  .offset-sm-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-sm-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 768px) {
-  .col-md {
-    -webkit-flex-basis: 0;
-        -ms-flex-preferred-size: 0;
-            flex-basis: 0;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-md-auto {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 auto;
-        -ms-flex: 0 0 auto;
-            flex: 0 0 auto;
-    width: auto;
-  }
-  .col-md-1 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 8.333333%;
-        -ms-flex: 0 0 8.333333%;
-            flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-md-2 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 16.666667%;
-        -ms-flex: 0 0 16.666667%;
-            flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-md-3 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 25%;
-        -ms-flex: 0 0 25%;
-            flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-md-4 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 33.333333%;
-        -ms-flex: 0 0 33.333333%;
-            flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-md-5 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 41.666667%;
-        -ms-flex: 0 0 41.666667%;
-            flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-md-6 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 50%;
-        -ms-flex: 0 0 50%;
-            flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-md-7 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 58.333333%;
-        -ms-flex: 0 0 58.333333%;
-            flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-md-8 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 66.666667%;
-        -ms-flex: 0 0 66.666667%;
-            flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-md-9 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 75%;
-        -ms-flex: 0 0 75%;
-            flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-md-10 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 83.333333%;
-        -ms-flex: 0 0 83.333333%;
-            flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-md-11 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 91.666667%;
-        -ms-flex: 0 0 91.666667%;
-            flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-md-12 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 100%;
-        -ms-flex: 0 0 100%;
-            flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .pull-md-0 {
-    right: auto;
-  }
-  .pull-md-1 {
-    right: 8.333333%;
-  }
-  .pull-md-2 {
-    right: 16.666667%;
-  }
-  .pull-md-3 {
-    right: 25%;
-  }
-  .pull-md-4 {
-    right: 33.333333%;
-  }
-  .pull-md-5 {
-    right: 41.666667%;
-  }
-  .pull-md-6 {
-    right: 50%;
-  }
-  .pull-md-7 {
-    right: 58.333333%;
-  }
-  .pull-md-8 {
-    right: 66.666667%;
-  }
-  .pull-md-9 {
-    right: 75%;
-  }
-  .pull-md-10 {
-    right: 83.333333%;
-  }
-  .pull-md-11 {
-    right: 91.666667%;
-  }
-  .pull-md-12 {
-    right: 100%;
-  }
-  .push-md-0 {
-    left: auto;
-  }
-  .push-md-1 {
-    left: 8.333333%;
-  }
-  .push-md-2 {
-    left: 16.666667%;
-  }
-  .push-md-3 {
-    left: 25%;
-  }
-  .push-md-4 {
-    left: 33.333333%;
-  }
-  .push-md-5 {
-    left: 41.666667%;
-  }
-  .push-md-6 {
-    left: 50%;
-  }
-  .push-md-7 {
-    left: 58.333333%;
-  }
-  .push-md-8 {
-    left: 66.666667%;
-  }
-  .push-md-9 {
-    left: 75%;
-  }
-  .push-md-10 {
-    left: 83.333333%;
-  }
-  .push-md-11 {
-    left: 91.666667%;
-  }
-  .push-md-12 {
-    left: 100%;
-  }
-  .offset-md-0 {
-    margin-left: 0%;
-  }
-  .offset-md-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-md-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-md-3 {
-    margin-left: 25%;
-  }
-  .offset-md-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-md-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-md-6 {
-    margin-left: 50%;
-  }
-  .offset-md-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-md-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-md-9 {
-    margin-left: 75%;
-  }
-  .offset-md-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-md-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 992px) {
-  .col-lg {
-    -webkit-flex-basis: 0;
-        -ms-flex-preferred-size: 0;
-            flex-basis: 0;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-lg-auto {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 auto;
-        -ms-flex: 0 0 auto;
-            flex: 0 0 auto;
-    width: auto;
-  }
-  .col-lg-1 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 8.333333%;
-        -ms-flex: 0 0 8.333333%;
-            flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-lg-2 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 16.666667%;
-        -ms-flex: 0 0 16.666667%;
-            flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-lg-3 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 25%;
-        -ms-flex: 0 0 25%;
-            flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-lg-4 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 33.333333%;
-        -ms-flex: 0 0 33.333333%;
-            flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-lg-5 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 41.666667%;
-        -ms-flex: 0 0 41.666667%;
-            flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-lg-6 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 50%;
-        -ms-flex: 0 0 50%;
-            flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-lg-7 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 58.333333%;
-        -ms-flex: 0 0 58.333333%;
-            flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-lg-8 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 66.666667%;
-        -ms-flex: 0 0 66.666667%;
-            flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-lg-9 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 75%;
-        -ms-flex: 0 0 75%;
-            flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-lg-10 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 83.333333%;
-        -ms-flex: 0 0 83.333333%;
-            flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-lg-11 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 91.666667%;
-        -ms-flex: 0 0 91.666667%;
-            flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-lg-12 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 100%;
-        -ms-flex: 0 0 100%;
-            flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .pull-lg-0 {
-    right: auto;
-  }
-  .pull-lg-1 {
-    right: 8.333333%;
-  }
-  .pull-lg-2 {
-    right: 16.666667%;
-  }
-  .pull-lg-3 {
-    right: 25%;
-  }
-  .pull-lg-4 {
-    right: 33.333333%;
-  }
-  .pull-lg-5 {
-    right: 41.666667%;
-  }
-  .pull-lg-6 {
-    right: 50%;
-  }
-  .pull-lg-7 {
-    right: 58.333333%;
-  }
-  .pull-lg-8 {
-    right: 66.666667%;
-  }
-  .pull-lg-9 {
-    right: 75%;
-  }
-  .pull-lg-10 {
-    right: 83.333333%;
-  }
-  .pull-lg-11 {
-    right: 91.666667%;
-  }
-  .pull-lg-12 {
-    right: 100%;
-  }
-  .push-lg-0 {
-    left: auto;
-  }
-  .push-lg-1 {
-    left: 8.333333%;
-  }
-  .push-lg-2 {
-    left: 16.666667%;
-  }
-  .push-lg-3 {
-    left: 25%;
-  }
-  .push-lg-4 {
-    left: 33.333333%;
-  }
-  .push-lg-5 {
-    left: 41.666667%;
-  }
-  .push-lg-6 {
-    left: 50%;
-  }
-  .push-lg-7 {
-    left: 58.333333%;
-  }
-  .push-lg-8 {
-    left: 66.666667%;
-  }
-  .push-lg-9 {
-    left: 75%;
-  }
-  .push-lg-10 {
-    left: 83.333333%;
-  }
-  .push-lg-11 {
-    left: 91.666667%;
-  }
-  .push-lg-12 {
-    left: 100%;
-  }
-  .offset-lg-0 {
-    margin-left: 0%;
-  }
-  .offset-lg-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-lg-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-lg-3 {
-    margin-left: 25%;
-  }
-  .offset-lg-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-lg-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-lg-6 {
-    margin-left: 50%;
-  }
-  .offset-lg-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-lg-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-lg-9 {
-    margin-left: 75%;
-  }
-  .offset-lg-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-lg-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-@media (min-width: 1200px) {
-  .col-xl {
-    -webkit-flex-basis: 0;
-        -ms-flex-preferred-size: 0;
-            flex-basis: 0;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    max-width: 100%;
-  }
-  .col-xl-auto {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 auto;
-        -ms-flex: 0 0 auto;
-            flex: 0 0 auto;
-    width: auto;
-  }
-  .col-xl-1 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 8.333333%;
-        -ms-flex: 0 0 8.333333%;
-            flex: 0 0 8.333333%;
-    max-width: 8.333333%;
-  }
-  .col-xl-2 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 16.666667%;
-        -ms-flex: 0 0 16.666667%;
-            flex: 0 0 16.666667%;
-    max-width: 16.666667%;
-  }
-  .col-xl-3 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 25%;
-        -ms-flex: 0 0 25%;
-            flex: 0 0 25%;
-    max-width: 25%;
-  }
-  .col-xl-4 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 33.333333%;
-        -ms-flex: 0 0 33.333333%;
-            flex: 0 0 33.333333%;
-    max-width: 33.333333%;
-  }
-  .col-xl-5 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 41.666667%;
-        -ms-flex: 0 0 41.666667%;
-            flex: 0 0 41.666667%;
-    max-width: 41.666667%;
-  }
-  .col-xl-6 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 50%;
-        -ms-flex: 0 0 50%;
-            flex: 0 0 50%;
-    max-width: 50%;
-  }
-  .col-xl-7 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 58.333333%;
-        -ms-flex: 0 0 58.333333%;
-            flex: 0 0 58.333333%;
-    max-width: 58.333333%;
-  }
-  .col-xl-8 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 66.666667%;
-        -ms-flex: 0 0 66.666667%;
-            flex: 0 0 66.666667%;
-    max-width: 66.666667%;
-  }
-  .col-xl-9 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 75%;
-        -ms-flex: 0 0 75%;
-            flex: 0 0 75%;
-    max-width: 75%;
-  }
-  .col-xl-10 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 83.333333%;
-        -ms-flex: 0 0 83.333333%;
-            flex: 0 0 83.333333%;
-    max-width: 83.333333%;
-  }
-  .col-xl-11 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 91.666667%;
-        -ms-flex: 0 0 91.666667%;
-            flex: 0 0 91.666667%;
-    max-width: 91.666667%;
-  }
-  .col-xl-12 {
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 100%;
-        -ms-flex: 0 0 100%;
-            flex: 0 0 100%;
-    max-width: 100%;
-  }
-  .pull-xl-0 {
-    right: auto;
-  }
-  .pull-xl-1 {
-    right: 8.333333%;
-  }
-  .pull-xl-2 {
-    right: 16.666667%;
-  }
-  .pull-xl-3 {
-    right: 25%;
-  }
-  .pull-xl-4 {
-    right: 33.333333%;
-  }
-  .pull-xl-5 {
-    right: 41.666667%;
-  }
-  .pull-xl-6 {
-    right: 50%;
-  }
-  .pull-xl-7 {
-    right: 58.333333%;
-  }
-  .pull-xl-8 {
-    right: 66.666667%;
-  }
-  .pull-xl-9 {
-    right: 75%;
-  }
-  .pull-xl-10 {
-    right: 83.333333%;
-  }
-  .pull-xl-11 {
-    right: 91.666667%;
-  }
-  .pull-xl-12 {
-    right: 100%;
-  }
-  .push-xl-0 {
-    left: auto;
-  }
-  .push-xl-1 {
-    left: 8.333333%;
-  }
-  .push-xl-2 {
-    left: 16.666667%;
-  }
-  .push-xl-3 {
-    left: 25%;
-  }
-  .push-xl-4 {
-    left: 33.333333%;
-  }
-  .push-xl-5 {
-    left: 41.666667%;
-  }
-  .push-xl-6 {
-    left: 50%;
-  }
-  .push-xl-7 {
-    left: 58.333333%;
-  }
-  .push-xl-8 {
-    left: 66.666667%;
-  }
-  .push-xl-9 {
-    left: 75%;
-  }
-  .push-xl-10 {
-    left: 83.333333%;
-  }
-  .push-xl-11 {
-    left: 91.666667%;
-  }
-  .push-xl-12 {
-    left: 100%;
-  }
-  .offset-xl-0 {
-    margin-left: 0%;
-  }
-  .offset-xl-1 {
-    margin-left: 8.333333%;
-  }
-  .offset-xl-2 {
-    margin-left: 16.666667%;
-  }
-  .offset-xl-3 {
-    margin-left: 25%;
-  }
-  .offset-xl-4 {
-    margin-left: 33.333333%;
-  }
-  .offset-xl-5 {
-    margin-left: 41.666667%;
-  }
-  .offset-xl-6 {
-    margin-left: 50%;
-  }
-  .offset-xl-7 {
-    margin-left: 58.333333%;
-  }
-  .offset-xl-8 {
-    margin-left: 66.666667%;
-  }
-  .offset-xl-9 {
-    margin-left: 75%;
-  }
-  .offset-xl-10 {
-    margin-left: 83.333333%;
-  }
-  .offset-xl-11 {
-    margin-left: 91.666667%;
-  }
-}
-
-.table {
-  width: 100%;
-  max-width: 100%;
-  margin-bottom: 1rem;
-}
-
-.table th,
-.table td {
-  padding: 0.75rem;
-  vertical-align: top;
-  border-top: 1px solid #eceeef;
-}
-
-.table thead th {
-  vertical-align: bottom;
-  border-bottom: 2px solid #eceeef;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #eceeef;
-}
-
-.table .table {
-  background-color: #fff;
-}
-
-.table-sm th,
-.table-sm td {
-  padding: 0.3rem;
-}
-
-.table-bordered {
-  border: 1px solid #eceeef;
-}
-
-.table-bordered th,
-.table-bordered td {
-  border: 1px solid #eceeef;
-}
-
-.table-bordered thead th,
-.table-bordered thead td {
-  border-bottom-width: 2px;
-}
-
-.table-striped tbody tr:nth-of-type(odd) {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.table-hover tbody tr:hover {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-active,
-.table-active > th,
-.table-active > td {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
-  background-color: rgba(0, 0, 0, 0.075);
-}
-
-.table-success,
-.table-success > th,
-.table-success > td {
-  background-color: #dff0d8;
-}
-
-.table-hover .table-success:hover {
-  background-color: #d0e9c6;
-}
-
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
-  background-color: #d0e9c6;
-}
-
-.table-info,
-.table-info > th,
-.table-info > td {
-  background-color: #d9edf7;
-}
-
-.table-hover .table-info:hover {
-  background-color: #c4e3f3;
-}
-
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
-  background-color: #c4e3f3;
-}
-
-.table-warning,
-.table-warning > th,
-.table-warning > td {
-  background-color: #fcf8e3;
-}
-
-.table-hover .table-warning:hover {
-  background-color: #faf2cc;
-}
-
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
-  background-color: #faf2cc;
-}
-
-.table-danger,
-.table-danger > th,
-.table-danger > td {
-  background-color: #f2dede;
-}
-
-.table-hover .table-danger:hover {
-  background-color: #ebcccc;
-}
-
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
-  background-color: #ebcccc;
-}
-
-.thead-inverse th {
-  color: #fff;
-  background-color: #292b2c;
-}
-
-.thead-default th {
-  color: #464a4c;
-  background-color: #eceeef;
-}
-
-.table-inverse {
-  color: #fff;
-  background-color: #292b2c;
-}
-
-.table-inverse th,
-.table-inverse td,
-.table-inverse thead th {
-  border-color: #fff;
-}
-
-.table-inverse.table-bordered {
-  border: 0;
-}
-
-.table-responsive {
-  display: block;
-  width: 100%;
-  overflow-x: auto;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-}
-
-.table-responsive.table-bordered {
-  border: 0;
-}
-
-.form-control {
-  display: block;
-  width: 100%;
-  padding: 0.5rem 0.75rem;
-  font-size: 1rem;
-  line-height: 1.25;
-  color: #464a4c;
-  background-color: #fff;
-  background-image: none;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0.25rem;
-  -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
-  transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
-  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
-}
-
-.form-control::-ms-expand {
-  background-color: transparent;
-  border: 0;
-}
-
-.form-control:focus {
-  color: #464a4c;
-  background-color: #fff;
-  border-color: #5cb3fd;
-  outline: none;
-}
-
-.form-control::-webkit-input-placeholder {
-  color: #636c72;
-  opacity: 1;
-}
-
-.form-control::-moz-placeholder {
-  color: #636c72;
-  opacity: 1;
-}
-
-.form-control:-ms-input-placeholder {
-  color: #636c72;
-  opacity: 1;
-}
-
-.form-control::placeholder {
-  color: #636c72;
-  opacity: 1;
-}
-
-.form-control:disabled, .form-control[readonly] {
-  background-color: #eceeef;
-  opacity: 1;
-}
-
-.form-control:disabled {
-  cursor: not-allowed;
-}
-
-select.form-control:not([size]):not([multiple]) {
-  height: calc(2.25rem + 2px);
-}
-
-select.form-control:focus::-ms-value {
-  color: #464a4c;
-  background-color: #fff;
-}
-
-.form-control-file,
-.form-control-range {
-  display: block;
-}
-
-.col-form-label {
-  padding-top: calc(0.5rem - 1px * 2);
-  padding-bottom: calc(0.5rem - 1px * 2);
-  margin-bottom: 0;
-}
-
-.col-form-label-lg {
-  padding-top: calc(0.75rem - 1px * 2);
-  padding-bottom: calc(0.75rem - 1px * 2);
-  font-size: 1.25rem;
-}
-
-.col-form-label-sm {
-  padding-top: calc(0.25rem - 1px * 2);
-  padding-bottom: calc(0.25rem - 1px * 2);
-  font-size: 0.875rem;
-}
-
-.col-form-legend {
-  padding-top: 0.5rem;
-  padding-bottom: 0.5rem;
-  margin-bottom: 0;
-  font-size: 1rem;
-}
-
-.form-control-static {
-  padding-top: 0.5rem;
-  padding-bottom: 0.5rem;
-  margin-bottom: 0;
-  line-height: 1.25;
-  border: solid transparent;
-  border-width: 1px 0;
-}
-
-.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,
-.input-group-sm > .form-control-static.input-group-addon,
-.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,
-.input-group-lg > .form-control-static.input-group-addon,
-.input-group-lg > .input-group-btn > .form-control-static.btn {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.form-control-sm, .input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.875rem;
-  border-radius: 0.2rem;
-}
-
-select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),
-.input-group-sm > select.input-group-addon:not([size]):not([multiple]),
-.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
-  height: 1.8125rem;
-}
-
-.form-control-lg, .input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn {
-  padding: 0.75rem 1.5rem;
-  font-size: 1.25rem;
-  border-radius: 0.3rem;
-}
-
-select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
-.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
-.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
-  height: 3.166667rem;
-}
-
-.form-group {
-  margin-bottom: 1rem;
-}
-
-.form-text {
-  display: block;
-  margin-top: 0.25rem;
-}
-
-.form-check {
-  position: relative;
-  display: block;
-  margin-bottom: 0.5rem;
-}
-
-.form-check.disabled .form-check-label {
-  color: #636c72;
-  cursor: not-allowed;
-}
-
-.form-check-label {
-  padding-left: 1.25rem;
-  margin-bottom: 0;
-  cursor: pointer;
-}
-
-.form-check-input {
-  position: absolute;
-  margin-top: 0.25rem;
-  margin-left: -1.25rem;
-}
-
-.form-check-input:only-child {
-  position: static;
-}
-
-.form-check-inline {
-  display: inline-block;
-}
-
-.form-check-inline .form-check-label {
-  vertical-align: middle;
-}
-
-.form-check-inline + .form-check-inline {
-  margin-left: 0.75rem;
-}
-
-.form-control-feedback {
-  margin-top: 0.25rem;
-}
-
-.form-control-success,
-.form-control-warning,
-.form-control-danger {
-  padding-right: 2.25rem;
-  background-repeat: no-repeat;
-  background-position: center right 0.5625rem;
-  -webkit-background-size: 1.125rem 1.125rem;
-          background-size: 1.125rem 1.125rem;
-}
-
-.has-success .form-control-feedback,
-.has-success .form-control-label,
-.has-success .col-form-label,
-.has-success .form-check-label,
-.has-success .custom-control {
-  color: #5cb85c;
-}
-
-.has-success .form-control {
-  border-color: #5cb85c;
-}
-
-.has-success .input-group-addon {
-  color: #5cb85c;
-  border-color: #5cb85c;
-  background-color: #eaf6ea;
-}
-
-.has-success .form-control-success {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
-}
-
-.has-warning .form-control-feedback,
-.has-warning .form-control-label,
-.has-warning .col-form-label,
-.has-warning .form-check-label,
-.has-warning .custom-control {
-  color: #f0ad4e;
-}
-
-.has-warning .form-control {
-  border-color: #f0ad4e;
-}
-
-.has-warning .input-group-addon {
-  color: #f0ad4e;
-  border-color: #f0ad4e;
-  background-color: white;
-}
-
-.has-warning .form-control-warning {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E");
-}
-
-.has-danger .form-control-feedback,
-.has-danger .form-control-label,
-.has-danger .col-form-label,
-.has-danger .form-check-label,
-.has-danger .custom-control {
-  color: #d9534f;
-}
-
-.has-danger .form-control {
-  border-color: #d9534f;
-}
-
-.has-danger .input-group-addon {
-  color: #d9534f;
-  border-color: #d9534f;
-  background-color: #fdf7f7;
-}
-
-.has-danger .form-control-danger {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
-}
-
-.form-inline {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-flow: row wrap;
-      -ms-flex-flow: row wrap;
-          flex-flow: row wrap;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-
-.form-inline .form-check {
-  width: 100%;
-}
-
-@media (min-width: 576px) {
-  .form-inline label {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: center;
-    -webkit-justify-content: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    margin-bottom: 0;
-  }
-  .form-inline .form-group {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-flex: 0;
-    -webkit-flex: 0 0 auto;
-        -ms-flex: 0 0 auto;
-            flex: 0 0 auto;
-    -webkit-flex-flow: row wrap;
-        -ms-flex-flow: row wrap;
-            flex-flow: row wrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    margin-bottom: 0;
-  }
-  .form-inline .form-control {
-    display: inline-block;
-    width: auto;
-    vertical-align: middle;
-  }
-  .form-inline .form-control-static {
-    display: inline-block;
-  }
-  .form-inline .input-group {
-    width: auto;
-  }
-  .form-inline .form-control-label {
-    margin-bottom: 0;
-    vertical-align: middle;
-  }
-  .form-inline .form-check {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: center;
-    -webkit-justify-content: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    width: auto;
-    margin-top: 0;
-    margin-bottom: 0;
-  }
-  .form-inline .form-check-label {
-    padding-left: 0;
-  }
-  .form-inline .form-check-input {
-    position: relative;
-    margin-top: 0;
-    margin-right: 0.25rem;
-    margin-left: 0;
-  }
-  .form-inline .custom-control {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: center;
-    -webkit-justify-content: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    padding-left: 0;
-  }
-  .form-inline .custom-control-indicator {
-    position: static;
-    display: inline-block;
-    margin-right: 0.25rem;
-    vertical-align: text-bottom;
-  }
-  .form-inline .has-feedback .form-control-feedback {
-    top: 0;
-  }
-}
-
-.btn {
-  display: inline-block;
-  font-weight: normal;
-  line-height: 1.25;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: middle;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  border: 1px solid transparent;
-  padding: 0.5rem 1rem;
-  font-size: 1rem;
-  border-radius: 0.25rem;
-  -webkit-transition: all 0.2s ease-in-out;
-  -o-transition: all 0.2s ease-in-out;
-  transition: all 0.2s ease-in-out;
-}
-
-.btn:focus, .btn:hover {
-  text-decoration: none;
-}
-
-.btn:focus, .btn.focus {
-  outline: 0;
-  -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
-          box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
-}
-
-.btn.disabled, .btn:disabled {
-  cursor: not-allowed;
-  opacity: .65;
-}
-
-.btn:active, .btn.active {
-  background-image: none;
-}
-
-a.btn.disabled,
-fieldset[disabled] a.btn {
-  pointer-events: none;
-}
-
-.btn-primary {
-  color: #fff;
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.btn-primary:hover {
-  color: #fff;
-  background-color: #025aa5;
-  border-color: #01549b;
-}
-
-.btn-primary:focus, .btn-primary.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-          box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-}
-
-.btn-primary.disabled, .btn-primary:disabled {
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.btn-primary:active, .btn-primary.active,
-.show > .btn-primary.dropdown-toggle {
-  color: #fff;
-  background-color: #025aa5;
-  background-image: none;
-  border-color: #01549b;
-}
-
-.btn-secondary {
-  color: #292b2c;
-  background-color: #fff;
-  border-color: #ccc;
-}
-
-.btn-secondary:hover {
-  color: #292b2c;
-  background-color: #e6e6e6;
-  border-color: #adadad;
-}
-
-.btn-secondary:focus, .btn-secondary.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-          box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-}
-
-.btn-secondary.disabled, .btn-secondary:disabled {
-  background-color: #fff;
-  border-color: #ccc;
-}
-
-.btn-secondary:active, .btn-secondary.active,
-.show > .btn-secondary.dropdown-toggle {
-  color: #292b2c;
-  background-color: #e6e6e6;
-  background-image: none;
-  border-color: #adadad;
-}
-
-.btn-info {
-  color: #fff;
-  background-color: #5bc0de;
-  border-color: #5bc0de;
-}
-
-.btn-info:hover {
-  color: #fff;
-  background-color: #31b0d5;
-  border-color: #2aabd2;
-}
-
-.btn-info:focus, .btn-info.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-          box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-}
-
-.btn-info.disabled, .btn-info:disabled {
-  background-color: #5bc0de;
-  border-color: #5bc0de;
-}
-
-.btn-info:active, .btn-info.active,
-.show > .btn-info.dropdown-toggle {
-  color: #fff;
-  background-color: #31b0d5;
-  background-image: none;
-  border-color: #2aabd2;
-}
-
-.btn-success {
-  color: #fff;
-  background-color: #5cb85c;
-  border-color: #5cb85c;
-}
-
-.btn-success:hover {
-  color: #fff;
-  background-color: #449d44;
-  border-color: #419641;
-}
-
-.btn-success:focus, .btn-success.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-          box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-}
-
-.btn-success.disabled, .btn-success:disabled {
-  background-color: #5cb85c;
-  border-color: #5cb85c;
-}
-
-.btn-success:active, .btn-success.active,
-.show > .btn-success.dropdown-toggle {
-  color: #fff;
-  background-color: #449d44;
-  background-image: none;
-  border-color: #419641;
-}
-
-.btn-warning {
-  color: #fff;
-  background-color: #f0ad4e;
-  border-color: #f0ad4e;
-}
-
-.btn-warning:hover {
-  color: #fff;
-  background-color: #ec971f;
-  border-color: #eb9316;
-}
-
-.btn-warning:focus, .btn-warning.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-          box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-}
-
-.btn-warning.disabled, .btn-warning:disabled {
-  background-color: #f0ad4e;
-  border-color: #f0ad4e;
-}
-
-.btn-warning:active, .btn-warning.active,
-.show > .btn-warning.dropdown-toggle {
-  color: #fff;
-  background-color: #ec971f;
-  background-image: none;
-  border-color: #eb9316;
-}
-
-.btn-danger {
-  color: #fff;
-  background-color: #d9534f;
-  border-color: #d9534f;
-}
-
-.btn-danger:hover {
-  color: #fff;
-  background-color: #c9302c;
-  border-color: #c12e2a;
-}
-
-.btn-danger:focus, .btn-danger.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-          box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-}
-
-.btn-danger.disabled, .btn-danger:disabled {
-  background-color: #d9534f;
-  border-color: #d9534f;
-}
-
-.btn-danger:active, .btn-danger.active,
-.show > .btn-danger.dropdown-toggle {
-  color: #fff;
-  background-color: #c9302c;
-  background-image: none;
-  border-color: #c12e2a;
-}
-
-.btn-outline-primary {
-  color: #0275d8;
-  background-image: none;
-  background-color: transparent;
-  border-color: #0275d8;
-}
-
-.btn-outline-primary:hover {
-  color: #fff;
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.btn-outline-primary:focus, .btn-outline-primary.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-          box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-}
-
-.btn-outline-primary.disabled, .btn-outline-primary:disabled {
-  color: #0275d8;
-  background-color: transparent;
-}
-
-.btn-outline-primary:active, .btn-outline-primary.active,
-.show > .btn-outline-primary.dropdown-toggle {
-  color: #fff;
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.btn-outline-secondary {
-  color: #ccc;
-  background-image: none;
-  background-color: transparent;
-  border-color: #ccc;
-}
-
-.btn-outline-secondary:hover {
-  color: #fff;
-  background-color: #ccc;
-  border-color: #ccc;
-}
-
-.btn-outline-secondary:focus, .btn-outline-secondary.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-          box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-}
-
-.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
-  color: #ccc;
-  background-color: transparent;
-}
-
-.btn-outline-secondary:active, .btn-outline-secondary.active,
-.show > .btn-outline-secondary.dropdown-toggle {
-  color: #fff;
-  background-color: #ccc;
-  border-color: #ccc;
-}
-
-.btn-outline-info {
-  color: #5bc0de;
-  background-image: none;
-  background-color: transparent;
-  border-color: #5bc0de;
-}
-
-.btn-outline-info:hover {
-  color: #fff;
-  background-color: #5bc0de;
-  border-color: #5bc0de;
-}
-
-.btn-outline-info:focus, .btn-outline-info.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-          box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-}
-
-.btn-outline-info.disabled, .btn-outline-info:disabled {
-  color: #5bc0de;
-  background-color: transparent;
-}
-
-.btn-outline-info:active, .btn-outline-info.active,
-.show > .btn-outline-info.dropdown-toggle {
-  color: #fff;
-  background-color: #5bc0de;
-  border-color: #5bc0de;
-}
-
-.btn-outline-success {
-  color: #5cb85c;
-  background-image: none;
-  background-color: transparent;
-  border-color: #5cb85c;
-}
-
-.btn-outline-success:hover {
-  color: #fff;
-  background-color: #5cb85c;
-  border-color: #5cb85c;
-}
-
-.btn-outline-success:focus, .btn-outline-success.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-          box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-}
-
-.btn-outline-success.disabled, .btn-outline-success:disabled {
-  color: #5cb85c;
-  background-color: transparent;
-}
-
-.btn-outline-success:active, .btn-outline-success.active,
-.show > .btn-outline-success.dropdown-toggle {
-  color: #fff;
-  background-color: #5cb85c;
-  border-color: #5cb85c;
-}
-
-.btn-outline-warning {
-  color: #f0ad4e;
-  background-image: none;
-  background-color: transparent;
-  border-color: #f0ad4e;
-}
-
-.btn-outline-warning:hover {
-  color: #fff;
-  background-color: #f0ad4e;
-  border-color: #f0ad4e;
-}
-
-.btn-outline-warning:focus, .btn-outline-warning.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-          box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-}
-
-.btn-outline-warning.disabled, .btn-outline-warning:disabled {
-  color: #f0ad4e;
-  background-color: transparent;
-}
-
-.btn-outline-warning:active, .btn-outline-warning.active,
-.show > .btn-outline-warning.dropdown-toggle {
-  color: #fff;
-  background-color: #f0ad4e;
-  border-color: #f0ad4e;
-}
-
-.btn-outline-danger {
-  color: #d9534f;
-  background-image: none;
-  background-color: transparent;
-  border-color: #d9534f;
-}
-
-.btn-outline-danger:hover {
-  color: #fff;
-  background-color: #d9534f;
-  border-color: #d9534f;
-}
-
-.btn-outline-danger:focus, .btn-outline-danger.focus {
-  -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-          box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-}
-
-.btn-outline-danger.disabled, .btn-outline-danger:disabled {
-  color: #d9534f;
-  background-color: transparent;
-}
-
-.btn-outline-danger:active, .btn-outline-danger.active,
-.show > .btn-outline-danger.dropdown-toggle {
-  color: #fff;
-  background-color: #d9534f;
-  border-color: #d9534f;
-}
-
-.btn-link {
-  font-weight: normal;
-  color: #0275d8;
-  border-radius: 0;
-}
-
-.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {
-  background-color: transparent;
-}
-
-.btn-link, .btn-link:focus, .btn-link:active {
-  border-color: transparent;
-}
-
-.btn-link:hover {
-  border-color: transparent;
-}
-
-.btn-link:focus, .btn-link:hover {
-  color: #014c8c;
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.btn-link:disabled {
-  color: #636c72;
-}
-
-.btn-link:disabled:focus, .btn-link:disabled:hover {
-  text-decoration: none;
-}
-
-.btn-lg, .btn-group-lg > .btn {
-  padding: 0.75rem 1.5rem;
-  font-size: 1.25rem;
-  border-radius: 0.3rem;
-}
-
-.btn-sm, .btn-group-sm > .btn {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.875rem;
-  border-radius: 0.2rem;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-}
-
-.btn-block + .btn-block {
-  margin-top: 0.5rem;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-  -o-transition: opacity 0.15s linear;
-  transition: opacity 0.15s linear;
-}
-
-.fade.show {
-  opacity: 1;
-}
-
-.collapse {
-  display: none;
-}
-
-.collapse.show {
-  display: block;
-}
-
-tr.collapse.show {
-  display: table-row;
-}
-
-tbody.collapse.show {
-  display: table-row-group;
-}
-
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition: height 0.35s ease;
-  -o-transition: height 0.35s ease;
-  transition: height 0.35s ease;
-}
-
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle::after {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 0.3em;
-  vertical-align: middle;
-  content: "";
-  border-top: 0.3em solid;
-  border-right: 0.3em solid transparent;
-  border-left: 0.3em solid transparent;
-}
-
-.dropdown-toggle:focus {
-  outline: 0;
-}
-
-.dropup .dropdown-toggle::after {
-  border-top: 0;
-  border-bottom: 0.3em solid;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: 1000;
-  display: none;
-  float: left;
-  min-width: 10rem;
-  padding: 0.5rem 0;
-  margin: 0.125rem 0 0;
-  font-size: 1rem;
-  color: #292b2c;
-  text-align: left;
-  list-style: none;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0.25rem;
-}
-
-.dropdown-divider {
-  height: 1px;
-  margin: 0.5rem 0;
-  overflow: hidden;
-  background-color: #eceeef;
-}
-
-.dropdown-item {
-  display: block;
-  width: 100%;
-  padding: 3px 1.5rem;
-  clear: both;
-  font-weight: normal;
-  color: #292b2c;
-  text-align: inherit;
-  white-space: nowrap;
-  background: none;
-  border: 0;
-}
-
-.dropdown-item:focus, .dropdown-item:hover {
-  color: #1d1e1f;
-  text-decoration: none;
-  background-color: #f7f7f9;
-}
-
-.dropdown-item.active, .dropdown-item:active {
-  color: #fff;
-  text-decoration: none;
-  background-color: #0275d8;
-}
-
-.dropdown-item.disabled, .dropdown-item:disabled {
-  color: #636c72;
-  cursor: not-allowed;
-  background-color: transparent;
-}
-
-.show > .dropdown-menu {
-  display: block;
-}
-
-.show > a {
-  outline: 0;
-}
-
-.dropdown-menu-right {
-  right: 0;
-  left: auto;
-}
-
-.dropdown-menu-left {
-  right: auto;
-  left: 0;
-}
-
-.dropdown-header {
-  display: block;
-  padding: 0.5rem 1.5rem;
-  margin-bottom: 0;
-  font-size: 0.875rem;
-  color: #636c72;
-  white-space: nowrap;
-}
-
-.dropdown-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 990;
-}
-
-.dropup .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 0.125rem;
-}
-
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: -webkit-inline-box;
-  display: -webkit-inline-flex;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  vertical-align: middle;
-}
-
-.btn-group > .btn,
-.btn-group-vertical > .btn {
-  position: relative;
-  -webkit-box-flex: 0;
-  -webkit-flex: 0 1 auto;
-      -ms-flex: 0 1 auto;
-          flex: 0 1 auto;
-}
-
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
-  z-index: 2;
-}
-
-.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
-.btn-group-vertical > .btn:focus,
-.btn-group-vertical > .btn:active,
-.btn-group-vertical > .btn.active {
-  z-index: 2;
-}
-
-.btn-group .btn + .btn,
-.btn-group .btn + .btn-group,
-.btn-group .btn-group + .btn,
-.btn-group .btn-group + .btn-group,
-.btn-group-vertical .btn + .btn,
-.btn-group-vertical .btn + .btn-group,
-.btn-group-vertical .btn-group + .btn,
-.btn-group-vertical .btn-group + .btn-group {
-  margin-left: -1px;
-}
-
-.btn-toolbar {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: start;
-  -webkit-justify-content: flex-start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-}
-
-.btn-toolbar .input-group {
-  width: auto;
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-}
-
-.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-
-.btn-group > .btn-group {
-  float: left;
-}
-
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-
-.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-.btn + .dropdown-toggle-split {
-  padding-right: 0.75rem;
-  padding-left: 0.75rem;
-}
-
-.btn + .dropdown-toggle-split::after {
-  margin-left: 0;
-}
-
-.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
-  padding-right: 0.375rem;
-  padding-left: 0.375rem;
-}
-
-.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
-  padding-right: 1.125rem;
-  padding-left: 1.125rem;
-}
-
-.btn-group-vertical {
-  display: -webkit-inline-box;
-  display: -webkit-inline-flex;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-box-align: start;
-  -webkit-align-items: flex-start;
-      -ms-flex-align: start;
-          align-items: flex-start;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.btn-group-vertical .btn,
-.btn-group-vertical .btn-group {
-  width: 100%;
-}
-
-.btn-group-vertical > .btn + .btn,
-.btn-group-vertical > .btn + .btn-group,
-.btn-group-vertical > .btn-group + .btn,
-.btn-group-vertical > .btn-group + .btn-group {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-
-.btn-group-vertical > .btn:first-child:not(:last-child) {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-.btn-group-vertical > .btn:last-child:not(:first-child) {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
-.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-
-[data-toggle="buttons"] > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn input[type="checkbox"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
-[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
-  position: absolute;
-  clip: rect(0, 0, 0, 0);
-  pointer-events: none;
-}
-
-.input-group {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  width: 100%;
-}
-
-.input-group .form-control {
-  position: relative;
-  z-index: 2;
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 auto;
-      -ms-flex: 1 1 auto;
-          flex: 1 1 auto;
-  width: 1%;
-  margin-bottom: 0;
-}
-
-.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {
-  z-index: 3;
-}
-
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.input-group-addon:not(:first-child):not(:last-child),
-.input-group-btn:not(:first-child):not(:last-child),
-.input-group .form-control:not(:first-child):not(:last-child) {
-  border-radius: 0;
-}
-
-.input-group-addon,
-.input-group-btn {
-  white-space: nowrap;
-  vertical-align: middle;
-}
-
-.input-group-addon {
-  padding: 0.5rem 0.75rem;
-  margin-bottom: 0;
-  font-size: 1rem;
-  font-weight: normal;
-  line-height: 1.25;
-  color: #464a4c;
-  text-align: center;
-  background-color: #eceeef;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0.25rem;
-}
-
-.input-group-addon.form-control-sm,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .input-group-addon.btn {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.875rem;
-  border-radius: 0.2rem;
-}
-
-.input-group-addon.form-control-lg,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .input-group-addon.btn {
-  padding: 0.75rem 1.5rem;
-  font-size: 1.25rem;
-  border-radius: 0.3rem;
-}
-
-.input-group-addon input[type="radio"],
-.input-group-addon input[type="checkbox"] {
-  margin-top: 0;
-}
-
-.input-group .form-control:not(:last-child),
-.input-group-addon:not(:last-child),
-.input-group-btn:not(:last-child) > .btn,
-.input-group-btn:not(:last-child) > .btn-group > .btn,
-.input-group-btn:not(:last-child) > .dropdown-toggle,
-.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
-  border-bottom-right-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.input-group-addon:not(:last-child) {
-  border-right: 0;
-}
-
-.input-group .form-control:not(:first-child),
-.input-group-addon:not(:first-child),
-.input-group-btn:not(:first-child) > .btn,
-.input-group-btn:not(:first-child) > .btn-group > .btn,
-.input-group-btn:not(:first-child) > .dropdown-toggle,
-.input-group-btn:not(:last-child) > .btn:not(:first-child),
-.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-}
-
-.form-control + .input-group-addon:not(:first-child) {
-  border-left: 0;
-}
-
-.input-group-btn {
-  position: relative;
-  font-size: 0;
-  white-space: nowrap;
-}
-
-.input-group-btn > .btn {
-  position: relative;
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 0%;
-      -ms-flex: 1 1 0%;
-          flex: 1 1 0%;
-}
-
-.input-group-btn > .btn + .btn {
-  margin-left: -1px;
-}
-
-.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {
-  z-index: 3;
-}
-
-.input-group-btn:not(:last-child) > .btn,
-.input-group-btn:not(:last-child) > .btn-group {
-  margin-right: -1px;
-}
-
-.input-group-btn:not(:first-child) > .btn,
-.input-group-btn:not(:first-child) > .btn-group {
-  z-index: 2;
-  margin-left: -1px;
-}
-
-.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,
-.input-group-btn:not(:first-child) > .btn-group:focus,
-.input-group-btn:not(:first-child) > .btn-group:active,
-.input-group-btn:not(:first-child) > .btn-group:hover {
-  z-index: 3;
-}
-
-.custom-control {
-  position: relative;
-  display: -webkit-inline-box;
-  display: -webkit-inline-flex;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  min-height: 1.5rem;
-  padding-left: 1.5rem;
-  margin-right: 1rem;
-  cursor: pointer;
-}
-
-.custom-control-input {
-  position: absolute;
-  z-index: -1;
-  opacity: 0;
-}
-
-.custom-control-input:checked ~ .custom-control-indicator {
-  color: #fff;
-  background-color: #0275d8;
-}
-
-.custom-control-input:focus ~ .custom-control-indicator {
-  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
-          box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
-}
-
-.custom-control-input:active ~ .custom-control-indicator {
-  color: #fff;
-  background-color: #8fcafe;
-}
-
-.custom-control-input:disabled ~ .custom-control-indicator {
-  cursor: not-allowed;
-  background-color: #eceeef;
-}
-
-.custom-control-input:disabled ~ .custom-control-description {
-  color: #636c72;
-  cursor: not-allowed;
-}
-
-.custom-control-indicator {
-  position: absolute;
-  top: 0.25rem;
-  left: 0;
-  display: block;
-  width: 1rem;
-  height: 1rem;
-  pointer-events: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  background-color: #ddd;
-  background-repeat: no-repeat;
-  background-position: center center;
-  -webkit-background-size: 50% 50%;
-          background-size: 50% 50%;
-}
-
-.custom-checkbox .custom-control-indicator {
-  border-radius: 0.25rem;
-}
-
-.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
-}
-
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {
-  background-color: #0275d8;
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
-}
-
-.custom-radio .custom-control-indicator {
-  border-radius: 50%;
-}
-
-.custom-radio .custom-control-input:checked ~ .custom-control-indicator {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
-}
-
-.custom-controls-stacked {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-}
-
-.custom-controls-stacked .custom-control {
-  margin-bottom: 0.25rem;
-}
-
-.custom-controls-stacked .custom-control + .custom-control {
-  margin-left: 0;
-}
-
-.custom-select {
-  display: inline-block;
-  max-width: 100%;
-  height: calc(2.25rem + 2px);
-  padding: 0.375rem 1.75rem 0.375rem 0.75rem;
-  line-height: 1.25;
-  color: #464a4c;
-  vertical-align: middle;
-  background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
-  -webkit-background-size: 8px 10px;
-          background-size: 8px 10px;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0.25rem;
-  -moz-appearance: none;
-  -webkit-appearance: none;
-}
-
-.custom-select:focus {
-  border-color: #5cb3fd;
-  outline: none;
-}
-
-.custom-select:focus::-ms-value {
-  color: #464a4c;
-  background-color: #fff;
-}
-
-.custom-select:disabled {
-  color: #636c72;
-  cursor: not-allowed;
-  background-color: #eceeef;
-}
-
-.custom-select::-ms-expand {
-  opacity: 0;
-}
-
-.custom-select-sm {
-  padding-top: 0.375rem;
-  padding-bottom: 0.375rem;
-  font-size: 75%;
-}
-
-.custom-file {
-  position: relative;
-  display: inline-block;
-  max-width: 100%;
-  height: 2.5rem;
-  margin-bottom: 0;
-  cursor: pointer;
-}
-
-.custom-file-input {
-  min-width: 14rem;
-  max-width: 100%;
-  height: 2.5rem;
-  margin: 0;
-  filter: alpha(opacity=0);
-  opacity: 0;
-}
-
-.custom-file-control {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 5;
-  height: 2.5rem;
-  padding: 0.5rem 1rem;
-  line-height: 1.5;
-  color: #464a4c;
-  pointer-events: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  background-color: #fff;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0.25rem;
-}
-
-.custom-file-control:lang(en)::after {
-  content: "Choose file...";
-}
-
-.custom-file-control::before {
-  position: absolute;
-  top: -1px;
-  right: -1px;
-  bottom: -1px;
-  z-index: 6;
-  display: block;
-  height: 2.5rem;
-  padding: 0.5rem 1rem;
-  line-height: 1.5;
-  color: #464a4c;
-  background-color: #eceeef;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 0 0.25rem 0.25rem 0;
-}
-
-.custom-file-control:lang(en)::before {
-  content: "Browse";
-}
-
-.nav {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-
-.nav-link {
-  display: block;
-  padding: 0.5em 1em;
-}
-
-.nav-link:focus, .nav-link:hover {
-  text-decoration: none;
-}
-
-.nav-link.disabled {
-  color: #636c72;
-  cursor: not-allowed;
-}
-
-.nav-tabs {
-  border-bottom: 1px solid #ddd;
-}
-
-.nav-tabs .nav-item {
-  margin-bottom: -1px;
-}
-
-.nav-tabs .nav-link {
-  border: 1px solid transparent;
-  border-top-right-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
-  border-color: #eceeef #eceeef #ddd;
-}
-
-.nav-tabs .nav-link.disabled {
-  color: #636c72;
-  background-color: transparent;
-  border-color: transparent;
-}
-
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
-  color: #464a4c;
-  background-color: #fff;
-  border-color: #ddd #ddd #fff;
-}
-
-.nav-tabs .dropdown-menu {
-  margin-top: -1px;
-  border-top-right-radius: 0;
-  border-top-left-radius: 0;
-}
-
-.nav-pills .nav-link {
-  border-radius: 0.25rem;
-}
-
-.nav-pills .nav-link.active,
-.nav-pills .nav-item.show .nav-link {
-  color: #fff;
-  cursor: default;
-  background-color: #0275d8;
-}
-
-.nav-fill .nav-item {
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 auto;
-      -ms-flex: 1 1 auto;
-          flex: 1 1 auto;
-  text-align: center;
-}
-
-.nav-justified .nav-item {
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 100%;
-      -ms-flex: 1 1 100%;
-          flex: 1 1 100%;
-  text-align: center;
-}
-
-.tab-content > .tab-pane {
-  display: none;
-}
-
-.tab-content > .active {
-  display: block;
-}
-
-.navbar {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  padding: 0.5rem 1rem;
-}
-
-.navbar-brand {
-  display: inline-block;
-  padding-top: .25rem;
-  padding-bottom: .25rem;
-  margin-right: 1rem;
-  font-size: 1.25rem;
-  line-height: inherit;
-  white-space: nowrap;
-}
-
-.navbar-brand:focus, .navbar-brand:hover {
-  text-decoration: none;
-}
-
-.navbar-nav {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  padding-left: 0;
-  margin-bottom: 0;
-  list-style: none;
-}
-
-.navbar-nav .nav-link {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.navbar-text {
-  display: inline-block;
-  padding-top: .425rem;
-  padding-bottom: .425rem;
-}
-
-.navbar-toggler {
-  -webkit-align-self: flex-start;
-      -ms-flex-item-align: start;
-          align-self: flex-start;
-  padding: 0.25rem 0.75rem;
-  font-size: 1.25rem;
-  line-height: 1;
-  background: transparent;
-  border: 1px solid transparent;
-  border-radius: 0.25rem;
-}
-
-.navbar-toggler:focus, .navbar-toggler:hover {
-  text-decoration: none;
-}
-
-.navbar-toggler-icon {
-  display: inline-block;
-  width: 1.5em;
-  height: 1.5em;
-  vertical-align: middle;
-  content: "";
-  background: no-repeat center center;
-  -webkit-background-size: 100% 100%;
-          background-size: 100% 100%;
-}
-
-.navbar-toggler-left {
-  position: absolute;
-  left: 1rem;
-}
-
-.navbar-toggler-right {
-  position: absolute;
-  right: 1rem;
-}
-
-@media (max-width: 575px) {
-  .navbar-toggleable .navbar-nav .dropdown-menu {
-    position: static;
-    float: none;
-  }
-  .navbar-toggleable > .container {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 576px) {
-  .navbar-toggleable {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable .navbar-nav {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-  }
-  .navbar-toggleable .navbar-nav .nav-link {
-    padding-right: .5rem;
-    padding-left: .5rem;
-  }
-  .navbar-toggleable > .container {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable .navbar-collapse {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-    width: 100%;
-  }
-  .navbar-toggleable .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 767px) {
-  .navbar-toggleable-sm .navbar-nav .dropdown-menu {
-    position: static;
-    float: none;
-  }
-  .navbar-toggleable-sm > .container {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 768px) {
-  .navbar-toggleable-sm {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-sm .navbar-nav {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-  }
-  .navbar-toggleable-sm .navbar-nav .nav-link {
-    padding-right: .5rem;
-    padding-left: .5rem;
-  }
-  .navbar-toggleable-sm > .container {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-sm .navbar-collapse {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-    width: 100%;
-  }
-  .navbar-toggleable-sm .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 991px) {
-  .navbar-toggleable-md .navbar-nav .dropdown-menu {
-    position: static;
-    float: none;
-  }
-  .navbar-toggleable-md > .container {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 992px) {
-  .navbar-toggleable-md {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-md .navbar-nav {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-  }
-  .navbar-toggleable-md .navbar-nav .nav-link {
-    padding-right: .5rem;
-    padding-left: .5rem;
-  }
-  .navbar-toggleable-md > .container {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-md .navbar-collapse {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-    width: 100%;
-  }
-  .navbar-toggleable-md .navbar-toggler {
-    display: none;
-  }
-}
-
-@media (max-width: 1199px) {
-  .navbar-toggleable-lg .navbar-nav .dropdown-menu {
-    position: static;
-    float: none;
-  }
-  .navbar-toggleable-lg > .container {
-    padding-right: 0;
-    padding-left: 0;
-  }
-}
-
-@media (min-width: 1200px) {
-  .navbar-toggleable-lg {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-lg .navbar-nav {
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: row;
-        -ms-flex-direction: row;
-            flex-direction: row;
-  }
-  .navbar-toggleable-lg .navbar-nav .nav-link {
-    padding-right: .5rem;
-    padding-left: .5rem;
-  }
-  .navbar-toggleable-lg > .container {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-wrap: nowrap;
-        -ms-flex-wrap: nowrap;
-            flex-wrap: nowrap;
-    -webkit-box-align: center;
-    -webkit-align-items: center;
-        -ms-flex-align: center;
-            align-items: center;
-  }
-  .navbar-toggleable-lg .navbar-collapse {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-    width: 100%;
-  }
-  .navbar-toggleable-lg .navbar-toggler {
-    display: none;
-  }
-}
-
-.navbar-toggleable-xl {
-  -webkit-box-orient: horizontal;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: row;
-      -ms-flex-direction: row;
-          flex-direction: row;
-  -webkit-flex-wrap: nowrap;
-      -ms-flex-wrap: nowrap;
-          flex-wrap: nowrap;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-
-.navbar-toggleable-xl .navbar-nav .dropdown-menu {
-  position: static;
-  float: none;
-}
-
-.navbar-toggleable-xl > .container {
-  padding-right: 0;
-  padding-left: 0;
-}
-
-.navbar-toggleable-xl .navbar-nav {
-  -webkit-box-orient: horizontal;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: row;
-      -ms-flex-direction: row;
-          flex-direction: row;
-}
-
-.navbar-toggleable-xl .navbar-nav .nav-link {
-  padding-right: .5rem;
-  padding-left: .5rem;
-}
-
-.navbar-toggleable-xl > .container {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-wrap: nowrap;
-      -ms-flex-wrap: nowrap;
-          flex-wrap: nowrap;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-
-.navbar-toggleable-xl .navbar-collapse {
-  display: -webkit-box !important;
-  display: -webkit-flex !important;
-  display: -ms-flexbox !important;
-  display: flex !important;
-  width: 100%;
-}
-
-.navbar-toggleable-xl .navbar-toggler {
-  display: none;
-}
-
-.navbar-light .navbar-brand,
-.navbar-light .navbar-toggler {
-  color: rgba(0, 0, 0, 0.9);
-}
-
-.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover,
-.navbar-light .navbar-toggler:focus,
-.navbar-light .navbar-toggler:hover {
-  color: rgba(0, 0, 0, 0.9);
-}
-
-.navbar-light .navbar-nav .nav-link {
-  color: rgba(0, 0, 0, 0.5);
-}
-
-.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.navbar-light .navbar-nav .nav-link.disabled {
-  color: rgba(0, 0, 0, 0.3);
-}
-
-.navbar-light .navbar-nav .open > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.open,
-.navbar-light .navbar-nav .nav-link.active {
-  color: rgba(0, 0, 0, 0.9);
-}
-
-.navbar-light .navbar-toggler {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-
-.navbar-light .navbar-toggler-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");
-}
-
-.navbar-light .navbar-text {
-  color: rgba(0, 0, 0, 0.5);
-}
-
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-toggler {
-  color: white;
-}
-
-.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-toggler:focus,
-.navbar-inverse .navbar-toggler:hover {
-  color: white;
-}
-
-.navbar-inverse .navbar-nav .nav-link {
-  color: rgba(255, 255, 255, 0.5);
-}
-
-.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.navbar-inverse .navbar-nav .nav-link.disabled {
-  color: rgba(255, 255, 255, 0.25);
-}
-
-.navbar-inverse .navbar-nav .open > .nav-link,
-.navbar-inverse .navbar-nav .active > .nav-link,
-.navbar-inverse .navbar-nav .nav-link.open,
-.navbar-inverse .navbar-nav .nav-link.active {
-  color: white;
-}
-
-.navbar-inverse .navbar-toggler {
-  border-color: rgba(255, 255, 255, 0.1);
-}
-
-.navbar-inverse .navbar-toggler-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");
-}
-
-.navbar-inverse .navbar-text {
-  color: rgba(255, 255, 255, 0.5);
-}
-
-.card {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  background-color: #fff;
-  border: 1px solid rgba(0, 0, 0, 0.125);
-  border-radius: 0.25rem;
-}
-
-.card-block {
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 auto;
-      -ms-flex: 1 1 auto;
-          flex: 1 1 auto;
-  padding: 1.25rem;
-}
-
-.card-title {
-  margin-bottom: 0.75rem;
-}
-
-.card-subtitle {
-  margin-top: -0.375rem;
-  margin-bottom: 0;
-}
-
-.card-text:last-child {
-  margin-bottom: 0;
-}
-
-.card-link:hover {
-  text-decoration: none;
-}
-
-.card-link + .card-link {
-  margin-left: 1.25rem;
-}
-
-.card > .list-group:first-child .list-group-item:first-child {
-  border-top-right-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.card > .list-group:last-child .list-group-item:last-child {
-  border-bottom-right-radius: 0.25rem;
-  border-bottom-left-radius: 0.25rem;
-}
-
-.card-header {
-  padding: 0.75rem 1.25rem;
-  margin-bottom: 0;
-  background-color: #f7f7f9;
-  border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-header:first-child {
-  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
-}
-
-.card-footer {
-  padding: 0.75rem 1.25rem;
-  background-color: #f7f7f9;
-  border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.card-footer:last-child {
-  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
-}
-
-.card-header-tabs {
-  margin-right: -0.625rem;
-  margin-bottom: -0.75rem;
-  margin-left: -0.625rem;
-  border-bottom: 0;
-}
-
-.card-header-pills {
-  margin-right: -0.625rem;
-  margin-left: -0.625rem;
-}
-
-.card-primary {
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.card-primary .card-header,
-.card-primary .card-footer {
-  background-color: transparent;
-}
-
-.card-success {
-  background-color: #5cb85c;
-  border-color: #5cb85c;
-}
-
-.card-success .card-header,
-.card-success .card-footer {
-  background-color: transparent;
-}
-
-.card-info {
-  background-color: #5bc0de;
-  border-color: #5bc0de;
-}
-
-.card-info .card-header,
-.card-info .card-footer {
-  background-color: transparent;
-}
-
-.card-warning {
-  background-color: #f0ad4e;
-  border-color: #f0ad4e;
-}
-
-.card-warning .card-header,
-.card-warning .card-footer {
-  background-color: transparent;
-}
-
-.card-danger {
-  background-color: #d9534f;
-  border-color: #d9534f;
-}
-
-.card-danger .card-header,
-.card-danger .card-footer {
-  background-color: transparent;
-}
-
-.card-outline-primary {
-  background-color: transparent;
-  border-color: #0275d8;
-}
-
-.card-outline-secondary {
-  background-color: transparent;
-  border-color: #ccc;
-}
-
-.card-outline-info {
-  background-color: transparent;
-  border-color: #5bc0de;
-}
-
-.card-outline-success {
-  background-color: transparent;
-  border-color: #5cb85c;
-}
-
-.card-outline-warning {
-  background-color: transparent;
-  border-color: #f0ad4e;
-}
-
-.card-outline-danger {
-  background-color: transparent;
-  border-color: #d9534f;
-}
-
-.card-inverse {
-  color: rgba(255, 255, 255, 0.65);
-}
-
-.card-inverse .card-header,
-.card-inverse .card-footer {
-  background-color: transparent;
-  border-color: rgba(255, 255, 255, 0.2);
-}
-
-.card-inverse .card-header,
-.card-inverse .card-footer,
-.card-inverse .card-title,
-.card-inverse .card-blockquote {
-  color: #fff;
-}
-
-.card-inverse .card-link,
-.card-inverse .card-text,
-.card-inverse .card-subtitle,
-.card-inverse .card-blockquote .blockquote-footer {
-  color: rgba(255, 255, 255, 0.65);
-}
-
-.card-inverse .card-link:focus, .card-inverse .card-link:hover {
-  color: #fff;
-}
-
-.card-blockquote {
-  padding: 0;
-  margin-bottom: 0;
-  border-left: 0;
-}
-
-.card-img {
-  border-radius: calc(0.25rem - 1px);
-}
-
-.card-img-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 1.25rem;
-}
-
-.card-img-top {
-  border-top-right-radius: calc(0.25rem - 1px);
-  border-top-left-radius: calc(0.25rem - 1px);
-}
-
-.card-img-bottom {
-  border-bottom-right-radius: calc(0.25rem - 1px);
-  border-bottom-left-radius: calc(0.25rem - 1px);
-}
-
-@media (min-width: 576px) {
-  .card-deck {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-flow: row wrap;
-        -ms-flex-flow: row wrap;
-            flex-flow: row wrap;
-  }
-  .card-deck .card {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-flex: 1;
-    -webkit-flex: 1 0 0%;
-        -ms-flex: 1 0 0%;
-            flex: 1 0 0%;
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-    -webkit-flex-direction: column;
-        -ms-flex-direction: column;
-            flex-direction: column;
-  }
-  .card-deck .card:not(:first-child) {
-    margin-left: 15px;
-  }
-  .card-deck .card:not(:last-child) {
-    margin-right: 15px;
-  }
-}
-
-@media (min-width: 576px) {
-  .card-group {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-flow: row wrap;
-        -ms-flex-flow: row wrap;
-            flex-flow: row wrap;
-  }
-  .card-group .card {
-    -webkit-box-flex: 1;
-    -webkit-flex: 1 0 0%;
-        -ms-flex: 1 0 0%;
-            flex: 1 0 0%;
-  }
-  .card-group .card + .card {
-    margin-left: 0;
-    border-left: 0;
-  }
-  .card-group .card:first-child {
-    border-bottom-right-radius: 0;
-    border-top-right-radius: 0;
-  }
-  .card-group .card:first-child .card-img-top {
-    border-top-right-radius: 0;
-  }
-  .card-group .card:first-child .card-img-bottom {
-    border-bottom-right-radius: 0;
-  }
-  .card-group .card:last-child {
-    border-bottom-left-radius: 0;
-    border-top-left-radius: 0;
-  }
-  .card-group .card:last-child .card-img-top {
-    border-top-left-radius: 0;
-  }
-  .card-group .card:last-child .card-img-bottom {
-    border-bottom-left-radius: 0;
-  }
-  .card-group .card:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-  .card-group .card:not(:first-child):not(:last-child) .card-img-top,
-  .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {
-    border-radius: 0;
-  }
-}
-
-@media (min-width: 576px) {
-  .card-columns {
-    -webkit-column-count: 3;
-       -moz-column-count: 3;
-            column-count: 3;
-    -webkit-column-gap: 1.25rem;
-       -moz-column-gap: 1.25rem;
-            column-gap: 1.25rem;
-  }
-  .card-columns .card {
-    display: inline-block;
-    width: 100%;
-    margin-bottom: 0.75rem;
-  }
-}
-
-.breadcrumb {
-  padding: 0.75rem 1rem;
-  margin-bottom: 1rem;
-  list-style: none;
-  background-color: #eceeef;
-  border-radius: 0.25rem;
-}
-
-.breadcrumb::after {
-  display: block;
-  content: "";
-  clear: both;
-}
-
-.breadcrumb-item {
-  float: left;
-}
-
-.breadcrumb-item + .breadcrumb-item::before {
-  display: inline-block;
-  padding-right: 0.5rem;
-  padding-left: 0.5rem;
-  color: #636c72;
-  content: "/";
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: underline;
-}
-
-.breadcrumb-item + .breadcrumb-item:hover::before {
-  text-decoration: none;
-}
-
-.breadcrumb-item.active {
-  color: #636c72;
-}
-
-.pagination {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  padding-left: 0;
-  list-style: none;
-  border-radius: 0.25rem;
-}
-
-.page-item:first-child .page-link {
-  margin-left: 0;
-  border-bottom-left-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.page-item:last-child .page-link {
-  border-bottom-right-radius: 0.25rem;
-  border-top-right-radius: 0.25rem;
-}
-
-.page-item.active .page-link {
-  z-index: 2;
-  color: #fff;
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.page-item.disabled .page-link {
-  color: #636c72;
-  pointer-events: none;
-  cursor: not-allowed;
-  background-color: #fff;
-  border-color: #ddd;
-}
-
-.page-link {
-  position: relative;
-  display: block;
-  padding: 0.5rem 0.75rem;
-  margin-left: -1px;
-  line-height: 1.25;
-  color: #0275d8;
-  background-color: #fff;
-  border: 1px solid #ddd;
-}
-
-.page-link:focus, .page-link:hover {
-  color: #014c8c;
-  text-decoration: none;
-  background-color: #eceeef;
-  border-color: #ddd;
-}
-
-.pagination-lg .page-link {
-  padding: 0.75rem 1.5rem;
-  font-size: 1.25rem;
-}
-
-.pagination-lg .page-item:first-child .page-link {
-  border-bottom-left-radius: 0.3rem;
-  border-top-left-radius: 0.3rem;
-}
-
-.pagination-lg .page-item:last-child .page-link {
-  border-bottom-right-radius: 0.3rem;
-  border-top-right-radius: 0.3rem;
-}
-
-.pagination-sm .page-link {
-  padding: 0.25rem 0.5rem;
-  font-size: 0.875rem;
-}
-
-.pagination-sm .page-item:first-child .page-link {
-  border-bottom-left-radius: 0.2rem;
-  border-top-left-radius: 0.2rem;
-}
-
-.pagination-sm .page-item:last-child .page-link {
-  border-bottom-right-radius: 0.2rem;
-  border-top-right-radius: 0.2rem;
-}
-
-.badge {
-  display: inline-block;
-  padding: 0.25em 0.4em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: #fff;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: 0.25rem;
-}
-
-.badge:empty {
-  display: none;
-}
-
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-a.badge:focus, a.badge:hover {
-  color: #fff;
-  text-decoration: none;
-  cursor: pointer;
-}
-
-.badge-pill {
-  padding-right: 0.6em;
-  padding-left: 0.6em;
-  border-radius: 10rem;
-}
-
-.badge-default {
-  background-color: #636c72;
-}
-
-.badge-default[href]:focus, .badge-default[href]:hover {
-  background-color: #4b5257;
-}
-
-.badge-primary {
-  background-color: #0275d8;
-}
-
-.badge-primary[href]:focus, .badge-primary[href]:hover {
-  background-color: #025aa5;
-}
-
-.badge-success {
-  background-color: #5cb85c;
-}
-
-.badge-success[href]:focus, .badge-success[href]:hover {
-  background-color: #449d44;
-}
-
-.badge-info {
-  background-color: #5bc0de;
-}
-
-.badge-info[href]:focus, .badge-info[href]:hover {
-  background-color: #31b0d5;
-}
-
-.badge-warning {
-  background-color: #f0ad4e;
-}
-
-.badge-warning[href]:focus, .badge-warning[href]:hover {
-  background-color: #ec971f;
-}
-
-.badge-danger {
-  background-color: #d9534f;
-}
-
-.badge-danger[href]:focus, .badge-danger[href]:hover {
-  background-color: #c9302c;
-}
-
-.jumbotron {
-  padding: 2rem 1rem;
-  margin-bottom: 2rem;
-  background-color: #eceeef;
-  border-radius: 0.3rem;
-}
-
-@media (min-width: 576px) {
-  .jumbotron {
-    padding: 4rem 2rem;
-  }
-}
-
-.jumbotron-hr {
-  border-top-color: #d0d5d8;
-}
-
-.jumbotron-fluid {
-  padding-right: 0;
-  padding-left: 0;
-  border-radius: 0;
-}
-
-.alert {
-  padding: 0.75rem 1.25rem;
-  margin-bottom: 1rem;
-  border: 1px solid transparent;
-  border-radius: 0.25rem;
-}
-
-.alert-heading {
-  color: inherit;
-}
-
-.alert-link {
-  font-weight: bold;
-}
-
-.alert-dismissible .close {
-  position: relative;
-  top: -0.75rem;
-  right: -1.25rem;
-  padding: 0.75rem 1.25rem;
-  color: inherit;
-}
-
-.alert-success {
-  background-color: #dff0d8;
-  border-color: #d0e9c6;
-  color: #3c763d;
-}
-
-.alert-success hr {
-  border-top-color: #c1e2b3;
-}
-
-.alert-success .alert-link {
-  color: #2b542c;
-}
-
-.alert-info {
-  background-color: #d9edf7;
-  border-color: #bcdff1;
-  color: #31708f;
-}
-
-.alert-info hr {
-  border-top-color: #a6d5ec;
-}
-
-.alert-info .alert-link {
-  color: #245269;
-}
-
-.alert-warning {
-  background-color: #fcf8e3;
-  border-color: #faf2cc;
-  color: #8a6d3b;
-}
-
-.alert-warning hr {
-  border-top-color: #f7ecb5;
-}
-
-.alert-warning .alert-link {
-  color: #66512c;
-}
-
-.alert-danger {
-  background-color: #f2dede;
-  border-color: #ebcccc;
-  color: #a94442;
-}
-
-.alert-danger hr {
-  border-top-color: #e4b9b9;
-}
-
-.alert-danger .alert-link {
-  color: #843534;
-}
-
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 1rem 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 1rem 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 1rem 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-.progress {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  overflow: hidden;
-  font-size: 0.75rem;
-  line-height: 1rem;
-  text-align: center;
-  background-color: #eceeef;
-  border-radius: 0.25rem;
-}
-
-.progress-bar {
-  height: 1rem;
-  color: #fff;
-  background-color: #0275d8;
-}
-
-.progress-bar-striped {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-  -webkit-background-size: 1rem 1rem;
-          background-size: 1rem 1rem;
-}
-
-.progress-bar-animated {
-  -webkit-animation: progress-bar-stripes 1s linear infinite;
-       -o-animation: progress-bar-stripes 1s linear infinite;
-          animation: progress-bar-stripes 1s linear infinite;
-}
-
-.media {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: start;
-  -webkit-align-items: flex-start;
-      -ms-flex-align: start;
-          align-items: flex-start;
-}
-
-.media-body {
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 0%;
-      -ms-flex: 1 1 0%;
-          flex: 1 1 0%;
-}
-
-.list-group {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  padding-left: 0;
-  margin-bottom: 0;
-}
-
-.list-group-item-action {
-  width: 100%;
-  color: #464a4c;
-  text-align: inherit;
-}
-
-.list-group-item-action .list-group-item-heading {
-  color: #292b2c;
-}
-
-.list-group-item-action:focus, .list-group-item-action:hover {
-  color: #464a4c;
-  text-decoration: none;
-  background-color: #f7f7f9;
-}
-
-.list-group-item-action:active {
-  color: #292b2c;
-  background-color: #eceeef;
-}
-
-.list-group-item {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-flow: row wrap;
-      -ms-flex-flow: row wrap;
-          flex-flow: row wrap;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  padding: 0.75rem 1.25rem;
-  margin-bottom: -1px;
-  background-color: #fff;
-  border: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-.list-group-item:first-child {
-  border-top-right-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  border-bottom-right-radius: 0.25rem;
-  border-bottom-left-radius: 0.25rem;
-}
-
-.list-group-item:focus, .list-group-item:hover {
-  text-decoration: none;
-}
-
-.list-group-item.disabled, .list-group-item:disabled {
-  color: #636c72;
-  cursor: not-allowed;
-  background-color: #fff;
-}
-
-.list-group-item.disabled .list-group-item-heading, .list-group-item:disabled .list-group-item-heading {
-  color: inherit;
-}
-
-.list-group-item.disabled .list-group-item-text, .list-group-item:disabled .list-group-item-text {
-  color: #636c72;
-}
-
-.list-group-item.active {
-  z-index: 2;
-  color: #fff;
-  background-color: #0275d8;
-  border-color: #0275d8;
-}
-
-.list-group-item.active .list-group-item-heading,
-.list-group-item.active .list-group-item-heading > small,
-.list-group-item.active .list-group-item-heading > .small {
-  color: inherit;
-}
-
-.list-group-item.active .list-group-item-text {
-  color: #daeeff;
-}
-
-.list-group-flush .list-group-item {
-  border-right: 0;
-  border-left: 0;
-  border-radius: 0;
-}
-
-.list-group-flush:first-child .list-group-item:first-child {
-  border-top: 0;
-}
-
-.list-group-flush:last-child .list-group-item:last-child {
-  border-bottom: 0;
-}
-
-.list-group-item-success {
-  color: #3c763d;
-  background-color: #dff0d8;
-}
-
-a.list-group-item-success,
-button.list-group-item-success {
-  color: #3c763d;
-}
-
-a.list-group-item-success .list-group-item-heading,
-button.list-group-item-success .list-group-item-heading {
-  color: inherit;
-}
-
-a.list-group-item-success:focus, a.list-group-item-success:hover,
-button.list-group-item-success:focus,
-button.list-group-item-success:hover {
-  color: #3c763d;
-  background-color: #d0e9c6;
-}
-
-a.list-group-item-success.active,
-button.list-group-item-success.active {
-  color: #fff;
-  background-color: #3c763d;
-  border-color: #3c763d;
-}
-
-.list-group-item-info {
-  color: #31708f;
-  background-color: #d9edf7;
-}
-
-a.list-group-item-info,
-button.list-group-item-info {
-  color: #31708f;
-}
-
-a.list-group-item-info .list-group-item-heading,
-button.list-group-item-info .list-group-item-heading {
-  color: inherit;
-}
-
-a.list-group-item-info:focus, a.list-group-item-info:hover,
-button.list-group-item-info:focus,
-button.list-group-item-info:hover {
-  color: #31708f;
-  background-color: #c4e3f3;
-}
-
-a.list-group-item-info.active,
-button.list-group-item-info.active {
-  color: #fff;
-  background-color: #31708f;
-  border-color: #31708f;
-}
-
-.list-group-item-warning {
-  color: #8a6d3b;
-  background-color: #fcf8e3;
-}
-
-a.list-group-item-warning,
-button.list-group-item-warning {
-  color: #8a6d3b;
-}
-
-a.list-group-item-warning .list-group-item-heading,
-button.list-group-item-warning .list-group-item-heading {
-  color: inherit;
-}
-
-a.list-group-item-warning:focus, a.list-group-item-warning:hover,
-button.list-group-item-warning:focus,
-button.list-group-item-warning:hover {
-  color: #8a6d3b;
-  background-color: #faf2cc;
-}
-
-a.list-group-item-warning.active,
-button.list-group-item-warning.active {
-  color: #fff;
-  background-color: #8a6d3b;
-  border-color: #8a6d3b;
-}
-
-.list-group-item-danger {
-  color: #a94442;
-  background-color: #f2dede;
-}
-
-a.list-group-item-danger,
-button.list-group-item-danger {
-  color: #a94442;
-}
-
-a.list-group-item-danger .list-group-item-heading,
-button.list-group-item-danger .list-group-item-heading {
-  color: inherit;
-}
-
-a.list-group-item-danger:focus, a.list-group-item-danger:hover,
-button.list-group-item-danger:focus,
-button.list-group-item-danger:hover {
-  color: #a94442;
-  background-color: #ebcccc;
-}
-
-a.list-group-item-danger.active,
-button.list-group-item-danger.active {
-  color: #fff;
-  background-color: #a94442;
-  border-color: #a94442;
-}
-
-.embed-responsive {
-  position: relative;
-  display: block;
-  width: 100%;
-  padding: 0;
-  overflow: hidden;
-}
-
-.embed-responsive::before {
-  display: block;
-  content: "";
-}
-
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  border: 0;
-}
-
-.embed-responsive-21by9::before {
-  padding-top: 42.857143%;
-}
-
-.embed-responsive-16by9::before {
-  padding-top: 56.25%;
-}
-
-.embed-responsive-4by3::before {
-  padding-top: 75%;
-}
-
-.embed-responsive-1by1::before {
-  padding-top: 100%;
-}
-
-.close {
-  float: right;
-  font-size: 1.5rem;
-  font-weight: bold;
-  line-height: 1;
-  color: #000;
-  text-shadow: 0 1px 0 #fff;
-  opacity: .5;
-}
-
-.close:focus, .close:hover {
-  color: #000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: .75;
-}
-
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.modal-open {
-  overflow: hidden;
-}
-
-.modal {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1050;
-  display: none;
-  overflow: hidden;
-  outline: 0;
-}
-
-.modal.fade .modal-dialog {
-  -webkit-transition: -webkit-transform 0.3s ease-out;
-  transition: -webkit-transform 0.3s ease-out;
-  -o-transition: -o-transform 0.3s ease-out;
-  transition: transform 0.3s ease-out;
-  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;
-  -webkit-transform: translate(0, -25%);
-       -o-transform: translate(0, -25%);
-          transform: translate(0, -25%);
-}
-
-.modal.show .modal-dialog {
-  -webkit-transform: translate(0, 0);
-       -o-transform: translate(0, 0);
-          transform: translate(0, 0);
-}
-
-.modal-open .modal {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-
-.modal-content {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  border-radius: 0.3rem;
-  outline: 0;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop.show {
-  opacity: 0.5;
-}
-
-.modal-header {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: justify;
-  -webkit-justify-content: space-between;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  padding: 15px;
-  border-bottom: 1px solid #eceeef;
-}
-
-.modal-title {
-  margin-bottom: 0;
-  line-height: 1.5;
-}
-
-.modal-body {
-  position: relative;
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 1 auto;
-      -ms-flex: 1 1 auto;
-          flex: 1 1 auto;
-  padding: 15px;
-}
-
-.modal-footer {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: end;
-  -webkit-justify-content: flex-end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-  padding: 15px;
-  border-top: 1px solid #eceeef;
-}
-
-.modal-footer > :not(:first-child) {
-  margin-left: .25rem;
-}
-
-.modal-footer > :not(:last-child) {
-  margin-right: .25rem;
-}
-
-.modal-scrollbar-measure {
-  position: absolute;
-  top: -9999px;
-  width: 50px;
-  height: 50px;
-  overflow: scroll;
-}
-
-@media (min-width: 576px) {
-  .modal-dialog {
-    max-width: 500px;
-    margin: 30px auto;
-  }
-  .modal-sm {
-    max-width: 300px;
-  }
-}
-
-@media (min-width: 992px) {
-  .modal-lg {
-    max-width: 800px;
-  }
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1070;
-  display: block;
-  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
-  font-style: normal;
-  font-weight: normal;
-  letter-spacing: normal;
-  line-break: auto;
-  line-height: 1.5;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  white-space: normal;
-  word-break: normal;
-  word-spacing: normal;
-  font-size: 0.875rem;
-  word-wrap: break-word;
-  opacity: 0;
-}
-
-.tooltip.show {
-  opacity: 0.9;
-}
-
-.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {
-  padding: 5px 0;
-  margin-top: -3px;
-}
-
-.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  content: "";
-  border-width: 5px 5px 0;
-  border-top-color: #000;
-}
-
-.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {
-  padding: 0 5px;
-  margin-left: 3px;
-}
-
-.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  content: "";
-  border-width: 5px 5px 5px 0;
-  border-right-color: #000;
-}
-
-.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {
-  padding: 5px 0;
-  margin-top: 3px;
-}
-
-.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  content: "";
-  border-width: 0 5px 5px;
-  border-bottom-color: #000;
-}
-
-.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {
-  padding: 0 5px;
-  margin-left: -3px;
-}
-
-.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  content: "";
-  border-width: 5px 0 5px 5px;
-  border-left-color: #000;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 3px 8px;
-  color: #fff;
-  text-align: center;
-  background-color: #000;
-  border-radius: 0.25rem;
-}
-
-.tooltip-inner::before {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1060;
-  display: block;
-  max-width: 276px;
-  padding: 1px;
-  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
-  font-style: normal;
-  font-weight: normal;
-  letter-spacing: normal;
-  line-break: auto;
-  line-height: 1.5;
-  text-align: left;
-  text-align: start;
-  text-decoration: none;
-  text-shadow: none;
-  text-transform: none;
-  white-space: normal;
-  word-break: normal;
-  word-spacing: normal;
-  font-size: 0.875rem;
-  word-wrap: break-word;
-  background-color: #fff;
-  -webkit-background-clip: padding-box;
-          background-clip: padding-box;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  border-radius: 0.3rem;
-}
-
-.popover.popover-top, .popover.bs-tether-element-attached-bottom {
-  margin-top: -10px;
-}
-
-.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {
-  left: 50%;
-  border-bottom-width: 0;
-}
-
-.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {
-  bottom: -11px;
-  margin-left: -11px;
-  border-top-color: rgba(0, 0, 0, 0.25);
-}
-
-.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {
-  bottom: -10px;
-  margin-left: -10px;
-  border-top-color: #fff;
-}
-
-.popover.popover-right, .popover.bs-tether-element-attached-left {
-  margin-left: 10px;
-}
-
-.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {
-  top: 50%;
-  border-left-width: 0;
-}
-
-.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {
-  left: -11px;
-  margin-top: -11px;
-  border-right-color: rgba(0, 0, 0, 0.25);
-}
-
-.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {
-  left: -10px;
-  margin-top: -10px;
-  border-right-color: #fff;
-}
-
-.popover.popover-bottom, .popover.bs-tether-element-attached-top {
-  margin-top: 10px;
-}
-
-.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {
-  left: 50%;
-  border-top-width: 0;
-}
-
-.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {
-  top: -11px;
-  margin-left: -11px;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-}
-
-.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {
-  top: -10px;
-  margin-left: -10px;
-  border-bottom-color: #f7f7f7;
-}
-
-.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {
-  position: absolute;
-  top: 0;
-  left: 50%;
-  display: block;
-  width: 20px;
-  margin-left: -10px;
-  content: "";
-  border-bottom: 1px solid #f7f7f7;
-}
-
-.popover.popover-left, .popover.bs-tether-element-attached-right {
-  margin-left: -10px;
-}
-
-.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {
-  top: 50%;
-  border-right-width: 0;
-}
-
-.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {
-  right: -11px;
-  margin-top: -11px;
-  border-left-color: rgba(0, 0, 0, 0.25);
-}
-
-.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {
-  right: -10px;
-  margin-top: -10px;
-  border-left-color: #fff;
-}
-
-.popover-title {
-  padding: 8px 14px;
-  margin-bottom: 0;
-  font-size: 1rem;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  border-top-right-radius: calc(0.3rem - 1px);
-  border-top-left-radius: calc(0.3rem - 1px);
-}
-
-.popover-title:empty {
-  display: none;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-.popover::before,
-.popover::after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover::before {
-  content: "";
-  border-width: 11px;
-}
-
-.popover::after {
-  content: "";
-  border-width: 10px;
-}
-
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-item {
-  position: relative;
-  display: none;
-  width: 100%;
-}
-
-@media (-webkit-transform-3d) {
-  .carousel-item {
-    -webkit-transition: -webkit-transform 0.6s ease-in-out;
-    transition: -webkit-transform 0.6s ease-in-out;
-    -o-transition: -o-transform 0.6s ease-in-out;
-    transition: transform 0.6s ease-in-out;
-    transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;
-    -webkit-backface-visibility: hidden;
-            backface-visibility: hidden;
-    -webkit-perspective: 1000px;
-            perspective: 1000px;
-  }
-}
-
-@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) {
-  .carousel-item {
-    -webkit-transition: -webkit-transform 0.6s ease-in-out;
-    transition: -webkit-transform 0.6s ease-in-out;
-    -o-transition: -o-transform 0.6s ease-in-out;
-    transition: transform 0.6s ease-in-out;
-    transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;
-    -webkit-backface-visibility: hidden;
-            backface-visibility: hidden;
-    -webkit-perspective: 1000px;
-            perspective: 1000px;
-  }
-}
-
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.carousel-item-next,
-.carousel-item-prev {
-  position: absolute;
-  top: 0;
-}
-
-@media (-webkit-transform-3d) {
-  .carousel-item-next.carousel-item-left,
-  .carousel-item-prev.carousel-item-right {
-    -webkit-transform: translate3d(0, 0, 0);
-            transform: translate3d(0, 0, 0);
-  }
-  .carousel-item-next,
-  .active.carousel-item-right {
-    -webkit-transform: translate3d(100%, 0, 0);
-            transform: translate3d(100%, 0, 0);
-  }
-  .carousel-item-prev,
-  .active.carousel-item-left {
-    -webkit-transform: translate3d(-100%, 0, 0);
-            transform: translate3d(-100%, 0, 0);
-  }
-}
-
-@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) {
-  .carousel-item-next.carousel-item-left,
-  .carousel-item-prev.carousel-item-right {
-    -webkit-transform: translate3d(0, 0, 0);
-            transform: translate3d(0, 0, 0);
-  }
-  .carousel-item-next,
-  .active.carousel-item-right {
-    -webkit-transform: translate3d(100%, 0, 0);
-            transform: translate3d(100%, 0, 0);
-  }
-  .carousel-item-prev,
-  .active.carousel-item-left {
-    -webkit-transform: translate3d(-100%, 0, 0);
-            transform: translate3d(-100%, 0, 0);
-  }
-}
-
-.carousel-control-prev,
-.carousel-control-next {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  width: 15%;
-  color: #fff;
-  text-align: center;
-  opacity: 0.5;
-}
-
-.carousel-control-prev:focus, .carousel-control-prev:hover,
-.carousel-control-next:focus,
-.carousel-control-next:hover {
-  color: #fff;
-  text-decoration: none;
-  outline: 0;
-  opacity: .9;
-}
-
-.carousel-control-prev {
-  left: 0;
-}
-
-.carousel-control-next {
-  right: 0;
-}
-
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
-  display: inline-block;
-  width: 20px;
-  height: 20px;
-  background: transparent no-repeat center center;
-  -webkit-background-size: 100% 100%;
-          background-size: 100% 100%;
-}
-
-.carousel-control-prev-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
-}
-
-.carousel-control-next-icon {
-  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
-}
-
-.carousel-indicators {
-  position: absolute;
-  right: 0;
-  bottom: 10px;
-  left: 0;
-  z-index: 15;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: center;
-  -webkit-justify-content: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  padding-left: 0;
-  margin-right: 15%;
-  margin-left: 15%;
-  list-style: none;
-}
-
-.carousel-indicators li {
-  position: relative;
-  -webkit-box-flex: 1;
-  -webkit-flex: 1 0 auto;
-      -ms-flex: 1 0 auto;
-          flex: 1 0 auto;
-  max-width: 30px;
-  height: 3px;
-  margin-right: 3px;
-  margin-left: 3px;
-  text-indent: -999px;
-  cursor: pointer;
-  background-color: rgba(255, 255, 255, 0.5);
-}
-
-.carousel-indicators li::before {
-  position: absolute;
-  top: -10px;
-  left: 0;
-  display: inline-block;
-  width: 100%;
-  height: 10px;
-  content: "";
-}
-
-.carousel-indicators li::after {
-  position: absolute;
-  bottom: -10px;
-  left: 0;
-  display: inline-block;
-  width: 100%;
-  height: 10px;
-  content: "";
-}
-
-.carousel-indicators .active {
-  background-color: #fff;
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 15%;
-  bottom: 20px;
-  left: 15%;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: #fff;
-  text-align: center;
-}
-
-.align-baseline {
-  vertical-align: baseline !important;
-}
-
-.align-top {
-  vertical-align: top !important;
-}
-
-.align-middle {
-  vertical-align: middle !important;
-}
-
-.align-bottom {
-  vertical-align: bottom !important;
-}
-
-.align-text-bottom {
-  vertical-align: text-bottom !important;
-}
-
-.align-text-top {
-  vertical-align: text-top !important;
-}
-
-.bg-faded {
-  background-color: #f7f7f7;
-}
-
-.bg-primary {
-  background-color: #0275d8 !important;
-}
-
-a.bg-primary:focus, a.bg-primary:hover {
-  background-color: #025aa5 !important;
-}
-
-.bg-success {
-  background-color: #5cb85c !important;
-}
-
-a.bg-success:focus, a.bg-success:hover {
-  background-color: #449d44 !important;
-}
-
-.bg-info {
-  background-color: #5bc0de !important;
-}
-
-a.bg-info:focus, a.bg-info:hover {
-  background-color: #31b0d5 !important;
-}
-
-.bg-warning {
-  background-color: #f0ad4e !important;
-}
-
-a.bg-warning:focus, a.bg-warning:hover {
-  background-color: #ec971f !important;
-}
-
-.bg-danger {
-  background-color: #d9534f !important;
-}
-
-a.bg-danger:focus, a.bg-danger:hover {
-  background-color: #c9302c !important;
-}
-
-.bg-inverse {
-  background-color: #292b2c !important;
-}
-
-a.bg-inverse:focus, a.bg-inverse:hover {
-  background-color: #101112 !important;
-}
-
-.border-0 {
-  border: 0 !important;
-}
-
-.border-top-0 {
-  border-top: 0 !important;
-}
-
-.border-right-0 {
-  border-right: 0 !important;
-}
-
-.border-bottom-0 {
-  border-bottom: 0 !important;
-}
-
-.border-left-0 {
-  border-left: 0 !important;
-}
-
-.rounded {
-  border-radius: 0.25rem;
-}
-
-.rounded-top {
-  border-top-right-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.rounded-right {
-  border-bottom-right-radius: 0.25rem;
-  border-top-right-radius: 0.25rem;
-}
-
-.rounded-bottom {
-  border-bottom-right-radius: 0.25rem;
-  border-bottom-left-radius: 0.25rem;
-}
-
-.rounded-left {
-  border-bottom-left-radius: 0.25rem;
-  border-top-left-radius: 0.25rem;
-}
-
-.rounded-circle {
-  border-radius: 50%;
-}
-
-.rounded-0 {
-  border-radius: 0;
-}
-
-.clearfix::after {
-  display: block;
-  content: "";
-  clear: both;
-}
-
-.d-none {
-  display: none !important;
-}
-
-.d-inline {
-  display: inline !important;
-}
-
-.d-inline-block {
-  display: inline-block !important;
-}
-
-.d-block {
-  display: block !important;
-}
-
-.d-table {
-  display: table !important;
-}
-
-.d-table-cell {
-  display: table-cell !important;
-}
-
-.d-flex {
-  display: -webkit-box !important;
-  display: -webkit-flex !important;
-  display: -ms-flexbox !important;
-  display: flex !important;
-}
-
-.d-inline-flex {
-  display: -webkit-inline-box !important;
-  display: -webkit-inline-flex !important;
-  display: -ms-inline-flexbox !important;
-  display: inline-flex !important;
-}
-
-@media (min-width: 576px) {
-  .d-sm-none {
-    display: none !important;
-  }
-  .d-sm-inline {
-    display: inline !important;
-  }
-  .d-sm-inline-block {
-    display: inline-block !important;
-  }
-  .d-sm-block {
-    display: block !important;
-  }
-  .d-sm-table {
-    display: table !important;
-  }
-  .d-sm-table-cell {
-    display: table-cell !important;
-  }
-  .d-sm-flex {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-sm-inline-flex {
-    display: -webkit-inline-box !important;
-    display: -webkit-inline-flex !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .d-md-none {
-    display: none !important;
-  }
-  .d-md-inline {
-    display: inline !important;
-  }
-  .d-md-inline-block {
-    display: inline-block !important;
-  }
-  .d-md-block {
-    display: block !important;
-  }
-  .d-md-table {
-    display: table !important;
-  }
-  .d-md-table-cell {
-    display: table-cell !important;
-  }
-  .d-md-flex {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-md-inline-flex {
-    display: -webkit-inline-box !important;
-    display: -webkit-inline-flex !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .d-lg-none {
-    display: none !important;
-  }
-  .d-lg-inline {
-    display: inline !important;
-  }
-  .d-lg-inline-block {
-    display: inline-block !important;
-  }
-  .d-lg-block {
-    display: block !important;
-  }
-  .d-lg-table {
-    display: table !important;
-  }
-  .d-lg-table-cell {
-    display: table-cell !important;
-  }
-  .d-lg-flex {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-lg-inline-flex {
-    display: -webkit-inline-box !important;
-    display: -webkit-inline-flex !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .d-xl-none {
-    display: none !important;
-  }
-  .d-xl-inline {
-    display: inline !important;
-  }
-  .d-xl-inline-block {
-    display: inline-block !important;
-  }
-  .d-xl-block {
-    display: block !important;
-  }
-  .d-xl-table {
-    display: table !important;
-  }
-  .d-xl-table-cell {
-    display: table-cell !important;
-  }
-  .d-xl-flex {
-    display: -webkit-box !important;
-    display: -webkit-flex !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-  .d-xl-inline-flex {
-    display: -webkit-inline-box !important;
-    display: -webkit-inline-flex !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-.flex-first {
-  -webkit-box-ordinal-group: 0;
-  -webkit-order: -1;
-      -ms-flex-order: -1;
-          order: -1;
-}
-
-.flex-last {
-  -webkit-box-ordinal-group: 2;
-  -webkit-order: 1;
-      -ms-flex-order: 1;
-          order: 1;
-}
-
-.flex-unordered {
-  -webkit-box-ordinal-group: 1;
-  -webkit-order: 0;
-      -ms-flex-order: 0;
-          order: 0;
-}
-
-.flex-row {
-  -webkit-box-orient: horizontal !important;
-  -webkit-box-direction: normal !important;
-  -webkit-flex-direction: row !important;
-      -ms-flex-direction: row !important;
-          flex-direction: row !important;
-}
-
-.flex-column {
-  -webkit-box-orient: vertical !important;
-  -webkit-box-direction: normal !important;
-  -webkit-flex-direction: column !important;
-      -ms-flex-direction: column !important;
-          flex-direction: column !important;
-}
-
-.flex-row-reverse {
-  -webkit-box-orient: horizontal !important;
-  -webkit-box-direction: reverse !important;
-  -webkit-flex-direction: row-reverse !important;
-      -ms-flex-direction: row-reverse !important;
-          flex-direction: row-reverse !important;
-}
-
-.flex-column-reverse {
-  -webkit-box-orient: vertical !important;
-  -webkit-box-direction: reverse !important;
-  -webkit-flex-direction: column-reverse !important;
-      -ms-flex-direction: column-reverse !important;
-          flex-direction: column-reverse !important;
-}
-
-.flex-wrap {
-  -webkit-flex-wrap: wrap !important;
-      -ms-flex-wrap: wrap !important;
-          flex-wrap: wrap !important;
-}
-
-.flex-nowrap {
-  -webkit-flex-wrap: nowrap !important;
-      -ms-flex-wrap: nowrap !important;
-          flex-wrap: nowrap !important;
-}
-
-.flex-wrap-reverse {
-  -webkit-flex-wrap: wrap-reverse !important;
-      -ms-flex-wrap: wrap-reverse !important;
-          flex-wrap: wrap-reverse !important;
-}
-
-.justify-content-start {
-  -webkit-box-pack: start !important;
-  -webkit-justify-content: flex-start !important;
-      -ms-flex-pack: start !important;
-          justify-content: flex-start !important;
-}
-
-.justify-content-end {
-  -webkit-box-pack: end !important;
-  -webkit-justify-content: flex-end !important;
-      -ms-flex-pack: end !important;
-          justify-content: flex-end !important;
-}
-
-.justify-content-center {
-  -webkit-box-pack: center !important;
-  -webkit-justify-content: center !important;
-      -ms-flex-pack: center !important;
-          justify-content: center !important;
-}
-
-.justify-content-between {
-  -webkit-box-pack: justify !important;
-  -webkit-justify-content: space-between !important;
-      -ms-flex-pack: justify !important;
-          justify-content: space-between !important;
-}
-
-.justify-content-around {
-  -webkit-justify-content: space-around !important;
-      -ms-flex-pack: distribute !important;
-          justify-content: space-around !important;
-}
-
-.align-items-start {
-  -webkit-box-align: start !important;
-  -webkit-align-items: flex-start !important;
-      -ms-flex-align: start !important;
-          align-items: flex-start !important;
-}
-
-.align-items-end {
-  -webkit-box-align: end !important;
-  -webkit-align-items: flex-end !important;
-      -ms-flex-align: end !important;
-          align-items: flex-end !important;
-}
-
-.align-items-center {
-  -webkit-box-align: center !important;
-  -webkit-align-items: center !important;
-      -ms-flex-align: center !important;
-          align-items: center !important;
-}
-
-.align-items-baseline {
-  -webkit-box-align: baseline !important;
-  -webkit-align-items: baseline !important;
-      -ms-flex-align: baseline !important;
-          align-items: baseline !important;
-}
-
-.align-items-stretch {
-  -webkit-box-align: stretch !important;
-  -webkit-align-items: stretch !important;
-      -ms-flex-align: stretch !important;
-          align-items: stretch !important;
-}
-
-.align-content-start {
-  -webkit-align-content: flex-start !important;
-      -ms-flex-line-pack: start !important;
-          align-content: flex-start !important;
-}
-
-.align-content-end {
-  -webkit-align-content: flex-end !important;
-      -ms-flex-line-pack: end !important;
-          align-content: flex-end !important;
-}
-
-.align-content-center {
-  -webkit-align-content: center !important;
-      -ms-flex-line-pack: center !important;
-          align-content: center !important;
-}
-
-.align-content-between {
-  -webkit-align-content: space-between !important;
-      -ms-flex-line-pack: justify !important;
-          align-content: space-between !important;
-}
-
-.align-content-around {
-  -webkit-align-content: space-around !important;
-      -ms-flex-line-pack: distribute !important;
-          align-content: space-around !important;
-}
-
-.align-content-stretch {
-  -webkit-align-content: stretch !important;
-      -ms-flex-line-pack: stretch !important;
-          align-content: stretch !important;
-}
-
-.align-self-auto {
-  -webkit-align-self: auto !important;
-      -ms-flex-item-align: auto !important;
-              -ms-grid-row-align: auto !important;
-          align-self: auto !important;
-}
-
-.align-self-start {
-  -webkit-align-self: flex-start !important;
-      -ms-flex-item-align: start !important;
-          align-self: flex-start !important;
-}
-
-.align-self-end {
-  -webkit-align-self: flex-end !important;
-      -ms-flex-item-align: end !important;
-          align-self: flex-end !important;
-}
-
-.align-self-center {
-  -webkit-align-self: center !important;
-      -ms-flex-item-align: center !important;
-              -ms-grid-row-align: center !important;
-          align-self: center !important;
-}
-
-.align-self-baseline {
-  -webkit-align-self: baseline !important;
-      -ms-flex-item-align: baseline !important;
-          align-self: baseline !important;
-}
-
-.align-self-stretch {
-  -webkit-align-self: stretch !important;
-      -ms-flex-item-align: stretch !important;
-              -ms-grid-row-align: stretch !important;
-          align-self: stretch !important;
-}
-
-@media (min-width: 576px) {
-  .flex-sm-first {
-    -webkit-box-ordinal-group: 0;
-    -webkit-order: -1;
-        -ms-flex-order: -1;
-            order: -1;
-  }
-  .flex-sm-last {
-    -webkit-box-ordinal-group: 2;
-    -webkit-order: 1;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .flex-sm-unordered {
-    -webkit-box-ordinal-group: 1;
-    -webkit-order: 0;
-        -ms-flex-order: 0;
-            order: 0;
-  }
-  .flex-sm-row {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: row !important;
-        -ms-flex-direction: row !important;
-            flex-direction: row !important;
-  }
-  .flex-sm-column {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: column !important;
-        -ms-flex-direction: column !important;
-            flex-direction: column !important;
-  }
-  .flex-sm-row-reverse {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: row-reverse !important;
-        -ms-flex-direction: row-reverse !important;
-            flex-direction: row-reverse !important;
-  }
-  .flex-sm-column-reverse {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: column-reverse !important;
-        -ms-flex-direction: column-reverse !important;
-            flex-direction: column-reverse !important;
-  }
-  .flex-sm-wrap {
-    -webkit-flex-wrap: wrap !important;
-        -ms-flex-wrap: wrap !important;
-            flex-wrap: wrap !important;
-  }
-  .flex-sm-nowrap {
-    -webkit-flex-wrap: nowrap !important;
-        -ms-flex-wrap: nowrap !important;
-            flex-wrap: nowrap !important;
-  }
-  .flex-sm-wrap-reverse {
-    -webkit-flex-wrap: wrap-reverse !important;
-        -ms-flex-wrap: wrap-reverse !important;
-            flex-wrap: wrap-reverse !important;
-  }
-  .justify-content-sm-start {
-    -webkit-box-pack: start !important;
-    -webkit-justify-content: flex-start !important;
-        -ms-flex-pack: start !important;
-            justify-content: flex-start !important;
-  }
-  .justify-content-sm-end {
-    -webkit-box-pack: end !important;
-    -webkit-justify-content: flex-end !important;
-        -ms-flex-pack: end !important;
-            justify-content: flex-end !important;
-  }
-  .justify-content-sm-center {
-    -webkit-box-pack: center !important;
-    -webkit-justify-content: center !important;
-        -ms-flex-pack: center !important;
-            justify-content: center !important;
-  }
-  .justify-content-sm-between {
-    -webkit-box-pack: justify !important;
-    -webkit-justify-content: space-between !important;
-        -ms-flex-pack: justify !important;
-            justify-content: space-between !important;
-  }
-  .justify-content-sm-around {
-    -webkit-justify-content: space-around !important;
-        -ms-flex-pack: distribute !important;
-            justify-content: space-around !important;
-  }
-  .align-items-sm-start {
-    -webkit-box-align: start !important;
-    -webkit-align-items: flex-start !important;
-        -ms-flex-align: start !important;
-            align-items: flex-start !important;
-  }
-  .align-items-sm-end {
-    -webkit-box-align: end !important;
-    -webkit-align-items: flex-end !important;
-        -ms-flex-align: end !important;
-            align-items: flex-end !important;
-  }
-  .align-items-sm-center {
-    -webkit-box-align: center !important;
-    -webkit-align-items: center !important;
-        -ms-flex-align: center !important;
-            align-items: center !important;
-  }
-  .align-items-sm-baseline {
-    -webkit-box-align: baseline !important;
-    -webkit-align-items: baseline !important;
-        -ms-flex-align: baseline !important;
-            align-items: baseline !important;
-  }
-  .align-items-sm-stretch {
-    -webkit-box-align: stretch !important;
-    -webkit-align-items: stretch !important;
-        -ms-flex-align: stretch !important;
-            align-items: stretch !important;
-  }
-  .align-content-sm-start {
-    -webkit-align-content: flex-start !important;
-        -ms-flex-line-pack: start !important;
-            align-content: flex-start !important;
-  }
-  .align-content-sm-end {
-    -webkit-align-content: flex-end !important;
-        -ms-flex-line-pack: end !important;
-            align-content: flex-end !important;
-  }
-  .align-content-sm-center {
-    -webkit-align-content: center !important;
-        -ms-flex-line-pack: center !important;
-            align-content: center !important;
-  }
-  .align-content-sm-between {
-    -webkit-align-content: space-between !important;
-        -ms-flex-line-pack: justify !important;
-            align-content: space-between !important;
-  }
-  .align-content-sm-around {
-    -webkit-align-content: space-around !important;
-        -ms-flex-line-pack: distribute !important;
-            align-content: space-around !important;
-  }
-  .align-content-sm-stretch {
-    -webkit-align-content: stretch !important;
-        -ms-flex-line-pack: stretch !important;
-            align-content: stretch !important;
-  }
-  .align-self-sm-auto {
-    -webkit-align-self: auto !important;
-        -ms-flex-item-align: auto !important;
-                -ms-grid-row-align: auto !important;
-            align-self: auto !important;
-  }
-  .align-self-sm-start {
-    -webkit-align-self: flex-start !important;
-        -ms-flex-item-align: start !important;
-            align-self: flex-start !important;
-  }
-  .align-self-sm-end {
-    -webkit-align-self: flex-end !important;
-        -ms-flex-item-align: end !important;
-            align-self: flex-end !important;
-  }
-  .align-self-sm-center {
-    -webkit-align-self: center !important;
-        -ms-flex-item-align: center !important;
-                -ms-grid-row-align: center !important;
-            align-self: center !important;
-  }
-  .align-self-sm-baseline {
-    -webkit-align-self: baseline !important;
-        -ms-flex-item-align: baseline !important;
-            align-self: baseline !important;
-  }
-  .align-self-sm-stretch {
-    -webkit-align-self: stretch !important;
-        -ms-flex-item-align: stretch !important;
-                -ms-grid-row-align: stretch !important;
-            align-self: stretch !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .flex-md-first {
-    -webkit-box-ordinal-group: 0;
-    -webkit-order: -1;
-        -ms-flex-order: -1;
-            order: -1;
-  }
-  .flex-md-last {
-    -webkit-box-ordinal-group: 2;
-    -webkit-order: 1;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .flex-md-unordered {
-    -webkit-box-ordinal-group: 1;
-    -webkit-order: 0;
-        -ms-flex-order: 0;
-            order: 0;
-  }
-  .flex-md-row {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: row !important;
-        -ms-flex-direction: row !important;
-            flex-direction: row !important;
-  }
-  .flex-md-column {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: column !important;
-        -ms-flex-direction: column !important;
-            flex-direction: column !important;
-  }
-  .flex-md-row-reverse {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: row-reverse !important;
-        -ms-flex-direction: row-reverse !important;
-            flex-direction: row-reverse !important;
-  }
-  .flex-md-column-reverse {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: column-reverse !important;
-        -ms-flex-direction: column-reverse !important;
-            flex-direction: column-reverse !important;
-  }
-  .flex-md-wrap {
-    -webkit-flex-wrap: wrap !important;
-        -ms-flex-wrap: wrap !important;
-            flex-wrap: wrap !important;
-  }
-  .flex-md-nowrap {
-    -webkit-flex-wrap: nowrap !important;
-        -ms-flex-wrap: nowrap !important;
-            flex-wrap: nowrap !important;
-  }
-  .flex-md-wrap-reverse {
-    -webkit-flex-wrap: wrap-reverse !important;
-        -ms-flex-wrap: wrap-reverse !important;
-            flex-wrap: wrap-reverse !important;
-  }
-  .justify-content-md-start {
-    -webkit-box-pack: start !important;
-    -webkit-justify-content: flex-start !important;
-        -ms-flex-pack: start !important;
-            justify-content: flex-start !important;
-  }
-  .justify-content-md-end {
-    -webkit-box-pack: end !important;
-    -webkit-justify-content: flex-end !important;
-        -ms-flex-pack: end !important;
-            justify-content: flex-end !important;
-  }
-  .justify-content-md-center {
-    -webkit-box-pack: center !important;
-    -webkit-justify-content: center !important;
-        -ms-flex-pack: center !important;
-            justify-content: center !important;
-  }
-  .justify-content-md-between {
-    -webkit-box-pack: justify !important;
-    -webkit-justify-content: space-between !important;
-        -ms-flex-pack: justify !important;
-            justify-content: space-between !important;
-  }
-  .justify-content-md-around {
-    -webkit-justify-content: space-around !important;
-        -ms-flex-pack: distribute !important;
-            justify-content: space-around !important;
-  }
-  .align-items-md-start {
-    -webkit-box-align: start !important;
-    -webkit-align-items: flex-start !important;
-        -ms-flex-align: start !important;
-            align-items: flex-start !important;
-  }
-  .align-items-md-end {
-    -webkit-box-align: end !important;
-    -webkit-align-items: flex-end !important;
-        -ms-flex-align: end !important;
-            align-items: flex-end !important;
-  }
-  .align-items-md-center {
-    -webkit-box-align: center !important;
-    -webkit-align-items: center !important;
-        -ms-flex-align: center !important;
-            align-items: center !important;
-  }
-  .align-items-md-baseline {
-    -webkit-box-align: baseline !important;
-    -webkit-align-items: baseline !important;
-        -ms-flex-align: baseline !important;
-            align-items: baseline !important;
-  }
-  .align-items-md-stretch {
-    -webkit-box-align: stretch !important;
-    -webkit-align-items: stretch !important;
-        -ms-flex-align: stretch !important;
-            align-items: stretch !important;
-  }
-  .align-content-md-start {
-    -webkit-align-content: flex-start !important;
-        -ms-flex-line-pack: start !important;
-            align-content: flex-start !important;
-  }
-  .align-content-md-end {
-    -webkit-align-content: flex-end !important;
-        -ms-flex-line-pack: end !important;
-            align-content: flex-end !important;
-  }
-  .align-content-md-center {
-    -webkit-align-content: center !important;
-        -ms-flex-line-pack: center !important;
-            align-content: center !important;
-  }
-  .align-content-md-between {
-    -webkit-align-content: space-between !important;
-        -ms-flex-line-pack: justify !important;
-            align-content: space-between !important;
-  }
-  .align-content-md-around {
-    -webkit-align-content: space-around !important;
-        -ms-flex-line-pack: distribute !important;
-            align-content: space-around !important;
-  }
-  .align-content-md-stretch {
-    -webkit-align-content: stretch !important;
-        -ms-flex-line-pack: stretch !important;
-            align-content: stretch !important;
-  }
-  .align-self-md-auto {
-    -webkit-align-self: auto !important;
-        -ms-flex-item-align: auto !important;
-                -ms-grid-row-align: auto !important;
-            align-self: auto !important;
-  }
-  .align-self-md-start {
-    -webkit-align-self: flex-start !important;
-        -ms-flex-item-align: start !important;
-            align-self: flex-start !important;
-  }
-  .align-self-md-end {
-    -webkit-align-self: flex-end !important;
-        -ms-flex-item-align: end !important;
-            align-self: flex-end !important;
-  }
-  .align-self-md-center {
-    -webkit-align-self: center !important;
-        -ms-flex-item-align: center !important;
-                -ms-grid-row-align: center !important;
-            align-self: center !important;
-  }
-  .align-self-md-baseline {
-    -webkit-align-self: baseline !important;
-        -ms-flex-item-align: baseline !important;
-            align-self: baseline !important;
-  }
-  .align-self-md-stretch {
-    -webkit-align-self: stretch !important;
-        -ms-flex-item-align: stretch !important;
-                -ms-grid-row-align: stretch !important;
-            align-self: stretch !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .flex-lg-first {
-    -webkit-box-ordinal-group: 0;
-    -webkit-order: -1;
-        -ms-flex-order: -1;
-            order: -1;
-  }
-  .flex-lg-last {
-    -webkit-box-ordinal-group: 2;
-    -webkit-order: 1;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .flex-lg-unordered {
-    -webkit-box-ordinal-group: 1;
-    -webkit-order: 0;
-        -ms-flex-order: 0;
-            order: 0;
-  }
-  .flex-lg-row {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: row !important;
-        -ms-flex-direction: row !important;
-            flex-direction: row !important;
-  }
-  .flex-lg-column {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: column !important;
-        -ms-flex-direction: column !important;
-            flex-direction: column !important;
-  }
-  .flex-lg-row-reverse {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: row-reverse !important;
-        -ms-flex-direction: row-reverse !important;
-            flex-direction: row-reverse !important;
-  }
-  .flex-lg-column-reverse {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: column-reverse !important;
-        -ms-flex-direction: column-reverse !important;
-            flex-direction: column-reverse !important;
-  }
-  .flex-lg-wrap {
-    -webkit-flex-wrap: wrap !important;
-        -ms-flex-wrap: wrap !important;
-            flex-wrap: wrap !important;
-  }
-  .flex-lg-nowrap {
-    -webkit-flex-wrap: nowrap !important;
-        -ms-flex-wrap: nowrap !important;
-            flex-wrap: nowrap !important;
-  }
-  .flex-lg-wrap-reverse {
-    -webkit-flex-wrap: wrap-reverse !important;
-        -ms-flex-wrap: wrap-reverse !important;
-            flex-wrap: wrap-reverse !important;
-  }
-  .justify-content-lg-start {
-    -webkit-box-pack: start !important;
-    -webkit-justify-content: flex-start !important;
-        -ms-flex-pack: start !important;
-            justify-content: flex-start !important;
-  }
-  .justify-content-lg-end {
-    -webkit-box-pack: end !important;
-    -webkit-justify-content: flex-end !important;
-        -ms-flex-pack: end !important;
-            justify-content: flex-end !important;
-  }
-  .justify-content-lg-center {
-    -webkit-box-pack: center !important;
-    -webkit-justify-content: center !important;
-        -ms-flex-pack: center !important;
-            justify-content: center !important;
-  }
-  .justify-content-lg-between {
-    -webkit-box-pack: justify !important;
-    -webkit-justify-content: space-between !important;
-        -ms-flex-pack: justify !important;
-            justify-content: space-between !important;
-  }
-  .justify-content-lg-around {
-    -webkit-justify-content: space-around !important;
-        -ms-flex-pack: distribute !important;
-            justify-content: space-around !important;
-  }
-  .align-items-lg-start {
-    -webkit-box-align: start !important;
-    -webkit-align-items: flex-start !important;
-        -ms-flex-align: start !important;
-            align-items: flex-start !important;
-  }
-  .align-items-lg-end {
-    -webkit-box-align: end !important;
-    -webkit-align-items: flex-end !important;
-        -ms-flex-align: end !important;
-            align-items: flex-end !important;
-  }
-  .align-items-lg-center {
-    -webkit-box-align: center !important;
-    -webkit-align-items: center !important;
-        -ms-flex-align: center !important;
-            align-items: center !important;
-  }
-  .align-items-lg-baseline {
-    -webkit-box-align: baseline !important;
-    -webkit-align-items: baseline !important;
-        -ms-flex-align: baseline !important;
-            align-items: baseline !important;
-  }
-  .align-items-lg-stretch {
-    -webkit-box-align: stretch !important;
-    -webkit-align-items: stretch !important;
-        -ms-flex-align: stretch !important;
-            align-items: stretch !important;
-  }
-  .align-content-lg-start {
-    -webkit-align-content: flex-start !important;
-        -ms-flex-line-pack: start !important;
-            align-content: flex-start !important;
-  }
-  .align-content-lg-end {
-    -webkit-align-content: flex-end !important;
-        -ms-flex-line-pack: end !important;
-            align-content: flex-end !important;
-  }
-  .align-content-lg-center {
-    -webkit-align-content: center !important;
-        -ms-flex-line-pack: center !important;
-            align-content: center !important;
-  }
-  .align-content-lg-between {
-    -webkit-align-content: space-between !important;
-        -ms-flex-line-pack: justify !important;
-            align-content: space-between !important;
-  }
-  .align-content-lg-around {
-    -webkit-align-content: space-around !important;
-        -ms-flex-line-pack: distribute !important;
-            align-content: space-around !important;
-  }
-  .align-content-lg-stretch {
-    -webkit-align-content: stretch !important;
-        -ms-flex-line-pack: stretch !important;
-            align-content: stretch !important;
-  }
-  .align-self-lg-auto {
-    -webkit-align-self: auto !important;
-        -ms-flex-item-align: auto !important;
-                -ms-grid-row-align: auto !important;
-            align-self: auto !important;
-  }
-  .align-self-lg-start {
-    -webkit-align-self: flex-start !important;
-        -ms-flex-item-align: start !important;
-            align-self: flex-start !important;
-  }
-  .align-self-lg-end {
-    -webkit-align-self: flex-end !important;
-        -ms-flex-item-align: end !important;
-            align-self: flex-end !important;
-  }
-  .align-self-lg-center {
-    -webkit-align-self: center !important;
-        -ms-flex-item-align: center !important;
-                -ms-grid-row-align: center !important;
-            align-self: center !important;
-  }
-  .align-self-lg-baseline {
-    -webkit-align-self: baseline !important;
-        -ms-flex-item-align: baseline !important;
-            align-self: baseline !important;
-  }
-  .align-self-lg-stretch {
-    -webkit-align-self: stretch !important;
-        -ms-flex-item-align: stretch !important;
-                -ms-grid-row-align: stretch !important;
-            align-self: stretch !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .flex-xl-first {
-    -webkit-box-ordinal-group: 0;
-    -webkit-order: -1;
-        -ms-flex-order: -1;
-            order: -1;
-  }
-  .flex-xl-last {
-    -webkit-box-ordinal-group: 2;
-    -webkit-order: 1;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .flex-xl-unordered {
-    -webkit-box-ordinal-group: 1;
-    -webkit-order: 0;
-        -ms-flex-order: 0;
-            order: 0;
-  }
-  .flex-xl-row {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: row !important;
-        -ms-flex-direction: row !important;
-            flex-direction: row !important;
-  }
-  .flex-xl-column {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: normal !important;
-    -webkit-flex-direction: column !important;
-        -ms-flex-direction: column !important;
-            flex-direction: column !important;
-  }
-  .flex-xl-row-reverse {
-    -webkit-box-orient: horizontal !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: row-reverse !important;
-        -ms-flex-direction: row-reverse !important;
-            flex-direction: row-reverse !important;
-  }
-  .flex-xl-column-reverse {
-    -webkit-box-orient: vertical !important;
-    -webkit-box-direction: reverse !important;
-    -webkit-flex-direction: column-reverse !important;
-        -ms-flex-direction: column-reverse !important;
-            flex-direction: column-reverse !important;
-  }
-  .flex-xl-wrap {
-    -webkit-flex-wrap: wrap !important;
-        -ms-flex-wrap: wrap !important;
-            flex-wrap: wrap !important;
-  }
-  .flex-xl-nowrap {
-    -webkit-flex-wrap: nowrap !important;
-        -ms-flex-wrap: nowrap !important;
-            flex-wrap: nowrap !important;
-  }
-  .flex-xl-wrap-reverse {
-    -webkit-flex-wrap: wrap-reverse !important;
-        -ms-flex-wrap: wrap-reverse !important;
-            flex-wrap: wrap-reverse !important;
-  }
-  .justify-content-xl-start {
-    -webkit-box-pack: start !important;
-    -webkit-justify-content: flex-start !important;
-        -ms-flex-pack: start !important;
-            justify-content: flex-start !important;
-  }
-  .justify-content-xl-end {
-    -webkit-box-pack: end !important;
-    -webkit-justify-content: flex-end !important;
-        -ms-flex-pack: end !important;
-            justify-content: flex-end !important;
-  }
-  .justify-content-xl-center {
-    -webkit-box-pack: center !important;
-    -webkit-justify-content: center !important;
-        -ms-flex-pack: center !important;
-            justify-content: center !important;
-  }
-  .justify-content-xl-between {
-    -webkit-box-pack: justify !important;
-    -webkit-justify-content: space-between !important;
-        -ms-flex-pack: justify !important;
-            justify-content: space-between !important;
-  }
-  .justify-content-xl-around {
-    -webkit-justify-content: space-around !important;
-        -ms-flex-pack: distribute !important;
-            justify-content: space-around !important;
-  }
-  .align-items-xl-start {
-    -webkit-box-align: start !important;
-    -webkit-align-items: flex-start !important;
-        -ms-flex-align: start !important;
-            align-items: flex-start !important;
-  }
-  .align-items-xl-end {
-    -webkit-box-align: end !important;
-    -webkit-align-items: flex-end !important;
-        -ms-flex-align: end !important;
-            align-items: flex-end !important;
-  }
-  .align-items-xl-center {
-    -webkit-box-align: center !important;
-    -webkit-align-items: center !important;
-        -ms-flex-align: center !important;
-            align-items: center !important;
-  }
-  .align-items-xl-baseline {
-    -webkit-box-align: baseline !important;
-    -webkit-align-items: baseline !important;
-        -ms-flex-align: baseline !important;
-            align-items: baseline !important;
-  }
-  .align-items-xl-stretch {
-    -webkit-box-align: stretch !important;
-    -webkit-align-items: stretch !important;
-        -ms-flex-align: stretch !important;
-            align-items: stretch !important;
-  }
-  .align-content-xl-start {
-    -webkit-align-content: flex-start !important;
-        -ms-flex-line-pack: start !important;
-            align-content: flex-start !important;
-  }
-  .align-content-xl-end {
-    -webkit-align-content: flex-end !important;
-        -ms-flex-line-pack: end !important;
-            align-content: flex-end !important;
-  }
-  .align-content-xl-center {
-    -webkit-align-content: center !important;
-        -ms-flex-line-pack: center !important;
-            align-content: center !important;
-  }
-  .align-content-xl-between {
-    -webkit-align-content: space-between !important;
-        -ms-flex-line-pack: justify !important;
-            align-content: space-between !important;
-  }
-  .align-content-xl-around {
-    -webkit-align-content: space-around !important;
-        -ms-flex-line-pack: distribute !important;
-            align-content: space-around !important;
-  }
-  .align-content-xl-stretch {
-    -webkit-align-content: stretch !important;
-        -ms-flex-line-pack: stretch !important;
-            align-content: stretch !important;
-  }
-  .align-self-xl-auto {
-    -webkit-align-self: auto !important;
-        -ms-flex-item-align: auto !important;
-                -ms-grid-row-align: auto !important;
-            align-self: auto !important;
-  }
-  .align-self-xl-start {
-    -webkit-align-self: flex-start !important;
-        -ms-flex-item-align: start !important;
-            align-self: flex-start !important;
-  }
-  .align-self-xl-end {
-    -webkit-align-self: flex-end !important;
-        -ms-flex-item-align: end !important;
-            align-self: flex-end !important;
-  }
-  .align-self-xl-center {
-    -webkit-align-self: center !important;
-        -ms-flex-item-align: center !important;
-                -ms-grid-row-align: center !important;
-            align-self: center !important;
-  }
-  .align-self-xl-baseline {
-    -webkit-align-self: baseline !important;
-        -ms-flex-item-align: baseline !important;
-            align-self: baseline !important;
-  }
-  .align-self-xl-stretch {
-    -webkit-align-self: stretch !important;
-        -ms-flex-item-align: stretch !important;
-                -ms-grid-row-align: stretch !important;
-            align-self: stretch !important;
-  }
-}
-
-.float-left {
-  float: left !important;
-}
-
-.float-right {
-  float: right !important;
-}
-
-.float-none {
-  float: none !important;
-}
-
-@media (min-width: 576px) {
-  .float-sm-left {
-    float: left !important;
-  }
-  .float-sm-right {
-    float: right !important;
-  }
-  .float-sm-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .float-md-left {
-    float: left !important;
-  }
-  .float-md-right {
-    float: right !important;
-  }
-  .float-md-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .float-lg-left {
-    float: left !important;
-  }
-  .float-lg-right {
-    float: right !important;
-  }
-  .float-lg-none {
-    float: none !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .float-xl-left {
-    float: left !important;
-  }
-  .float-xl-right {
-    float: right !important;
-  }
-  .float-xl-none {
-    float: none !important;
-  }
-}
-
-.fixed-top {
-  position: fixed;
-  top: 0;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-}
-
-.fixed-bottom {
-  position: fixed;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1030;
-}
-
-.sticky-top {
-  position: -webkit-sticky;
-  position: sticky;
-  top: 0;
-  z-index: 1030;
-}
-
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  padding: 0;
-  margin: -1px;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0);
-  border: 0;
-}
-
-.sr-only-focusable:active, .sr-only-focusable:focus {
-  position: static;
-  width: auto;
-  height: auto;
-  margin: 0;
-  overflow: visible;
-  clip: auto;
-}
-
-.w-25 {
-  width: 25% !important;
-}
-
-.w-50 {
-  width: 50% !important;
-}
-
-.w-75 {
-  width: 75% !important;
-}
-
-.w-100 {
-  width: 100% !important;
-}
-
-.h-25 {
-  height: 25% !important;
-}
-
-.h-50 {
-  height: 50% !important;
-}
-
-.h-75 {
-  height: 75% !important;
-}
-
-.h-100 {
-  height: 100% !important;
-}
-
-.mw-100 {
-  max-width: 100% !important;
-}
-
-.mh-100 {
-  max-height: 100% !important;
-}
-
-.m-0 {
-  margin: 0 0 !important;
-}
-
-.mt-0 {
-  margin-top: 0 !important;
-}
-
-.mr-0 {
-  margin-right: 0 !important;
-}
-
-.mb-0 {
-  margin-bottom: 0 !important;
-}
-
-.ml-0 {
-  margin-left: 0 !important;
-}
-
-.mx-0 {
-  margin-right: 0 !important;
-  margin-left: 0 !important;
-}
-
-.my-0 {
-  margin-top: 0 !important;
-  margin-bottom: 0 !important;
-}
-
-.m-1 {
-  margin: 0.25rem 0.25rem !important;
-}
-
-.mt-1 {
-  margin-top: 0.25rem !important;
-}
-
-.mr-1 {
-  margin-right: 0.25rem !important;
-}
-
-.mb-1 {
-  margin-bottom: 0.25rem !important;
-}
-
-.ml-1 {
-  margin-left: 0.25rem !important;
-}
-
-.mx-1 {
-  margin-right: 0.25rem !important;
-  margin-left: 0.25rem !important;
-}
-
-.my-1 {
-  margin-top: 0.25rem !important;
-  margin-bottom: 0.25rem !important;
-}
-
-.m-2 {
-  margin: 0.5rem 0.5rem !important;
-}
-
-.mt-2 {
-  margin-top: 0.5rem !important;
-}
-
-.mr-2 {
-  margin-right: 0.5rem !important;
-}
-
-.mb-2 {
-  margin-bottom: 0.5rem !important;
-}
-
-.ml-2 {
-  margin-left: 0.5rem !important;
-}
-
-.mx-2 {
-  margin-right: 0.5rem !important;
-  margin-left: 0.5rem !important;
-}
-
-.my-2 {
-  margin-top: 0.5rem !important;
-  margin-bottom: 0.5rem !important;
-}
-
-.m-3 {
-  margin: 1rem 1rem !important;
-}
-
-.mt-3 {
-  margin-top: 1rem !important;
-}
-
-.mr-3 {
-  margin-right: 1rem !important;
-}
-
-.mb-3 {
-  margin-bottom: 1rem !important;
-}
-
-.ml-3 {
-  margin-left: 1rem !important;
-}
-
-.mx-3 {
-  margin-right: 1rem !important;
-  margin-left: 1rem !important;
-}
-
-.my-3 {
-  margin-top: 1rem !important;
-  margin-bottom: 1rem !important;
-}
-
-.m-4 {
-  margin: 1.5rem 1.5rem !important;
-}
-
-.mt-4 {
-  margin-top: 1.5rem !important;
-}
-
-.mr-4 {
-  margin-right: 1.5rem !important;
-}
-
-.mb-4 {
-  margin-bottom: 1.5rem !important;
-}
-
-.ml-4 {
-  margin-left: 1.5rem !important;
-}
-
-.mx-4 {
-  margin-right: 1.5rem !important;
-  margin-left: 1.5rem !important;
-}
-
-.my-4 {
-  margin-top: 1.5rem !important;
-  margin-bottom: 1.5rem !important;
-}
-
-.m-5 {
-  margin: 3rem 3rem !important;
-}
-
-.mt-5 {
-  margin-top: 3rem !important;
-}
-
-.mr-5 {
-  margin-right: 3rem !important;
-}
-
-.mb-5 {
-  margin-bottom: 3rem !important;
-}
-
-.ml-5 {
-  margin-left: 3rem !important;
-}
-
-.mx-5 {
-  margin-right: 3rem !important;
-  margin-left: 3rem !important;
-}
-
-.my-5 {
-  margin-top: 3rem !important;
-  margin-bottom: 3rem !important;
-}
-
-.p-0 {
-  padding: 0 0 !important;
-}
-
-.pt-0 {
-  padding-top: 0 !important;
-}
-
-.pr-0 {
-  padding-right: 0 !important;
-}
-
-.pb-0 {
-  padding-bottom: 0 !important;
-}
-
-.pl-0 {
-  padding-left: 0 !important;
-}
-
-.px-0 {
-  padding-right: 0 !important;
-  padding-left: 0 !important;
-}
-
-.py-0 {
-  padding-top: 0 !important;
-  padding-bottom: 0 !important;
-}
-
-.p-1 {
-  padding: 0.25rem 0.25rem !important;
-}
-
-.pt-1 {
-  padding-top: 0.25rem !important;
-}
-
-.pr-1 {
-  padding-right: 0.25rem !important;
-}
-
-.pb-1 {
-  padding-bottom: 0.25rem !important;
-}
-
-.pl-1 {
-  padding-left: 0.25rem !important;
-}
-
-.px-1 {
-  padding-right: 0.25rem !important;
-  padding-left: 0.25rem !important;
-}
-
-.py-1 {
-  padding-top: 0.25rem !important;
-  padding-bottom: 0.25rem !important;
-}
-
-.p-2 {
-  padding: 0.5rem 0.5rem !important;
-}
-
-.pt-2 {
-  padding-top: 0.5rem !important;
-}
-
-.pr-2 {
-  padding-right: 0.5rem !important;
-}
-
-.pb-2 {
-  padding-bottom: 0.5rem !important;
-}
-
-.pl-2 {
-  padding-left: 0.5rem !important;
-}
-
-.px-2 {
-  padding-right: 0.5rem !important;
-  padding-left: 0.5rem !important;
-}
-
-.py-2 {
-  padding-top: 0.5rem !important;
-  padding-bottom: 0.5rem !important;
-}
-
-.p-3 {
-  padding: 1rem 1rem !important;
-}
-
-.pt-3 {
-  padding-top: 1rem !important;
-}
-
-.pr-3 {
-  padding-right: 1rem !important;
-}
-
-.pb-3 {
-  padding-bottom: 1rem !important;
-}
-
-.pl-3 {
-  padding-left: 1rem !important;
-}
-
-.px-3 {
-  padding-right: 1rem !important;
-  padding-left: 1rem !important;
-}
-
-.py-3 {
-  padding-top: 1rem !important;
-  padding-bottom: 1rem !important;
-}
-
-.p-4 {
-  padding: 1.5rem 1.5rem !important;
-}
-
-.pt-4 {
-  padding-top: 1.5rem !important;
-}
-
-.pr-4 {
-  padding-right: 1.5rem !important;
-}
-
-.pb-4 {
-  padding-bottom: 1.5rem !important;
-}
-
-.pl-4 {
-  padding-left: 1.5rem !important;
-}
-
-.px-4 {
-  padding-right: 1.5rem !important;
-  padding-left: 1.5rem !important;
-}
-
-.py-4 {
-  padding-top: 1.5rem !important;
-  padding-bottom: 1.5rem !important;
-}
-
-.p-5 {
-  padding: 3rem 3rem !important;
-}
-
-.pt-5 {
-  padding-top: 3rem !important;
-}
-
-.pr-5 {
-  padding-right: 3rem !important;
-}
-
-.pb-5 {
-  padding-bottom: 3rem !important;
-}
-
-.pl-5 {
-  padding-left: 3rem !important;
-}
-
-.px-5 {
-  padding-right: 3rem !important;
-  padding-left: 3rem !important;
-}
-
-.py-5 {
-  padding-top: 3rem !important;
-  padding-bottom: 3rem !important;
-}
-
-.m-auto {
-  margin: auto !important;
-}
-
-.mt-auto {
-  margin-top: auto !important;
-}
-
-.mr-auto {
-  margin-right: auto !important;
-}
-
-.mb-auto {
-  margin-bottom: auto !important;
-}
-
-.ml-auto {
-  margin-left: auto !important;
-}
-
-.mx-auto {
-  margin-right: auto !important;
-  margin-left: auto !important;
-}
-
-.my-auto {
-  margin-top: auto !important;
-  margin-bottom: auto !important;
-}
-
-@media (min-width: 576px) {
-  .m-sm-0 {
-    margin: 0 0 !important;
-  }
-  .mt-sm-0 {
-    margin-top: 0 !important;
-  }
-  .mr-sm-0 {
-    margin-right: 0 !important;
-  }
-  .mb-sm-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-sm-0 {
-    margin-left: 0 !important;
-  }
-  .mx-sm-0 {
-    margin-right: 0 !important;
-    margin-left: 0 !important;
-  }
-  .my-sm-0 {
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-  }
-  .m-sm-1 {
-    margin: 0.25rem 0.25rem !important;
-  }
-  .mt-sm-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-sm-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-sm-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-sm-1 {
-    margin-left: 0.25rem !important;
-  }
-  .mx-sm-1 {
-    margin-right: 0.25rem !important;
-    margin-left: 0.25rem !important;
-  }
-  .my-sm-1 {
-    margin-top: 0.25rem !important;
-    margin-bottom: 0.25rem !important;
-  }
-  .m-sm-2 {
-    margin: 0.5rem 0.5rem !important;
-  }
-  .mt-sm-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-sm-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-sm-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-sm-2 {
-    margin-left: 0.5rem !important;
-  }
-  .mx-sm-2 {
-    margin-right: 0.5rem !important;
-    margin-left: 0.5rem !important;
-  }
-  .my-sm-2 {
-    margin-top: 0.5rem !important;
-    margin-bottom: 0.5rem !important;
-  }
-  .m-sm-3 {
-    margin: 1rem 1rem !important;
-  }
-  .mt-sm-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-sm-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-sm-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-sm-3 {
-    margin-left: 1rem !important;
-  }
-  .mx-sm-3 {
-    margin-right: 1rem !important;
-    margin-left: 1rem !important;
-  }
-  .my-sm-3 {
-    margin-top: 1rem !important;
-    margin-bottom: 1rem !important;
-  }
-  .m-sm-4 {
-    margin: 1.5rem 1.5rem !important;
-  }
-  .mt-sm-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-sm-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-sm-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-sm-4 {
-    margin-left: 1.5rem !important;
-  }
-  .mx-sm-4 {
-    margin-right: 1.5rem !important;
-    margin-left: 1.5rem !important;
-  }
-  .my-sm-4 {
-    margin-top: 1.5rem !important;
-    margin-bottom: 1.5rem !important;
-  }
-  .m-sm-5 {
-    margin: 3rem 3rem !important;
-  }
-  .mt-sm-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-sm-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-sm-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-sm-5 {
-    margin-left: 3rem !important;
-  }
-  .mx-sm-5 {
-    margin-right: 3rem !important;
-    margin-left: 3rem !important;
-  }
-  .my-sm-5 {
-    margin-top: 3rem !important;
-    margin-bottom: 3rem !important;
-  }
-  .p-sm-0 {
-    padding: 0 0 !important;
-  }
-  .pt-sm-0 {
-    padding-top: 0 !important;
-  }
-  .pr-sm-0 {
-    padding-right: 0 !important;
-  }
-  .pb-sm-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-sm-0 {
-    padding-left: 0 !important;
-  }
-  .px-sm-0 {
-    padding-right: 0 !important;
-    padding-left: 0 !important;
-  }
-  .py-sm-0 {
-    padding-top: 0 !important;
-    padding-bottom: 0 !important;
-  }
-  .p-sm-1 {
-    padding: 0.25rem 0.25rem !important;
-  }
-  .pt-sm-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-sm-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-sm-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-sm-1 {
-    padding-left: 0.25rem !important;
-  }
-  .px-sm-1 {
-    padding-right: 0.25rem !important;
-    padding-left: 0.25rem !important;
-  }
-  .py-sm-1 {
-    padding-top: 0.25rem !important;
-    padding-bottom: 0.25rem !important;
-  }
-  .p-sm-2 {
-    padding: 0.5rem 0.5rem !important;
-  }
-  .pt-sm-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-sm-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-sm-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-sm-2 {
-    padding-left: 0.5rem !important;
-  }
-  .px-sm-2 {
-    padding-right: 0.5rem !important;
-    padding-left: 0.5rem !important;
-  }
-  .py-sm-2 {
-    padding-top: 0.5rem !important;
-    padding-bottom: 0.5rem !important;
-  }
-  .p-sm-3 {
-    padding: 1rem 1rem !important;
-  }
-  .pt-sm-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-sm-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-sm-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-sm-3 {
-    padding-left: 1rem !important;
-  }
-  .px-sm-3 {
-    padding-right: 1rem !important;
-    padding-left: 1rem !important;
-  }
-  .py-sm-3 {
-    padding-top: 1rem !important;
-    padding-bottom: 1rem !important;
-  }
-  .p-sm-4 {
-    padding: 1.5rem 1.5rem !important;
-  }
-  .pt-sm-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-sm-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-sm-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-sm-4 {
-    padding-left: 1.5rem !important;
-  }
-  .px-sm-4 {
-    padding-right: 1.5rem !important;
-    padding-left: 1.5rem !important;
-  }
-  .py-sm-4 {
-    padding-top: 1.5rem !important;
-    padding-bottom: 1.5rem !important;
-  }
-  .p-sm-5 {
-    padding: 3rem 3rem !important;
-  }
-  .pt-sm-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-sm-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-sm-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-sm-5 {
-    padding-left: 3rem !important;
-  }
-  .px-sm-5 {
-    padding-right: 3rem !important;
-    padding-left: 3rem !important;
-  }
-  .py-sm-5 {
-    padding-top: 3rem !important;
-    padding-bottom: 3rem !important;
-  }
-  .m-sm-auto {
-    margin: auto !important;
-  }
-  .mt-sm-auto {
-    margin-top: auto !important;
-  }
-  .mr-sm-auto {
-    margin-right: auto !important;
-  }
-  .mb-sm-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-sm-auto {
-    margin-left: auto !important;
-  }
-  .mx-sm-auto {
-    margin-right: auto !important;
-    margin-left: auto !important;
-  }
-  .my-sm-auto {
-    margin-top: auto !important;
-    margin-bottom: auto !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .m-md-0 {
-    margin: 0 0 !important;
-  }
-  .mt-md-0 {
-    margin-top: 0 !important;
-  }
-  .mr-md-0 {
-    margin-right: 0 !important;
-  }
-  .mb-md-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-md-0 {
-    margin-left: 0 !important;
-  }
-  .mx-md-0 {
-    margin-right: 0 !important;
-    margin-left: 0 !important;
-  }
-  .my-md-0 {
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-  }
-  .m-md-1 {
-    margin: 0.25rem 0.25rem !important;
-  }
-  .mt-md-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-md-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-md-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-md-1 {
-    margin-left: 0.25rem !important;
-  }
-  .mx-md-1 {
-    margin-right: 0.25rem !important;
-    margin-left: 0.25rem !important;
-  }
-  .my-md-1 {
-    margin-top: 0.25rem !important;
-    margin-bottom: 0.25rem !important;
-  }
-  .m-md-2 {
-    margin: 0.5rem 0.5rem !important;
-  }
-  .mt-md-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-md-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-md-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-md-2 {
-    margin-left: 0.5rem !important;
-  }
-  .mx-md-2 {
-    margin-right: 0.5rem !important;
-    margin-left: 0.5rem !important;
-  }
-  .my-md-2 {
-    margin-top: 0.5rem !important;
-    margin-bottom: 0.5rem !important;
-  }
-  .m-md-3 {
-    margin: 1rem 1rem !important;
-  }
-  .mt-md-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-md-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-md-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-md-3 {
-    margin-left: 1rem !important;
-  }
-  .mx-md-3 {
-    margin-right: 1rem !important;
-    margin-left: 1rem !important;
-  }
-  .my-md-3 {
-    margin-top: 1rem !important;
-    margin-bottom: 1rem !important;
-  }
-  .m-md-4 {
-    margin: 1.5rem 1.5rem !important;
-  }
-  .mt-md-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-md-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-md-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-md-4 {
-    margin-left: 1.5rem !important;
-  }
-  .mx-md-4 {
-    margin-right: 1.5rem !important;
-    margin-left: 1.5rem !important;
-  }
-  .my-md-4 {
-    margin-top: 1.5rem !important;
-    margin-bottom: 1.5rem !important;
-  }
-  .m-md-5 {
-    margin: 3rem 3rem !important;
-  }
-  .mt-md-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-md-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-md-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-md-5 {
-    margin-left: 3rem !important;
-  }
-  .mx-md-5 {
-    margin-right: 3rem !important;
-    margin-left: 3rem !important;
-  }
-  .my-md-5 {
-    margin-top: 3rem !important;
-    margin-bottom: 3rem !important;
-  }
-  .p-md-0 {
-    padding: 0 0 !important;
-  }
-  .pt-md-0 {
-    padding-top: 0 !important;
-  }
-  .pr-md-0 {
-    padding-right: 0 !important;
-  }
-  .pb-md-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-md-0 {
-    padding-left: 0 !important;
-  }
-  .px-md-0 {
-    padding-right: 0 !important;
-    padding-left: 0 !important;
-  }
-  .py-md-0 {
-    padding-top: 0 !important;
-    padding-bottom: 0 !important;
-  }
-  .p-md-1 {
-    padding: 0.25rem 0.25rem !important;
-  }
-  .pt-md-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-md-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-md-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-md-1 {
-    padding-left: 0.25rem !important;
-  }
-  .px-md-1 {
-    padding-right: 0.25rem !important;
-    padding-left: 0.25rem !important;
-  }
-  .py-md-1 {
-    padding-top: 0.25rem !important;
-    padding-bottom: 0.25rem !important;
-  }
-  .p-md-2 {
-    padding: 0.5rem 0.5rem !important;
-  }
-  .pt-md-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-md-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-md-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-md-2 {
-    padding-left: 0.5rem !important;
-  }
-  .px-md-2 {
-    padding-right: 0.5rem !important;
-    padding-left: 0.5rem !important;
-  }
-  .py-md-2 {
-    padding-top: 0.5rem !important;
-    padding-bottom: 0.5rem !important;
-  }
-  .p-md-3 {
-    padding: 1rem 1rem !important;
-  }
-  .pt-md-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-md-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-md-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-md-3 {
-    padding-left: 1rem !important;
-  }
-  .px-md-3 {
-    padding-right: 1rem !important;
-    padding-left: 1rem !important;
-  }
-  .py-md-3 {
-    padding-top: 1rem !important;
-    padding-bottom: 1rem !important;
-  }
-  .p-md-4 {
-    padding: 1.5rem 1.5rem !important;
-  }
-  .pt-md-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-md-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-md-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-md-4 {
-    padding-left: 1.5rem !important;
-  }
-  .px-md-4 {
-    padding-right: 1.5rem !important;
-    padding-left: 1.5rem !important;
-  }
-  .py-md-4 {
-    padding-top: 1.5rem !important;
-    padding-bottom: 1.5rem !important;
-  }
-  .p-md-5 {
-    padding: 3rem 3rem !important;
-  }
-  .pt-md-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-md-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-md-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-md-5 {
-    padding-left: 3rem !important;
-  }
-  .px-md-5 {
-    padding-right: 3rem !important;
-    padding-left: 3rem !important;
-  }
-  .py-md-5 {
-    padding-top: 3rem !important;
-    padding-bottom: 3rem !important;
-  }
-  .m-md-auto {
-    margin: auto !important;
-  }
-  .mt-md-auto {
-    margin-top: auto !important;
-  }
-  .mr-md-auto {
-    margin-right: auto !important;
-  }
-  .mb-md-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-md-auto {
-    margin-left: auto !important;
-  }
-  .mx-md-auto {
-    margin-right: auto !important;
-    margin-left: auto !important;
-  }
-  .my-md-auto {
-    margin-top: auto !important;
-    margin-bottom: auto !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .m-lg-0 {
-    margin: 0 0 !important;
-  }
-  .mt-lg-0 {
-    margin-top: 0 !important;
-  }
-  .mr-lg-0 {
-    margin-right: 0 !important;
-  }
-  .mb-lg-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-lg-0 {
-    margin-left: 0 !important;
-  }
-  .mx-lg-0 {
-    margin-right: 0 !important;
-    margin-left: 0 !important;
-  }
-  .my-lg-0 {
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-  }
-  .m-lg-1 {
-    margin: 0.25rem 0.25rem !important;
-  }
-  .mt-lg-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-lg-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-lg-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-lg-1 {
-    margin-left: 0.25rem !important;
-  }
-  .mx-lg-1 {
-    margin-right: 0.25rem !important;
-    margin-left: 0.25rem !important;
-  }
-  .my-lg-1 {
-    margin-top: 0.25rem !important;
-    margin-bottom: 0.25rem !important;
-  }
-  .m-lg-2 {
-    margin: 0.5rem 0.5rem !important;
-  }
-  .mt-lg-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-lg-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-lg-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-lg-2 {
-    margin-left: 0.5rem !important;
-  }
-  .mx-lg-2 {
-    margin-right: 0.5rem !important;
-    margin-left: 0.5rem !important;
-  }
-  .my-lg-2 {
-    margin-top: 0.5rem !important;
-    margin-bottom: 0.5rem !important;
-  }
-  .m-lg-3 {
-    margin: 1rem 1rem !important;
-  }
-  .mt-lg-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-lg-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-lg-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-lg-3 {
-    margin-left: 1rem !important;
-  }
-  .mx-lg-3 {
-    margin-right: 1rem !important;
-    margin-left: 1rem !important;
-  }
-  .my-lg-3 {
-    margin-top: 1rem !important;
-    margin-bottom: 1rem !important;
-  }
-  .m-lg-4 {
-    margin: 1.5rem 1.5rem !important;
-  }
-  .mt-lg-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-lg-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-lg-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-lg-4 {
-    margin-left: 1.5rem !important;
-  }
-  .mx-lg-4 {
-    margin-right: 1.5rem !important;
-    margin-left: 1.5rem !important;
-  }
-  .my-lg-4 {
-    margin-top: 1.5rem !important;
-    margin-bottom: 1.5rem !important;
-  }
-  .m-lg-5 {
-    margin: 3rem 3rem !important;
-  }
-  .mt-lg-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-lg-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-lg-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-lg-5 {
-    margin-left: 3rem !important;
-  }
-  .mx-lg-5 {
-    margin-right: 3rem !important;
-    margin-left: 3rem !important;
-  }
-  .my-lg-5 {
-    margin-top: 3rem !important;
-    margin-bottom: 3rem !important;
-  }
-  .p-lg-0 {
-    padding: 0 0 !important;
-  }
-  .pt-lg-0 {
-    padding-top: 0 !important;
-  }
-  .pr-lg-0 {
-    padding-right: 0 !important;
-  }
-  .pb-lg-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-lg-0 {
-    padding-left: 0 !important;
-  }
-  .px-lg-0 {
-    padding-right: 0 !important;
-    padding-left: 0 !important;
-  }
-  .py-lg-0 {
-    padding-top: 0 !important;
-    padding-bottom: 0 !important;
-  }
-  .p-lg-1 {
-    padding: 0.25rem 0.25rem !important;
-  }
-  .pt-lg-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-lg-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-lg-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-lg-1 {
-    padding-left: 0.25rem !important;
-  }
-  .px-lg-1 {
-    padding-right: 0.25rem !important;
-    padding-left: 0.25rem !important;
-  }
-  .py-lg-1 {
-    padding-top: 0.25rem !important;
-    padding-bottom: 0.25rem !important;
-  }
-  .p-lg-2 {
-    padding: 0.5rem 0.5rem !important;
-  }
-  .pt-lg-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-lg-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-lg-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-lg-2 {
-    padding-left: 0.5rem !important;
-  }
-  .px-lg-2 {
-    padding-right: 0.5rem !important;
-    padding-left: 0.5rem !important;
-  }
-  .py-lg-2 {
-    padding-top: 0.5rem !important;
-    padding-bottom: 0.5rem !important;
-  }
-  .p-lg-3 {
-    padding: 1rem 1rem !important;
-  }
-  .pt-lg-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-lg-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-lg-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-lg-3 {
-    padding-left: 1rem !important;
-  }
-  .px-lg-3 {
-    padding-right: 1rem !important;
-    padding-left: 1rem !important;
-  }
-  .py-lg-3 {
-    padding-top: 1rem !important;
-    padding-bottom: 1rem !important;
-  }
-  .p-lg-4 {
-    padding: 1.5rem 1.5rem !important;
-  }
-  .pt-lg-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-lg-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-lg-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-lg-4 {
-    padding-left: 1.5rem !important;
-  }
-  .px-lg-4 {
-    padding-right: 1.5rem !important;
-    padding-left: 1.5rem !important;
-  }
-  .py-lg-4 {
-    padding-top: 1.5rem !important;
-    padding-bottom: 1.5rem !important;
-  }
-  .p-lg-5 {
-    padding: 3rem 3rem !important;
-  }
-  .pt-lg-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-lg-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-lg-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-lg-5 {
-    padding-left: 3rem !important;
-  }
-  .px-lg-5 {
-    padding-right: 3rem !important;
-    padding-left: 3rem !important;
-  }
-  .py-lg-5 {
-    padding-top: 3rem !important;
-    padding-bottom: 3rem !important;
-  }
-  .m-lg-auto {
-    margin: auto !important;
-  }
-  .mt-lg-auto {
-    margin-top: auto !important;
-  }
-  .mr-lg-auto {
-    margin-right: auto !important;
-  }
-  .mb-lg-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-lg-auto {
-    margin-left: auto !important;
-  }
-  .mx-lg-auto {
-    margin-right: auto !important;
-    margin-left: auto !important;
-  }
-  .my-lg-auto {
-    margin-top: auto !important;
-    margin-bottom: auto !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .m-xl-0 {
-    margin: 0 0 !important;
-  }
-  .mt-xl-0 {
-    margin-top: 0 !important;
-  }
-  .mr-xl-0 {
-    margin-right: 0 !important;
-  }
-  .mb-xl-0 {
-    margin-bottom: 0 !important;
-  }
-  .ml-xl-0 {
-    margin-left: 0 !important;
-  }
-  .mx-xl-0 {
-    margin-right: 0 !important;
-    margin-left: 0 !important;
-  }
-  .my-xl-0 {
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-  }
-  .m-xl-1 {
-    margin: 0.25rem 0.25rem !important;
-  }
-  .mt-xl-1 {
-    margin-top: 0.25rem !important;
-  }
-  .mr-xl-1 {
-    margin-right: 0.25rem !important;
-  }
-  .mb-xl-1 {
-    margin-bottom: 0.25rem !important;
-  }
-  .ml-xl-1 {
-    margin-left: 0.25rem !important;
-  }
-  .mx-xl-1 {
-    margin-right: 0.25rem !important;
-    margin-left: 0.25rem !important;
-  }
-  .my-xl-1 {
-    margin-top: 0.25rem !important;
-    margin-bottom: 0.25rem !important;
-  }
-  .m-xl-2 {
-    margin: 0.5rem 0.5rem !important;
-  }
-  .mt-xl-2 {
-    margin-top: 0.5rem !important;
-  }
-  .mr-xl-2 {
-    margin-right: 0.5rem !important;
-  }
-  .mb-xl-2 {
-    margin-bottom: 0.5rem !important;
-  }
-  .ml-xl-2 {
-    margin-left: 0.5rem !important;
-  }
-  .mx-xl-2 {
-    margin-right: 0.5rem !important;
-    margin-left: 0.5rem !important;
-  }
-  .my-xl-2 {
-    margin-top: 0.5rem !important;
-    margin-bottom: 0.5rem !important;
-  }
-  .m-xl-3 {
-    margin: 1rem 1rem !important;
-  }
-  .mt-xl-3 {
-    margin-top: 1rem !important;
-  }
-  .mr-xl-3 {
-    margin-right: 1rem !important;
-  }
-  .mb-xl-3 {
-    margin-bottom: 1rem !important;
-  }
-  .ml-xl-3 {
-    margin-left: 1rem !important;
-  }
-  .mx-xl-3 {
-    margin-right: 1rem !important;
-    margin-left: 1rem !important;
-  }
-  .my-xl-3 {
-    margin-top: 1rem !important;
-    margin-bottom: 1rem !important;
-  }
-  .m-xl-4 {
-    margin: 1.5rem 1.5rem !important;
-  }
-  .mt-xl-4 {
-    margin-top: 1.5rem !important;
-  }
-  .mr-xl-4 {
-    margin-right: 1.5rem !important;
-  }
-  .mb-xl-4 {
-    margin-bottom: 1.5rem !important;
-  }
-  .ml-xl-4 {
-    margin-left: 1.5rem !important;
-  }
-  .mx-xl-4 {
-    margin-right: 1.5rem !important;
-    margin-left: 1.5rem !important;
-  }
-  .my-xl-4 {
-    margin-top: 1.5rem !important;
-    margin-bottom: 1.5rem !important;
-  }
-  .m-xl-5 {
-    margin: 3rem 3rem !important;
-  }
-  .mt-xl-5 {
-    margin-top: 3rem !important;
-  }
-  .mr-xl-5 {
-    margin-right: 3rem !important;
-  }
-  .mb-xl-5 {
-    margin-bottom: 3rem !important;
-  }
-  .ml-xl-5 {
-    margin-left: 3rem !important;
-  }
-  .mx-xl-5 {
-    margin-right: 3rem !important;
-    margin-left: 3rem !important;
-  }
-  .my-xl-5 {
-    margin-top: 3rem !important;
-    margin-bottom: 3rem !important;
-  }
-  .p-xl-0 {
-    padding: 0 0 !important;
-  }
-  .pt-xl-0 {
-    padding-top: 0 !important;
-  }
-  .pr-xl-0 {
-    padding-right: 0 !important;
-  }
-  .pb-xl-0 {
-    padding-bottom: 0 !important;
-  }
-  .pl-xl-0 {
-    padding-left: 0 !important;
-  }
-  .px-xl-0 {
-    padding-right: 0 !important;
-    padding-left: 0 !important;
-  }
-  .py-xl-0 {
-    padding-top: 0 !important;
-    padding-bottom: 0 !important;
-  }
-  .p-xl-1 {
-    padding: 0.25rem 0.25rem !important;
-  }
-  .pt-xl-1 {
-    padding-top: 0.25rem !important;
-  }
-  .pr-xl-1 {
-    padding-right: 0.25rem !important;
-  }
-  .pb-xl-1 {
-    padding-bottom: 0.25rem !important;
-  }
-  .pl-xl-1 {
-    padding-left: 0.25rem !important;
-  }
-  .px-xl-1 {
-    padding-right: 0.25rem !important;
-    padding-left: 0.25rem !important;
-  }
-  .py-xl-1 {
-    padding-top: 0.25rem !important;
-    padding-bottom: 0.25rem !important;
-  }
-  .p-xl-2 {
-    padding: 0.5rem 0.5rem !important;
-  }
-  .pt-xl-2 {
-    padding-top: 0.5rem !important;
-  }
-  .pr-xl-2 {
-    padding-right: 0.5rem !important;
-  }
-  .pb-xl-2 {
-    padding-bottom: 0.5rem !important;
-  }
-  .pl-xl-2 {
-    padding-left: 0.5rem !important;
-  }
-  .px-xl-2 {
-    padding-right: 0.5rem !important;
-    padding-left: 0.5rem !important;
-  }
-  .py-xl-2 {
-    padding-top: 0.5rem !important;
-    padding-bottom: 0.5rem !important;
-  }
-  .p-xl-3 {
-    padding: 1rem 1rem !important;
-  }
-  .pt-xl-3 {
-    padding-top: 1rem !important;
-  }
-  .pr-xl-3 {
-    padding-right: 1rem !important;
-  }
-  .pb-xl-3 {
-    padding-bottom: 1rem !important;
-  }
-  .pl-xl-3 {
-    padding-left: 1rem !important;
-  }
-  .px-xl-3 {
-    padding-right: 1rem !important;
-    padding-left: 1rem !important;
-  }
-  .py-xl-3 {
-    padding-top: 1rem !important;
-    padding-bottom: 1rem !important;
-  }
-  .p-xl-4 {
-    padding: 1.5rem 1.5rem !important;
-  }
-  .pt-xl-4 {
-    padding-top: 1.5rem !important;
-  }
-  .pr-xl-4 {
-    padding-right: 1.5rem !important;
-  }
-  .pb-xl-4 {
-    padding-bottom: 1.5rem !important;
-  }
-  .pl-xl-4 {
-    padding-left: 1.5rem !important;
-  }
-  .px-xl-4 {
-    padding-right: 1.5rem !important;
-    padding-left: 1.5rem !important;
-  }
-  .py-xl-4 {
-    padding-top: 1.5rem !important;
-    padding-bottom: 1.5rem !important;
-  }
-  .p-xl-5 {
-    padding: 3rem 3rem !important;
-  }
-  .pt-xl-5 {
-    padding-top: 3rem !important;
-  }
-  .pr-xl-5 {
-    padding-right: 3rem !important;
-  }
-  .pb-xl-5 {
-    padding-bottom: 3rem !important;
-  }
-  .pl-xl-5 {
-    padding-left: 3rem !important;
-  }
-  .px-xl-5 {
-    padding-right: 3rem !important;
-    padding-left: 3rem !important;
-  }
-  .py-xl-5 {
-    padding-top: 3rem !important;
-    padding-bottom: 3rem !important;
-  }
-  .m-xl-auto {
-    margin: auto !important;
-  }
-  .mt-xl-auto {
-    margin-top: auto !important;
-  }
-  .mr-xl-auto {
-    margin-right: auto !important;
-  }
-  .mb-xl-auto {
-    margin-bottom: auto !important;
-  }
-  .ml-xl-auto {
-    margin-left: auto !important;
-  }
-  .mx-xl-auto {
-    margin-right: auto !important;
-    margin-left: auto !important;
-  }
-  .my-xl-auto {
-    margin-top: auto !important;
-    margin-bottom: auto !important;
-  }
-}
-
-.text-justify {
-  text-align: justify !important;
-}
-
-.text-nowrap {
-  white-space: nowrap !important;
-}
-
-.text-truncate {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.text-left {
-  text-align: left !important;
-}
-
-.text-right {
-  text-align: right !important;
-}
-
-.text-center {
-  text-align: center !important;
-}
-
-@media (min-width: 576px) {
-  .text-sm-left {
-    text-align: left !important;
-  }
-  .text-sm-right {
-    text-align: right !important;
-  }
-  .text-sm-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .text-md-left {
-    text-align: left !important;
-  }
-  .text-md-right {
-    text-align: right !important;
-  }
-  .text-md-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .text-lg-left {
-    text-align: left !important;
-  }
-  .text-lg-right {
-    text-align: right !important;
-  }
-  .text-lg-center {
-    text-align: center !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .text-xl-left {
-    text-align: left !important;
-  }
-  .text-xl-right {
-    text-align: right !important;
-  }
-  .text-xl-center {
-    text-align: center !important;
-  }
-}
-
-.text-lowercase {
-  text-transform: lowercase !important;
-}
-
-.text-uppercase {
-  text-transform: uppercase !important;
-}
-
-.text-capitalize {
-  text-transform: capitalize !important;
-}
-
-.font-weight-normal {
-  font-weight: normal;
-}
-
-.font-weight-bold {
-  font-weight: bold;
-}
-
-.font-italic {
-  font-style: italic;
-}
-
-.text-white {
-  color: #fff !important;
-}
-
-.text-muted {
-  color: #636c72 !important;
-}
-
-a.text-muted:focus, a.text-muted:hover {
-  color: #4b5257 !important;
-}
-
-.text-primary {
-  color: #0275d8 !important;
-}
-
-a.text-primary:focus, a.text-primary:hover {
-  color: #025aa5 !important;
-}
-
-.text-success {
-  color: #5cb85c !important;
-}
-
-a.text-success:focus, a.text-success:hover {
-  color: #449d44 !important;
-}
-
-.text-info {
-  color: #5bc0de !important;
-}
-
-a.text-info:focus, a.text-info:hover {
-  color: #31b0d5 !important;
-}
-
-.text-warning {
-  color: #f0ad4e !important;
-}
-
-a.text-warning:focus, a.text-warning:hover {
-  color: #ec971f !important;
-}
-
-.text-danger {
-  color: #d9534f !important;
-}
-
-a.text-danger:focus, a.text-danger:hover {
-  color: #c9302c !important;
-}
-
-.text-gray-dark {
-  color: #292b2c !important;
-}
-
-a.text-gray-dark:focus, a.text-gray-dark:hover {
-  color: #101112 !important;
-}
-
-.text-hide {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.invisible {
-  visibility: hidden !important;
-}
-
-.hidden-xs-up {
-  display: none !important;
-}
-
-@media (max-width: 575px) {
-  .hidden-xs-down {
-    display: none !important;
-  }
-}
-
-@media (min-width: 576px) {
-  .hidden-sm-up {
-    display: none !important;
-  }
-}
-
-@media (max-width: 767px) {
-  .hidden-sm-down {
-    display: none !important;
-  }
-}
-
-@media (min-width: 768px) {
-  .hidden-md-up {
-    display: none !important;
-  }
-}
-
-@media (max-width: 991px) {
-  .hidden-md-down {
-    display: none !important;
-  }
-}
-
-@media (min-width: 992px) {
-  .hidden-lg-up {
-    display: none !important;
-  }
-}
-
-@media (max-width: 1199px) {
-  .hidden-lg-down {
-    display: none !important;
-  }
-}
-
-@media (min-width: 1200px) {
-  .hidden-xl-up {
-    display: none !important;
-  }
-}
-
-.hidden-xl-down {
-  display: none !important;
-}
-
-.visible-print-block {
-  display: none !important;
-}
-
-@media print {
-  .visible-print-block {
-    display: block !important;
-  }
-}
-
-.visible-print-inline {
-  display: none !important;
-}
-
-@media print {
-  .visible-print-inline {
-    display: inline !important;
-  }
-}
-
-.visible-print-inline-block {
-  display: none !important;
-}
-
-@media print {
-  .visible-print-inline-block {
-    display: inline-block !important;
-  }
-}
-
-@media print {
-  .hidden-print {
-    display: none !important;
-  }
-}
-/*# sourceMappingURL=bootstrap.css.map */
\ No newline at end of file
diff --git a/packages/csslib/test/examples/bulma.css b/packages/csslib/test/examples/bulma.css
deleted file mode 100644
index 32b9f3e..0000000
--- a/packages/csslib/test/examples/bulma.css
+++ /dev/null
@@ -1,7128 +0,0 @@
-/*! bulma.io v0.4.1 | MIT License | github.com/jgthms/bulma */
-@-webkit-keyframes spinAround {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-  }
-  to {
-    -webkit-transform: rotate(359deg);
-            transform: rotate(359deg);
-  }
-}
-@keyframes spinAround {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-  }
-  to {
-    -webkit-transform: rotate(359deg);
-            transform: rotate(359deg);
-  }
-}
-
-/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */
-html,
-body,
-p,
-ol,
-ul,
-li,
-dl,
-dt,
-dd,
-blockquote,
-figure,
-fieldset,
-legend,
-textarea,
-pre,
-iframe,
-hr,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 0;
-  padding: 0;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-size: 100%;
-  font-weight: normal;
-}
-
-ul {
-  list-style: none;
-}
-
-button,
-input,
-select,
-textarea {
-  margin: 0;
-}
-
-html {
-  box-sizing: border-box;
-}
-
-* {
-  box-sizing: inherit;
-}
-
-*:before, *:after {
-  box-sizing: inherit;
-}
-
-img,
-embed,
-object,
-audio,
-video {
-  height: auto;
-  max-width: 100%;
-}
-
-iframe {
-  border: 0;
-}
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-  text-align: left;
-}
-
-html {
-  background-color: #fff;
-  font-size: 16px;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-font-smoothing: antialiased;
-  min-width: 300px;
-  overflow-x: hidden;
-  overflow-y: scroll;
-  text-rendering: optimizeLegibility;
-}
-
-article,
-aside,
-figure,
-footer,
-header,
-hgroup,
-section {
-  display: block;
-}
-
-body,
-button,
-input,
-select,
-textarea {
-  font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
-}
-
-code,
-pre {
-  -moz-osx-font-smoothing: auto;
-  -webkit-font-smoothing: auto;
-  font-family: monospace;
-}
-
-body {
-  color: #4a4a4a;
-  font-size: 1rem;
-  font-weight: 400;
-  line-height: 1.5;
-}
-
-a {
-  color: #00d1b2;
-  cursor: pointer;
-  text-decoration: none;
-  -webkit-transition: none 86ms ease-out;
-  transition: none 86ms ease-out;
-}
-
-a:hover {
-  color: #363636;
-}
-
-code {
-  background-color: whitesmoke;
-  color: #ff3860;
-  font-size: 0.8em;
-  font-weight: normal;
-  padding: 0.25em 0.5em 0.25em;
-}
-
-hr {
-  background-color: #dbdbdb;
-  border: none;
-  display: block;
-  height: 1px;
-  margin: 1.5rem 0;
-}
-
-img {
-  max-width: 100%;
-}
-
-input[type="checkbox"],
-input[type="radio"] {
-  vertical-align: baseline;
-}
-
-small {
-  font-size: 0.8em;
-}
-
-span {
-  font-style: inherit;
-  font-weight: inherit;
-}
-
-strong {
-  color: #363636;
-  font-weight: 700;
-}
-
-pre {
-  background-color: whitesmoke;
-  color: #4a4a4a;
-  font-size: 0.8em;
-  white-space: pre;
-  word-wrap: normal;
-}
-
-pre code {
-  -webkit-overflow-scrolling: touch;
-  background: none;
-  color: inherit;
-  display: block;
-  font-size: 1em;
-  overflow-x: auto;
-  padding: 1.25rem 1.5rem;
-}
-
-table {
-  width: 100%;
-}
-
-table td,
-table th {
-  text-align: left;
-  vertical-align: top;
-}
-
-table th {
-  color: #363636;
-}
-
-.is-block {
-  display: block;
-}
-
-@media screen and (max-width: 768px) {
-  .is-block-mobile {
-    display: block !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-block-tablet {
-    display: block !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-block-tablet-only {
-    display: block !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-block-touch {
-    display: block !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-block-desktop {
-    display: block !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-block-desktop-only {
-    display: block !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-block-widescreen {
-    display: block !important;
-  }
-}
-
-.is-flex {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-@media screen and (max-width: 768px) {
-  .is-flex-mobile {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-flex-tablet {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-flex-tablet-only {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-flex-touch {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-flex-desktop {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-flex-desktop-only {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-flex-widescreen {
-    display: -webkit-box !important;
-    display: -ms-flexbox !important;
-    display: flex !important;
-  }
-}
-
-.is-inline {
-  display: inline;
-}
-
-@media screen and (max-width: 768px) {
-  .is-inline-mobile {
-    display: inline !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-inline-tablet {
-    display: inline !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-inline-tablet-only {
-    display: inline !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-inline-touch {
-    display: inline !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-inline-desktop {
-    display: inline !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-inline-desktop-only {
-    display: inline !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-inline-widescreen {
-    display: inline !important;
-  }
-}
-
-.is-inline-block {
-  display: inline-block;
-}
-
-@media screen and (max-width: 768px) {
-  .is-inline-block-mobile {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-inline-block-tablet {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-inline-block-tablet-only {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-inline-block-touch {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-inline-block-desktop {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-inline-block-desktop-only {
-    display: inline-block !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-inline-block-widescreen {
-    display: inline-block !important;
-  }
-}
-
-.is-inline-flex {
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-}
-
-@media screen and (max-width: 768px) {
-  .is-inline-flex-mobile {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-inline-flex-tablet {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-inline-flex-tablet-only {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-inline-flex-touch {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-inline-flex-desktop {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-inline-flex-desktop-only {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-inline-flex-widescreen {
-    display: -webkit-inline-box !important;
-    display: -ms-inline-flexbox !important;
-    display: inline-flex !important;
-  }
-}
-
-.is-clearfix:after {
-  clear: both;
-  content: " ";
-  display: table;
-}
-
-.is-pulled-left {
-  float: left;
-}
-
-.is-pulled-right {
-  float: right;
-}
-
-.is-clipped {
-  overflow: hidden !important;
-}
-
-.is-overlay {
-  bottom: 0;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-
-.has-text-centered {
-  text-align: center;
-}
-
-.has-text-left {
-  text-align: left;
-}
-
-.has-text-right {
-  text-align: right;
-}
-
-.has-text-white {
-  color: white;
-}
-
-a.has-text-white:hover, a.has-text-white:focus {
-  color: #e6e6e6;
-}
-
-.has-text-black {
-  color: #0a0a0a;
-}
-
-a.has-text-black:hover, a.has-text-black:focus {
-  color: black;
-}
-
-.has-text-light {
-  color: whitesmoke;
-}
-
-a.has-text-light:hover, a.has-text-light:focus {
-  color: #dbdbdb;
-}
-
-.has-text-dark {
-  color: #363636;
-}
-
-a.has-text-dark:hover, a.has-text-dark:focus {
-  color: #1c1c1c;
-}
-
-.has-text-primary {
-  color: #00d1b2;
-}
-
-a.has-text-primary:hover, a.has-text-primary:focus {
-  color: #009e86;
-}
-
-.has-text-info {
-  color: #3273dc;
-}
-
-a.has-text-info:hover, a.has-text-info:focus {
-  color: #205bbc;
-}
-
-.has-text-success {
-  color: #23d160;
-}
-
-a.has-text-success:hover, a.has-text-success:focus {
-  color: #1ca64c;
-}
-
-.has-text-warning {
-  color: #ffdd57;
-}
-
-a.has-text-warning:hover, a.has-text-warning:focus {
-  color: #ffd324;
-}
-
-.has-text-danger {
-  color: #ff3860;
-}
-
-a.has-text-danger:hover, a.has-text-danger:focus {
-  color: #ff0537;
-}
-
-.is-hidden {
-  display: none !important;
-}
-
-@media screen and (max-width: 768px) {
-  .is-hidden-mobile {
-    display: none !important;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .is-hidden-tablet {
-    display: none !important;
-  }
-}
-
-@media screen and (min-width: 769px) and (max-width: 999px) {
-  .is-hidden-tablet-only {
-    display: none !important;
-  }
-}
-
-@media screen and (max-width: 999px) {
-  .is-hidden-touch {
-    display: none !important;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .is-hidden-desktop {
-    display: none !important;
-  }
-}
-
-@media screen and (min-width: 1000px) and (max-width: 1191px) {
-  .is-hidden-desktop-only {
-    display: none !important;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .is-hidden-widescreen {
-    display: none !important;
-  }
-}
-
-.is-marginless {
-  margin: 0 !important;
-}
-
-.is-paddingless {
-  padding: 0 !important;
-}
-
-.is-unselectable {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.box {
-  background-color: white;
-  border-radius: 5px;
-  box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
-  display: block;
-  padding: 1.25rem;
-}
-
-.box:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-a.box:hover, a.box:focus {
-  box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #00d1b2;
-}
-
-a.box:active {
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #00d1b2;
-}
-
-.button {
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border: 1px solid transparent;
-  border-radius: 3px;
-  box-shadow: none;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 1rem;
-  height: 2.25em;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  line-height: 1.5;
-  padding-bottom: calc(0.375em - 1px);
-  padding-left: calc(0.625em - 1px);
-  padding-right: calc(0.625em - 1px);
-  padding-top: calc(0.375em - 1px);
-  position: relative;
-  vertical-align: top;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  background-color: white;
-  border-color: #dbdbdb;
-  color: #363636;
-  cursor: pointer;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  padding-left: 0.75em;
-  padding-right: 0.75em;
-  text-align: center;
-  white-space: nowrap;
-}
-
-.button:focus, .button.is-focused, .button:active, .button.is-active {
-  outline: none;
-}
-
-.button[disabled] {
-  cursor: not-allowed;
-}
-
-.button strong {
-  color: inherit;
-}
-
-.button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large {
-  height: 1.5em;
-  width: 1.5em;
-}
-
-.button .icon:first-child:not(:last-child) {
-  margin-left: calc(-0.375em - 1px);
-  margin-right: 0.1875em;
-}
-
-.button .icon:last-child:not(:first-child) {
-  margin-left: 0.1875em;
-  margin-right: calc(-0.375em - 1px);
-}
-
-.button .icon:first-child:last-child {
-  margin-left: calc(-0.375em - 1px);
-  margin-right: calc(-0.375em - 1px);
-}
-
-.button:hover, .button.is-hovered {
-  border-color: #b5b5b5;
-  color: #363636;
-}
-
-.button:focus, .button.is-focused {
-  border-color: #00d1b2;
-  box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25);
-  color: #363636;
-}
-
-.button:active, .button.is-active {
-  border-color: #4a4a4a;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #363636;
-}
-
-.button.is-link {
-  background-color: transparent;
-  border-color: transparent;
-  color: #4a4a4a;
-  text-decoration: underline;
-}
-
-.button.is-link:hover, .button.is-link.is-hovered, .button.is-link:focus, .button.is-link.is-focused, .button.is-link:active, .button.is-link.is-active {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.button.is-link[disabled] {
-  background-color: transparent;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-white {
-  background-color: white;
-  border-color: transparent;
-  color: #0a0a0a;
-}
-
-.button.is-white:hover, .button.is-white.is-hovered {
-  background-color: #f9f9f9;
-  border-color: transparent;
-  color: #0a0a0a;
-}
-
-.button.is-white:focus, .button.is-white.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25);
-  color: #0a0a0a;
-}
-
-.button.is-white:active, .button.is-white.is-active {
-  background-color: #f2f2f2;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #0a0a0a;
-}
-
-.button.is-white[disabled] {
-  background-color: white;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-white.is-inverted {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.button.is-white.is-inverted:hover {
-  background-color: black;
-}
-
-.button.is-white.is-inverted[disabled] {
-  background-color: #0a0a0a;
-  border-color: transparent;
-  box-shadow: none;
-  color: white;
-}
-
-.button.is-white.is-loading:after {
-  border-color: transparent transparent #0a0a0a #0a0a0a !important;
-}
-
-.button.is-white.is-outlined {
-  background-color: transparent;
-  border-color: white;
-  color: white;
-}
-
-.button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus {
-  background-color: white;
-  border-color: white;
-  color: #0a0a0a;
-}
-
-.button.is-white.is-outlined.is-loading:after {
-  border-color: transparent transparent white white !important;
-}
-
-.button.is-white.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: white;
-  box-shadow: none;
-  color: white;
-}
-
-.button.is-white.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #0a0a0a;
-  color: #0a0a0a;
-}
-
-.button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.button.is-white.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #0a0a0a;
-  box-shadow: none;
-  color: #0a0a0a;
-}
-
-.button.is-black {
-  background-color: #0a0a0a;
-  border-color: transparent;
-  color: white;
-}
-
-.button.is-black:hover, .button.is-black.is-hovered {
-  background-color: #040404;
-  border-color: transparent;
-  color: white;
-}
-
-.button.is-black:focus, .button.is-black.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25);
-  color: white;
-}
-
-.button.is-black:active, .button.is-black.is-active {
-  background-color: black;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: white;
-}
-
-.button.is-black[disabled] {
-  background-color: #0a0a0a;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-black.is-inverted {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.button.is-black.is-inverted:hover {
-  background-color: #f2f2f2;
-}
-
-.button.is-black.is-inverted[disabled] {
-  background-color: white;
-  border-color: transparent;
-  box-shadow: none;
-  color: #0a0a0a;
-}
-
-.button.is-black.is-loading:after {
-  border-color: transparent transparent white white !important;
-}
-
-.button.is-black.is-outlined {
-  background-color: transparent;
-  border-color: #0a0a0a;
-  color: #0a0a0a;
-}
-
-.button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus {
-  background-color: #0a0a0a;
-  border-color: #0a0a0a;
-  color: white;
-}
-
-.button.is-black.is-outlined.is-loading:after {
-  border-color: transparent transparent #0a0a0a #0a0a0a !important;
-}
-
-.button.is-black.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #0a0a0a;
-  box-shadow: none;
-  color: #0a0a0a;
-}
-
-.button.is-black.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: white;
-  color: white;
-}
-
-.button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.button.is-black.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: white;
-  box-shadow: none;
-  color: white;
-}
-
-.button.is-light {
-  background-color: whitesmoke;
-  border-color: transparent;
-  color: #363636;
-}
-
-.button.is-light:hover, .button.is-light.is-hovered {
-  background-color: #eeeeee;
-  border-color: transparent;
-  color: #363636;
-}
-
-.button.is-light:focus, .button.is-light.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25);
-  color: #363636;
-}
-
-.button.is-light:active, .button.is-light.is-active {
-  background-color: #e8e8e8;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #363636;
-}
-
-.button.is-light[disabled] {
-  background-color: whitesmoke;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-light.is-inverted {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.button.is-light.is-inverted:hover {
-  background-color: #292929;
-}
-
-.button.is-light.is-inverted[disabled] {
-  background-color: #363636;
-  border-color: transparent;
-  box-shadow: none;
-  color: whitesmoke;
-}
-
-.button.is-light.is-loading:after {
-  border-color: transparent transparent #363636 #363636 !important;
-}
-
-.button.is-light.is-outlined {
-  background-color: transparent;
-  border-color: whitesmoke;
-  color: whitesmoke;
-}
-
-.button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus {
-  background-color: whitesmoke;
-  border-color: whitesmoke;
-  color: #363636;
-}
-
-.button.is-light.is-outlined.is-loading:after {
-  border-color: transparent transparent whitesmoke whitesmoke !important;
-}
-
-.button.is-light.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: whitesmoke;
-  box-shadow: none;
-  color: whitesmoke;
-}
-
-.button.is-light.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #363636;
-  color: #363636;
-}
-
-.button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.button.is-light.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #363636;
-  box-shadow: none;
-  color: #363636;
-}
-
-.button.is-dark {
-  background-color: #363636;
-  border-color: transparent;
-  color: whitesmoke;
-}
-
-.button.is-dark:hover, .button.is-dark.is-hovered {
-  background-color: #2f2f2f;
-  border-color: transparent;
-  color: whitesmoke;
-}
-
-.button.is-dark:focus, .button.is-dark.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25);
-  color: whitesmoke;
-}
-
-.button.is-dark:active, .button.is-dark.is-active {
-  background-color: #292929;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: whitesmoke;
-}
-
-.button.is-dark[disabled] {
-  background-color: #363636;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-dark.is-inverted {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.button.is-dark.is-inverted:hover {
-  background-color: #e8e8e8;
-}
-
-.button.is-dark.is-inverted[disabled] {
-  background-color: whitesmoke;
-  border-color: transparent;
-  box-shadow: none;
-  color: #363636;
-}
-
-.button.is-dark.is-loading:after {
-  border-color: transparent transparent whitesmoke whitesmoke !important;
-}
-
-.button.is-dark.is-outlined {
-  background-color: transparent;
-  border-color: #363636;
-  color: #363636;
-}
-
-.button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus {
-  background-color: #363636;
-  border-color: #363636;
-  color: whitesmoke;
-}
-
-.button.is-dark.is-outlined.is-loading:after {
-  border-color: transparent transparent #363636 #363636 !important;
-}
-
-.button.is-dark.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #363636;
-  box-shadow: none;
-  color: #363636;
-}
-
-.button.is-dark.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: whitesmoke;
-  color: whitesmoke;
-}
-
-.button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.button.is-dark.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: whitesmoke;
-  box-shadow: none;
-  color: whitesmoke;
-}
-
-.button.is-primary {
-  background-color: #00d1b2;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-primary:hover, .button.is-primary.is-hovered {
-  background-color: #00c4a7;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-primary:focus, .button.is-primary.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(0, 209, 178, 0.25);
-  color: #fff;
-}
-
-.button.is-primary:active, .button.is-primary.is-active {
-  background-color: #00b89c;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #fff;
-}
-
-.button.is-primary[disabled] {
-  background-color: #00d1b2;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-primary.is-inverted {
-  background-color: #fff;
-  color: #00d1b2;
-}
-
-.button.is-primary.is-inverted:hover {
-  background-color: #f2f2f2;
-}
-
-.button.is-primary.is-inverted[disabled] {
-  background-color: #fff;
-  border-color: transparent;
-  box-shadow: none;
-  color: #00d1b2;
-}
-
-.button.is-primary.is-loading:after {
-  border-color: transparent transparent #fff #fff !important;
-}
-
-.button.is-primary.is-outlined {
-  background-color: transparent;
-  border-color: #00d1b2;
-  color: #00d1b2;
-}
-
-.button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus {
-  background-color: #00d1b2;
-  border-color: #00d1b2;
-  color: #fff;
-}
-
-.button.is-primary.is-outlined.is-loading:after {
-  border-color: transparent transparent #00d1b2 #00d1b2 !important;
-}
-
-.button.is-primary.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #00d1b2;
-  box-shadow: none;
-  color: #00d1b2;
-}
-
-.button.is-primary.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #fff;
-  color: #fff;
-}
-
-.button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus {
-  background-color: #fff;
-  color: #00d1b2;
-}
-
-.button.is-primary.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #fff;
-  box-shadow: none;
-  color: #fff;
-}
-
-.button.is-info {
-  background-color: #3273dc;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-info:hover, .button.is-info.is-hovered {
-  background-color: #276cda;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-info:focus, .button.is-info.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(50, 115, 220, 0.25);
-  color: #fff;
-}
-
-.button.is-info:active, .button.is-info.is-active {
-  background-color: #2366d1;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #fff;
-}
-
-.button.is-info[disabled] {
-  background-color: #3273dc;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-info.is-inverted {
-  background-color: #fff;
-  color: #3273dc;
-}
-
-.button.is-info.is-inverted:hover {
-  background-color: #f2f2f2;
-}
-
-.button.is-info.is-inverted[disabled] {
-  background-color: #fff;
-  border-color: transparent;
-  box-shadow: none;
-  color: #3273dc;
-}
-
-.button.is-info.is-loading:after {
-  border-color: transparent transparent #fff #fff !important;
-}
-
-.button.is-info.is-outlined {
-  background-color: transparent;
-  border-color: #3273dc;
-  color: #3273dc;
-}
-
-.button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus {
-  background-color: #3273dc;
-  border-color: #3273dc;
-  color: #fff;
-}
-
-.button.is-info.is-outlined.is-loading:after {
-  border-color: transparent transparent #3273dc #3273dc !important;
-}
-
-.button.is-info.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #3273dc;
-  box-shadow: none;
-  color: #3273dc;
-}
-
-.button.is-info.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #fff;
-  color: #fff;
-}
-
-.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus {
-  background-color: #fff;
-  color: #3273dc;
-}
-
-.button.is-info.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #fff;
-  box-shadow: none;
-  color: #fff;
-}
-
-.button.is-success {
-  background-color: #23d160;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-success:hover, .button.is-success.is-hovered {
-  background-color: #22c65b;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-success:focus, .button.is-success.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(35, 209, 96, 0.25);
-  color: #fff;
-}
-
-.button.is-success:active, .button.is-success.is-active {
-  background-color: #20bc56;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #fff;
-}
-
-.button.is-success[disabled] {
-  background-color: #23d160;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-success.is-inverted {
-  background-color: #fff;
-  color: #23d160;
-}
-
-.button.is-success.is-inverted:hover {
-  background-color: #f2f2f2;
-}
-
-.button.is-success.is-inverted[disabled] {
-  background-color: #fff;
-  border-color: transparent;
-  box-shadow: none;
-  color: #23d160;
-}
-
-.button.is-success.is-loading:after {
-  border-color: transparent transparent #fff #fff !important;
-}
-
-.button.is-success.is-outlined {
-  background-color: transparent;
-  border-color: #23d160;
-  color: #23d160;
-}
-
-.button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus {
-  background-color: #23d160;
-  border-color: #23d160;
-  color: #fff;
-}
-
-.button.is-success.is-outlined.is-loading:after {
-  border-color: transparent transparent #23d160 #23d160 !important;
-}
-
-.button.is-success.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #23d160;
-  box-shadow: none;
-  color: #23d160;
-}
-
-.button.is-success.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #fff;
-  color: #fff;
-}
-
-.button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus {
-  background-color: #fff;
-  color: #23d160;
-}
-
-.button.is-success.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #fff;
-  box-shadow: none;
-  color: #fff;
-}
-
-.button.is-warning {
-  background-color: #ffdd57;
-  border-color: transparent;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning:hover, .button.is-warning.is-hovered {
-  background-color: #ffdb4a;
-  border-color: transparent;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning:focus, .button.is-warning.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25);
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning:active, .button.is-warning.is-active {
-  background-color: #ffd83d;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning[disabled] {
-  background-color: #ffdd57;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-warning.is-inverted {
-  background-color: rgba(0, 0, 0, 0.7);
-  color: #ffdd57;
-}
-
-.button.is-warning.is-inverted:hover {
-  background-color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning.is-inverted[disabled] {
-  background-color: rgba(0, 0, 0, 0.7);
-  border-color: transparent;
-  box-shadow: none;
-  color: #ffdd57;
-}
-
-.button.is-warning.is-loading:after {
-  border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important;
-}
-
-.button.is-warning.is-outlined {
-  background-color: transparent;
-  border-color: #ffdd57;
-  color: #ffdd57;
-}
-
-.button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus {
-  background-color: #ffdd57;
-  border-color: #ffdd57;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning.is-outlined.is-loading:after {
-  border-color: transparent transparent #ffdd57 #ffdd57 !important;
-}
-
-.button.is-warning.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #ffdd57;
-  box-shadow: none;
-  color: #ffdd57;
-}
-
-.button.is-warning.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: rgba(0, 0, 0, 0.7);
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus {
-  background-color: rgba(0, 0, 0, 0.7);
-  color: #ffdd57;
-}
-
-.button.is-warning.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: rgba(0, 0, 0, 0.7);
-  box-shadow: none;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.button.is-danger {
-  background-color: #ff3860;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-danger:hover, .button.is-danger.is-hovered {
-  background-color: #ff2b56;
-  border-color: transparent;
-  color: #fff;
-}
-
-.button.is-danger:focus, .button.is-danger.is-focused {
-  border-color: transparent;
-  box-shadow: 0 0 0.5em rgba(255, 56, 96, 0.25);
-  color: #fff;
-}
-
-.button.is-danger:active, .button.is-danger.is-active {
-  background-color: #ff1f4b;
-  border-color: transparent;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-  color: #fff;
-}
-
-.button.is-danger[disabled] {
-  background-color: #ff3860;
-  border-color: transparent;
-  box-shadow: none;
-}
-
-.button.is-danger.is-inverted {
-  background-color: #fff;
-  color: #ff3860;
-}
-
-.button.is-danger.is-inverted:hover {
-  background-color: #f2f2f2;
-}
-
-.button.is-danger.is-inverted[disabled] {
-  background-color: #fff;
-  border-color: transparent;
-  box-shadow: none;
-  color: #ff3860;
-}
-
-.button.is-danger.is-loading:after {
-  border-color: transparent transparent #fff #fff !important;
-}
-
-.button.is-danger.is-outlined {
-  background-color: transparent;
-  border-color: #ff3860;
-  color: #ff3860;
-}
-
-.button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus {
-  background-color: #ff3860;
-  border-color: #ff3860;
-  color: #fff;
-}
-
-.button.is-danger.is-outlined.is-loading:after {
-  border-color: transparent transparent #ff3860 #ff3860 !important;
-}
-
-.button.is-danger.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #ff3860;
-  box-shadow: none;
-  color: #ff3860;
-}
-
-.button.is-danger.is-inverted.is-outlined {
-  background-color: transparent;
-  border-color: #fff;
-  color: #fff;
-}
-
-.button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus {
-  background-color: #fff;
-  color: #ff3860;
-}
-
-.button.is-danger.is-inverted.is-outlined[disabled] {
-  background-color: transparent;
-  border-color: #fff;
-  box-shadow: none;
-  color: #fff;
-}
-
-.button.is-small {
-  border-radius: 2px;
-  font-size: 0.75rem;
-}
-
-.button.is-medium {
-  font-size: 1.25rem;
-}
-
-.button.is-large {
-  font-size: 1.5rem;
-}
-
-.button[disabled] {
-  background-color: white;
-  border-color: #dbdbdb;
-  box-shadow: none;
-  opacity: 0.5;
-}
-
-.button.is-fullwidth {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  width: 100%;
-}
-
-.button.is-loading {
-  color: transparent !important;
-  pointer-events: none;
-}
-
-.button.is-loading:after {
-  -webkit-animation: spinAround 500ms infinite linear;
-          animation: spinAround 500ms infinite linear;
-  border: 2px solid #dbdbdb;
-  border-radius: 290486px;
-  border-right-color: transparent;
-  border-top-color: transparent;
-  content: "";
-  display: block;
-  height: 1em;
-  position: relative;
-  width: 1em;
-  position: absolute;
-  left: calc(50% - (1em / 2));
-  top: calc(50% - (1em / 2));
-  position: absolute !important;
-}
-
-button.button,
-input[type="submit"].button {
-  line-height: 1;
-  padding-bottom: 0.4em;
-  padding-top: 0.35em;
-}
-
-.content {
-  color: #4a4a4a;
-}
-
-.content:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.content li + li {
-  margin-top: 0.25em;
-}
-
-.content p:not(:last-child),
-.content dl:not(:last-child),
-.content ol:not(:last-child),
-.content ul:not(:last-child),
-.content blockquote:not(:last-child),
-.content pre:not(:last-child),
-.content table:not(:last-child) {
-  margin-bottom: 1em;
-}
-
-.content h1,
-.content h2,
-.content h3,
-.content h4,
-.content h5,
-.content h6 {
-  color: #363636;
-  font-weight: 400;
-  line-height: 1.125;
-}
-
-.content h1 {
-  font-size: 2em;
-  margin-bottom: 0.5em;
-}
-
-.content h1:not(:first-child) {
-  margin-top: 1em;
-}
-
-.content h2 {
-  font-size: 1.75em;
-  margin-bottom: 0.5714em;
-}
-
-.content h2:not(:first-child) {
-  margin-top: 1.1428em;
-}
-
-.content h3 {
-  font-size: 1.5em;
-  margin-bottom: 0.6666em;
-}
-
-.content h3:not(:first-child) {
-  margin-top: 1.3333em;
-}
-
-.content h4 {
-  font-size: 1.25em;
-  margin-bottom: 0.8em;
-}
-
-.content h5 {
-  font-size: 1.125em;
-  margin-bottom: 0.8888em;
-}
-
-.content h6 {
-  font-size: 1em;
-  margin-bottom: 1em;
-}
-
-.content blockquote {
-  background-color: whitesmoke;
-  border-left: 5px solid #dbdbdb;
-  padding: 1.25em 1.5em;
-}
-
-.content ol {
-  list-style: decimal outside;
-  margin-left: 2em;
-  margin-right: 2em;
-  margin-top: 1em;
-}
-
-.content ul {
-  list-style: disc outside;
-  margin-left: 2em;
-  margin-right: 2em;
-  margin-top: 1em;
-}
-
-.content ul ul {
-  list-style-type: circle;
-  margin-top: 0.5em;
-}
-
-.content ul ul ul {
-  list-style-type: square;
-}
-
-.content dd {
-  margin-left: 2em;
-}
-
-.content pre {
-  -webkit-overflow-scrolling: touch;
-  overflow-x: auto;
-  padding: 1.25em 1.5em;
-  white-space: pre;
-  word-wrap: normal;
-}
-
-.content table {
-  width: 100%;
-}
-
-.content table td,
-.content table th {
-  border: 1px solid #dbdbdb;
-  border-width: 0 0 1px;
-  padding: 0.5em 0.75em;
-  vertical-align: top;
-}
-
-.content table th {
-  color: #363636;
-  text-align: left;
-}
-
-.content table tr:hover {
-  background-color: whitesmoke;
-}
-
-.content table thead td,
-.content table thead th {
-  border-width: 0 0 2px;
-  color: #363636;
-}
-
-.content table tfoot td,
-.content table tfoot th {
-  border-width: 2px 0 0;
-  color: #363636;
-}
-
-.content table tbody tr:last-child td,
-.content table tbody tr:last-child th {
-  border-bottom-width: 0;
-}
-
-.content.is-small {
-  font-size: 0.75rem;
-}
-
-.content.is-medium {
-  font-size: 1.25rem;
-}
-
-.content.is-large {
-  font-size: 1.5rem;
-}
-
-.input,
-.textarea {
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border: 1px solid transparent;
-  border-radius: 3px;
-  box-shadow: none;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 1rem;
-  height: 2.25em;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  line-height: 1.5;
-  padding-bottom: calc(0.375em - 1px);
-  padding-left: calc(0.625em - 1px);
-  padding-right: calc(0.625em - 1px);
-  padding-top: calc(0.375em - 1px);
-  position: relative;
-  vertical-align: top;
-  background-color: white;
-  border-color: #dbdbdb;
-  color: #363636;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1);
-  max-width: 100%;
-  width: 100%;
-}
-
-.input:focus, .input.is-focused, .input:active, .input.is-active,
-.textarea:focus,
-.textarea.is-focused,
-.textarea:active,
-.textarea.is-active {
-  outline: none;
-}
-
-.input[disabled],
-.textarea[disabled] {
-  cursor: not-allowed;
-}
-
-.input:hover, .input.is-hovered,
-.textarea:hover,
-.textarea.is-hovered {
-  border-color: #b5b5b5;
-}
-
-.input:focus, .input.is-focused, .input:active, .input.is-active,
-.textarea:focus,
-.textarea.is-focused,
-.textarea:active,
-.textarea.is-active {
-  border-color: #00d1b2;
-}
-
-.input[disabled],
-.textarea[disabled] {
-  background-color: whitesmoke;
-  border-color: whitesmoke;
-  box-shadow: none;
-  color: #7a7a7a;
-}
-
-.input[disabled]::-moz-placeholder,
-.textarea[disabled]::-moz-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.input[disabled]::-webkit-input-placeholder,
-.textarea[disabled]::-webkit-input-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.input[disabled]:-moz-placeholder,
-.textarea[disabled]:-moz-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.input[disabled]:-ms-input-placeholder,
-.textarea[disabled]:-ms-input-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.input[type="search"],
-.textarea[type="search"] {
-  border-radius: 290486px;
-}
-
-.input.is-white,
-.textarea.is-white {
-  border-color: white;
-}
-
-.input.is-black,
-.textarea.is-black {
-  border-color: #0a0a0a;
-}
-
-.input.is-light,
-.textarea.is-light {
-  border-color: whitesmoke;
-}
-
-.input.is-dark,
-.textarea.is-dark {
-  border-color: #363636;
-}
-
-.input.is-primary,
-.textarea.is-primary {
-  border-color: #00d1b2;
-}
-
-.input.is-info,
-.textarea.is-info {
-  border-color: #3273dc;
-}
-
-.input.is-success,
-.textarea.is-success {
-  border-color: #23d160;
-}
-
-.input.is-warning,
-.textarea.is-warning {
-  border-color: #ffdd57;
-}
-
-.input.is-danger,
-.textarea.is-danger {
-  border-color: #ff3860;
-}
-
-.input.is-small,
-.textarea.is-small {
-  border-radius: 2px;
-  font-size: 0.75rem;
-}
-
-.input.is-medium,
-.textarea.is-medium {
-  font-size: 1.25rem;
-}
-
-.input.is-large,
-.textarea.is-large {
-  font-size: 1.5rem;
-}
-
-.input.is-fullwidth,
-.textarea.is-fullwidth {
-  display: block;
-  width: 100%;
-}
-
-.input.is-inline,
-.textarea.is-inline {
-  display: inline;
-  width: auto;
-}
-
-.textarea {
-  display: block;
-  max-height: 600px;
-  max-width: 100%;
-  min-height: 120px;
-  min-width: 100%;
-  padding: 0.625em;
-  resize: vertical;
-}
-
-.checkbox,
-.radio {
-  cursor: pointer;
-  display: inline-block;
-  line-height: 1.25;
-  position: relative;
-}
-
-.checkbox input,
-.radio input {
-  cursor: pointer;
-}
-
-.checkbox:hover,
-.radio:hover {
-  color: #363636;
-}
-
-.checkbox[disabled],
-.radio[disabled] {
-  color: #7a7a7a;
-  cursor: not-allowed;
-}
-
-.radio + .radio {
-  margin-left: 0.5em;
-}
-
-.select {
-  display: inline-block;
-  height: 2.25em;
-  position: relative;
-  vertical-align: top;
-}
-
-.select:after {
-  border: 1px solid #00d1b2;
-  border-right: 0;
-  border-top: 0;
-  content: " ";
-  display: block;
-  height: 0.5em;
-  pointer-events: none;
-  position: absolute;
-  -webkit-transform: rotate(-45deg);
-          transform: rotate(-45deg);
-  width: 0.5em;
-  margin-top: -0.375em;
-  right: 1.125em;
-  top: 50%;
-  z-index: 4;
-}
-
-.select select {
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border: 1px solid transparent;
-  border-radius: 3px;
-  box-shadow: none;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 1rem;
-  height: 2.25em;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  line-height: 1.5;
-  padding-bottom: calc(0.375em - 1px);
-  padding-left: calc(0.625em - 1px);
-  padding-right: calc(0.625em - 1px);
-  padding-top: calc(0.375em - 1px);
-  position: relative;
-  vertical-align: top;
-  background-color: white;
-  border-color: #dbdbdb;
-  color: #363636;
-  cursor: pointer;
-  display: block;
-  font-size: 1em;
-  outline: none;
-  padding-right: 2.5em;
-}
-
-.select select:focus, .select select.is-focused, .select select:active, .select select.is-active {
-  outline: none;
-}
-
-.select select[disabled] {
-  cursor: not-allowed;
-}
-
-.select select:hover, .select select.is-hovered {
-  border-color: #b5b5b5;
-}
-
-.select select:focus, .select select.is-focused, .select select:active, .select select.is-active {
-  border-color: #00d1b2;
-}
-
-.select select[disabled] {
-  background-color: whitesmoke;
-  border-color: whitesmoke;
-  box-shadow: none;
-  color: #7a7a7a;
-}
-
-.select select[disabled]::-moz-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.select select[disabled]::-webkit-input-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.select select[disabled]:-moz-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.select select[disabled]:-ms-input-placeholder {
-  color: rgba(54, 54, 54, 0.3);
-}
-
-.select select:hover {
-  border-color: #b5b5b5;
-}
-
-.select select::-ms-expand {
-  display: none;
-}
-
-.select select[disabled]:hover {
-  border-color: whitesmoke;
-}
-
-.select:hover:after {
-  border-color: #363636;
-}
-
-.select.is-white select {
-  border-color: white;
-}
-
-.select.is-black select {
-  border-color: #0a0a0a;
-}
-
-.select.is-light select {
-  border-color: whitesmoke;
-}
-
-.select.is-dark select {
-  border-color: #363636;
-}
-
-.select.is-primary select {
-  border-color: #00d1b2;
-}
-
-.select.is-info select {
-  border-color: #3273dc;
-}
-
-.select.is-success select {
-  border-color: #23d160;
-}
-
-.select.is-warning select {
-  border-color: #ffdd57;
-}
-
-.select.is-danger select {
-  border-color: #ff3860;
-}
-
-.select.is-small {
-  border-radius: 2px;
-  font-size: 0.75rem;
-}
-
-.select.is-medium {
-  font-size: 1.25rem;
-}
-
-.select.is-large {
-  font-size: 1.5rem;
-}
-
-.select.is-disabled:after {
-  border-color: #7a7a7a;
-}
-
-.select.is-fullwidth {
-  width: 100%;
-}
-
-.select.is-fullwidth select {
-  width: 100%;
-}
-
-.select.is-loading:after {
-  -webkit-animation: spinAround 500ms infinite linear;
-          animation: spinAround 500ms infinite linear;
-  border: 2px solid #dbdbdb;
-  border-radius: 290486px;
-  border-right-color: transparent;
-  border-top-color: transparent;
-  content: "";
-  display: block;
-  height: 1em;
-  position: relative;
-  width: 1em;
-  margin-top: 0;
-  position: absolute;
-  right: 0.625em;
-  top: 0.625em;
-  -webkit-transform: none;
-          transform: none;
-}
-
-.label {
-  color: #363636;
-  display: block;
-  font-size: 1rem;
-  font-weight: 700;
-}
-
-.label:not(:last-child) {
-  margin-bottom: 0.5em;
-}
-
-.label.is-small {
-  font-size: 0.75rem;
-}
-
-.label.is-medium {
-  font-size: 1.25rem;
-}
-
-.label.is-large {
-  font-size: 1.5rem;
-}
-
-.help {
-  display: block;
-  font-size: 0.75rem;
-  margin-top: 0.25rem;
-}
-
-.help.is-white {
-  color: white;
-}
-
-.help.is-black {
-  color: #0a0a0a;
-}
-
-.help.is-light {
-  color: whitesmoke;
-}
-
-.help.is-dark {
-  color: #363636;
-}
-
-.help.is-primary {
-  color: #00d1b2;
-}
-
-.help.is-info {
-  color: #3273dc;
-}
-
-.help.is-success {
-  color: #23d160;
-}
-
-.help.is-warning {
-  color: #ffdd57;
-}
-
-.help.is-danger {
-  color: #ff3860;
-}
-
-.field:not(:last-child) {
-  margin-bottom: 0.75rem;
-}
-
-.field.has-addons {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-}
-
-.field.has-addons .control {
-  margin-right: -1px;
-}
-
-.field.has-addons .control:first-child .button,
-.field.has-addons .control:first-child .input,
-.field.has-addons .control:first-child .select select {
-  border-bottom-left-radius: 3px;
-  border-top-left-radius: 3px;
-}
-
-.field.has-addons .control:last-child .button,
-.field.has-addons .control:last-child .input,
-.field.has-addons .control:last-child .select select {
-  border-bottom-right-radius: 3px;
-  border-top-right-radius: 3px;
-}
-
-.field.has-addons .control .button,
-.field.has-addons .control .input,
-.field.has-addons .control .select select {
-  border-radius: 0;
-}
-
-.field.has-addons .control .button:hover, .field.has-addons .control .button.is-hovered,
-.field.has-addons .control .input:hover,
-.field.has-addons .control .input.is-hovered,
-.field.has-addons .control .select select:hover,
-.field.has-addons .control .select select.is-hovered {
-  z-index: 2;
-}
-
-.field.has-addons .control .button:focus, .field.has-addons .control .button.is-focused, .field.has-addons .control .button:active, .field.has-addons .control .button.is-active,
-.field.has-addons .control .input:focus,
-.field.has-addons .control .input.is-focused,
-.field.has-addons .control .input:active,
-.field.has-addons .control .input.is-active,
-.field.has-addons .control .select select:focus,
-.field.has-addons .control .select select.is-focused,
-.field.has-addons .control .select select:active,
-.field.has-addons .control .select select.is-active {
-  z-index: 3;
-}
-
-.field.has-addons .control .button:focus:hover, .field.has-addons .control .button.is-focused:hover, .field.has-addons .control .button:active:hover, .field.has-addons .control .button.is-active:hover,
-.field.has-addons .control .input:focus:hover,
-.field.has-addons .control .input.is-focused:hover,
-.field.has-addons .control .input:active:hover,
-.field.has-addons .control .input.is-active:hover,
-.field.has-addons .control .select select:focus:hover,
-.field.has-addons .control .select select.is-focused:hover,
-.field.has-addons .control .select select:active:hover,
-.field.has-addons .control .select select.is-active:hover {
-  z-index: 4;
-}
-
-.field.has-addons .control.is-expanded {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.field.has-addons.has-addons-centered {
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.field.has-addons.has-addons-right {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-}
-
-.field.has-addons.has-addons-fullwidth .control {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.field.is-grouped {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-}
-
-.field.is-grouped > .control {
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.field.is-grouped > .control:not(:last-child) {
-  margin-bottom: 0;
-  margin-right: 0.75rem;
-}
-
-.field.is-grouped > .control.is-expanded {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-}
-
-.field.is-grouped.is-grouped-centered {
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.field.is-grouped.is-grouped-right {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-}
-
-@media screen and (min-width: 769px), print {
-  .field.is-horizontal {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-}
-
-.field-label .label {
-  font-size: inherit;
-}
-
-@media screen and (max-width: 768px) {
-  .field-label {
-    margin-bottom: 0.5rem;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .field-label {
-    -ms-flex-preferred-size: 0;
-        flex-basis: 0;
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    -ms-flex-negative: 0;
-        flex-shrink: 0;
-    margin-right: 1.5rem;
-    text-align: right;
-  }
-  .field-label.is-small {
-    font-size: 0.75rem;
-    padding-top: 0.375em;
-  }
-  .field-label.is-normal {
-    padding-top: 0.375em;
-  }
-  .field-label.is-medium {
-    font-size: 1.25rem;
-    padding-top: 0.375em;
-  }
-  .field-label.is-large {
-    font-size: 1.5rem;
-    padding-top: 0.375em;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .field-body {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-preferred-size: 0;
-        flex-basis: 0;
-    -webkit-box-flex: 5;
-        -ms-flex-positive: 5;
-            flex-grow: 5;
-    -ms-flex-negative: 1;
-        flex-shrink: 1;
-  }
-  .field-body .field {
-    -ms-flex-negative: 1;
-        flex-shrink: 1;
-  }
-  .field-body .field:not(.is-narrow) {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-  }
-  .field-body .field:not(:last-child) {
-    margin-bottom: 0;
-    margin-right: 0.75rem;
-  }
-}
-
-.control {
-  font-size: 1rem;
-  position: relative;
-  text-align: left;
-}
-
-.control.has-icon .icon {
-  color: #dbdbdb;
-  height: 2.25em;
-  pointer-events: none;
-  position: absolute;
-  top: 0;
-  width: 2.25em;
-  z-index: 4;
-}
-
-.control.has-icon .input:focus + .icon {
-  color: #7a7a7a;
-}
-
-.control.has-icon .input.is-small + .icon {
-  font-size: 0.75rem;
-}
-
-.control.has-icon .input.is-medium + .icon {
-  font-size: 1.25rem;
-}
-
-.control.has-icon .input.is-large + .icon {
-  font-size: 1.5rem;
-}
-
-.control.has-icon:not(.has-icon-right) .icon {
-  left: 0;
-}
-
-.control.has-icon:not(.has-icon-right) .input {
-  padding-left: 2.25em;
-}
-
-.control.has-icon.has-icon-right .icon {
-  right: 0;
-}
-
-.control.has-icon.has-icon-right .input {
-  padding-right: 2.25em;
-}
-
-.control.has-icons-left .input:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon {
-  color: #7a7a7a;
-}
-
-.control.has-icons-left .input.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon {
-  font-size: 0.75rem;
-}
-
-.control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon {
-  font-size: 1.25rem;
-}
-
-.control.has-icons-left .input.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon {
-  font-size: 1.5rem;
-}
-
-.control.has-icons-left .icon, .control.has-icons-right .icon {
-  color: #dbdbdb;
-  height: 2.25em;
-  pointer-events: none;
-  position: absolute;
-  top: 0;
-  width: 2.25em;
-  z-index: 4;
-}
-
-.control.has-icons-left .input {
-  padding-left: 2.25em;
-}
-
-.control.has-icons-left .icon.is-left {
-  left: 0;
-}
-
-.control.has-icons-right .input {
-  padding-right: 2.25em;
-}
-
-.control.has-icons-right .icon.is-right {
-  right: 0;
-}
-
-.control.is-loading:after {
-  -webkit-animation: spinAround 500ms infinite linear;
-          animation: spinAround 500ms infinite linear;
-  border: 2px solid #dbdbdb;
-  border-radius: 290486px;
-  border-right-color: transparent;
-  border-top-color: transparent;
-  content: "";
-  display: block;
-  height: 1em;
-  position: relative;
-  width: 1em;
-  position: absolute !important;
-  right: 0.625em;
-  top: 0.625em;
-}
-
-.icon {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  height: 1.5rem;
-  width: 1.5rem;
-}
-
-.icon .fa {
-  font-size: 21px;
-}
-
-.icon.is-small {
-  height: 1rem;
-  width: 1rem;
-}
-
-.icon.is-small .fa {
-  font-size: 14px;
-}
-
-.icon.is-medium {
-  height: 2rem;
-  width: 2rem;
-}
-
-.icon.is-medium .fa {
-  font-size: 28px;
-}
-
-.icon.is-large {
-  height: 3rem;
-  width: 3rem;
-}
-
-.icon.is-large .fa {
-  font-size: 42px;
-}
-
-.image {
-  display: block;
-  position: relative;
-}
-
-.image img {
-  display: block;
-  height: auto;
-  width: 100%;
-}
-
-.image.is-square img, .image.is-1by1 img, .image.is-4by3 img, .image.is-3by2 img, .image.is-16by9 img, .image.is-2by1 img {
-  bottom: 0;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  height: 100%;
-  width: 100%;
-}
-
-.image.is-square, .image.is-1by1 {
-  padding-top: 100%;
-}
-
-.image.is-4by3 {
-  padding-top: 75%;
-}
-
-.image.is-3by2 {
-  padding-top: 66.6666%;
-}
-
-.image.is-16by9 {
-  padding-top: 56.25%;
-}
-
-.image.is-2by1 {
-  padding-top: 50%;
-}
-
-.image.is-16x16 {
-  height: 16px;
-  width: 16px;
-}
-
-.image.is-24x24 {
-  height: 24px;
-  width: 24px;
-}
-
-.image.is-32x32 {
-  height: 32px;
-  width: 32px;
-}
-
-.image.is-48x48 {
-  height: 48px;
-  width: 48px;
-}
-
-.image.is-64x64 {
-  height: 64px;
-  width: 64px;
-}
-
-.image.is-96x96 {
-  height: 96px;
-  width: 96px;
-}
-
-.image.is-128x128 {
-  height: 128px;
-  width: 128px;
-}
-
-.notification {
-  background-color: whitesmoke;
-  border-radius: 3px;
-  padding: 1.25rem 2.5rem 1.25rem 1.5rem;
-  position: relative;
-}
-
-.notification:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.notification a:not(.button) {
-  color: currentColor;
-  text-decoration: underline;
-}
-
-.notification code,
-.notification pre {
-  background: white;
-}
-
-.notification pre code {
-  background: transparent;
-}
-
-.notification > .delete {
-  position: absolute;
-  right: 0.5em;
-  top: 0.5em;
-}
-
-.notification .title,
-.notification .subtitle,
-.notification .content {
-  color: inherit;
-}
-
-.notification.is-white {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.notification.is-black {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.notification.is-light {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.notification.is-dark {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.notification.is-primary {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.notification.is-info {
-  background-color: #3273dc;
-  color: #fff;
-}
-
-.notification.is-success {
-  background-color: #23d160;
-  color: #fff;
-}
-
-.notification.is-warning {
-  background-color: #ffdd57;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.notification.is-danger {
-  background-color: #ff3860;
-  color: #fff;
-}
-
-.progress {
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  border: none;
-  border-radius: 290486px;
-  display: block;
-  height: 1rem;
-  overflow: hidden;
-  padding: 0;
-  width: 100%;
-}
-
-.progress:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.progress::-webkit-progress-bar {
-  background-color: #dbdbdb;
-}
-
-.progress::-webkit-progress-value {
-  background-color: #4a4a4a;
-}
-
-.progress::-moz-progress-bar {
-  background-color: #4a4a4a;
-}
-
-.progress.is-white::-webkit-progress-value {
-  background-color: white;
-}
-
-.progress.is-white::-moz-progress-bar {
-  background-color: white;
-}
-
-.progress.is-black::-webkit-progress-value {
-  background-color: #0a0a0a;
-}
-
-.progress.is-black::-moz-progress-bar {
-  background-color: #0a0a0a;
-}
-
-.progress.is-light::-webkit-progress-value {
-  background-color: whitesmoke;
-}
-
-.progress.is-light::-moz-progress-bar {
-  background-color: whitesmoke;
-}
-
-.progress.is-dark::-webkit-progress-value {
-  background-color: #363636;
-}
-
-.progress.is-dark::-moz-progress-bar {
-  background-color: #363636;
-}
-
-.progress.is-primary::-webkit-progress-value {
-  background-color: #00d1b2;
-}
-
-.progress.is-primary::-moz-progress-bar {
-  background-color: #00d1b2;
-}
-
-.progress.is-info::-webkit-progress-value {
-  background-color: #3273dc;
-}
-
-.progress.is-info::-moz-progress-bar {
-  background-color: #3273dc;
-}
-
-.progress.is-success::-webkit-progress-value {
-  background-color: #23d160;
-}
-
-.progress.is-success::-moz-progress-bar {
-  background-color: #23d160;
-}
-
-.progress.is-warning::-webkit-progress-value {
-  background-color: #ffdd57;
-}
-
-.progress.is-warning::-moz-progress-bar {
-  background-color: #ffdd57;
-}
-
-.progress.is-danger::-webkit-progress-value {
-  background-color: #ff3860;
-}
-
-.progress.is-danger::-moz-progress-bar {
-  background-color: #ff3860;
-}
-
-.progress.is-small {
-  height: 0.75rem;
-}
-
-.progress.is-medium {
-  height: 1.25rem;
-}
-
-.progress.is-large {
-  height: 1.5rem;
-}
-
-.table {
-  background-color: white;
-  color: #363636;
-  margin-bottom: 1.5rem;
-  width: 100%;
-}
-
-.table td,
-.table th {
-  border: 1px solid #dbdbdb;
-  border-width: 0 0 1px;
-  padding: 0.5em 0.75em;
-  vertical-align: top;
-}
-
-.table td.is-narrow,
-.table th.is-narrow {
-  white-space: nowrap;
-  width: 1%;
-}
-
-.table th {
-  color: #363636;
-  text-align: left;
-}
-
-.table tr:hover {
-  background-color: #fafafa;
-}
-
-.table tr.is-selected {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.table tr.is-selected a,
-.table tr.is-selected strong {
-  color: currentColor;
-}
-
-.table tr.is-selected td,
-.table tr.is-selected th {
-  border-color: #fff;
-  color: currentColor;
-}
-
-.table thead td,
-.table thead th {
-  border-width: 0 0 2px;
-  color: #7a7a7a;
-}
-
-.table tfoot td,
-.table tfoot th {
-  border-width: 2px 0 0;
-  color: #7a7a7a;
-}
-
-.table tbody tr:last-child td,
-.table tbody tr:last-child th {
-  border-bottom-width: 0;
-}
-
-.table.is-bordered td,
-.table.is-bordered th {
-  border-width: 1px;
-}
-
-.table.is-bordered tr:last-child td,
-.table.is-bordered tr:last-child th {
-  border-bottom-width: 1px;
-}
-
-.table.is-narrow td,
-.table.is-narrow th {
-  padding: 0.25em 0.5em;
-}
-
-.table.is-striped tbody tr:nth-child(even) {
-  background-color: #fafafa;
-}
-
-.table.is-striped tbody tr:nth-child(even):hover {
-  background-color: whitesmoke;
-}
-
-.tag {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  background-color: whitesmoke;
-  border-radius: 290486px;
-  color: #4a4a4a;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 0.75rem;
-  height: 2em;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  line-height: 1.5;
-  padding-left: 0.875em;
-  padding-right: 0.875em;
-  white-space: nowrap;
-}
-
-.tag .delete {
-  margin-left: 0.25em;
-  margin-right: -0.375em;
-}
-
-.tag.is-white {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.tag.is-black {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.tag.is-light {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.tag.is-dark {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.tag.is-primary {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.tag.is-info {
-  background-color: #3273dc;
-  color: #fff;
-}
-
-.tag.is-success {
-  background-color: #23d160;
-  color: #fff;
-}
-
-.tag.is-warning {
-  background-color: #ffdd57;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.tag.is-danger {
-  background-color: #ff3860;
-  color: #fff;
-}
-
-.tag.is-medium {
-  font-size: 1rem;
-}
-
-.tag.is-large {
-  font-size: 1.25rem;
-}
-
-.title,
-.subtitle {
-  word-break: break-word;
-}
-
-.title:not(:last-child),
-.subtitle:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.title em,
-.title span,
-.subtitle em,
-.subtitle span {
-  font-weight: 300;
-}
-
-.title strong,
-.subtitle strong {
-  font-weight: 500;
-}
-
-.title .tag,
-.subtitle .tag {
-  vertical-align: middle;
-}
-
-.title {
-  color: #363636;
-  font-size: 2rem;
-  font-weight: 300;
-  line-height: 1.125;
-}
-
-.title strong {
-  color: inherit;
-}
-
-.title + .highlight {
-  margin-top: -0.75rem;
-}
-
-.title:not(.is-spaced) + .subtitle {
-  margin-top: -1.5rem;
-}
-
-.title.is-1 {
-  font-size: 3rem;
-}
-
-.title.is-2 {
-  font-size: 2.5rem;
-}
-
-.title.is-3 {
-  font-size: 2rem;
-}
-
-.title.is-4 {
-  font-size: 1.5rem;
-}
-
-.title.is-5 {
-  font-size: 1.25rem;
-}
-
-.title.is-6 {
-  font-size: 1rem;
-}
-
-.subtitle {
-  color: #4a4a4a;
-  font-size: 1.25rem;
-  font-weight: 300;
-  line-height: 1.25;
-}
-
-.subtitle strong {
-  color: #363636;
-}
-
-.subtitle:not(.is-spaced) + .title {
-  margin-top: -1.5rem;
-}
-
-.subtitle.is-1 {
-  font-size: 3rem;
-}
-
-.subtitle.is-2 {
-  font-size: 2.5rem;
-}
-
-.subtitle.is-3 {
-  font-size: 2rem;
-}
-
-.subtitle.is-4 {
-  font-size: 1.5rem;
-}
-
-.subtitle.is-5 {
-  font-size: 1.25rem;
-}
-
-.subtitle.is-6 {
-  font-size: 1rem;
-}
-
-.block:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.container {
-  position: relative;
-}
-
-@media screen and (min-width: 1000px) {
-  .container {
-    margin: 0 auto;
-    max-width: 960px;
-    width: 960px;
-  }
-  .container.is-fluid {
-    margin: 0 20px;
-    max-width: none;
-    width: auto;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .container {
-    max-width: 1152px;
-    width: 1152px;
-  }
-}
-
-@media screen and (min-width: 1384px) {
-  .container {
-    max-width: 1344px;
-    width: 1344px;
-  }
-}
-
-.delete {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  background-color: rgba(10, 10, 10, 0.2);
-  border: none;
-  border-radius: 290486px;
-  cursor: pointer;
-  display: inline-block;
-  font-size: 1rem;
-  height: 20px;
-  outline: none;
-  position: relative;
-  vertical-align: top;
-  width: 20px;
-}
-
-.delete:before, .delete:after {
-  background-color: white;
-  content: "";
-  display: block;
-  left: 50%;
-  position: absolute;
-  top: 50%;
-  -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg);
-          transform: translateX(-50%) translateY(-50%) rotate(45deg);
-  -webkit-transform-origin: center center;
-          transform-origin: center center;
-}
-
-.delete:before {
-  height: 2px;
-  width: 50%;
-}
-
-.delete:after {
-  height: 50%;
-  width: 2px;
-}
-
-.delete:hover, .delete:focus {
-  background-color: rgba(10, 10, 10, 0.3);
-}
-
-.delete:active {
-  background-color: rgba(10, 10, 10, 0.4);
-}
-
-.delete.is-small {
-  height: 16px;
-  width: 16px;
-}
-
-.delete.is-medium {
-  height: 24px;
-  width: 24px;
-}
-
-.delete.is-large {
-  height: 32px;
-  width: 32px;
-}
-
-.fa {
-  font-size: 21px;
-  text-align: center;
-  vertical-align: top;
-}
-
-.heading {
-  display: block;
-  font-size: 11px;
-  letter-spacing: 1px;
-  margin-bottom: 5px;
-  text-transform: uppercase;
-}
-
-.highlight {
-  font-weight: 400;
-  max-width: 100%;
-  overflow: hidden;
-  padding: 0;
-}
-
-.highlight:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.highlight pre {
-  overflow: auto;
-  max-width: 100%;
-}
-
-.loader {
-  -webkit-animation: spinAround 500ms infinite linear;
-          animation: spinAround 500ms infinite linear;
-  border: 2px solid #dbdbdb;
-  border-radius: 290486px;
-  border-right-color: transparent;
-  border-top-color: transparent;
-  content: "";
-  display: block;
-  height: 1em;
-  position: relative;
-  width: 1em;
-}
-
-.number {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  background-color: whitesmoke;
-  border-radius: 290486px;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 1.25rem;
-  height: 2em;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  margin-right: 1.5rem;
-  min-width: 2.5em;
-  padding: 0.25rem 0.5rem;
-  text-align: center;
-  vertical-align: top;
-}
-
-.card-header {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1);
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.card-header-title {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  color: #363636;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  font-weight: 700;
-  padding: 0.75rem;
-}
-
-.card-header-icon {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  cursor: pointer;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  padding: 0.75rem;
-}
-
-.card-image {
-  display: block;
-  position: relative;
-}
-
-.card-content {
-  padding: 1.5rem;
-}
-
-.card-footer {
-  border-top: 1px solid #dbdbdb;
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.card-footer-item {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-preferred-size: 0;
-      flex-basis: 0;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  padding: 0.75rem;
-}
-
-.card-footer-item:not(:last-child) {
-  border-right: 1px solid #dbdbdb;
-}
-
-.card {
-  background-color: white;
-  box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
-  color: #4a4a4a;
-  max-width: 100%;
-  position: relative;
-}
-
-.card .media:not(:last-child) {
-  margin-bottom: 0.75rem;
-}
-
-.level-item {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-preferred-size: auto;
-      flex-basis: auto;
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.level-item .title,
-.level-item .subtitle {
-  margin-bottom: 0;
-}
-
-@media screen and (max-width: 768px) {
-  .level-item:not(:last-child) {
-    margin-bottom: 0.75rem;
-  }
-}
-
-.level-left,
-.level-right {
-  -ms-flex-preferred-size: auto;
-      flex-basis: auto;
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.level-left .level-item:not(:last-child),
-.level-right .level-item:not(:last-child) {
-  margin-right: 0.75rem;
-}
-
-.level-left .level-item.is-flexible,
-.level-right .level-item.is-flexible {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-}
-
-.level-left {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-}
-
-@media screen and (max-width: 768px) {
-  .level-left + .level-right {
-    margin-top: 1.5rem;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .level-left {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-}
-
-.level-right {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-}
-
-@media screen and (min-width: 769px), print {
-  .level-right {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-}
-
-.level {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-}
-
-.level:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.level code {
-  border-radius: 3px;
-}
-
-.level img {
-  display: inline-block;
-  vertical-align: top;
-}
-
-.level.is-mobile {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.level.is-mobile .level-left,
-.level.is-mobile .level-right {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.level.is-mobile .level-left + .level-right {
-  margin-top: 0;
-}
-
-.level.is-mobile .level-item:not(:last-child) {
-  margin-bottom: 0;
-}
-
-.level.is-mobile .level-item:not(.is-narrow) {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-}
-
-@media screen and (min-width: 769px), print {
-  .level {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-  .level > .level-item:not(.is-narrow) {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-  }
-}
-
-.media-left,
-.media-right {
-  -ms-flex-preferred-size: auto;
-      flex-basis: auto;
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.media-left {
-  margin-right: 1rem;
-}
-
-.media-right {
-  margin-left: 1rem;
-}
-
-.media-content {
-  -ms-flex-preferred-size: auto;
-      flex-basis: auto;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-  text-align: left;
-}
-
-.media {
-  -webkit-box-align: start;
-      -ms-flex-align: start;
-          align-items: flex-start;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  text-align: left;
-}
-
-.media .content:not(:last-child) {
-  margin-bottom: 0.75rem;
-}
-
-.media .media {
-  border-top: 1px solid rgba(219, 219, 219, 0.5);
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  padding-top: 0.75rem;
-}
-
-.media .media .content:not(:last-child),
-.media .media .control:not(:last-child) {
-  margin-bottom: 0.5rem;
-}
-
-.media .media .media {
-  padding-top: 0.5rem;
-}
-
-.media .media .media + .media {
-  margin-top: 0.5rem;
-}
-
-.media + .media {
-  border-top: 1px solid rgba(219, 219, 219, 0.5);
-  margin-top: 1rem;
-  padding-top: 1rem;
-}
-
-.media.is-large + .media {
-  margin-top: 1.5rem;
-  padding-top: 1.5rem;
-}
-
-.menu {
-  font-size: 1rem;
-}
-
-.menu-list {
-  line-height: 1.25;
-}
-
-.menu-list a {
-  border-radius: 2px;
-  color: #4a4a4a;
-  display: block;
-  padding: 0.5em 0.75em;
-}
-
-.menu-list a:hover {
-  background-color: whitesmoke;
-  color: #00d1b2;
-}
-
-.menu-list a.is-active {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.menu-list li ul {
-  border-left: 1px solid #dbdbdb;
-  margin: 0.75em;
-  padding-left: 0.75em;
-}
-
-.menu-label {
-  color: #7a7a7a;
-  font-size: 0.8em;
-  letter-spacing: 0.1em;
-  text-transform: uppercase;
-}
-
-.menu-label:not(:first-child) {
-  margin-top: 1em;
-}
-
-.menu-label:not(:last-child) {
-  margin-bottom: 1em;
-}
-
-.message {
-  background-color: whitesmoke;
-  border-radius: 3px;
-  font-size: 1rem;
-}
-
-.message:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.message.is-white {
-  background-color: white;
-}
-
-.message.is-white .message-header {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.message.is-white .message-body {
-  border-color: white;
-  color: #4d4d4d;
-}
-
-.message.is-black {
-  background-color: #fafafa;
-}
-
-.message.is-black .message-header {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.message.is-black .message-body {
-  border-color: #0a0a0a;
-  color: #090909;
-}
-
-.message.is-light {
-  background-color: #fafafa;
-}
-
-.message.is-light .message-header {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.message.is-light .message-body {
-  border-color: whitesmoke;
-  color: #505050;
-}
-
-.message.is-dark {
-  background-color: #fafafa;
-}
-
-.message.is-dark .message-header {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.message.is-dark .message-body {
-  border-color: #363636;
-  color: #2a2a2a;
-}
-
-.message.is-primary {
-  background-color: #f5fffd;
-}
-
-.message.is-primary .message-header {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.message.is-primary .message-body {
-  border-color: #00d1b2;
-  color: #021310;
-}
-
-.message.is-info {
-  background-color: #f6f9fe;
-}
-
-.message.is-info .message-header {
-  background-color: #3273dc;
-  color: #fff;
-}
-
-.message.is-info .message-body {
-  border-color: #3273dc;
-  color: #22509a;
-}
-
-.message.is-success {
-  background-color: #f6fef9;
-}
-
-.message.is-success .message-header {
-  background-color: #23d160;
-  color: #fff;
-}
-
-.message.is-success .message-body {
-  border-color: #23d160;
-  color: #0e301a;
-}
-
-.message.is-warning {
-  background-color: #fffdf5;
-}
-
-.message.is-warning .message-header {
-  background-color: #ffdd57;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.message.is-warning .message-body {
-  border-color: #ffdd57;
-  color: #3b3108;
-}
-
-.message.is-danger {
-  background-color: #fff5f7;
-}
-
-.message.is-danger .message-header {
-  background-color: #ff3860;
-  color: #fff;
-}
-
-.message.is-danger .message-body {
-  border-color: #ff3860;
-  color: #cd0930;
-}
-
-.message-header {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  background-color: #4a4a4a;
-  border-radius: 3px 3px 0 0;
-  color: #fff;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  line-height: 1.25;
-  padding: 0.5em 0.75em;
-  position: relative;
-}
-
-.message-header a,
-.message-header strong {
-  color: inherit;
-}
-
-.message-header a {
-  text-decoration: underline;
-}
-
-.message-header .delete {
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  margin-left: 0.75em;
-}
-
-.message-header + .message-body {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-  border-top: none;
-}
-
-.message-body {
-  border: 1px solid #dbdbdb;
-  border-radius: 3px;
-  color: #4a4a4a;
-  padding: 1em 1.25em;
-}
-
-.message-body a,
-.message-body strong {
-  color: inherit;
-}
-
-.message-body a {
-  text-decoration: underline;
-}
-
-.message-body code,
-.message-body pre {
-  background: white;
-}
-
-.message-body pre code {
-  background: transparent;
-}
-
-.modal-background {
-  bottom: 0;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  background-color: rgba(10, 10, 10, 0.86);
-}
-
-.modal-content,
-.modal-card {
-  margin: 0 20px;
-  max-height: calc(100vh - 160px);
-  overflow: auto;
-  position: relative;
-  width: 100%;
-}
-
-@media screen and (min-width: 769px), print {
-  .modal-content,
-  .modal-card {
-    margin: 0 auto;
-    max-height: calc(100vh - 40px);
-    width: 640px;
-  }
-}
-
-.modal-close {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  background-color: rgba(10, 10, 10, 0.2);
-  border: none;
-  border-radius: 290486px;
-  cursor: pointer;
-  display: inline-block;
-  font-size: 1rem;
-  height: 20px;
-  outline: none;
-  position: relative;
-  vertical-align: top;
-  width: 20px;
-  background: none;
-  height: 40px;
-  position: fixed;
-  right: 20px;
-  top: 20px;
-  width: 40px;
-}
-
-.modal-close:before, .modal-close:after {
-  background-color: white;
-  content: "";
-  display: block;
-  left: 50%;
-  position: absolute;
-  top: 50%;
-  -webkit-transform: translateX(-50%) translateY(-50%) rotate(45deg);
-          transform: translateX(-50%) translateY(-50%) rotate(45deg);
-  -webkit-transform-origin: center center;
-          transform-origin: center center;
-}
-
-.modal-close:before {
-  height: 2px;
-  width: 50%;
-}
-
-.modal-close:after {
-  height: 50%;
-  width: 2px;
-}
-
-.modal-close:hover, .modal-close:focus {
-  background-color: rgba(10, 10, 10, 0.3);
-}
-
-.modal-close:active {
-  background-color: rgba(10, 10, 10, 0.4);
-}
-
-.modal-close.is-small {
-  height: 16px;
-  width: 16px;
-}
-
-.modal-close.is-medium {
-  height: 24px;
-  width: 24px;
-}
-
-.modal-close.is-large {
-  height: 32px;
-  width: 32px;
-}
-
-.modal-card {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  max-height: calc(100vh - 40px);
-  overflow: hidden;
-}
-
-.modal-card-head,
-.modal-card-foot {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  background-color: whitesmoke;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  padding: 20px;
-  position: relative;
-}
-
-.modal-card-head {
-  border-bottom: 1px solid #dbdbdb;
-  border-top-left-radius: 5px;
-  border-top-right-radius: 5px;
-}
-
-.modal-card-title {
-  color: #363636;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  font-size: 1.5rem;
-  line-height: 1;
-}
-
-.modal-card-foot {
-  border-bottom-left-radius: 5px;
-  border-bottom-right-radius: 5px;
-  border-top: 1px solid #dbdbdb;
-}
-
-.modal-card-foot .button:not(:last-child) {
-  margin-right: 10px;
-}
-
-.modal-card-body {
-  -webkit-overflow-scrolling: touch;
-  background-color: white;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-  overflow: auto;
-  padding: 20px;
-}
-
-.modal {
-  bottom: 0;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: none;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  overflow: hidden;
-  position: fixed;
-  z-index: 20;
-}
-
-.modal.is-active {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.nav-toggle {
-  cursor: pointer;
-  display: block;
-  height: 3.25rem;
-  position: relative;
-  width: 3.25rem;
-}
-
-.nav-toggle span {
-  background-color: #4a4a4a;
-  display: block;
-  height: 1px;
-  left: 50%;
-  margin-left: -7px;
-  position: absolute;
-  top: 50%;
-  -webkit-transition: none 86ms ease-out;
-  transition: none 86ms ease-out;
-  -webkit-transition-property: background, left, opacity, -webkit-transform;
-  transition-property: background, left, opacity, -webkit-transform;
-  transition-property: background, left, opacity, transform;
-  transition-property: background, left, opacity, transform, -webkit-transform;
-  width: 15px;
-}
-
-.nav-toggle span:nth-child(1) {
-  margin-top: -6px;
-}
-
-.nav-toggle span:nth-child(2) {
-  margin-top: -1px;
-}
-
-.nav-toggle span:nth-child(3) {
-  margin-top: 4px;
-}
-
-.nav-toggle:hover {
-  background-color: whitesmoke;
-}
-
-.nav-toggle.is-active span {
-  background-color: #00d1b2;
-}
-
-.nav-toggle.is-active span:nth-child(1) {
-  margin-left: -5px;
-  -webkit-transform: rotate(45deg);
-          transform: rotate(45deg);
-  -webkit-transform-origin: left top;
-          transform-origin: left top;
-}
-
-.nav-toggle.is-active span:nth-child(2) {
-  opacity: 0;
-}
-
-.nav-toggle.is-active span:nth-child(3) {
-  margin-left: -5px;
-  -webkit-transform: rotate(-45deg);
-          transform: rotate(-45deg);
-  -webkit-transform-origin: left bottom;
-          transform-origin: left bottom;
-}
-
-@media screen and (min-width: 769px), print {
-  .nav-toggle {
-    display: none;
-  }
-}
-
-.nav-item {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  font-size: 1rem;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  line-height: 1.5;
-  padding: 0.5rem 0.75rem;
-}
-
-.nav-item a {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.nav-item img {
-  max-height: 1.75rem;
-}
-
-.nav-item .tag:first-child:not(:last-child) {
-  margin-right: 0.5rem;
-}
-
-.nav-item .tag:last-child:not(:first-child) {
-  margin-left: 0.5rem;
-}
-
-@media screen and (max-width: 768px) {
-  .nav-item {
-    -webkit-box-pack: start;
-        -ms-flex-pack: start;
-            justify-content: flex-start;
-  }
-}
-
-.nav-item a,
-a.nav-item {
-  color: #7a7a7a;
-}
-
-.nav-item a:hover,
-a.nav-item:hover {
-  color: #363636;
-}
-
-.nav-item a.is-active,
-a.nav-item.is-active {
-  color: #363636;
-}
-
-.nav-item a.is-tab,
-a.nav-item.is-tab {
-  border-bottom: 1px solid transparent;
-  border-top: 1px solid transparent;
-  padding-bottom: calc(0.75rem - 1px);
-  padding-left: 1rem;
-  padding-right: 1rem;
-  padding-top: calc(0.75rem - 1px);
-}
-
-.nav-item a.is-tab:hover,
-a.nav-item.is-tab:hover {
-  border-bottom-color: #00d1b2;
-  border-top-color: transparent;
-}
-
-.nav-item a.is-tab.is-active,
-a.nav-item.is-tab.is-active {
-  border-bottom: 3px solid #00d1b2;
-  color: #00d1b2;
-  padding-bottom: calc(0.75rem - 3px);
-}
-
-@media screen and (min-width: 1000px) {
-  .nav-item a.is-brand,
-  a.nav-item.is-brand {
-    padding-left: 0;
-  }
-}
-
-.nav-left,
-.nav-right {
-  -webkit-overflow-scrolling: touch;
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  max-width: 100%;
-  overflow: auto;
-}
-
-@media screen and (min-width: 1192px) {
-  .nav-left,
-  .nav-right {
-    -ms-flex-preferred-size: 0;
-        flex-basis: 0;
-  }
-}
-
-.nav-left {
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  white-space: nowrap;
-}
-
-.nav-right {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-}
-
-.nav-center {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-@media screen and (max-width: 768px) {
-  .nav-menu.nav-right {
-    background-color: white;
-    box-shadow: 0 4px 7px rgba(10, 10, 10, 0.1);
-    left: 0;
-    display: none;
-    right: 0;
-    top: 100%;
-    position: absolute;
-  }
-  .nav-menu.nav-right .nav-item {
-    border-top: 1px solid rgba(219, 219, 219, 0.5);
-    padding: 0.75rem;
-  }
-  .nav-menu.nav-right.is-active {
-    display: block;
-  }
-}
-
-.nav {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  background-color: white;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  height: 3.25rem;
-  position: relative;
-  text-align: center;
-  z-index: 10;
-}
-
-.nav > .container {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  min-height: 3.25rem;
-  width: 100%;
-}
-
-.nav.has-shadow {
-  box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1);
-}
-
-.pagination {
-  font-size: 1rem;
-  margin: -0.25rem;
-}
-
-.pagination.is-small {
-  font-size: 0.75rem;
-}
-
-.pagination.is-medium {
-  font-size: 1.25rem;
-}
-
-.pagination.is-large {
-  font-size: 1.5rem;
-}
-
-.pagination,
-.pagination-list {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  text-align: center;
-}
-
-.pagination-previous,
-.pagination-next,
-.pagination-link,
-.pagination-ellipsis {
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border: 1px solid transparent;
-  border-radius: 3px;
-  box-shadow: none;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  font-size: 1rem;
-  height: 2.25em;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  line-height: 1.5;
-  padding-bottom: calc(0.375em - 1px);
-  padding-left: calc(0.625em - 1px);
-  padding-right: calc(0.625em - 1px);
-  padding-top: calc(0.375em - 1px);
-  position: relative;
-  vertical-align: top;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  font-size: 1em;
-  padding-left: 0.5em;
-  padding-right: 0.5em;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  margin: 0.25rem;
-  text-align: center;
-}
-
-.pagination-previous:focus, .pagination-previous.is-focused, .pagination-previous:active, .pagination-previous.is-active,
-.pagination-next:focus,
-.pagination-next.is-focused,
-.pagination-next:active,
-.pagination-next.is-active,
-.pagination-link:focus,
-.pagination-link.is-focused,
-.pagination-link:active,
-.pagination-link.is-active,
-.pagination-ellipsis:focus,
-.pagination-ellipsis.is-focused,
-.pagination-ellipsis:active,
-.pagination-ellipsis.is-active {
-  outline: none;
-}
-
-.pagination-previous[disabled],
-.pagination-next[disabled],
-.pagination-link[disabled],
-.pagination-ellipsis[disabled] {
-  cursor: not-allowed;
-}
-
-.pagination-previous,
-.pagination-next,
-.pagination-link {
-  border-color: #dbdbdb;
-  min-width: 2.25em;
-}
-
-.pagination-previous:hover,
-.pagination-next:hover,
-.pagination-link:hover {
-  border-color: #b5b5b5;
-  color: #363636;
-}
-
-.pagination-previous:focus,
-.pagination-next:focus,
-.pagination-link:focus {
-  border-color: #00d1b2;
-}
-
-.pagination-previous:active,
-.pagination-next:active,
-.pagination-link:active {
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2);
-}
-
-.pagination-previous[disabled],
-.pagination-next[disabled],
-.pagination-link[disabled] {
-  background-color: #dbdbdb;
-  border-color: #dbdbdb;
-  box-shadow: none;
-  color: #7a7a7a;
-  opacity: 0.5;
-}
-
-.pagination-previous,
-.pagination-next {
-  padding-left: 0.75em;
-  padding-right: 0.75em;
-  white-space: nowrap;
-}
-
-.pagination-link.is-current {
-  background-color: #00d1b2;
-  border-color: #00d1b2;
-  color: #fff;
-}
-
-.pagination-ellipsis {
-  color: #b5b5b5;
-  pointer-events: none;
-}
-
-.pagination-list {
-  -ms-flex-wrap: wrap;
-      flex-wrap: wrap;
-}
-
-@media screen and (max-width: 768px) {
-  .pagination {
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap;
-  }
-  .pagination-previous,
-  .pagination-next {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    -ms-flex-negative: 1;
-        flex-shrink: 1;
-  }
-  .pagination-list li {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    -ms-flex-negative: 1;
-        flex-shrink: 1;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .pagination-list {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    -ms-flex-negative: 1;
-        flex-shrink: 1;
-    -webkit-box-pack: start;
-        -ms-flex-pack: start;
-            justify-content: flex-start;
-    -webkit-box-ordinal-group: 2;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .pagination-previous {
-    -webkit-box-ordinal-group: 3;
-        -ms-flex-order: 2;
-            order: 2;
-  }
-  .pagination-next {
-    -webkit-box-ordinal-group: 4;
-        -ms-flex-order: 3;
-            order: 3;
-  }
-  .pagination {
-    -webkit-box-pack: justify;
-        -ms-flex-pack: justify;
-            justify-content: space-between;
-  }
-  .pagination.is-centered .pagination-previous {
-    -webkit-box-ordinal-group: 2;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .pagination.is-centered .pagination-list {
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    -webkit-box-ordinal-group: 3;
-        -ms-flex-order: 2;
-            order: 2;
-  }
-  .pagination.is-centered .pagination-next {
-    -webkit-box-ordinal-group: 4;
-        -ms-flex-order: 3;
-            order: 3;
-  }
-  .pagination.is-right .pagination-previous {
-    -webkit-box-ordinal-group: 2;
-        -ms-flex-order: 1;
-            order: 1;
-  }
-  .pagination.is-right .pagination-next {
-    -webkit-box-ordinal-group: 3;
-        -ms-flex-order: 2;
-            order: 2;
-  }
-  .pagination.is-right .pagination-list {
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end;
-    -webkit-box-ordinal-group: 4;
-        -ms-flex-order: 3;
-            order: 3;
-  }
-}
-
-.panel {
-  font-size: 1rem;
-}
-
-.panel:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.panel-heading,
-.panel-tabs,
-.panel-block {
-  border-bottom: 1px solid #dbdbdb;
-  border-left: 1px solid #dbdbdb;
-  border-right: 1px solid #dbdbdb;
-}
-
-.panel-heading:first-child,
-.panel-tabs:first-child,
-.panel-block:first-child {
-  border-top: 1px solid #dbdbdb;
-}
-
-.panel-heading {
-  background-color: whitesmoke;
-  border-radius: 3px 3px 0 0;
-  color: #363636;
-  font-size: 1.25em;
-  font-weight: 300;
-  line-height: 1.25;
-  padding: 0.5em 0.75em;
-}
-
-.panel-tabs {
-  -webkit-box-align: end;
-      -ms-flex-align: end;
-          align-items: flex-end;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  font-size: 0.875em;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.panel-tabs a {
-  border-bottom: 1px solid #dbdbdb;
-  margin-bottom: -1px;
-  padding: 0.5em;
-}
-
-.panel-tabs a.is-active {
-  border-bottom-color: #4a4a4a;
-  color: #363636;
-}
-
-.panel-list a {
-  color: #4a4a4a;
-}
-
-.panel-list a:hover {
-  color: #00d1b2;
-}
-
-.panel-block {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  color: #363636;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-  padding: 0.5em 0.75em;
-}
-
-.panel-block input[type="checkbox"] {
-  margin-right: 0.75em;
-}
-
-.panel-block > .control {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-  width: 100%;
-}
-
-.panel-block.is-wrapped {
-  -ms-flex-wrap: wrap;
-      flex-wrap: wrap;
-}
-
-.panel-block.is-active {
-  border-left-color: #00d1b2;
-  color: #363636;
-}
-
-.panel-block.is-active .panel-icon {
-  color: #00d1b2;
-}
-
-a.panel-block,
-label.panel-block {
-  cursor: pointer;
-}
-
-a.panel-block:hover,
-label.panel-block:hover {
-  background-color: whitesmoke;
-}
-
-.panel-icon {
-  display: inline-block;
-  font-size: 14px;
-  height: 1em;
-  line-height: 1em;
-  text-align: center;
-  vertical-align: top;
-  width: 1em;
-  color: #7a7a7a;
-  margin-right: 0.75em;
-}
-
-.panel-icon .fa {
-  font-size: inherit;
-  line-height: inherit;
-}
-
-.tabs {
-  -webkit-overflow-scrolling: touch;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  font-size: 1rem;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-  overflow: hidden;
-  overflow-x: auto;
-  white-space: nowrap;
-}
-
-.tabs:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.tabs a {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border-bottom: 1px solid #dbdbdb;
-  color: #4a4a4a;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  margin-bottom: -1px;
-  padding: 0.5em 1em;
-  vertical-align: top;
-}
-
-.tabs a:hover {
-  border-bottom-color: #363636;
-  color: #363636;
-}
-
-.tabs li {
-  display: block;
-}
-
-.tabs li.is-active a {
-  border-bottom-color: #00d1b2;
-  color: #00d1b2;
-}
-
-.tabs ul {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  border-bottom: 1px solid #dbdbdb;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  -webkit-box-pack: start;
-      -ms-flex-pack: start;
-          justify-content: flex-start;
-}
-
-.tabs ul.is-left {
-  padding-right: 0.75em;
-}
-
-.tabs ul.is-center {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  padding-left: 0.75em;
-  padding-right: 0.75em;
-}
-
-.tabs ul.is-right {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-  padding-left: 0.75em;
-}
-
-.tabs .icon:first-child {
-  margin-right: 0.5em;
-}
-
-.tabs .icon:last-child {
-  margin-left: 0.5em;
-}
-
-.tabs.is-centered ul {
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.tabs.is-right ul {
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-}
-
-.tabs.is-boxed a {
-  border: 1px solid transparent;
-  border-radius: 3px 3px 0 0;
-}
-
-.tabs.is-boxed a:hover {
-  background-color: whitesmoke;
-  border-bottom-color: #dbdbdb;
-}
-
-.tabs.is-boxed li.is-active a {
-  background-color: white;
-  border-color: #dbdbdb;
-  border-bottom-color: transparent !important;
-}
-
-.tabs.is-fullwidth li {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.tabs.is-toggle a {
-  border: 1px solid #dbdbdb;
-  margin-bottom: 0;
-  position: relative;
-}
-
-.tabs.is-toggle a:hover {
-  background-color: whitesmoke;
-  border-color: #b5b5b5;
-  z-index: 2;
-}
-
-.tabs.is-toggle li + li {
-  margin-left: -1px;
-}
-
-.tabs.is-toggle li:first-child a {
-  border-radius: 3px 0 0 3px;
-}
-
-.tabs.is-toggle li:last-child a {
-  border-radius: 0 3px 3px 0;
-}
-
-.tabs.is-toggle li.is-active a {
-  background-color: #00d1b2;
-  border-color: #00d1b2;
-  color: #fff;
-  z-index: 1;
-}
-
-.tabs.is-toggle ul {
-  border-bottom: none;
-}
-
-.tabs.is-small {
-  font-size: 0.75rem;
-}
-
-.tabs.is-medium {
-  font-size: 1.25rem;
-}
-
-.tabs.is-large {
-  font-size: 1.5rem;
-}
-
-.column {
-  display: block;
-  -ms-flex-preferred-size: 0;
-      flex-basis: 0;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-  padding: 0.75rem;
-}
-
-.columns.is-mobile > .column.is-narrow {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-}
-
-.columns.is-mobile > .column.is-full {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 100%;
-}
-
-.columns.is-mobile > .column.is-three-quarters {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 75%;
-}
-
-.columns.is-mobile > .column.is-two-thirds {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 66.6666%;
-}
-
-.columns.is-mobile > .column.is-half {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 50%;
-}
-
-.columns.is-mobile > .column.is-one-third {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 33.3333%;
-}
-
-.columns.is-mobile > .column.is-one-quarter {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 25%;
-}
-
-.columns.is-mobile > .column.is-offset-three-quarters {
-  margin-left: 75%;
-}
-
-.columns.is-mobile > .column.is-offset-two-thirds {
-  margin-left: 66.6666%;
-}
-
-.columns.is-mobile > .column.is-offset-half {
-  margin-left: 50%;
-}
-
-.columns.is-mobile > .column.is-offset-one-third {
-  margin-left: 33.3333%;
-}
-
-.columns.is-mobile > .column.is-offset-one-quarter {
-  margin-left: 25%;
-}
-
-.columns.is-mobile > .column.is-1 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 8.33333%;
-}
-
-.columns.is-mobile > .column.is-offset-1 {
-  margin-left: 8.33333%;
-}
-
-.columns.is-mobile > .column.is-2 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 16.66667%;
-}
-
-.columns.is-mobile > .column.is-offset-2 {
-  margin-left: 16.66667%;
-}
-
-.columns.is-mobile > .column.is-3 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 25%;
-}
-
-.columns.is-mobile > .column.is-offset-3 {
-  margin-left: 25%;
-}
-
-.columns.is-mobile > .column.is-4 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 33.33333%;
-}
-
-.columns.is-mobile > .column.is-offset-4 {
-  margin-left: 33.33333%;
-}
-
-.columns.is-mobile > .column.is-5 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 41.66667%;
-}
-
-.columns.is-mobile > .column.is-offset-5 {
-  margin-left: 41.66667%;
-}
-
-.columns.is-mobile > .column.is-6 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 50%;
-}
-
-.columns.is-mobile > .column.is-offset-6 {
-  margin-left: 50%;
-}
-
-.columns.is-mobile > .column.is-7 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 58.33333%;
-}
-
-.columns.is-mobile > .column.is-offset-7 {
-  margin-left: 58.33333%;
-}
-
-.columns.is-mobile > .column.is-8 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 66.66667%;
-}
-
-.columns.is-mobile > .column.is-offset-8 {
-  margin-left: 66.66667%;
-}
-
-.columns.is-mobile > .column.is-9 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 75%;
-}
-
-.columns.is-mobile > .column.is-offset-9 {
-  margin-left: 75%;
-}
-
-.columns.is-mobile > .column.is-10 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 83.33333%;
-}
-
-.columns.is-mobile > .column.is-offset-10 {
-  margin-left: 83.33333%;
-}
-
-.columns.is-mobile > .column.is-11 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 91.66667%;
-}
-
-.columns.is-mobile > .column.is-offset-11 {
-  margin-left: 91.66667%;
-}
-
-.columns.is-mobile > .column.is-12 {
-  -webkit-box-flex: 0;
-      -ms-flex: none;
-          flex: none;
-  width: 100%;
-}
-
-.columns.is-mobile > .column.is-offset-12 {
-  margin-left: 100%;
-}
-
-@media screen and (max-width: 768px) {
-  .column.is-narrow-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-  }
-  .column.is-full-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-three-quarters-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-two-thirds-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.6666%;
-  }
-  .column.is-half-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-one-third-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.3333%;
-  }
-  .column.is-one-quarter-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-three-quarters-mobile {
-    margin-left: 75%;
-  }
-  .column.is-offset-two-thirds-mobile {
-    margin-left: 66.6666%;
-  }
-  .column.is-offset-half-mobile {
-    margin-left: 50%;
-  }
-  .column.is-offset-one-third-mobile {
-    margin-left: 33.3333%;
-  }
-  .column.is-offset-one-quarter-mobile {
-    margin-left: 25%;
-  }
-  .column.is-1-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 8.33333%;
-  }
-  .column.is-offset-1-mobile {
-    margin-left: 8.33333%;
-  }
-  .column.is-2-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 16.66667%;
-  }
-  .column.is-offset-2-mobile {
-    margin-left: 16.66667%;
-  }
-  .column.is-3-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-3-mobile {
-    margin-left: 25%;
-  }
-  .column.is-4-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.33333%;
-  }
-  .column.is-offset-4-mobile {
-    margin-left: 33.33333%;
-  }
-  .column.is-5-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 41.66667%;
-  }
-  .column.is-offset-5-mobile {
-    margin-left: 41.66667%;
-  }
-  .column.is-6-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-offset-6-mobile {
-    margin-left: 50%;
-  }
-  .column.is-7-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 58.33333%;
-  }
-  .column.is-offset-7-mobile {
-    margin-left: 58.33333%;
-  }
-  .column.is-8-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.66667%;
-  }
-  .column.is-offset-8-mobile {
-    margin-left: 66.66667%;
-  }
-  .column.is-9-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-offset-9-mobile {
-    margin-left: 75%;
-  }
-  .column.is-10-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 83.33333%;
-  }
-  .column.is-offset-10-mobile {
-    margin-left: 83.33333%;
-  }
-  .column.is-11-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 91.66667%;
-  }
-  .column.is-offset-11-mobile {
-    margin-left: 91.66667%;
-  }
-  .column.is-12-mobile {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-offset-12-mobile {
-    margin-left: 100%;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .column.is-narrow, .column.is-narrow-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-  }
-  .column.is-full, .column.is-full-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-three-quarters, .column.is-three-quarters-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-two-thirds, .column.is-two-thirds-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.6666%;
-  }
-  .column.is-half, .column.is-half-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-one-third, .column.is-one-third-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.3333%;
-  }
-  .column.is-one-quarter, .column.is-one-quarter-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet {
-    margin-left: 75%;
-  }
-  .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet {
-    margin-left: 66.6666%;
-  }
-  .column.is-offset-half, .column.is-offset-half-tablet {
-    margin-left: 50%;
-  }
-  .column.is-offset-one-third, .column.is-offset-one-third-tablet {
-    margin-left: 33.3333%;
-  }
-  .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet {
-    margin-left: 25%;
-  }
-  .column.is-1, .column.is-1-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 8.33333%;
-  }
-  .column.is-offset-1, .column.is-offset-1-tablet {
-    margin-left: 8.33333%;
-  }
-  .column.is-2, .column.is-2-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 16.66667%;
-  }
-  .column.is-offset-2, .column.is-offset-2-tablet {
-    margin-left: 16.66667%;
-  }
-  .column.is-3, .column.is-3-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-3, .column.is-offset-3-tablet {
-    margin-left: 25%;
-  }
-  .column.is-4, .column.is-4-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.33333%;
-  }
-  .column.is-offset-4, .column.is-offset-4-tablet {
-    margin-left: 33.33333%;
-  }
-  .column.is-5, .column.is-5-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 41.66667%;
-  }
-  .column.is-offset-5, .column.is-offset-5-tablet {
-    margin-left: 41.66667%;
-  }
-  .column.is-6, .column.is-6-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-offset-6, .column.is-offset-6-tablet {
-    margin-left: 50%;
-  }
-  .column.is-7, .column.is-7-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 58.33333%;
-  }
-  .column.is-offset-7, .column.is-offset-7-tablet {
-    margin-left: 58.33333%;
-  }
-  .column.is-8, .column.is-8-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.66667%;
-  }
-  .column.is-offset-8, .column.is-offset-8-tablet {
-    margin-left: 66.66667%;
-  }
-  .column.is-9, .column.is-9-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-offset-9, .column.is-offset-9-tablet {
-    margin-left: 75%;
-  }
-  .column.is-10, .column.is-10-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 83.33333%;
-  }
-  .column.is-offset-10, .column.is-offset-10-tablet {
-    margin-left: 83.33333%;
-  }
-  .column.is-11, .column.is-11-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 91.66667%;
-  }
-  .column.is-offset-11, .column.is-offset-11-tablet {
-    margin-left: 91.66667%;
-  }
-  .column.is-12, .column.is-12-tablet {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-offset-12, .column.is-offset-12-tablet {
-    margin-left: 100%;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .column.is-narrow-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-  }
-  .column.is-full-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-three-quarters-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-two-thirds-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.6666%;
-  }
-  .column.is-half-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-one-third-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.3333%;
-  }
-  .column.is-one-quarter-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-three-quarters-desktop {
-    margin-left: 75%;
-  }
-  .column.is-offset-two-thirds-desktop {
-    margin-left: 66.6666%;
-  }
-  .column.is-offset-half-desktop {
-    margin-left: 50%;
-  }
-  .column.is-offset-one-third-desktop {
-    margin-left: 33.3333%;
-  }
-  .column.is-offset-one-quarter-desktop {
-    margin-left: 25%;
-  }
-  .column.is-1-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 8.33333%;
-  }
-  .column.is-offset-1-desktop {
-    margin-left: 8.33333%;
-  }
-  .column.is-2-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 16.66667%;
-  }
-  .column.is-offset-2-desktop {
-    margin-left: 16.66667%;
-  }
-  .column.is-3-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-3-desktop {
-    margin-left: 25%;
-  }
-  .column.is-4-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.33333%;
-  }
-  .column.is-offset-4-desktop {
-    margin-left: 33.33333%;
-  }
-  .column.is-5-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 41.66667%;
-  }
-  .column.is-offset-5-desktop {
-    margin-left: 41.66667%;
-  }
-  .column.is-6-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-offset-6-desktop {
-    margin-left: 50%;
-  }
-  .column.is-7-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 58.33333%;
-  }
-  .column.is-offset-7-desktop {
-    margin-left: 58.33333%;
-  }
-  .column.is-8-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.66667%;
-  }
-  .column.is-offset-8-desktop {
-    margin-left: 66.66667%;
-  }
-  .column.is-9-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-offset-9-desktop {
-    margin-left: 75%;
-  }
-  .column.is-10-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 83.33333%;
-  }
-  .column.is-offset-10-desktop {
-    margin-left: 83.33333%;
-  }
-  .column.is-11-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 91.66667%;
-  }
-  .column.is-offset-11-desktop {
-    margin-left: 91.66667%;
-  }
-  .column.is-12-desktop {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-offset-12-desktop {
-    margin-left: 100%;
-  }
-}
-
-@media screen and (min-width: 1192px) {
-  .column.is-narrow-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-  }
-  .column.is-full-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-three-quarters-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-two-thirds-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.6666%;
-  }
-  .column.is-half-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-one-third-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.3333%;
-  }
-  .column.is-one-quarter-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-three-quarters-widescreen {
-    margin-left: 75%;
-  }
-  .column.is-offset-two-thirds-widescreen {
-    margin-left: 66.6666%;
-  }
-  .column.is-offset-half-widescreen {
-    margin-left: 50%;
-  }
-  .column.is-offset-one-third-widescreen {
-    margin-left: 33.3333%;
-  }
-  .column.is-offset-one-quarter-widescreen {
-    margin-left: 25%;
-  }
-  .column.is-1-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 8.33333%;
-  }
-  .column.is-offset-1-widescreen {
-    margin-left: 8.33333%;
-  }
-  .column.is-2-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 16.66667%;
-  }
-  .column.is-offset-2-widescreen {
-    margin-left: 16.66667%;
-  }
-  .column.is-3-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .column.is-offset-3-widescreen {
-    margin-left: 25%;
-  }
-  .column.is-4-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.33333%;
-  }
-  .column.is-offset-4-widescreen {
-    margin-left: 33.33333%;
-  }
-  .column.is-5-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 41.66667%;
-  }
-  .column.is-offset-5-widescreen {
-    margin-left: 41.66667%;
-  }
-  .column.is-6-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .column.is-offset-6-widescreen {
-    margin-left: 50%;
-  }
-  .column.is-7-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 58.33333%;
-  }
-  .column.is-offset-7-widescreen {
-    margin-left: 58.33333%;
-  }
-  .column.is-8-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.66667%;
-  }
-  .column.is-offset-8-widescreen {
-    margin-left: 66.66667%;
-  }
-  .column.is-9-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .column.is-offset-9-widescreen {
-    margin-left: 75%;
-  }
-  .column.is-10-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 83.33333%;
-  }
-  .column.is-offset-10-widescreen {
-    margin-left: 83.33333%;
-  }
-  .column.is-11-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 91.66667%;
-  }
-  .column.is-offset-11-widescreen {
-    margin-left: 91.66667%;
-  }
-  .column.is-12-widescreen {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-  .column.is-offset-12-widescreen {
-    margin-left: 100%;
-  }
-}
-
-.columns {
-  margin-left: -0.75rem;
-  margin-right: -0.75rem;
-  margin-top: -0.75rem;
-}
-
-.columns:last-child {
-  margin-bottom: -0.75rem;
-}
-
-.columns:not(:last-child) {
-  margin-bottom: 0.75rem;
-}
-
-.columns.is-centered {
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-}
-
-.columns.is-gapless {
-  margin-left: 0;
-  margin-right: 0;
-  margin-top: 0;
-}
-
-.columns.is-gapless:last-child {
-  margin-bottom: 0;
-}
-
-.columns.is-gapless:not(:last-child) {
-  margin-bottom: 1.5rem;
-}
-
-.columns.is-gapless > .column {
-  margin: 0;
-  padding: 0;
-}
-
-@media screen and (min-width: 769px), print {
-  .columns.is-grid {
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap;
-  }
-  .columns.is-grid > .column {
-    max-width: 33.3333%;
-    padding: 0.75rem;
-    width: 33.3333%;
-  }
-  .columns.is-grid > .column + .column {
-    margin-left: 0;
-  }
-}
-
-.columns.is-mobile {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.columns.is-multiline {
-  -ms-flex-wrap: wrap;
-      flex-wrap: wrap;
-}
-
-.columns.is-vcentered {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-
-@media screen and (min-width: 769px), print {
-  .columns:not(.is-desktop) {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-}
-
-@media screen and (min-width: 1000px) {
-  .columns.is-desktop {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-}
-
-.tile {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  display: block;
-  -ms-flex-preferred-size: 0;
-      flex-basis: 0;
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-  min-height: -webkit-min-content;
-  min-height: -moz-min-content;
-  min-height: min-content;
-}
-
-.tile.is-ancestor {
-  margin-left: -0.75rem;
-  margin-right: -0.75rem;
-  margin-top: -0.75rem;
-}
-
-.tile.is-ancestor:last-child {
-  margin-bottom: -0.75rem;
-}
-
-.tile.is-ancestor:not(:last-child) {
-  margin-bottom: 0.75rem;
-}
-
-.tile.is-child {
-  margin: 0 !important;
-}
-
-.tile.is-parent {
-  padding: 0.75rem;
-}
-
-.tile.is-vertical {
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column;
-}
-
-.tile.is-vertical > .tile.is-child:not(:last-child) {
-  margin-bottom: 1.5rem !important;
-}
-
-@media screen and (min-width: 769px), print {
-  .tile:not(.is-child) {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-  .tile.is-1 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 8.33333%;
-  }
-  .tile.is-2 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 16.66667%;
-  }
-  .tile.is-3 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 25%;
-  }
-  .tile.is-4 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 33.33333%;
-  }
-  .tile.is-5 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 41.66667%;
-  }
-  .tile.is-6 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 50%;
-  }
-  .tile.is-7 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 58.33333%;
-  }
-  .tile.is-8 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 66.66667%;
-  }
-  .tile.is-9 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 75%;
-  }
-  .tile.is-10 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 83.33333%;
-  }
-  .tile.is-11 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 91.66667%;
-  }
-  .tile.is-12 {
-    -webkit-box-flex: 0;
-        -ms-flex: none;
-            flex: none;
-    width: 100%;
-  }
-}
-
-.hero-video {
-  bottom: 0;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  overflow: hidden;
-}
-
-.hero-video video {
-  left: 50%;
-  min-height: 100%;
-  min-width: 100%;
-  position: absolute;
-  top: 50%;
-  -webkit-transform: translate3d(-50%, -50%, 0);
-          transform: translate3d(-50%, -50%, 0);
-}
-
-.hero-video.is-transparent {
-  opacity: 0.3;
-}
-
-@media screen and (max-width: 768px) {
-  .hero-video {
-    display: none;
-  }
-}
-
-.hero-buttons {
-  margin-top: 1.5rem;
-}
-
-@media screen and (max-width: 768px) {
-  .hero-buttons .button {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-  }
-  .hero-buttons .button:not(:last-child) {
-    margin-bottom: 0.75rem;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .hero-buttons {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-  }
-  .hero-buttons .button:not(:last-child) {
-    margin-right: 1.5rem;
-  }
-}
-
-.hero-head,
-.hero-foot {
-  -webkit-box-flex: 0;
-      -ms-flex-positive: 0;
-          flex-grow: 0;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-}
-
-.hero-body {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 0;
-      flex-shrink: 0;
-  padding: 3rem 1.5rem;
-}
-
-@media screen and (min-width: 1192px) {
-  .hero-body {
-    padding-left: 0;
-    padding-right: 0;
-  }
-}
-
-.hero {
-  -webkit-box-align: stretch;
-      -ms-flex-align: stretch;
-          align-items: stretch;
-  background-color: white;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-box-pack: justify;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-}
-
-.hero .nav {
-  background: none;
-  box-shadow: 0 1px 0 rgba(219, 219, 219, 0.3);
-}
-
-.hero .tabs ul {
-  border-bottom: none;
-}
-
-.hero.is-white {
-  background-color: white;
-  color: #0a0a0a;
-}
-
-.hero.is-white a:not(.button),
-.hero.is-white strong {
-  color: inherit;
-}
-
-.hero.is-white .title {
-  color: #0a0a0a;
-}
-
-.hero.is-white .subtitle {
-  color: rgba(10, 10, 10, 0.9);
-}
-
-.hero.is-white .subtitle a:not(.button),
-.hero.is-white .subtitle strong {
-  color: #0a0a0a;
-}
-
-.hero.is-white .nav {
-  box-shadow: 0 1px 0 rgba(10, 10, 10, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-white .nav-menu {
-    background-color: white;
-  }
-}
-
-.hero.is-white a.nav-item,
-.hero.is-white .nav-item a:not(.button) {
-  color: rgba(10, 10, 10, 0.7);
-}
-
-.hero.is-white a.nav-item:hover, .hero.is-white a.nav-item.is-active,
-.hero.is-white .nav-item a:not(.button):hover,
-.hero.is-white .nav-item a:not(.button).is-active {
-  color: #0a0a0a;
-}
-
-.hero.is-white .tabs a {
-  color: #0a0a0a;
-  opacity: 0.9;
-}
-
-.hero.is-white .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-white .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a {
-  color: #0a0a0a;
-}
-
-.hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover {
-  background-color: #0a0a0a;
-  border-color: #0a0a0a;
-  color: white;
-}
-
-.hero.is-white.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%);
-  background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-white.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #e6e6e6 0%, white 71%, white 100%);
-    background-image: linear-gradient(141deg, #e6e6e6 0%, white 71%, white 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-white .nav-toggle span {
-    background-color: #0a0a0a;
-  }
-  .hero.is-white .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-white .nav-toggle.is-active span {
-    background-color: #0a0a0a;
-  }
-  .hero.is-white .nav-menu .nav-item {
-    border-top-color: rgba(10, 10, 10, 0.2);
-  }
-}
-
-.hero.is-black {
-  background-color: #0a0a0a;
-  color: white;
-}
-
-.hero.is-black a:not(.button),
-.hero.is-black strong {
-  color: inherit;
-}
-
-.hero.is-black .title {
-  color: white;
-}
-
-.hero.is-black .subtitle {
-  color: rgba(255, 255, 255, 0.9);
-}
-
-.hero.is-black .subtitle a:not(.button),
-.hero.is-black .subtitle strong {
-  color: white;
-}
-
-.hero.is-black .nav {
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-black .nav-menu {
-    background-color: #0a0a0a;
-  }
-}
-
-.hero.is-black a.nav-item,
-.hero.is-black .nav-item a:not(.button) {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.hero.is-black a.nav-item:hover, .hero.is-black a.nav-item.is-active,
-.hero.is-black .nav-item a:not(.button):hover,
-.hero.is-black .nav-item a:not(.button).is-active {
-  color: white;
-}
-
-.hero.is-black .tabs a {
-  color: white;
-  opacity: 0.9;
-}
-
-.hero.is-black .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-black .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a {
-  color: white;
-}
-
-.hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover {
-  background-color: white;
-  border-color: white;
-  color: #0a0a0a;
-}
-
-.hero.is-black.is-bold {
-  background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%);
-  background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-black.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, black 0%, #0a0a0a 71%, #181616 100%);
-    background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-black .nav-toggle span {
-    background-color: white;
-  }
-  .hero.is-black .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-black .nav-toggle.is-active span {
-    background-color: white;
-  }
-  .hero.is-black .nav-menu .nav-item {
-    border-top-color: rgba(255, 255, 255, 0.2);
-  }
-}
-
-.hero.is-light {
-  background-color: whitesmoke;
-  color: #363636;
-}
-
-.hero.is-light a:not(.button),
-.hero.is-light strong {
-  color: inherit;
-}
-
-.hero.is-light .title {
-  color: #363636;
-}
-
-.hero.is-light .subtitle {
-  color: rgba(54, 54, 54, 0.9);
-}
-
-.hero.is-light .subtitle a:not(.button),
-.hero.is-light .subtitle strong {
-  color: #363636;
-}
-
-.hero.is-light .nav {
-  box-shadow: 0 1px 0 rgba(54, 54, 54, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-light .nav-menu {
-    background-color: whitesmoke;
-  }
-}
-
-.hero.is-light a.nav-item,
-.hero.is-light .nav-item a:not(.button) {
-  color: rgba(54, 54, 54, 0.7);
-}
-
-.hero.is-light a.nav-item:hover, .hero.is-light a.nav-item.is-active,
-.hero.is-light .nav-item a:not(.button):hover,
-.hero.is-light .nav-item a:not(.button).is-active {
-  color: #363636;
-}
-
-.hero.is-light .tabs a {
-  color: #363636;
-  opacity: 0.9;
-}
-
-.hero.is-light .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-light .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a {
-  color: #363636;
-}
-
-.hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover {
-  background-color: #363636;
-  border-color: #363636;
-  color: whitesmoke;
-}
-
-.hero.is-light.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%);
-  background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-light.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #dfd8d8 0%, whitesmoke 71%, white 100%);
-    background-image: linear-gradient(141deg, #dfd8d8 0%, whitesmoke 71%, white 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-light .nav-toggle span {
-    background-color: #363636;
-  }
-  .hero.is-light .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-light .nav-toggle.is-active span {
-    background-color: #363636;
-  }
-  .hero.is-light .nav-menu .nav-item {
-    border-top-color: rgba(54, 54, 54, 0.2);
-  }
-}
-
-.hero.is-dark {
-  background-color: #363636;
-  color: whitesmoke;
-}
-
-.hero.is-dark a:not(.button),
-.hero.is-dark strong {
-  color: inherit;
-}
-
-.hero.is-dark .title {
-  color: whitesmoke;
-}
-
-.hero.is-dark .subtitle {
-  color: rgba(245, 245, 245, 0.9);
-}
-
-.hero.is-dark .subtitle a:not(.button),
-.hero.is-dark .subtitle strong {
-  color: whitesmoke;
-}
-
-.hero.is-dark .nav {
-  box-shadow: 0 1px 0 rgba(245, 245, 245, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-dark .nav-menu {
-    background-color: #363636;
-  }
-}
-
-.hero.is-dark a.nav-item,
-.hero.is-dark .nav-item a:not(.button) {
-  color: rgba(245, 245, 245, 0.7);
-}
-
-.hero.is-dark a.nav-item:hover, .hero.is-dark a.nav-item.is-active,
-.hero.is-dark .nav-item a:not(.button):hover,
-.hero.is-dark .nav-item a:not(.button).is-active {
-  color: whitesmoke;
-}
-
-.hero.is-dark .tabs a {
-  color: whitesmoke;
-  opacity: 0.9;
-}
-
-.hero.is-dark .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-dark .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a {
-  color: whitesmoke;
-}
-
-.hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover {
-  background-color: whitesmoke;
-  border-color: whitesmoke;
-  color: #363636;
-}
-
-.hero.is-dark.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%);
-  background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-dark.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #1f1919 0%, #363636 71%, #463f3f 100%);
-    background-image: linear-gradient(141deg, #1f1919 0%, #363636 71%, #463f3f 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-dark .nav-toggle span {
-    background-color: whitesmoke;
-  }
-  .hero.is-dark .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-dark .nav-toggle.is-active span {
-    background-color: whitesmoke;
-  }
-  .hero.is-dark .nav-menu .nav-item {
-    border-top-color: rgba(245, 245, 245, 0.2);
-  }
-}
-
-.hero.is-primary {
-  background-color: #00d1b2;
-  color: #fff;
-}
-
-.hero.is-primary a:not(.button),
-.hero.is-primary strong {
-  color: inherit;
-}
-
-.hero.is-primary .title {
-  color: #fff;
-}
-
-.hero.is-primary .subtitle {
-  color: rgba(255, 255, 255, 0.9);
-}
-
-.hero.is-primary .subtitle a:not(.button),
-.hero.is-primary .subtitle strong {
-  color: #fff;
-}
-
-.hero.is-primary .nav {
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-primary .nav-menu {
-    background-color: #00d1b2;
-  }
-}
-
-.hero.is-primary a.nav-item,
-.hero.is-primary .nav-item a:not(.button) {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.hero.is-primary a.nav-item:hover, .hero.is-primary a.nav-item.is-active,
-.hero.is-primary .nav-item a:not(.button):hover,
-.hero.is-primary .nav-item a:not(.button).is-active {
-  color: #fff;
-}
-
-.hero.is-primary .tabs a {
-  color: #fff;
-  opacity: 0.9;
-}
-
-.hero.is-primary .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-primary .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a {
-  color: #fff;
-}
-
-.hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover {
-  background-color: #fff;
-  border-color: #fff;
-  color: #00d1b2;
-}
-
-.hero.is-primary.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%);
-  background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-primary.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%);
-    background-image: linear-gradient(141deg, #009e6c 0%, #00d1b2 71%, #00e7eb 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-primary .nav-toggle span {
-    background-color: #fff;
-  }
-  .hero.is-primary .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-primary .nav-toggle.is-active span {
-    background-color: #fff;
-  }
-  .hero.is-primary .nav-menu .nav-item {
-    border-top-color: rgba(255, 255, 255, 0.2);
-  }
-}
-
-.hero.is-info {
-  background-color: #3273dc;
-  color: #fff;
-}
-
-.hero.is-info a:not(.button),
-.hero.is-info strong {
-  color: inherit;
-}
-
-.hero.is-info .title {
-  color: #fff;
-}
-
-.hero.is-info .subtitle {
-  color: rgba(255, 255, 255, 0.9);
-}
-
-.hero.is-info .subtitle a:not(.button),
-.hero.is-info .subtitle strong {
-  color: #fff;
-}
-
-.hero.is-info .nav {
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-info .nav-menu {
-    background-color: #3273dc;
-  }
-}
-
-.hero.is-info a.nav-item,
-.hero.is-info .nav-item a:not(.button) {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.hero.is-info a.nav-item:hover, .hero.is-info a.nav-item.is-active,
-.hero.is-info .nav-item a:not(.button):hover,
-.hero.is-info .nav-item a:not(.button).is-active {
-  color: #fff;
-}
-
-.hero.is-info .tabs a {
-  color: #fff;
-  opacity: 0.9;
-}
-
-.hero.is-info .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-info .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
-  color: #fff;
-}
-
-.hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
-  background-color: #fff;
-  border-color: #fff;
-  color: #3273dc;
-}
-
-.hero.is-info.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%);
-  background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-info.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #1577c6 0%, #3273dc 71%, #4366e5 100%);
-    background-image: linear-gradient(141deg, #1577c6 0%, #3273dc 71%, #4366e5 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-info .nav-toggle span {
-    background-color: #fff;
-  }
-  .hero.is-info .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-info .nav-toggle.is-active span {
-    background-color: #fff;
-  }
-  .hero.is-info .nav-menu .nav-item {
-    border-top-color: rgba(255, 255, 255, 0.2);
-  }
-}
-
-.hero.is-success {
-  background-color: #23d160;
-  color: #fff;
-}
-
-.hero.is-success a:not(.button),
-.hero.is-success strong {
-  color: inherit;
-}
-
-.hero.is-success .title {
-  color: #fff;
-}
-
-.hero.is-success .subtitle {
-  color: rgba(255, 255, 255, 0.9);
-}
-
-.hero.is-success .subtitle a:not(.button),
-.hero.is-success .subtitle strong {
-  color: #fff;
-}
-
-.hero.is-success .nav {
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-success .nav-menu {
-    background-color: #23d160;
-  }
-}
-
-.hero.is-success a.nav-item,
-.hero.is-success .nav-item a:not(.button) {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.hero.is-success a.nav-item:hover, .hero.is-success a.nav-item.is-active,
-.hero.is-success .nav-item a:not(.button):hover,
-.hero.is-success .nav-item a:not(.button).is-active {
-  color: #fff;
-}
-
-.hero.is-success .tabs a {
-  color: #fff;
-  opacity: 0.9;
-}
-
-.hero.is-success .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-success .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a {
-  color: #fff;
-}
-
-.hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover {
-  background-color: #fff;
-  border-color: #fff;
-  color: #23d160;
-}
-
-.hero.is-success.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%);
-  background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-success.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #12af2f 0%, #23d160 71%, #2ce28a 100%);
-    background-image: linear-gradient(141deg, #12af2f 0%, #23d160 71%, #2ce28a 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-success .nav-toggle span {
-    background-color: #fff;
-  }
-  .hero.is-success .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-success .nav-toggle.is-active span {
-    background-color: #fff;
-  }
-  .hero.is-success .nav-menu .nav-item {
-    border-top-color: rgba(255, 255, 255, 0.2);
-  }
-}
-
-.hero.is-warning {
-  background-color: #ffdd57;
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning a:not(.button),
-.hero.is-warning strong {
-  color: inherit;
-}
-
-.hero.is-warning .title {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning .subtitle {
-  color: rgba(0, 0, 0, 0.9);
-}
-
-.hero.is-warning .subtitle a:not(.button),
-.hero.is-warning .subtitle strong {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning .nav {
-  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-warning .nav-menu {
-    background-color: #ffdd57;
-  }
-}
-
-.hero.is-warning a.nav-item,
-.hero.is-warning .nav-item a:not(.button) {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning a.nav-item:hover, .hero.is-warning a.nav-item.is-active,
-.hero.is-warning .nav-item a:not(.button):hover,
-.hero.is-warning .nav-item a:not(.button).is-active {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning .tabs a {
-  color: rgba(0, 0, 0, 0.7);
-  opacity: 0.9;
-}
-
-.hero.is-warning .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-warning .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover {
-  background-color: rgba(0, 0, 0, 0.7);
-  border-color: rgba(0, 0, 0, 0.7);
-  color: #ffdd57;
-}
-
-.hero.is-warning.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%);
-  background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-warning.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%);
-    background-image: linear-gradient(141deg, #ffaf24 0%, #ffdd57 71%, #fffa70 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-warning .nav-toggle span {
-    background-color: rgba(0, 0, 0, 0.7);
-  }
-  .hero.is-warning .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-warning .nav-toggle.is-active span {
-    background-color: rgba(0, 0, 0, 0.7);
-  }
-  .hero.is-warning .nav-menu .nav-item {
-    border-top-color: rgba(0, 0, 0, 0.2);
-  }
-}
-
-.hero.is-danger {
-  background-color: #ff3860;
-  color: #fff;
-}
-
-.hero.is-danger a:not(.button),
-.hero.is-danger strong {
-  color: inherit;
-}
-
-.hero.is-danger .title {
-  color: #fff;
-}
-
-.hero.is-danger .subtitle {
-  color: rgba(255, 255, 255, 0.9);
-}
-
-.hero.is-danger .subtitle a:not(.button),
-.hero.is-danger .subtitle strong {
-  color: #fff;
-}
-
-.hero.is-danger .nav {
-  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-danger .nav-menu {
-    background-color: #ff3860;
-  }
-}
-
-.hero.is-danger a.nav-item,
-.hero.is-danger .nav-item a:not(.button) {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.hero.is-danger a.nav-item:hover, .hero.is-danger a.nav-item.is-active,
-.hero.is-danger .nav-item a:not(.button):hover,
-.hero.is-danger .nav-item a:not(.button).is-active {
-  color: #fff;
-}
-
-.hero.is-danger .tabs a {
-  color: #fff;
-  opacity: 0.9;
-}
-
-.hero.is-danger .tabs a:hover {
-  opacity: 1;
-}
-
-.hero.is-danger .tabs li.is-active a {
-  opacity: 1;
-}
-
-.hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a {
-  color: #fff;
-}
-
-.hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover {
-  background-color: rgba(10, 10, 10, 0.1);
-}
-
-.hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover {
-  background-color: #fff;
-  border-color: #fff;
-  color: #ff3860;
-}
-
-.hero.is-danger.is-bold {
-  background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%);
-  background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%);
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-danger.is-bold .nav-menu {
-    background-image: -webkit-linear-gradient(309deg, #ff0561 0%, #ff3860 71%, #ff5257 100%);
-    background-image: linear-gradient(141deg, #ff0561 0%, #ff3860 71%, #ff5257 100%);
-  }
-}
-
-@media screen and (max-width: 768px) {
-  .hero.is-danger .nav-toggle span {
-    background-color: #fff;
-  }
-  .hero.is-danger .nav-toggle:hover {
-    background-color: rgba(10, 10, 10, 0.1);
-  }
-  .hero.is-danger .nav-toggle.is-active span {
-    background-color: #fff;
-  }
-  .hero.is-danger .nav-menu .nav-item {
-    border-top-color: rgba(255, 255, 255, 0.2);
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .hero.is-medium .hero-body {
-    padding-bottom: 9rem;
-    padding-top: 9rem;
-  }
-}
-
-@media screen and (min-width: 769px), print {
-  .hero.is-large .hero-body {
-    padding-bottom: 18rem;
-    padding-top: 18rem;
-  }
-}
-
-.hero.is-fullheight {
-  min-height: 100vh;
-}
-
-.hero.is-fullheight .hero-body {
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.hero.is-fullheight .hero-body > .container {
-  -webkit-box-flex: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-  -ms-flex-negative: 1;
-      flex-shrink: 1;
-}
-
-.section {
-  background-color: white;
-  padding: 3rem 1.5rem;
-}
-
-@media screen and (min-width: 1000px) {
-  .section.is-medium {
-    padding: 9rem 1.5rem;
-  }
-  .section.is-large {
-    padding: 18rem 1.5rem;
-  }
-}
-
-.footer {
-  background-color: whitesmoke;
-  padding: 3rem 1.5rem 6rem;
-}
-/*# sourceMappingURL=bulma.css.map */
\ No newline at end of file
diff --git a/packages/csslib/test/examples/foundation.css b/packages/csslib/test/examples/foundation.css
deleted file mode 100644
index dd9aabd..0000000
--- a/packages/csslib/test/examples/foundation.css
+++ /dev/null
@@ -1,4398 +0,0 @@
-@charset "UTF-8";
-/**
- * Foundation for Sites by ZURB
- * Version 6.3.1
- * foundation.zurb.com
- * Licensed under MIT Open Source
- */
-/*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */
-/* Document
-       ========================================================================== */
-/**
-     * 1. Change the default font family in all browsers (opinionated).
-     * 2. Correct the line height in all browsers.
-     * 3. Prevent adjustments of font size after orientation changes in
-     *    IE on Windows Phone and in iOS.
-     */
-html {
-  font-family: sans-serif;
-  /* 1 */
-  line-height: 1.15;
-  /* 2 */
-  -ms-text-size-adjust: 100%;
-  /* 3 */
-  -webkit-text-size-adjust: 100%;
-  /* 3 */ }
-
-/* Sections
-       ========================================================================== */
-/**
-     * Remove the margin in all browsers (opinionated).
-     */
-body {
-  margin: 0; }
-
-/**
-     * Add the correct display in IE 9-.
-     */
-article,
-aside,
-footer,
-header,
-nav,
-section {
-  display: block; }
-
-/**
-     * Correct the font size and margin on `h1` elements within `section` and
-     * `article` contexts in Chrome, Firefox, and Safari.
-     */
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0; }
-
-/* Grouping content
-       ========================================================================== */
-/**
-     * Add the correct display in IE 9-.
-     */
-figcaption,
-figure {
-  display: block; }
-
-/**
-     * Add the correct margin in IE 8.
-     */
-figure {
-  margin: 1em 40px; }
-
-/**
-     * 1. Add the correct box sizing in Firefox.
-     * 2. Show the overflow in Edge and IE.
-     */
-hr {
-  box-sizing: content-box;
-  /* 1 */
-  height: 0;
-  /* 1 */
-  overflow: visible;
-  /* 2 */ }
-
-/**
-     * Add the correct display in IE.
-     */
-main {
-  display: block; }
-
-/**
-     * 1. Correct the inheritance and scaling of font size in all browsers.
-     * 2. Correct the odd `em` font sizing in all browsers.
-     */
-pre {
-  font-family: monospace, monospace;
-  /* 1 */
-  font-size: 1em;
-  /* 2 */ }
-
-/* Links
-       ========================================================================== */
-/**
-     * 1. Remove the gray background on active links in IE 10.
-     * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
-     */
-a {
-  background-color: transparent;
-  /* 1 */
-  -webkit-text-decoration-skip: objects;
-  /* 2 */ }
-
-/**
-     * Remove the outline on focused links when they are also active or hovered
-     * in all browsers (opinionated).
-     */
-a:active,
-a:hover {
-  outline-width: 0; }
-
-/* Text-level semantics
-       ========================================================================== */
-/**
-     * 1. Remove the bottom border in Firefox 39-.
-     * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
-     */
-abbr[title] {
-  border-bottom: none;
-  /* 1 */
-  text-decoration: underline;
-  /* 2 */
-  text-decoration: underline dotted;
-  /* 2 */ }
-
-/**
-     * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
-     */
-b,
-strong {
-  font-weight: inherit; }
-
-/**
-     * Add the correct font weight in Chrome, Edge, and Safari.
-     */
-b,
-strong {
-  font-weight: bolder; }
-
-/**
-     * 1. Correct the inheritance and scaling of font size in all browsers.
-     * 2. Correct the odd `em` font sizing in all browsers.
-     */
-code,
-kbd,
-samp {
-  font-family: monospace, monospace;
-  /* 1 */
-  font-size: 1em;
-  /* 2 */ }
-
-/**
-     * Add the correct font style in Android 4.3-.
-     */
-dfn {
-  font-style: italic; }
-
-/**
-     * Add the correct background and color in IE 9-.
-     */
-mark {
-  background-color: #ff0;
-  color: #000; }
-
-/**
-     * Add the correct font size in all browsers.
-     */
-small {
-  font-size: 80%; }
-
-/**
-     * Prevent `sub` and `sup` elements from affecting the line height in
-     * all browsers.
-     */
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline; }
-
-sub {
-  bottom: -0.25em; }
-
-sup {
-  top: -0.5em; }
-
-/* Embedded content
-       ========================================================================== */
-/**
-     * Add the correct display in IE 9-.
-     */
-audio,
-video {
-  display: inline-block; }
-
-/**
-     * Add the correct display in iOS 4-7.
-     */
-audio:not([controls]) {
-  display: none;
-  height: 0; }
-
-/**
-     * Remove the border on images inside links in IE 10-.
-     */
-img {
-  border-style: none; }
-
-/**
-     * Hide the overflow in IE.
-     */
-svg:not(:root) {
-  overflow: hidden; }
-
-/* Forms
-       ========================================================================== */
-/**
-     * 1. Change the font styles in all browsers (opinionated).
-     * 2. Remove the margin in Firefox and Safari.
-     */
-button,
-input,
-optgroup,
-select,
-textarea {
-  font-family: sans-serif;
-  /* 1 */
-  font-size: 100%;
-  /* 1 */
-  line-height: 1.15;
-  /* 1 */
-  margin: 0;
-  /* 2 */ }
-
-/**
-     * Show the overflow in IE.
-     */
-button {
-  overflow: visible; }
-
-/**
-     * Remove the inheritance of text transform in Edge, Firefox, and IE.
-     * 1. Remove the inheritance of text transform in Firefox.
-     */
-button,
-select {
-  /* 1 */
-  text-transform: none; }
-
-/**
-     * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
-     *    controls in Android 4.
-     * 2. Correct the inability to style clickable types in iOS and Safari.
-     */
-button,
-html [type="button"],
-[type="reset"],
-[type="submit"] {
-  -webkit-appearance: button;
-  /* 2 */ }
-
-button,
-[type="button"],
-[type="reset"],
-[type="submit"] {
-  /**
-       * Remove the inner border and padding in Firefox.
-       */
-  /**
-       * Restore the focus styles unset by the previous rule.
-       */ }
-  button::-moz-focus-inner,
-  [type="button"]::-moz-focus-inner,
-  [type="reset"]::-moz-focus-inner,
-  [type="submit"]::-moz-focus-inner {
-    border-style: none;
-    padding: 0; }
-  button:-moz-focusring,
-  [type="button"]:-moz-focusring,
-  [type="reset"]:-moz-focusring,
-  [type="submit"]:-moz-focusring {
-    outline: 1px dotted ButtonText; }
-
-/**
-     * Show the overflow in Edge.
-     */
-input {
-  overflow: visible; }
-
-/**
-     * 1. Add the correct box sizing in IE 10-.
-     * 2. Remove the padding in IE 10-.
-     */
-[type="checkbox"],
-[type="radio"] {
-  box-sizing: border-box;
-  /* 1 */
-  padding: 0;
-  /* 2 */ }
-
-/**
-     * Correct the cursor style of increment and decrement buttons in Chrome.
-     */
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
-  height: auto; }
-
-/**
-     * 1. Correct the odd appearance in Chrome and Safari.
-     * 2. Correct the outline style in Safari.
-     */
-[type="search"] {
-  -webkit-appearance: textfield;
-  /* 1 */
-  outline-offset: -2px;
-  /* 2 */
-  /**
-       * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
-       */ }
-  [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none; }
-
-/**
-     * 1. Correct the inability to style clickable types in iOS and Safari.
-     * 2. Change font properties to `inherit` in Safari.
-     */
-::-webkit-file-upload-button {
-  -webkit-appearance: button;
-  /* 1 */
-  font: inherit;
-  /* 2 */ }
-
-/**
-     * Change the border, margin, and padding in all browsers (opinionated).
-     */
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em; }
-
-/**
-     * 1. Correct the text wrapping in Edge and IE.
-     * 2. Correct the color inheritance from `fieldset` elements in IE.
-     * 3. Remove the padding so developers are not caught out when they zero out
-     *    `fieldset` elements in all browsers.
-     */
-legend {
-  box-sizing: border-box;
-  /* 1 */
-  display: table;
-  /* 1 */
-  max-width: 100%;
-  /* 1 */
-  padding: 0;
-  /* 3 */
-  color: inherit;
-  /* 2 */
-  white-space: normal;
-  /* 1 */ }
-
-/**
-     * 1. Add the correct display in IE 9-.
-     * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
-     */
-progress {
-  display: inline-block;
-  /* 1 */
-  vertical-align: baseline;
-  /* 2 */ }
-
-/**
-     * Remove the default vertical scrollbar in IE.
-     */
-textarea {
-  overflow: auto; }
-
-/* Interactive
-       ========================================================================== */
-/*
-     * Add the correct display in Edge, IE, and Firefox.
-     */
-details {
-  display: block; }
-
-/*
-     * Add the correct display in all browsers.
-     */
-summary {
-  display: list-item; }
-
-/*
-     * Add the correct display in IE 9-.
-     */
-menu {
-  display: block; }
-
-/* Scripting
-       ========================================================================== */
-/**
-     * Add the correct display in IE 9-.
-     */
-canvas {
-  display: inline-block; }
-
-/**
-     * Add the correct display in IE.
-     */
-template {
-  display: none; }
-
-/* Hidden
-       ========================================================================== */
-/**
-     * Add the correct display in IE 10-.
-     */
-[hidden] {
-  display: none; }
-
-.foundation-mq {
-  font-family: "small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"; }
-
-html {
-  box-sizing: border-box;
-  font-size: 100%; }
-
-*,
-*::before,
-*::after {
-  box-sizing: inherit; }
-
-body {
-  margin: 0;
-  padding: 0;
-  background: #fefefe;
-  font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
-  font-weight: normal;
-  line-height: 1.5;
-  color: #0a0a0a;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale; }
-
-img {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 100%;
-  height: auto;
-  -ms-interpolation-mode: bicubic; }
-
-textarea {
-  height: auto;
-  min-height: 50px;
-  border-radius: 0; }
-
-select {
-  box-sizing: border-box;
-  width: 100%;
-  border-radius: 0; }
-
-.map_canvas img,
-.map_canvas embed,
-.map_canvas object,
-.mqa-display img,
-.mqa-display embed,
-.mqa-display object {
-  max-width: none !important; }
-
-button {
-  padding: 0;
-  -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none;
-  border: 0;
-  border-radius: 0;
-  background: transparent;
-  line-height: 1; }
-  [data-whatinput='mouse'] button {
-    outline: 0; }
-
-pre {
-  overflow: auto; }
-
-.is-visible {
-  display: block !important; }
-
-.is-hidden {
-  display: none !important; }
-
-.row {
-  max-width: 75rem;
-  margin-right: auto;
-  margin-left: auto; }
-  .row::before, .row::after {
-    display: table;
-    content: ' '; }
-  .row::after {
-    clear: both; }
-  .row.collapse > .column, .row.collapse > .columns {
-    padding-right: 0;
-    padding-left: 0; }
-  .row .row {
-    margin-right: -0.625rem;
-    margin-left: -0.625rem; }
-    @media print, screen and (min-width: 40em) {
-      .row .row {
-        margin-right: -0.9375rem;
-        margin-left: -0.9375rem; } }
-    @media print, screen and (min-width: 64em) {
-      .row .row {
-        margin-right: -0.9375rem;
-        margin-left: -0.9375rem; } }
-    .row .row.collapse {
-      margin-right: 0;
-      margin-left: 0; }
-  .row.expanded {
-    max-width: none; }
-    .row.expanded .row {
-      margin-right: auto;
-      margin-left: auto; }
-  .row:not(.expanded) .row {
-    max-width: none; }
-  .row.gutter-small > .column, .row.gutter-small > .columns {
-    padding-right: 0.625rem;
-    padding-left: 0.625rem; }
-  .row.gutter-medium > .column, .row.gutter-medium > .columns {
-    padding-right: 0.9375rem;
-    padding-left: 0.9375rem; }
-
-.column, .columns {
-  width: 100%;
-  float: left;
-  padding-right: 0.625rem;
-  padding-left: 0.625rem; }
-  @media print, screen and (min-width: 40em) {
-    .column, .columns {
-      padding-right: 0.9375rem;
-      padding-left: 0.9375rem; } }
-  .column:last-child:not(:first-child), .columns:last-child:not(:first-child) {
-    float: right; }
-  .column.end:last-child:last-child, .end.columns:last-child:last-child {
-    float: left; }
-
-.column.row.row, .row.row.columns {
-  float: none; }
-
-.row .column.row.row, .row .row.row.columns {
-  margin-right: 0;
-  margin-left: 0;
-  padding-right: 0;
-  padding-left: 0; }
-
-.small-1 {
-  width: 8.33333%; }
-
-.small-push-1 {
-  position: relative;
-  left: 8.33333%; }
-
-.small-pull-1 {
-  position: relative;
-  left: -8.33333%; }
-
-.small-offset-0 {
-  margin-left: 0%; }
-
-.small-2 {
-  width: 16.66667%; }
-
-.small-push-2 {
-  position: relative;
-  left: 16.66667%; }
-
-.small-pull-2 {
-  position: relative;
-  left: -16.66667%; }
-
-.small-offset-1 {
-  margin-left: 8.33333%; }
-
-.small-3 {
-  width: 25%; }
-
-.small-push-3 {
-  position: relative;
-  left: 25%; }
-
-.small-pull-3 {
-  position: relative;
-  left: -25%; }
-
-.small-offset-2 {
-  margin-left: 16.66667%; }
-
-.small-4 {
-  width: 33.33333%; }
-
-.small-push-4 {
-  position: relative;
-  left: 33.33333%; }
-
-.small-pull-4 {
-  position: relative;
-  left: -33.33333%; }
-
-.small-offset-3 {
-  margin-left: 25%; }
-
-.small-5 {
-  width: 41.66667%; }
-
-.small-push-5 {
-  position: relative;
-  left: 41.66667%; }
-
-.small-pull-5 {
-  position: relative;
-  left: -41.66667%; }
-
-.small-offset-4 {
-  margin-left: 33.33333%; }
-
-.small-6 {
-  width: 50%; }
-
-.small-push-6 {
-  position: relative;
-  left: 50%; }
-
-.small-pull-6 {
-  position: relative;
-  left: -50%; }
-
-.small-offset-5 {
-  margin-left: 41.66667%; }
-
-.small-7 {
-  width: 58.33333%; }
-
-.small-push-7 {
-  position: relative;
-  left: 58.33333%; }
-
-.small-pull-7 {
-  position: relative;
-  left: -58.33333%; }
-
-.small-offset-6 {
-  margin-left: 50%; }
-
-.small-8 {
-  width: 66.66667%; }
-
-.small-push-8 {
-  position: relative;
-  left: 66.66667%; }
-
-.small-pull-8 {
-  position: relative;
-  left: -66.66667%; }
-
-.small-offset-7 {
-  margin-left: 58.33333%; }
-
-.small-9 {
-  width: 75%; }
-
-.small-push-9 {
-  position: relative;
-  left: 75%; }
-
-.small-pull-9 {
-  position: relative;
-  left: -75%; }
-
-.small-offset-8 {
-  margin-left: 66.66667%; }
-
-.small-10 {
-  width: 83.33333%; }
-
-.small-push-10 {
-  position: relative;
-  left: 83.33333%; }
-
-.small-pull-10 {
-  position: relative;
-  left: -83.33333%; }
-
-.small-offset-9 {
-  margin-left: 75%; }
-
-.small-11 {
-  width: 91.66667%; }
-
-.small-push-11 {
-  position: relative;
-  left: 91.66667%; }
-
-.small-pull-11 {
-  position: relative;
-  left: -91.66667%; }
-
-.small-offset-10 {
-  margin-left: 83.33333%; }
-
-.small-12 {
-  width: 100%; }
-
-.small-offset-11 {
-  margin-left: 91.66667%; }
-
-.small-up-1 > .column, .small-up-1 > .columns {
-  float: left;
-  width: 100%; }
-  .small-up-1 > .column:nth-of-type(1n), .small-up-1 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-1 > .column:nth-of-type(1n+1), .small-up-1 > .columns:nth-of-type(1n+1) {
-    clear: both; }
-  .small-up-1 > .column:last-child, .small-up-1 > .columns:last-child {
-    float: left; }
-
-.small-up-2 > .column, .small-up-2 > .columns {
-  float: left;
-  width: 50%; }
-  .small-up-2 > .column:nth-of-type(1n), .small-up-2 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-2 > .column:nth-of-type(2n+1), .small-up-2 > .columns:nth-of-type(2n+1) {
-    clear: both; }
-  .small-up-2 > .column:last-child, .small-up-2 > .columns:last-child {
-    float: left; }
-
-.small-up-3 > .column, .small-up-3 > .columns {
-  float: left;
-  width: 33.33333%; }
-  .small-up-3 > .column:nth-of-type(1n), .small-up-3 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-3 > .column:nth-of-type(3n+1), .small-up-3 > .columns:nth-of-type(3n+1) {
-    clear: both; }
-  .small-up-3 > .column:last-child, .small-up-3 > .columns:last-child {
-    float: left; }
-
-.small-up-4 > .column, .small-up-4 > .columns {
-  float: left;
-  width: 25%; }
-  .small-up-4 > .column:nth-of-type(1n), .small-up-4 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-4 > .column:nth-of-type(4n+1), .small-up-4 > .columns:nth-of-type(4n+1) {
-    clear: both; }
-  .small-up-4 > .column:last-child, .small-up-4 > .columns:last-child {
-    float: left; }
-
-.small-up-5 > .column, .small-up-5 > .columns {
-  float: left;
-  width: 20%; }
-  .small-up-5 > .column:nth-of-type(1n), .small-up-5 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-5 > .column:nth-of-type(5n+1), .small-up-5 > .columns:nth-of-type(5n+1) {
-    clear: both; }
-  .small-up-5 > .column:last-child, .small-up-5 > .columns:last-child {
-    float: left; }
-
-.small-up-6 > .column, .small-up-6 > .columns {
-  float: left;
-  width: 16.66667%; }
-  .small-up-6 > .column:nth-of-type(1n), .small-up-6 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-6 > .column:nth-of-type(6n+1), .small-up-6 > .columns:nth-of-type(6n+1) {
-    clear: both; }
-  .small-up-6 > .column:last-child, .small-up-6 > .columns:last-child {
-    float: left; }
-
-.small-up-7 > .column, .small-up-7 > .columns {
-  float: left;
-  width: 14.28571%; }
-  .small-up-7 > .column:nth-of-type(1n), .small-up-7 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-7 > .column:nth-of-type(7n+1), .small-up-7 > .columns:nth-of-type(7n+1) {
-    clear: both; }
-  .small-up-7 > .column:last-child, .small-up-7 > .columns:last-child {
-    float: left; }
-
-.small-up-8 > .column, .small-up-8 > .columns {
-  float: left;
-  width: 12.5%; }
-  .small-up-8 > .column:nth-of-type(1n), .small-up-8 > .columns:nth-of-type(1n) {
-    clear: none; }
-  .small-up-8 > .column:nth-of-type(8n+1), .small-up-8 > .columns:nth-of-type(8n+1) {
-    clear: both; }
-  .small-up-8 > .column:last-child, .small-up-8 > .columns:last-child {
-    float: left; }
-
-.small-collapse > .column, .small-collapse > .columns {
-  padding-right: 0;
-  padding-left: 0; }
-
-.small-collapse .row {
-  margin-right: 0;
-  margin-left: 0; }
-
-.expanded.row .small-collapse.row {
-  margin-right: 0;
-  margin-left: 0; }
-
-.small-uncollapse > .column, .small-uncollapse > .columns {
-  padding-right: 0.625rem;
-  padding-left: 0.625rem; }
-
-.small-centered {
-  margin-right: auto;
-  margin-left: auto; }
-  .small-centered, .small-centered:last-child:not(:first-child) {
-    float: none;
-    clear: both; }
-
-.small-uncentered,
-.small-push-0,
-.small-pull-0 {
-  position: static;
-  float: left;
-  margin-right: 0;
-  margin-left: 0; }
-
-@media print, screen and (min-width: 40em) {
-  .medium-1 {
-    width: 8.33333%; }
-  .medium-push-1 {
-    position: relative;
-    left: 8.33333%; }
-  .medium-pull-1 {
-    position: relative;
-    left: -8.33333%; }
-  .medium-offset-0 {
-    margin-left: 0%; }
-  .medium-2 {
-    width: 16.66667%; }
-  .medium-push-2 {
-    position: relative;
-    left: 16.66667%; }
-  .medium-pull-2 {
-    position: relative;
-    left: -16.66667%; }
-  .medium-offset-1 {
-    margin-left: 8.33333%; }
-  .medium-3 {
-    width: 25%; }
-  .medium-push-3 {
-    position: relative;
-    left: 25%; }
-  .medium-pull-3 {
-    position: relative;
-    left: -25%; }
-  .medium-offset-2 {
-    margin-left: 16.66667%; }
-  .medium-4 {
-    width: 33.33333%; }
-  .medium-push-4 {
-    position: relative;
-    left: 33.33333%; }
-  .medium-pull-4 {
-    position: relative;
-    left: -33.33333%; }
-  .medium-offset-3 {
-    margin-left: 25%; }
-  .medium-5 {
-    width: 41.66667%; }
-  .medium-push-5 {
-    position: relative;
-    left: 41.66667%; }
-  .medium-pull-5 {
-    position: relative;
-    left: -41.66667%; }
-  .medium-offset-4 {
-    margin-left: 33.33333%; }
-  .medium-6 {
-    width: 50%; }
-  .medium-push-6 {
-    position: relative;
-    left: 50%; }
-  .medium-pull-6 {
-    position: relative;
-    left: -50%; }
-  .medium-offset-5 {
-    margin-left: 41.66667%; }
-  .medium-7 {
-    width: 58.33333%; }
-  .medium-push-7 {
-    position: relative;
-    left: 58.33333%; }
-  .medium-pull-7 {
-    position: relative;
-    left: -58.33333%; }
-  .medium-offset-6 {
-    margin-left: 50%; }
-  .medium-8 {
-    width: 66.66667%; }
-  .medium-push-8 {
-    position: relative;
-    left: 66.66667%; }
-  .medium-pull-8 {
-    position: relative;
-    left: -66.66667%; }
-  .medium-offset-7 {
-    margin-left: 58.33333%; }
-  .medium-9 {
-    width: 75%; }
-  .medium-push-9 {
-    position: relative;
-    left: 75%; }
-  .medium-pull-9 {
-    position: relative;
-    left: -75%; }
-  .medium-offset-8 {
-    margin-left: 66.66667%; }
-  .medium-10 {
-    width: 83.33333%; }
-  .medium-push-10 {
-    position: relative;
-    left: 83.33333%; }
-  .medium-pull-10 {
-    position: relative;
-    left: -83.33333%; }
-  .medium-offset-9 {
-    margin-left: 75%; }
-  .medium-11 {
-    width: 91.66667%; }
-  .medium-push-11 {
-    position: relative;
-    left: 91.66667%; }
-  .medium-pull-11 {
-    position: relative;
-    left: -91.66667%; }
-  .medium-offset-10 {
-    margin-left: 83.33333%; }
-  .medium-12 {
-    width: 100%; }
-  .medium-offset-11 {
-    margin-left: 91.66667%; }
-  .medium-up-1 > .column, .medium-up-1 > .columns {
-    float: left;
-    width: 100%; }
-    .medium-up-1 > .column:nth-of-type(1n), .medium-up-1 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-1 > .column:nth-of-type(1n+1), .medium-up-1 > .columns:nth-of-type(1n+1) {
-      clear: both; }
-    .medium-up-1 > .column:last-child, .medium-up-1 > .columns:last-child {
-      float: left; }
-  .medium-up-2 > .column, .medium-up-2 > .columns {
-    float: left;
-    width: 50%; }
-    .medium-up-2 > .column:nth-of-type(1n), .medium-up-2 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-2 > .column:nth-of-type(2n+1), .medium-up-2 > .columns:nth-of-type(2n+1) {
-      clear: both; }
-    .medium-up-2 > .column:last-child, .medium-up-2 > .columns:last-child {
-      float: left; }
-  .medium-up-3 > .column, .medium-up-3 > .columns {
-    float: left;
-    width: 33.33333%; }
-    .medium-up-3 > .column:nth-of-type(1n), .medium-up-3 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-3 > .column:nth-of-type(3n+1), .medium-up-3 > .columns:nth-of-type(3n+1) {
-      clear: both; }
-    .medium-up-3 > .column:last-child, .medium-up-3 > .columns:last-child {
-      float: left; }
-  .medium-up-4 > .column, .medium-up-4 > .columns {
-    float: left;
-    width: 25%; }
-    .medium-up-4 > .column:nth-of-type(1n), .medium-up-4 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-4 > .column:nth-of-type(4n+1), .medium-up-4 > .columns:nth-of-type(4n+1) {
-      clear: both; }
-    .medium-up-4 > .column:last-child, .medium-up-4 > .columns:last-child {
-      float: left; }
-  .medium-up-5 > .column, .medium-up-5 > .columns {
-    float: left;
-    width: 20%; }
-    .medium-up-5 > .column:nth-of-type(1n), .medium-up-5 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-5 > .column:nth-of-type(5n+1), .medium-up-5 > .columns:nth-of-type(5n+1) {
-      clear: both; }
-    .medium-up-5 > .column:last-child, .medium-up-5 > .columns:last-child {
-      float: left; }
-  .medium-up-6 > .column, .medium-up-6 > .columns {
-    float: left;
-    width: 16.66667%; }
-    .medium-up-6 > .column:nth-of-type(1n), .medium-up-6 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-6 > .column:nth-of-type(6n+1), .medium-up-6 > .columns:nth-of-type(6n+1) {
-      clear: both; }
-    .medium-up-6 > .column:last-child, .medium-up-6 > .columns:last-child {
-      float: left; }
-  .medium-up-7 > .column, .medium-up-7 > .columns {
-    float: left;
-    width: 14.28571%; }
-    .medium-up-7 > .column:nth-of-type(1n), .medium-up-7 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-7 > .column:nth-of-type(7n+1), .medium-up-7 > .columns:nth-of-type(7n+1) {
-      clear: both; }
-    .medium-up-7 > .column:last-child, .medium-up-7 > .columns:last-child {
-      float: left; }
-  .medium-up-8 > .column, .medium-up-8 > .columns {
-    float: left;
-    width: 12.5%; }
-    .medium-up-8 > .column:nth-of-type(1n), .medium-up-8 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .medium-up-8 > .column:nth-of-type(8n+1), .medium-up-8 > .columns:nth-of-type(8n+1) {
-      clear: both; }
-    .medium-up-8 > .column:last-child, .medium-up-8 > .columns:last-child {
-      float: left; }
-  .medium-collapse > .column, .medium-collapse > .columns {
-    padding-right: 0;
-    padding-left: 0; }
-  .medium-collapse .row {
-    margin-right: 0;
-    margin-left: 0; }
-  .expanded.row .medium-collapse.row {
-    margin-right: 0;
-    margin-left: 0; }
-  .medium-uncollapse > .column, .medium-uncollapse > .columns {
-    padding-right: 0.9375rem;
-    padding-left: 0.9375rem; }
-  .medium-centered {
-    margin-right: auto;
-    margin-left: auto; }
-    .medium-centered, .medium-centered:last-child:not(:first-child) {
-      float: none;
-      clear: both; }
-  .medium-uncentered,
-  .medium-push-0,
-  .medium-pull-0 {
-    position: static;
-    float: left;
-    margin-right: 0;
-    margin-left: 0; } }
-
-@media print, screen and (min-width: 64em) {
-  .large-1 {
-    width: 8.33333%; }
-  .large-push-1 {
-    position: relative;
-    left: 8.33333%; }
-  .large-pull-1 {
-    position: relative;
-    left: -8.33333%; }
-  .large-offset-0 {
-    margin-left: 0%; }
-  .large-2 {
-    width: 16.66667%; }
-  .large-push-2 {
-    position: relative;
-    left: 16.66667%; }
-  .large-pull-2 {
-    position: relative;
-    left: -16.66667%; }
-  .large-offset-1 {
-    margin-left: 8.33333%; }
-  .large-3 {
-    width: 25%; }
-  .large-push-3 {
-    position: relative;
-    left: 25%; }
-  .large-pull-3 {
-    position: relative;
-    left: -25%; }
-  .large-offset-2 {
-    margin-left: 16.66667%; }
-  .large-4 {
-    width: 33.33333%; }
-  .large-push-4 {
-    position: relative;
-    left: 33.33333%; }
-  .large-pull-4 {
-    position: relative;
-    left: -33.33333%; }
-  .large-offset-3 {
-    margin-left: 25%; }
-  .large-5 {
-    width: 41.66667%; }
-  .large-push-5 {
-    position: relative;
-    left: 41.66667%; }
-  .large-pull-5 {
-    position: relative;
-    left: -41.66667%; }
-  .large-offset-4 {
-    margin-left: 33.33333%; }
-  .large-6 {
-    width: 50%; }
-  .large-push-6 {
-    position: relative;
-    left: 50%; }
-  .large-pull-6 {
-    position: relative;
-    left: -50%; }
-  .large-offset-5 {
-    margin-left: 41.66667%; }
-  .large-7 {
-    width: 58.33333%; }
-  .large-push-7 {
-    position: relative;
-    left: 58.33333%; }
-  .large-pull-7 {
-    position: relative;
-    left: -58.33333%; }
-  .large-offset-6 {
-    margin-left: 50%; }
-  .large-8 {
-    width: 66.66667%; }
-  .large-push-8 {
-    position: relative;
-    left: 66.66667%; }
-  .large-pull-8 {
-    position: relative;
-    left: -66.66667%; }
-  .large-offset-7 {
-    margin-left: 58.33333%; }
-  .large-9 {
-    width: 75%; }
-  .large-push-9 {
-    position: relative;
-    left: 75%; }
-  .large-pull-9 {
-    position: relative;
-    left: -75%; }
-  .large-offset-8 {
-    margin-left: 66.66667%; }
-  .large-10 {
-    width: 83.33333%; }
-  .large-push-10 {
-    position: relative;
-    left: 83.33333%; }
-  .large-pull-10 {
-    position: relative;
-    left: -83.33333%; }
-  .large-offset-9 {
-    margin-left: 75%; }
-  .large-11 {
-    width: 91.66667%; }
-  .large-push-11 {
-    position: relative;
-    left: 91.66667%; }
-  .large-pull-11 {
-    position: relative;
-    left: -91.66667%; }
-  .large-offset-10 {
-    margin-left: 83.33333%; }
-  .large-12 {
-    width: 100%; }
-  .large-offset-11 {
-    margin-left: 91.66667%; }
-  .large-up-1 > .column, .large-up-1 > .columns {
-    float: left;
-    width: 100%; }
-    .large-up-1 > .column:nth-of-type(1n), .large-up-1 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-1 > .column:nth-of-type(1n+1), .large-up-1 > .columns:nth-of-type(1n+1) {
-      clear: both; }
-    .large-up-1 > .column:last-child, .large-up-1 > .columns:last-child {
-      float: left; }
-  .large-up-2 > .column, .large-up-2 > .columns {
-    float: left;
-    width: 50%; }
-    .large-up-2 > .column:nth-of-type(1n), .large-up-2 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-2 > .column:nth-of-type(2n+1), .large-up-2 > .columns:nth-of-type(2n+1) {
-      clear: both; }
-    .large-up-2 > .column:last-child, .large-up-2 > .columns:last-child {
-      float: left; }
-  .large-up-3 > .column, .large-up-3 > .columns {
-    float: left;
-    width: 33.33333%; }
-    .large-up-3 > .column:nth-of-type(1n), .large-up-3 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-3 > .column:nth-of-type(3n+1), .large-up-3 > .columns:nth-of-type(3n+1) {
-      clear: both; }
-    .large-up-3 > .column:last-child, .large-up-3 > .columns:last-child {
-      float: left; }
-  .large-up-4 > .column, .large-up-4 > .columns {
-    float: left;
-    width: 25%; }
-    .large-up-4 > .column:nth-of-type(1n), .large-up-4 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-4 > .column:nth-of-type(4n+1), .large-up-4 > .columns:nth-of-type(4n+1) {
-      clear: both; }
-    .large-up-4 > .column:last-child, .large-up-4 > .columns:last-child {
-      float: left; }
-  .large-up-5 > .column, .large-up-5 > .columns {
-    float: left;
-    width: 20%; }
-    .large-up-5 > .column:nth-of-type(1n), .large-up-5 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-5 > .column:nth-of-type(5n+1), .large-up-5 > .columns:nth-of-type(5n+1) {
-      clear: both; }
-    .large-up-5 > .column:last-child, .large-up-5 > .columns:last-child {
-      float: left; }
-  .large-up-6 > .column, .large-up-6 > .columns {
-    float: left;
-    width: 16.66667%; }
-    .large-up-6 > .column:nth-of-type(1n), .large-up-6 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-6 > .column:nth-of-type(6n+1), .large-up-6 > .columns:nth-of-type(6n+1) {
-      clear: both; }
-    .large-up-6 > .column:last-child, .large-up-6 > .columns:last-child {
-      float: left; }
-  .large-up-7 > .column, .large-up-7 > .columns {
-    float: left;
-    width: 14.28571%; }
-    .large-up-7 > .column:nth-of-type(1n), .large-up-7 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-7 > .column:nth-of-type(7n+1), .large-up-7 > .columns:nth-of-type(7n+1) {
-      clear: both; }
-    .large-up-7 > .column:last-child, .large-up-7 > .columns:last-child {
-      float: left; }
-  .large-up-8 > .column, .large-up-8 > .columns {
-    float: left;
-    width: 12.5%; }
-    .large-up-8 > .column:nth-of-type(1n), .large-up-8 > .columns:nth-of-type(1n) {
-      clear: none; }
-    .large-up-8 > .column:nth-of-type(8n+1), .large-up-8 > .columns:nth-of-type(8n+1) {
-      clear: both; }
-    .large-up-8 > .column:last-child, .large-up-8 > .columns:last-child {
-      float: left; }
-  .large-collapse > .column, .large-collapse > .columns {
-    padding-right: 0;
-    padding-left: 0; }
-  .large-collapse .row {
-    margin-right: 0;
-    margin-left: 0; }
-  .expanded.row .large-collapse.row {
-    margin-right: 0;
-    margin-left: 0; }
-  .large-uncollapse > .column, .large-uncollapse > .columns {
-    padding-right: 0.9375rem;
-    padding-left: 0.9375rem; }
-  .large-centered {
-    margin-right: auto;
-    margin-left: auto; }
-    .large-centered, .large-centered:last-child:not(:first-child) {
-      float: none;
-      clear: both; }
-  .large-uncentered,
-  .large-push-0,
-  .large-pull-0 {
-    position: static;
-    float: left;
-    margin-right: 0;
-    margin-left: 0; } }
-
-.column-block {
-  margin-bottom: 1.25rem; }
-  .column-block > :last-child {
-    margin-bottom: 0; }
-  @media print, screen and (min-width: 40em) {
-    .column-block {
-      margin-bottom: 1.875rem; }
-      .column-block > :last-child {
-        margin-bottom: 0; } }
-
-div,
-dl,
-dt,
-dd,
-ul,
-ol,
-li,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-pre,
-form,
-p,
-blockquote,
-th,
-td {
-  margin: 0;
-  padding: 0; }
-
-p {
-  margin-bottom: 1rem;
-  font-size: inherit;
-  line-height: 1.6;
-  text-rendering: optimizeLegibility; }
-
-em,
-i {
-  font-style: italic;
-  line-height: inherit; }
-
-strong,
-b {
-  font-weight: bold;
-  line-height: inherit; }
-
-small {
-  font-size: 80%;
-  line-height: inherit; }
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
-  font-style: normal;
-  font-weight: normal;
-  color: inherit;
-  text-rendering: optimizeLegibility; }
-  h1 small,
-  h2 small,
-  h3 small,
-  h4 small,
-  h5 small,
-  h6 small {
-    line-height: 0;
-    color: #cacaca; }
-
-h1 {
-  font-size: 1.5rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-h2 {
-  font-size: 1.25rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-h3 {
-  font-size: 1.1875rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-h4 {
-  font-size: 1.125rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-h5 {
-  font-size: 1.0625rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-h6 {
-  font-size: 1rem;
-  line-height: 1.4;
-  margin-top: 0;
-  margin-bottom: 0.5rem; }
-
-@media print, screen and (min-width: 40em) {
-  h1 {
-    font-size: 3rem; }
-  h2 {
-    font-size: 2.5rem; }
-  h3 {
-    font-size: 1.9375rem; }
-  h4 {
-    font-size: 1.5625rem; }
-  h5 {
-    font-size: 1.25rem; }
-  h6 {
-    font-size: 1rem; } }
-
-a {
-  line-height: inherit;
-  color: #1779ba;
-  text-decoration: none;
-  cursor: pointer; }
-  a:hover, a:focus {
-    color: #1468a0; }
-  a img {
-    border: 0; }
-
-hr {
-  clear: both;
-  max-width: 75rem;
-  height: 0;
-  margin: 1.25rem auto;
-  border-top: 0;
-  border-right: 0;
-  border-bottom: 1px solid #cacaca;
-  border-left: 0; }
-
-ul,
-ol,
-dl {
-  margin-bottom: 1rem;
-  list-style-position: outside;
-  line-height: 1.6; }
-
-li {
-  font-size: inherit; }
-
-ul {
-  margin-left: 1.25rem;
-  list-style-type: disc; }
-
-ol {
-  margin-left: 1.25rem; }
-
-ul ul, ol ul, ul ol, ol ol {
-  margin-left: 1.25rem;
-  margin-bottom: 0; }
-
-dl {
-  margin-bottom: 1rem; }
-  dl dt {
-    margin-bottom: 0.3rem;
-    font-weight: bold; }
-
-blockquote {
-  margin: 0 0 1rem;
-  padding: 0.5625rem 1.25rem 0 1.1875rem;
-  border-left: 1px solid #cacaca; }
-  blockquote, blockquote p {
-    line-height: 1.6;
-    color: #8a8a8a; }
-
-cite {
-  display: block;
-  font-size: 0.8125rem;
-  color: #8a8a8a; }
-  cite:before {
-    content: "— "; }
-
-abbr {
-  border-bottom: 1px dotted #0a0a0a;
-  color: #0a0a0a;
-  cursor: help; }
-
-figure {
-  margin: 0; }
-
-code {
-  padding: 0.125rem 0.3125rem 0.0625rem;
-  border: 1px solid #cacaca;
-  background-color: #e6e6e6;
-  font-family: Consolas, "Liberation Mono", Courier, monospace;
-  font-weight: normal;
-  color: #0a0a0a; }
-
-kbd {
-  margin: 0;
-  padding: 0.125rem 0.25rem 0;
-  background-color: #e6e6e6;
-  font-family: Consolas, "Liberation Mono", Courier, monospace;
-  color: #0a0a0a; }
-
-.subheader {
-  margin-top: 0.2rem;
-  margin-bottom: 0.5rem;
-  font-weight: normal;
-  line-height: 1.4;
-  color: #8a8a8a; }
-
-.lead {
-  font-size: 125%;
-  line-height: 1.6; }
-
-.stat {
-  font-size: 2.5rem;
-  line-height: 1; }
-  p + .stat {
-    margin-top: -1rem; }
-
-.no-bullet {
-  margin-left: 0;
-  list-style: none; }
-
-.text-left {
-  text-align: left; }
-
-.text-right {
-  text-align: right; }
-
-.text-center {
-  text-align: center; }
-
-.text-justify {
-  text-align: justify; }
-
-@media print, screen and (min-width: 40em) {
-  .medium-text-left {
-    text-align: left; }
-  .medium-text-right {
-    text-align: right; }
-  .medium-text-center {
-    text-align: center; }
-  .medium-text-justify {
-    text-align: justify; } }
-
-@media print, screen and (min-width: 64em) {
-  .large-text-left {
-    text-align: left; }
-  .large-text-right {
-    text-align: right; }
-  .large-text-center {
-    text-align: center; }
-  .large-text-justify {
-    text-align: justify; } }
-
-.show-for-print {
-  display: none !important; }
-
-@media print {
-  * {
-    background: transparent !important;
-    box-shadow: none !important;
-    color: black !important;
-    text-shadow: none !important; }
-  .show-for-print {
-    display: block !important; }
-  .hide-for-print {
-    display: none !important; }
-  table.show-for-print {
-    display: table !important; }
-  thead.show-for-print {
-    display: table-header-group !important; }
-  tbody.show-for-print {
-    display: table-row-group !important; }
-  tr.show-for-print {
-    display: table-row !important; }
-  td.show-for-print {
-    display: table-cell !important; }
-  th.show-for-print {
-    display: table-cell !important; }
-  a,
-  a:visited {
-    text-decoration: underline; }
-  a[href]:after {
-    content: " (" attr(href) ")"; }
-  .ir a:after,
-  a[href^='javascript:']:after,
-  a[href^='#']:after {
-    content: ''; }
-  abbr[title]:after {
-    content: " (" attr(title) ")"; }
-  pre,
-  blockquote {
-    border: 1px solid #8a8a8a;
-    page-break-inside: avoid; }
-  thead {
-    display: table-header-group; }
-  tr,
-  img {
-    page-break-inside: avoid; }
-  img {
-    max-width: 100% !important; }
-  @page {
-    margin: 0.5cm; }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3; }
-  h2,
-  h3 {
-    page-break-after: avoid; } }
-
-.button {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0 0 1rem 0;
-  padding: 0.85em 1em;
-  -webkit-appearance: none;
-  border: 1px solid transparent;
-  border-radius: 0;
-  transition: background-color 0.25s ease-out, color 0.25s ease-out;
-  font-size: 0.9rem;
-  line-height: 1;
-  text-align: center;
-  cursor: pointer;
-  background-color: #1779ba;
-  color: #fefefe; }
-  [data-whatinput='mouse'] .button {
-    outline: 0; }
-  .button:hover, .button:focus {
-    background-color: #14679e;
-    color: #fefefe; }
-  .button.tiny {
-    font-size: 0.6rem; }
-  .button.small {
-    font-size: 0.75rem; }
-  .button.large {
-    font-size: 1.25rem; }
-  .button.expanded {
-    display: block;
-    width: 100%;
-    margin-right: 0;
-    margin-left: 0; }
-  .button.primary {
-    background-color: #1779ba;
-    color: #fefefe; }
-    .button.primary:hover, .button.primary:focus {
-      background-color: #126195;
-      color: #fefefe; }
-  .button.secondary {
-    background-color: #767676;
-    color: #fefefe; }
-    .button.secondary:hover, .button.secondary:focus {
-      background-color: #5e5e5e;
-      color: #fefefe; }
-  .button.success {
-    background-color: #3adb76;
-    color: #0a0a0a; }
-    .button.success:hover, .button.success:focus {
-      background-color: #22bb5b;
-      color: #0a0a0a; }
-  .button.warning {
-    background-color: #ffae00;
-    color: #0a0a0a; }
-    .button.warning:hover, .button.warning:focus {
-      background-color: #cc8b00;
-      color: #0a0a0a; }
-  .button.alert {
-    background-color: #cc4b37;
-    color: #fefefe; }
-    .button.alert:hover, .button.alert:focus {
-      background-color: #a53b2a;
-      color: #fefefe; }
-  .button.hollow {
-    border: 1px solid #1779ba;
-    color: #1779ba; }
-    .button.hollow, .button.hollow:hover, .button.hollow:focus {
-      background-color: transparent; }
-    .button.hollow:hover, .button.hollow:focus {
-      border-color: #0c3d5d;
-      color: #0c3d5d; }
-    .button.hollow.primary {
-      border: 1px solid #1779ba;
-      color: #1779ba; }
-      .button.hollow.primary:hover, .button.hollow.primary:focus {
-        border-color: #0c3d5d;
-        color: #0c3d5d; }
-    .button.hollow.secondary {
-      border: 1px solid #767676;
-      color: #767676; }
-      .button.hollow.secondary:hover, .button.hollow.secondary:focus {
-        border-color: #3b3b3b;
-        color: #3b3b3b; }
-    .button.hollow.success {
-      border: 1px solid #3adb76;
-      color: #3adb76; }
-      .button.hollow.success:hover, .button.hollow.success:focus {
-        border-color: #157539;
-        color: #157539; }
-    .button.hollow.warning {
-      border: 1px solid #ffae00;
-      color: #ffae00; }
-      .button.hollow.warning:hover, .button.hollow.warning:focus {
-        border-color: #805700;
-        color: #805700; }
-    .button.hollow.alert {
-      border: 1px solid #cc4b37;
-      color: #cc4b37; }
-      .button.hollow.alert:hover, .button.hollow.alert:focus {
-        border-color: #67251a;
-        color: #67251a; }
-  .button.disabled, .button[disabled] {
-    opacity: 0.25;
-    cursor: not-allowed; }
-    .button.disabled, .button.disabled:hover, .button.disabled:focus, .button[disabled], .button[disabled]:hover, .button[disabled]:focus {
-      background-color: #1779ba;
-      color: #fefefe; }
-    .button.disabled.primary, .button[disabled].primary {
-      opacity: 0.25;
-      cursor: not-allowed; }
-      .button.disabled.primary, .button.disabled.primary:hover, .button.disabled.primary:focus, .button[disabled].primary, .button[disabled].primary:hover, .button[disabled].primary:focus {
-        background-color: #1779ba;
-        color: #fefefe; }
-    .button.disabled.secondary, .button[disabled].secondary {
-      opacity: 0.25;
-      cursor: not-allowed; }
-      .button.disabled.secondary, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
-        background-color: #767676;
-        color: #fefefe; }
-    .button.disabled.success, .button[disabled].success {
-      opacity: 0.25;
-      cursor: not-allowed; }
-      .button.disabled.success, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success, .button[disabled].success:hover, .button[disabled].success:focus {
-        background-color: #3adb76;
-        color: #0a0a0a; }
-    .button.disabled.warning, .button[disabled].warning {
-      opacity: 0.25;
-      cursor: not-allowed; }
-      .button.disabled.warning, .button.disabled.warning:hover, .button.disabled.warning:focus, .button[disabled].warning, .button[disabled].warning:hover, .button[disabled].warning:focus {
-        background-color: #ffae00;
-        color: #0a0a0a; }
-    .button.disabled.alert, .button[disabled].alert {
-      opacity: 0.25;
-      cursor: not-allowed; }
-      .button.disabled.alert, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert, .button[disabled].alert:hover, .button[disabled].alert:focus {
-        background-color: #cc4b37;
-        color: #fefefe; }
-  .button.dropdown::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 0.4em;
-    content: '';
-    border-bottom-width: 0;
-    border-top-style: solid;
-    border-color: #fefefe transparent transparent;
-    position: relative;
-    top: 0.4em;
-    display: inline-block;
-    float: right;
-    margin-left: 1em; }
-  .button.arrow-only::after {
-    top: -0.1em;
-    float: none;
-    margin-left: 0; }
-
-[type='text'], [type='password'], [type='date'], [type='datetime'], [type='datetime-local'], [type='month'], [type='week'], [type='email'], [type='number'], [type='search'], [type='tel'], [type='time'], [type='url'], [type='color'],
-textarea {
-  display: block;
-  box-sizing: border-box;
-  width: 100%;
-  height: 2.4375rem;
-  margin: 0 0 1rem;
-  padding: 0.5rem;
-  border: 1px solid #cacaca;
-  border-radius: 0;
-  background-color: #fefefe;
-  box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1);
-  font-family: inherit;
-  font-size: 1rem;
-  font-weight: normal;
-  color: #0a0a0a;
-  transition: box-shadow 0.5s, border-color 0.25s ease-in-out;
-  -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none; }
-  [type='text']:focus, [type='password']:focus, [type='date']:focus, [type='datetime']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='week']:focus, [type='email']:focus, [type='number']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='url']:focus, [type='color']:focus,
-  textarea:focus {
-    outline: none;
-    border: 1px solid #8a8a8a;
-    background-color: #fefefe;
-    box-shadow: 0 0 5px #cacaca;
-    transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
-
-textarea {
-  max-width: 100%; }
-  textarea[rows] {
-    height: auto; }
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #cacaca; }
-
-input::-moz-placeholder,
-textarea::-moz-placeholder {
-  color: #cacaca; }
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #cacaca; }
-
-input::placeholder,
-textarea::placeholder {
-  color: #cacaca; }
-
-input:disabled, input[readonly],
-textarea:disabled,
-textarea[readonly] {
-  background-color: #e6e6e6;
-  cursor: not-allowed; }
-
-[type='submit'],
-[type='button'] {
-  -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none;
-  border-radius: 0; }
-
-input[type='search'] {
-  box-sizing: border-box; }
-
-[type='file'],
-[type='checkbox'],
-[type='radio'] {
-  margin: 0 0 1rem; }
-
-[type='checkbox'] + label,
-[type='radio'] + label {
-  display: inline-block;
-  vertical-align: baseline;
-  margin-left: 0.5rem;
-  margin-right: 1rem;
-  margin-bottom: 0; }
-  [type='checkbox'] + label[for],
-  [type='radio'] + label[for] {
-    cursor: pointer; }
-
-label > [type='checkbox'],
-label > [type='radio'] {
-  margin-right: 0.5rem; }
-
-[type='file'] {
-  width: 100%; }
-
-label {
-  display: block;
-  margin: 0;
-  font-size: 0.875rem;
-  font-weight: normal;
-  line-height: 1.8;
-  color: #0a0a0a; }
-  label.middle {
-    margin: 0 0 1rem;
-    padding: 0.5625rem 0; }
-
-.help-text {
-  margin-top: -0.5rem;
-  font-size: 0.8125rem;
-  font-style: italic;
-  color: #0a0a0a; }
-
-.input-group {
-  display: table;
-  width: 100%;
-  margin-bottom: 1rem; }
-  .input-group > :first-child {
-    border-radius: 0 0 0 0; }
-  .input-group > :last-child > * {
-    border-radius: 0 0 0 0; }
-
-.input-group-label, .input-group-field, .input-group-button, .input-group-button a,
-.input-group-button input,
-.input-group-button button,
-.input-group-button label {
-  margin: 0;
-  white-space: nowrap;
-  display: table-cell;
-  vertical-align: middle; }
-
-.input-group-label {
-  padding: 0 1rem;
-  border: 1px solid #cacaca;
-  background: #e6e6e6;
-  color: #0a0a0a;
-  text-align: center;
-  white-space: nowrap;
-  width: 1%;
-  height: 100%; }
-  .input-group-label:first-child {
-    border-right: 0; }
-  .input-group-label:last-child {
-    border-left: 0; }
-
-.input-group-field {
-  border-radius: 0;
-  height: 2.5rem; }
-
-.input-group-button {
-  padding-top: 0;
-  padding-bottom: 0;
-  text-align: center;
-  width: 1%;
-  height: 100%; }
-  .input-group-button a,
-  .input-group-button input,
-  .input-group-button button,
-  .input-group-button label {
-    height: 2.5rem;
-    padding-top: 0;
-    padding-bottom: 0;
-    font-size: 1rem; }
-
-.input-group .input-group-button {
-  display: table-cell; }
-
-fieldset {
-  margin: 0;
-  padding: 0;
-  border: 0; }
-
-legend {
-  max-width: 100%;
-  margin-bottom: 0.5rem; }
-
-.fieldset {
-  margin: 1.125rem 0;
-  padding: 1.25rem;
-  border: 1px solid #cacaca; }
-  .fieldset legend {
-    margin: 0;
-    margin-left: -0.1875rem;
-    padding: 0 0.1875rem;
-    background: #fefefe; }
-
-select {
-  height: 2.4375rem;
-  margin: 0 0 1rem;
-  padding: 0.5rem;
-  -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none;
-  border: 1px solid #cacaca;
-  border-radius: 0;
-  background-color: #fefefe;
-  font-family: inherit;
-  font-size: 1rem;
-  line-height: normal;
-  color: #0a0a0a;
-  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='32' height='24' viewBox='0 0 32 24'><polygon points='0,0 32,0 16,24' style='fill: rgb%28138, 138, 138%29'></polygon></svg>");
-  background-origin: content-box;
-  background-position: right -1rem center;
-  background-repeat: no-repeat;
-  background-size: 9px 6px;
-  padding-right: 1.5rem;
-  transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
-  @media screen and (min-width: 0\0) {
-    select {
-      background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg=="); } }
-  select:focus {
-    outline: none;
-    border: 1px solid #8a8a8a;
-    background-color: #fefefe;
-    box-shadow: 0 0 5px #cacaca;
-    transition: box-shadow 0.5s, border-color 0.25s ease-in-out; }
-  select:disabled {
-    background-color: #e6e6e6;
-    cursor: not-allowed; }
-  select::-ms-expand {
-    display: none; }
-  select[multiple] {
-    height: auto;
-    background-image: none; }
-
-.is-invalid-input:not(:focus) {
-  border-color: #cc4b37;
-  background-color: #f9ecea; }
-  .is-invalid-input:not(:focus)::-webkit-input-placeholder {
-    color: #cc4b37; }
-  .is-invalid-input:not(:focus)::-moz-placeholder {
-    color: #cc4b37; }
-  .is-invalid-input:not(:focus):-ms-input-placeholder {
-    color: #cc4b37; }
-  .is-invalid-input:not(:focus)::placeholder {
-    color: #cc4b37; }
-
-.is-invalid-label {
-  color: #cc4b37; }
-
-.form-error {
-  display: none;
-  margin-top: -0.5rem;
-  margin-bottom: 1rem;
-  font-size: 0.75rem;
-  font-weight: bold;
-  color: #cc4b37; }
-  .form-error.is-visible {
-    display: block; }
-
-.accordion {
-  margin-left: 0;
-  background: #fefefe;
-  list-style-type: none; }
-
-.accordion-item:first-child > :first-child {
-  border-radius: 0 0 0 0; }
-
-.accordion-item:last-child > :last-child {
-  border-radius: 0 0 0 0; }
-
-.accordion-title {
-  position: relative;
-  display: block;
-  padding: 1.25rem 1rem;
-  border: 1px solid #e6e6e6;
-  border-bottom: 0;
-  font-size: 0.75rem;
-  line-height: 1;
-  color: #1779ba; }
-  :last-child:not(.is-active) > .accordion-title {
-    border-bottom: 1px solid #e6e6e6;
-    border-radius: 0 0 0 0; }
-  .accordion-title:hover, .accordion-title:focus {
-    background-color: #e6e6e6; }
-  .accordion-title::before {
-    position: absolute;
-    top: 50%;
-    right: 1rem;
-    margin-top: -0.5rem;
-    content: '+'; }
-  .is-active > .accordion-title::before {
-    content: '\2013'; }
-
-.accordion-content {
-  display: none;
-  padding: 1rem;
-  border: 1px solid #e6e6e6;
-  border-bottom: 0;
-  background-color: #fefefe;
-  color: #0a0a0a; }
-  :last-child > .accordion-content:last-child {
-    border-bottom: 1px solid #e6e6e6; }
-
-.is-accordion-submenu-parent > a {
-  position: relative; }
-  .is-accordion-submenu-parent > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-bottom-width: 0;
-    border-top-style: solid;
-    border-color: #1779ba transparent transparent;
-    position: absolute;
-    top: 50%;
-    margin-top: -3px;
-    right: 1rem; }
-
-.is-accordion-submenu-parent[aria-expanded='true'] > a::after {
-  -ms-transform: rotate(180deg);
-      transform: rotate(180deg);
-  -ms-transform-origin: 50% 50%;
-      transform-origin: 50% 50%; }
-
-.badge {
-  display: inline-block;
-  min-width: 2.1em;
-  padding: 0.3em;
-  border-radius: 50%;
-  font-size: 0.6rem;
-  text-align: center;
-  background: #1779ba;
-  color: #fefefe; }
-  .badge.primary {
-    background: #1779ba;
-    color: #fefefe; }
-  .badge.secondary {
-    background: #767676;
-    color: #fefefe; }
-  .badge.success {
-    background: #3adb76;
-    color: #0a0a0a; }
-  .badge.warning {
-    background: #ffae00;
-    color: #0a0a0a; }
-  .badge.alert {
-    background: #cc4b37;
-    color: #fefefe; }
-
-.breadcrumbs {
-  margin: 0 0 1rem 0;
-  list-style: none; }
-  .breadcrumbs::before, .breadcrumbs::after {
-    display: table;
-    content: ' '; }
-  .breadcrumbs::after {
-    clear: both; }
-  .breadcrumbs li {
-    float: left;
-    font-size: 0.6875rem;
-    color: #0a0a0a;
-    cursor: default;
-    text-transform: uppercase; }
-    .breadcrumbs li:not(:last-child)::after {
-      position: relative;
-      top: 1px;
-      margin: 0 0.75rem;
-      opacity: 1;
-      content: "/";
-      color: #cacaca; }
-  .breadcrumbs a {
-    color: #1779ba; }
-    .breadcrumbs a:hover {
-      text-decoration: underline; }
-  .breadcrumbs .disabled {
-    color: #cacaca;
-    cursor: not-allowed; }
-
-.button-group {
-  margin-bottom: 1rem;
-  font-size: 0; }
-  .button-group::before, .button-group::after {
-    display: table;
-    content: ' '; }
-  .button-group::after {
-    clear: both; }
-  .button-group .button {
-    margin: 0;
-    margin-right: 1px;
-    margin-bottom: 1px;
-    font-size: 0.9rem; }
-    .button-group .button:last-child {
-      margin-right: 0; }
-  .button-group.tiny .button {
-    font-size: 0.6rem; }
-  .button-group.small .button {
-    font-size: 0.75rem; }
-  .button-group.large .button {
-    font-size: 1.25rem; }
-  .button-group.expanded {
-    margin-right: -1px; }
-    .button-group.expanded::before, .button-group.expanded::after {
-      display: none; }
-    .button-group.expanded .button:first-child:last-child {
-      width: 100%; }
-    .button-group.expanded .button:first-child:nth-last-child(2), .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button {
-      display: inline-block;
-      width: calc(50% - 1px);
-      margin-right: 1px; }
-      .button-group.expanded .button:first-child:nth-last-child(2):last-child, .button-group.expanded .button:first-child:nth-last-child(2):first-child:nth-last-child(2) ~ .button:last-child {
-        margin-right: -6px; }
-    .button-group.expanded .button:first-child:nth-last-child(3), .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button {
-      display: inline-block;
-      width: calc(33.33333% - 1px);
-      margin-right: 1px; }
-      .button-group.expanded .button:first-child:nth-last-child(3):last-child, .button-group.expanded .button:first-child:nth-last-child(3):first-child:nth-last-child(3) ~ .button:last-child {
-        margin-right: -6px; }
-    .button-group.expanded .button:first-child:nth-last-child(4), .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button {
-      display: inline-block;
-      width: calc(25% - 1px);
-      margin-right: 1px; }
-      .button-group.expanded .button:first-child:nth-last-child(4):last-child, .button-group.expanded .button:first-child:nth-last-child(4):first-child:nth-last-child(4) ~ .button:last-child {
-        margin-right: -6px; }
-    .button-group.expanded .button:first-child:nth-last-child(5), .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button {
-      display: inline-block;
-      width: calc(20% - 1px);
-      margin-right: 1px; }
-      .button-group.expanded .button:first-child:nth-last-child(5):last-child, .button-group.expanded .button:first-child:nth-last-child(5):first-child:nth-last-child(5) ~ .button:last-child {
-        margin-right: -6px; }
-    .button-group.expanded .button:first-child:nth-last-child(6), .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button {
-      display: inline-block;
-      width: calc(16.66667% - 1px);
-      margin-right: 1px; }
-      .button-group.expanded .button:first-child:nth-last-child(6):last-child, .button-group.expanded .button:first-child:nth-last-child(6):first-child:nth-last-child(6) ~ .button:last-child {
-        margin-right: -6px; }
-  .button-group.primary .button {
-    background-color: #1779ba;
-    color: #fefefe; }
-    .button-group.primary .button:hover, .button-group.primary .button:focus {
-      background-color: #126195;
-      color: #fefefe; }
-  .button-group.secondary .button {
-    background-color: #767676;
-    color: #fefefe; }
-    .button-group.secondary .button:hover, .button-group.secondary .button:focus {
-      background-color: #5e5e5e;
-      color: #fefefe; }
-  .button-group.success .button {
-    background-color: #3adb76;
-    color: #0a0a0a; }
-    .button-group.success .button:hover, .button-group.success .button:focus {
-      background-color: #22bb5b;
-      color: #0a0a0a; }
-  .button-group.warning .button {
-    background-color: #ffae00;
-    color: #0a0a0a; }
-    .button-group.warning .button:hover, .button-group.warning .button:focus {
-      background-color: #cc8b00;
-      color: #0a0a0a; }
-  .button-group.alert .button {
-    background-color: #cc4b37;
-    color: #fefefe; }
-    .button-group.alert .button:hover, .button-group.alert .button:focus {
-      background-color: #a53b2a;
-      color: #fefefe; }
-  .button-group.stacked .button, .button-group.stacked-for-small .button, .button-group.stacked-for-medium .button {
-    width: 100%; }
-    .button-group.stacked .button:last-child, .button-group.stacked-for-small .button:last-child, .button-group.stacked-for-medium .button:last-child {
-      margin-bottom: 0; }
-  @media print, screen and (min-width: 40em) {
-    .button-group.stacked-for-small .button {
-      width: auto;
-      margin-bottom: 0; } }
-  @media print, screen and (min-width: 64em) {
-    .button-group.stacked-for-medium .button {
-      width: auto;
-      margin-bottom: 0; } }
-  @media screen and (max-width: 39.9375em) {
-    .button-group.stacked-for-small.expanded {
-      display: block; }
-      .button-group.stacked-for-small.expanded .button {
-        display: block;
-        margin-right: 0; } }
-
-.card {
-  margin-bottom: 1rem;
-  border: 1px solid #e6e6e6;
-  border-radius: 0;
-  background: #fefefe;
-  box-shadow: none;
-  overflow: hidden;
-  color: #0a0a0a; }
-  .card > :last-child {
-    margin-bottom: 0; }
-
-.card-divider {
-  padding: 1rem;
-  background: #e6e6e6; }
-  .card-divider > :last-child {
-    margin-bottom: 0; }
-
-.card-section {
-  padding: 1rem; }
-  .card-section > :last-child {
-    margin-bottom: 0; }
-
-.callout {
-  position: relative;
-  margin: 0 0 1rem 0;
-  padding: 1rem;
-  border: 1px solid rgba(10, 10, 10, 0.25);
-  border-radius: 0;
-  background-color: white;
-  color: #0a0a0a; }
-  .callout > :first-child {
-    margin-top: 0; }
-  .callout > :last-child {
-    margin-bottom: 0; }
-  .callout.primary {
-    background-color: #d7ecfa;
-    color: #0a0a0a; }
-  .callout.secondary {
-    background-color: #eaeaea;
-    color: #0a0a0a; }
-  .callout.success {
-    background-color: #e1faea;
-    color: #0a0a0a; }
-  .callout.warning {
-    background-color: #fff3d9;
-    color: #0a0a0a; }
-  .callout.alert {
-    background-color: #f7e4e1;
-    color: #0a0a0a; }
-  .callout.small {
-    padding-top: 0.5rem;
-    padding-right: 0.5rem;
-    padding-bottom: 0.5rem;
-    padding-left: 0.5rem; }
-  .callout.large {
-    padding-top: 3rem;
-    padding-right: 3rem;
-    padding-bottom: 3rem;
-    padding-left: 3rem; }
-
-.close-button {
-  position: absolute;
-  color: #8a8a8a;
-  cursor: pointer; }
-  [data-whatinput='mouse'] .close-button {
-    outline: 0; }
-  .close-button:hover, .close-button:focus {
-    color: #0a0a0a; }
-  .close-button.small {
-    right: 0.66rem;
-    top: 0.33em;
-    font-size: 1.5em;
-    line-height: 1; }
-  .close-button, .close-button.medium {
-    right: 1rem;
-    top: 0.5rem;
-    font-size: 2em;
-    line-height: 1; }
-
-.menu {
-  margin: 0;
-  list-style-type: none; }
-  .menu > li {
-    display: table-cell;
-    vertical-align: middle; }
-    [data-whatinput='mouse'] .menu > li {
-      outline: 0; }
-  .menu > li > a {
-    display: block;
-    padding: 0.7rem 1rem;
-    line-height: 1; }
-  .menu input,
-  .menu select,
-  .menu a,
-  .menu button {
-    margin-bottom: 0; }
-  .menu > li > a img,
-  .menu > li > a i,
-  .menu > li > a svg {
-    vertical-align: middle; }
-    .menu > li > a img + span,
-    .menu > li > a i + span,
-    .menu > li > a svg + span {
-      vertical-align: middle; }
-  .menu > li > a img,
-  .menu > li > a i,
-  .menu > li > a svg {
-    margin-right: 0.25rem;
-    display: inline-block; }
-  .menu > li, .menu.horizontal > li {
-    display: table-cell; }
-  .menu.expanded {
-    display: table;
-    width: 100%;
-    table-layout: fixed; }
-    .menu.expanded > li:first-child:last-child {
-      width: 100%; }
-  .menu.vertical > li {
-    display: block; }
-  @media print, screen and (min-width: 40em) {
-    .menu.medium-horizontal > li {
-      display: table-cell; }
-    .menu.medium-expanded {
-      display: table;
-      width: 100%;
-      table-layout: fixed; }
-      .menu.medium-expanded > li:first-child:last-child {
-        width: 100%; }
-    .menu.medium-vertical > li {
-      display: block; } }
-  @media print, screen and (min-width: 64em) {
-    .menu.large-horizontal > li {
-      display: table-cell; }
-    .menu.large-expanded {
-      display: table;
-      width: 100%;
-      table-layout: fixed; }
-      .menu.large-expanded > li:first-child:last-child {
-        width: 100%; }
-    .menu.large-vertical > li {
-      display: block; } }
-  .menu.simple li {
-    display: inline-block;
-    vertical-align: top;
-    line-height: 1; }
-  .menu.simple a {
-    padding: 0; }
-  .menu.simple li {
-    margin-left: 0;
-    margin-right: 1rem; }
-  .menu.simple.align-right li {
-    margin-right: 0;
-    margin-left: 1rem; }
-  .menu.align-right::before, .menu.align-right::after {
-    display: table;
-    content: ' '; }
-  .menu.align-right::after {
-    clear: both; }
-  .menu.align-right > li {
-    float: right; }
-  .menu.icon-top > li > a {
-    text-align: center; }
-    .menu.icon-top > li > a img,
-    .menu.icon-top > li > a i,
-    .menu.icon-top > li > a svg {
-      display: block;
-      margin: 0 auto 0.25rem; }
-  .menu.icon-top.vertical a > span {
-    margin: auto; }
-  .menu.nested {
-    margin-left: 1rem; }
-  .menu .active > a {
-    background: #1779ba;
-    color: #fefefe; }
-  .menu.menu-bordered li {
-    border: 1px solid #e6e6e6; }
-    .menu.menu-bordered li:not(:first-child) {
-      border-top: 0; }
-  .menu.menu-hover li:hover {
-    background-color: #e6e6e6; }
-
-.menu-text {
-  padding-top: 0;
-  padding-bottom: 0;
-  padding: 0.7rem 1rem;
-  font-weight: bold;
-  line-height: 1;
-  color: inherit; }
-
-.menu-centered {
-  text-align: center; }
-  .menu-centered > .menu {
-    display: inline-block;
-    vertical-align: top; }
-
-.no-js [data-responsive-menu] ul {
-  display: none; }
-
-.menu-icon {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  width: 20px;
-  height: 16px;
-  cursor: pointer; }
-  .menu-icon::after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    display: block;
-    width: 100%;
-    height: 2px;
-    background: #fefefe;
-    box-shadow: 0 7px 0 #fefefe, 0 14px 0 #fefefe;
-    content: ''; }
-  .menu-icon:hover::after {
-    background: #cacaca;
-    box-shadow: 0 7px 0 #cacaca, 0 14px 0 #cacaca; }
-
-.menu-icon.dark {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  width: 20px;
-  height: 16px;
-  cursor: pointer; }
-  .menu-icon.dark::after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    display: block;
-    width: 100%;
-    height: 2px;
-    background: #0a0a0a;
-    box-shadow: 0 7px 0 #0a0a0a, 0 14px 0 #0a0a0a;
-    content: ''; }
-  .menu-icon.dark:hover::after {
-    background: #8a8a8a;
-    box-shadow: 0 7px 0 #8a8a8a, 0 14px 0 #8a8a8a; }
-
-.is-drilldown {
-  position: relative;
-  overflow: hidden; }
-  .is-drilldown li {
-    display: block; }
-  .is-drilldown.animate-height {
-    transition: height 0.5s; }
-
-.is-drilldown-submenu {
-  position: absolute;
-  top: 0;
-  left: 100%;
-  z-index: -1;
-  width: 100%;
-  background: #fefefe;
-  transition: transform 0.15s linear; }
-  .is-drilldown-submenu.is-active {
-    z-index: 1;
-    display: block;
-    -ms-transform: translateX(-100%);
-        transform: translateX(-100%); }
-  .is-drilldown-submenu.is-closing {
-    -ms-transform: translateX(100%);
-        transform: translateX(100%); }
-
-.drilldown-submenu-cover-previous {
-  min-height: 100%; }
-
-.is-drilldown-submenu-parent > a {
-  position: relative; }
-  .is-drilldown-submenu-parent > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-right-width: 0;
-    border-left-style: solid;
-    border-color: transparent transparent transparent #1779ba;
-    position: absolute;
-    top: 50%;
-    margin-top: -6px;
-    right: 1rem; }
-
-.js-drilldown-back > a::before {
-  display: block;
-  width: 0;
-  height: 0;
-  border: inset 6px;
-  content: '';
-  border-left-width: 0;
-  border-right-style: solid;
-  border-color: transparent #1779ba transparent transparent;
-  border-left-width: 0;
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 0.75rem;
-  border-left-width: 0; }
-
-.dropdown-pane {
-  position: absolute;
-  z-index: 10;
-  display: block;
-  width: 300px;
-  padding: 1rem;
-  visibility: hidden;
-  border: 1px solid #cacaca;
-  border-radius: 0;
-  background-color: #fefefe;
-  font-size: 1rem; }
-  .dropdown-pane.is-open {
-    visibility: visible; }
-
-.dropdown-pane.tiny {
-  width: 100px; }
-
-.dropdown-pane.small {
-  width: 200px; }
-
-.dropdown-pane.large {
-  width: 400px; }
-
-.dropdown.menu > li.opens-left > .is-dropdown-submenu {
-  top: 100%;
-  right: 0;
-  left: auto; }
-
-.dropdown.menu > li.opens-right > .is-dropdown-submenu {
-  top: 100%;
-  right: auto;
-  left: 0; }
-
-.dropdown.menu > li.is-dropdown-submenu-parent > a {
-  position: relative;
-  padding-right: 1.5rem; }
-
-.dropdown.menu > li.is-dropdown-submenu-parent > a::after {
-  display: block;
-  width: 0;
-  height: 0;
-  border: inset 6px;
-  content: '';
-  border-bottom-width: 0;
-  border-top-style: solid;
-  border-color: #1779ba transparent transparent;
-  right: 5px;
-  margin-top: -3px; }
-
-[data-whatinput='mouse'] .dropdown.menu a {
-  outline: 0; }
-
-.no-js .dropdown.menu ul {
-  display: none; }
-
-.dropdown.menu.vertical > li .is-dropdown-submenu {
-  top: 0; }
-
-.dropdown.menu.vertical > li.opens-left > .is-dropdown-submenu {
-  right: 100%;
-  left: auto; }
-
-.dropdown.menu.vertical > li.opens-right > .is-dropdown-submenu {
-  right: auto;
-  left: 100%; }
-
-.dropdown.menu.vertical > li > a::after {
-  right: 14px; }
-
-.dropdown.menu.vertical > li.opens-left > a::after {
-  display: block;
-  width: 0;
-  height: 0;
-  border: inset 6px;
-  content: '';
-  border-left-width: 0;
-  border-right-style: solid;
-  border-color: transparent #1779ba transparent transparent; }
-
-.dropdown.menu.vertical > li.opens-right > a::after {
-  display: block;
-  width: 0;
-  height: 0;
-  border: inset 6px;
-  content: '';
-  border-right-width: 0;
-  border-left-style: solid;
-  border-color: transparent transparent transparent #1779ba; }
-
-@media print, screen and (min-width: 40em) {
-  .dropdown.menu.medium-horizontal > li.opens-left > .is-dropdown-submenu {
-    top: 100%;
-    right: 0;
-    left: auto; }
-  .dropdown.menu.medium-horizontal > li.opens-right > .is-dropdown-submenu {
-    top: 100%;
-    right: auto;
-    left: 0; }
-  .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a {
-    position: relative;
-    padding-right: 1.5rem; }
-  .dropdown.menu.medium-horizontal > li.is-dropdown-submenu-parent > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-bottom-width: 0;
-    border-top-style: solid;
-    border-color: #1779ba transparent transparent;
-    right: 5px;
-    margin-top: -3px; }
-  .dropdown.menu.medium-vertical > li .is-dropdown-submenu {
-    top: 0; }
-  .dropdown.menu.medium-vertical > li.opens-left > .is-dropdown-submenu {
-    right: 100%;
-    left: auto; }
-  .dropdown.menu.medium-vertical > li.opens-right > .is-dropdown-submenu {
-    right: auto;
-    left: 100%; }
-  .dropdown.menu.medium-vertical > li > a::after {
-    right: 14px; }
-  .dropdown.menu.medium-vertical > li.opens-left > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-left-width: 0;
-    border-right-style: solid;
-    border-color: transparent #1779ba transparent transparent; }
-  .dropdown.menu.medium-vertical > li.opens-right > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-right-width: 0;
-    border-left-style: solid;
-    border-color: transparent transparent transparent #1779ba; } }
-
-@media print, screen and (min-width: 64em) {
-  .dropdown.menu.large-horizontal > li.opens-left > .is-dropdown-submenu {
-    top: 100%;
-    right: 0;
-    left: auto; }
-  .dropdown.menu.large-horizontal > li.opens-right > .is-dropdown-submenu {
-    top: 100%;
-    right: auto;
-    left: 0; }
-  .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a {
-    position: relative;
-    padding-right: 1.5rem; }
-  .dropdown.menu.large-horizontal > li.is-dropdown-submenu-parent > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-bottom-width: 0;
-    border-top-style: solid;
-    border-color: #1779ba transparent transparent;
-    right: 5px;
-    margin-top: -3px; }
-  .dropdown.menu.large-vertical > li .is-dropdown-submenu {
-    top: 0; }
-  .dropdown.menu.large-vertical > li.opens-left > .is-dropdown-submenu {
-    right: 100%;
-    left: auto; }
-  .dropdown.menu.large-vertical > li.opens-right > .is-dropdown-submenu {
-    right: auto;
-    left: 100%; }
-  .dropdown.menu.large-vertical > li > a::after {
-    right: 14px; }
-  .dropdown.menu.large-vertical > li.opens-left > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-left-width: 0;
-    border-right-style: solid;
-    border-color: transparent #1779ba transparent transparent; }
-  .dropdown.menu.large-vertical > li.opens-right > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-right-width: 0;
-    border-left-style: solid;
-    border-color: transparent transparent transparent #1779ba; } }
-
-.dropdown.menu.align-right .is-dropdown-submenu.first-sub {
-  top: 100%;
-  right: 0;
-  left: auto; }
-
-.is-dropdown-menu.vertical {
-  width: 100px; }
-  .is-dropdown-menu.vertical.align-right {
-    float: right; }
-
-.is-dropdown-submenu-parent {
-  position: relative; }
-  .is-dropdown-submenu-parent a::after {
-    position: absolute;
-    top: 50%;
-    right: 5px;
-    margin-top: -6px; }
-  .is-dropdown-submenu-parent.opens-inner > .is-dropdown-submenu {
-    top: 100%;
-    left: auto; }
-  .is-dropdown-submenu-parent.opens-left > .is-dropdown-submenu {
-    right: 100%;
-    left: auto; }
-  .is-dropdown-submenu-parent.opens-right > .is-dropdown-submenu {
-    right: auto;
-    left: 100%; }
-
-.is-dropdown-submenu {
-  position: absolute;
-  top: 0;
-  left: 100%;
-  z-index: 1;
-  display: none;
-  min-width: 200px;
-  border: 1px solid #cacaca;
-  background: #fefefe; }
-  .is-dropdown-submenu .is-dropdown-submenu-parent > a::after {
-    right: 14px; }
-  .is-dropdown-submenu .is-dropdown-submenu-parent.opens-left > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-left-width: 0;
-    border-right-style: solid;
-    border-color: transparent #1779ba transparent transparent; }
-  .is-dropdown-submenu .is-dropdown-submenu-parent.opens-right > a::after {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 6px;
-    content: '';
-    border-right-width: 0;
-    border-left-style: solid;
-    border-color: transparent transparent transparent #1779ba; }
-  .is-dropdown-submenu .is-dropdown-submenu {
-    margin-top: -1px; }
-  .is-dropdown-submenu > li {
-    width: 100%; }
-  .is-dropdown-submenu.js-dropdown-active {
-    display: block; }
-
-.responsive-embed,
-.flex-video {
-  position: relative;
-  height: 0;
-  margin-bottom: 1rem;
-  padding-bottom: 75%;
-  overflow: hidden; }
-  .responsive-embed iframe,
-  .responsive-embed object,
-  .responsive-embed embed,
-  .responsive-embed video,
-  .flex-video iframe,
-  .flex-video object,
-  .flex-video embed,
-  .flex-video video {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%; }
-  .responsive-embed.widescreen,
-  .flex-video.widescreen {
-    padding-bottom: 56.25%; }
-
-.label {
-  display: inline-block;
-  padding: 0.33333rem 0.5rem;
-  border-radius: 0;
-  font-size: 0.8rem;
-  line-height: 1;
-  white-space: nowrap;
-  cursor: default;
-  background: #1779ba;
-  color: #fefefe; }
-  .label.primary {
-    background: #1779ba;
-    color: #fefefe; }
-  .label.secondary {
-    background: #767676;
-    color: #fefefe; }
-  .label.success {
-    background: #3adb76;
-    color: #0a0a0a; }
-  .label.warning {
-    background: #ffae00;
-    color: #0a0a0a; }
-  .label.alert {
-    background: #cc4b37;
-    color: #fefefe; }
-
-.media-object {
-  display: block;
-  margin-bottom: 1rem; }
-  .media-object img {
-    max-width: none; }
-  @media screen and (max-width: 39.9375em) {
-    .media-object.stack-for-small .media-object-section {
-      padding: 0;
-      padding-bottom: 1rem;
-      display: block; }
-      .media-object.stack-for-small .media-object-section img {
-        width: 100%; } }
-
-.media-object-section {
-  display: table-cell;
-  vertical-align: top; }
-  .media-object-section:first-child {
-    padding-right: 1rem; }
-  .media-object-section:last-child:not(:nth-child(2)) {
-    padding-left: 1rem; }
-  .media-object-section > :last-child {
-    margin-bottom: 0; }
-  .media-object-section.middle {
-    vertical-align: middle; }
-  .media-object-section.bottom {
-    vertical-align: bottom; }
-
-.is-off-canvas-open {
-  overflow: hidden; }
-
-.js-off-canvas-overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  transition: opacity 0.5s ease, visibility 0.5s ease;
-  background: rgba(254, 254, 254, 0.25);
-  opacity: 0;
-  visibility: hidden;
-  overflow: hidden; }
-  .js-off-canvas-overlay.is-visible {
-    opacity: 1;
-    visibility: visible; }
-  .js-off-canvas-overlay.is-closable {
-    cursor: pointer; }
-  .js-off-canvas-overlay.is-overlay-absolute {
-    position: absolute; }
-  .js-off-canvas-overlay.is-overlay-fixed {
-    position: fixed; }
-
-.off-canvas-wrapper {
-  position: relative;
-  overflow: hidden; }
-
-.off-canvas {
-  position: fixed;
-  z-index: 1;
-  transition: transform 0.5s ease;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  background: #e6e6e6; }
-  [data-whatinput='mouse'] .off-canvas {
-    outline: 0; }
-  .off-canvas.is-transition-overlap {
-    z-index: 10; }
-    .off-canvas.is-transition-overlap.is-open {
-      box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); }
-  .off-canvas.is-open {
-    -ms-transform: translate(0, 0);
-        transform: translate(0, 0); }
-
-.off-canvas-absolute {
-  position: absolute;
-  z-index: 1;
-  transition: transform 0.5s ease;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  background: #e6e6e6; }
-  [data-whatinput='mouse'] .off-canvas-absolute {
-    outline: 0; }
-  .off-canvas-absolute.is-transition-overlap {
-    z-index: 10; }
-    .off-canvas-absolute.is-transition-overlap.is-open {
-      box-shadow: 0 0 10px rgba(10, 10, 10, 0.7); }
-  .off-canvas-absolute.is-open {
-    -ms-transform: translate(0, 0);
-        transform: translate(0, 0); }
-
-.position-left {
-  top: 0;
-  left: 0;
-  width: 250px;
-  height: 100%;
-  -ms-transform: translateX(-250px);
-      transform: translateX(-250px);
-  overflow-y: auto; }
-  .position-left.is-open ~ .off-canvas-content {
-    -ms-transform: translateX(250px);
-        transform: translateX(250px); }
-  .position-left.is-transition-push::after {
-    position: absolute;
-    top: 0;
-    right: 0;
-    height: 100%;
-    width: 1px;
-    box-shadow: 0 0 10px rgba(10, 10, 10, 0.7);
-    content: " "; }
-  .position-left.is-transition-overlap.is-open ~ .off-canvas-content {
-    -ms-transform: none;
-        transform: none; }
-
-.position-right {
-  top: 0;
-  right: 0;
-  width: 250px;
-  height: 100%;
-  -ms-transform: translateX(250px);
-      transform: translateX(250px);
-  overflow-y: auto; }
-  .position-right.is-open ~ .off-canvas-content {
-    -ms-transform: translateX(-250px);
-        transform: translateX(-250px); }
-  .position-right.is-transition-push::after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    height: 100%;
-    width: 1px;
-    box-shadow: 0 0 10px rgba(10, 10, 10, 0.7);
-    content: " "; }
-  .position-right.is-transition-overlap.is-open ~ .off-canvas-content {
-    -ms-transform: none;
-        transform: none; }
-
-.position-top {
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 250px;
-  -ms-transform: translateY(-250px);
-      transform: translateY(-250px);
-  overflow-x: auto; }
-  .position-top.is-open ~ .off-canvas-content {
-    -ms-transform: translateY(250px);
-        transform: translateY(250px); }
-  .position-top.is-transition-push::after {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    height: 1px;
-    width: 100%;
-    box-shadow: 0 0 10px rgba(10, 10, 10, 0.7);
-    content: " "; }
-  .position-top.is-transition-overlap.is-open ~ .off-canvas-content {
-    -ms-transform: none;
-        transform: none; }
-
-.position-bottom {
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  height: 250px;
-  -ms-transform: translateY(250px);
-      transform: translateY(250px);
-  overflow-x: auto; }
-  .position-bottom.is-open ~ .off-canvas-content {
-    -ms-transform: translateY(-250px);
-        transform: translateY(-250px); }
-  .position-bottom.is-transition-push::after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    height: 1px;
-    width: 100%;
-    box-shadow: 0 0 10px rgba(10, 10, 10, 0.7);
-    content: " "; }
-  .position-bottom.is-transition-overlap.is-open ~ .off-canvas-content {
-    -ms-transform: none;
-        transform: none; }
-
-.off-canvas-content {
-  transition: transform 0.5s ease;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-@media print, screen and (min-width: 40em) {
-  .position-left.reveal-for-medium {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-left.reveal-for-medium ~ .off-canvas-content {
-      margin-left: 250px; }
-  .position-right.reveal-for-medium {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-right.reveal-for-medium ~ .off-canvas-content {
-      margin-right: 250px; }
-  .position-top.reveal-for-medium {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-top.reveal-for-medium ~ .off-canvas-content {
-      margin-top: 250px; }
-  .position-bottom.reveal-for-medium {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-bottom.reveal-for-medium ~ .off-canvas-content {
-      margin-bottom: 250px; } }
-
-@media print, screen and (min-width: 64em) {
-  .position-left.reveal-for-large {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-left.reveal-for-large ~ .off-canvas-content {
-      margin-left: 250px; }
-  .position-right.reveal-for-large {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-right.reveal-for-large ~ .off-canvas-content {
-      margin-right: 250px; }
-  .position-top.reveal-for-large {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-top.reveal-for-large ~ .off-canvas-content {
-      margin-top: 250px; }
-  .position-bottom.reveal-for-large {
-    -ms-transform: none;
-        transform: none;
-    z-index: 1; }
-    .position-bottom.reveal-for-large ~ .off-canvas-content {
-      margin-bottom: 250px; } }
-
-.orbit {
-  position: relative; }
-
-.orbit-container {
-  position: relative;
-  height: 0;
-  margin: 0;
-  list-style: none;
-  overflow: hidden; }
-
-.orbit-slide {
-  width: 100%; }
-  .orbit-slide.no-motionui.is-active {
-    top: 0;
-    left: 0; }
-
-.orbit-figure {
-  margin: 0; }
-
-.orbit-image {
-  width: 100%;
-  max-width: 100%;
-  margin: 0; }
-
-.orbit-caption {
-  position: absolute;
-  bottom: 0;
-  width: 100%;
-  margin-bottom: 0;
-  padding: 1rem;
-  background-color: rgba(10, 10, 10, 0.5);
-  color: #fefefe; }
-
-.orbit-previous, .orbit-next {
-  position: absolute;
-  top: 50%;
-  -ms-transform: translateY(-50%);
-      transform: translateY(-50%);
-  z-index: 10;
-  padding: 1rem;
-  color: #fefefe; }
-  [data-whatinput='mouse'] .orbit-previous, [data-whatinput='mouse'] .orbit-next {
-    outline: 0; }
-  .orbit-previous:hover, .orbit-next:hover, .orbit-previous:active, .orbit-next:active, .orbit-previous:focus, .orbit-next:focus {
-    background-color: rgba(10, 10, 10, 0.5); }
-
-.orbit-previous {
-  left: 0; }
-
-.orbit-next {
-  left: auto;
-  right: 0; }
-
-.orbit-bullets {
-  position: relative;
-  margin-top: 0.8rem;
-  margin-bottom: 0.8rem;
-  text-align: center; }
-  [data-whatinput='mouse'] .orbit-bullets {
-    outline: 0; }
-  .orbit-bullets button {
-    width: 1.2rem;
-    height: 1.2rem;
-    margin: 0.1rem;
-    border-radius: 50%;
-    background-color: #cacaca; }
-    .orbit-bullets button:hover {
-      background-color: #8a8a8a; }
-    .orbit-bullets button.is-active {
-      background-color: #8a8a8a; }
-
-.pagination {
-  margin-left: 0;
-  margin-bottom: 1rem; }
-  .pagination::before, .pagination::after {
-    display: table;
-    content: ' '; }
-  .pagination::after {
-    clear: both; }
-  .pagination li {
-    margin-right: 0.0625rem;
-    border-radius: 0;
-    font-size: 0.875rem;
-    display: none; }
-    .pagination li:last-child, .pagination li:first-child {
-      display: inline-block; }
-    @media print, screen and (min-width: 40em) {
-      .pagination li {
-        display: inline-block; } }
-  .pagination a,
-  .pagination button {
-    display: block;
-    padding: 0.1875rem 0.625rem;
-    border-radius: 0;
-    color: #0a0a0a; }
-    .pagination a:hover,
-    .pagination button:hover {
-      background: #e6e6e6; }
-  .pagination .current {
-    padding: 0.1875rem 0.625rem;
-    background: #1779ba;
-    color: #fefefe;
-    cursor: default; }
-  .pagination .disabled {
-    padding: 0.1875rem 0.625rem;
-    color: #cacaca;
-    cursor: not-allowed; }
-    .pagination .disabled:hover {
-      background: transparent; }
-  .pagination .ellipsis::after {
-    padding: 0.1875rem 0.625rem;
-    content: '\2026';
-    color: #0a0a0a; }
-
-.pagination-previous a::before,
-.pagination-previous.disabled::before {
-  display: inline-block;
-  margin-right: 0.5rem;
-  content: '\00ab'; }
-
-.pagination-next a::after,
-.pagination-next.disabled::after {
-  display: inline-block;
-  margin-left: 0.5rem;
-  content: '\00bb'; }
-
-.progress {
-  height: 1rem;
-  margin-bottom: 1rem;
-  border-radius: 0;
-  background-color: #cacaca; }
-  .progress.primary .progress-meter {
-    background-color: #1779ba; }
-  .progress.secondary .progress-meter {
-    background-color: #767676; }
-  .progress.success .progress-meter {
-    background-color: #3adb76; }
-  .progress.warning .progress-meter {
-    background-color: #ffae00; }
-  .progress.alert .progress-meter {
-    background-color: #cc4b37; }
-
-.progress-meter {
-  position: relative;
-  display: block;
-  width: 0%;
-  height: 100%;
-  background-color: #1779ba; }
-
-.progress-meter-text {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  -ms-transform: translate(-50%, -50%);
-      transform: translate(-50%, -50%);
-  position: absolute;
-  margin: 0;
-  font-size: 0.75rem;
-  font-weight: bold;
-  color: #fefefe;
-  white-space: nowrap; }
-
-body.is-reveal-open {
-  overflow: hidden; }
-
-html.is-reveal-open,
-html.is-reveal-open body {
-  min-height: 100%;
-  overflow: hidden;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none; }
-
-.reveal-overlay {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1005;
-  display: none;
-  background-color: rgba(10, 10, 10, 0.45);
-  overflow-y: scroll; }
-
-.reveal {
-  z-index: 1006;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  display: none;
-  padding: 1rem;
-  border: 1px solid #cacaca;
-  border-radius: 0;
-  background-color: #fefefe;
-  position: relative;
-  top: 100px;
-  margin-right: auto;
-  margin-left: auto;
-  overflow-y: auto; }
-  [data-whatinput='mouse'] .reveal {
-    outline: 0; }
-  @media print, screen and (min-width: 40em) {
-    .reveal {
-      min-height: 0; } }
-  .reveal .column, .reveal .columns,
-  .reveal .columns {
-    min-width: 0; }
-  .reveal > :last-child {
-    margin-bottom: 0; }
-  @media print, screen and (min-width: 40em) {
-    .reveal {
-      width: 600px;
-      max-width: 75rem; } }
-  @media print, screen and (min-width: 40em) {
-    .reveal .reveal {
-      right: auto;
-      left: auto;
-      margin: 0 auto; } }
-  .reveal.collapse {
-    padding: 0; }
-  @media print, screen and (min-width: 40em) {
-    .reveal.tiny {
-      width: 30%;
-      max-width: 75rem; } }
-  @media print, screen and (min-width: 40em) {
-    .reveal.small {
-      width: 50%;
-      max-width: 75rem; } }
-  @media print, screen and (min-width: 40em) {
-    .reveal.large {
-      width: 90%;
-      max-width: 75rem; } }
-  .reveal.full {
-    top: 0;
-    left: 0;
-    width: 100%;
-    max-width: none;
-    height: 100%;
-    height: 100vh;
-    min-height: 100vh;
-    margin-left: 0;
-    border: 0;
-    border-radius: 0; }
-  @media screen and (max-width: 39.9375em) {
-    .reveal {
-      top: 0;
-      left: 0;
-      width: 100%;
-      max-width: none;
-      height: 100%;
-      height: 100vh;
-      min-height: 100vh;
-      margin-left: 0;
-      border: 0;
-      border-radius: 0; } }
-  .reveal.without-overlay {
-    position: fixed; }
-
-.slider {
-  position: relative;
-  height: 0.5rem;
-  margin-top: 1.25rem;
-  margin-bottom: 2.25rem;
-  background-color: #e6e6e6;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -ms-touch-action: none;
-      touch-action: none; }
-
-.slider-fill {
-  position: absolute;
-  top: 0;
-  left: 0;
-  display: inline-block;
-  max-width: 100%;
-  height: 0.5rem;
-  background-color: #cacaca;
-  transition: all 0.2s ease-in-out; }
-  .slider-fill.is-dragging {
-    transition: all 0s linear; }
-
-.slider-handle {
-  position: absolute;
-  top: 50%;
-  -ms-transform: translateY(-50%);
-      transform: translateY(-50%);
-  position: absolute;
-  left: 0;
-  z-index: 1;
-  display: inline-block;
-  width: 1.4rem;
-  height: 1.4rem;
-  border-radius: 0;
-  background-color: #1779ba;
-  transition: all 0.2s ease-in-out;
-  -ms-touch-action: manipulation;
-      touch-action: manipulation; }
-  [data-whatinput='mouse'] .slider-handle {
-    outline: 0; }
-  .slider-handle:hover {
-    background-color: #14679e; }
-  .slider-handle.is-dragging {
-    transition: all 0s linear; }
-
-.slider.disabled,
-.slider[disabled] {
-  opacity: 0.25;
-  cursor: not-allowed; }
-
-.slider.vertical {
-  display: inline-block;
-  width: 0.5rem;
-  height: 12.5rem;
-  margin: 0 1.25rem;
-  -ms-transform: scale(1, -1);
-      transform: scale(1, -1); }
-  .slider.vertical .slider-fill {
-    top: 0;
-    width: 0.5rem;
-    max-height: 100%; }
-  .slider.vertical .slider-handle {
-    position: absolute;
-    top: 0;
-    left: 50%;
-    width: 1.4rem;
-    height: 1.4rem;
-    -ms-transform: translateX(-50%);
-        transform: translateX(-50%); }
-
-.sticky-container {
-  position: relative; }
-
-.sticky {
-  position: relative;
-  z-index: 0;
-  transform: translate3d(0, 0, 0); }
-
-.sticky.is-stuck {
-  position: fixed;
-  z-index: 5; }
-  .sticky.is-stuck.is-at-top {
-    top: 0; }
-  .sticky.is-stuck.is-at-bottom {
-    bottom: 0; }
-
-.sticky.is-anchored {
-  position: relative;
-  right: auto;
-  left: auto; }
-  .sticky.is-anchored.is-at-bottom {
-    bottom: 0; }
-
-.switch {
-  height: 2rem;
-  position: relative;
-  margin-bottom: 1rem;
-  outline: 0;
-  font-size: 0.875rem;
-  font-weight: bold;
-  color: #fefefe;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none; }
-
-.switch-input {
-  position: absolute;
-  margin-bottom: 0;
-  opacity: 0; }
-
-.switch-paddle {
-  position: relative;
-  display: block;
-  width: 4rem;
-  height: 2rem;
-  border-radius: 0;
-  background: #cacaca;
-  transition: all 0.25s ease-out;
-  font-weight: inherit;
-  color: inherit;
-  cursor: pointer; }
-  input + .switch-paddle {
-    margin: 0; }
-  .switch-paddle::after {
-    position: absolute;
-    top: 0.25rem;
-    left: 0.25rem;
-    display: block;
-    width: 1.5rem;
-    height: 1.5rem;
-    transform: translate3d(0, 0, 0);
-    border-radius: 0;
-    background: #fefefe;
-    transition: all 0.25s ease-out;
-    content: ''; }
-  input:checked ~ .switch-paddle {
-    background: #1779ba; }
-    input:checked ~ .switch-paddle::after {
-      left: 2.25rem; }
-  [data-whatinput='mouse'] input:focus ~ .switch-paddle {
-    outline: 0; }
-
-.switch-active, .switch-inactive {
-  position: absolute;
-  top: 50%;
-  -ms-transform: translateY(-50%);
-      transform: translateY(-50%); }
-
-.switch-active {
-  left: 8%;
-  display: none; }
-  input:checked + label > .switch-active {
-    display: block; }
-
-.switch-inactive {
-  right: 15%; }
-  input:checked + label > .switch-inactive {
-    display: none; }
-
-.switch.tiny {
-  height: 1.5rem; }
-  .switch.tiny .switch-paddle {
-    width: 3rem;
-    height: 1.5rem;
-    font-size: 0.625rem; }
-  .switch.tiny .switch-paddle::after {
-    top: 0.25rem;
-    left: 0.25rem;
-    width: 1rem;
-    height: 1rem; }
-  .switch.tiny input:checked ~ .switch-paddle::after {
-    left: 1.75rem; }
-
-.switch.small {
-  height: 1.75rem; }
-  .switch.small .switch-paddle {
-    width: 3.5rem;
-    height: 1.75rem;
-    font-size: 0.75rem; }
-  .switch.small .switch-paddle::after {
-    top: 0.25rem;
-    left: 0.25rem;
-    width: 1.25rem;
-    height: 1.25rem; }
-  .switch.small input:checked ~ .switch-paddle::after {
-    left: 2rem; }
-
-.switch.large {
-  height: 2.5rem; }
-  .switch.large .switch-paddle {
-    width: 5rem;
-    height: 2.5rem;
-    font-size: 1rem; }
-  .switch.large .switch-paddle::after {
-    top: 0.25rem;
-    left: 0.25rem;
-    width: 2rem;
-    height: 2rem; }
-  .switch.large input:checked ~ .switch-paddle::after {
-    left: 2.75rem; }
-
-table {
-  width: 100%;
-  margin-bottom: 1rem;
-  border-radius: 0; }
-  table thead,
-  table tbody,
-  table tfoot {
-    border: 1px solid #f1f1f1;
-    background-color: #fefefe; }
-  table caption {
-    padding: 0.5rem 0.625rem 0.625rem;
-    font-weight: bold; }
-  table thead {
-    background: #f8f8f8;
-    color: #0a0a0a; }
-  table tfoot {
-    background: #f1f1f1;
-    color: #0a0a0a; }
-  table thead tr,
-  table tfoot tr {
-    background: transparent; }
-  table thead th,
-  table thead td,
-  table tfoot th,
-  table tfoot td {
-    padding: 0.5rem 0.625rem 0.625rem;
-    font-weight: bold;
-    text-align: left; }
-  table tbody th,
-  table tbody td {
-    padding: 0.5rem 0.625rem 0.625rem; }
-  table tbody tr:nth-child(even) {
-    border-bottom: 0;
-    background-color: #f1f1f1; }
-  table.unstriped tbody {
-    background-color: #fefefe; }
-    table.unstriped tbody tr {
-      border-bottom: 0;
-      border-bottom: 1px solid #f1f1f1;
-      background-color: #fefefe; }
-
-@media screen and (max-width: 63.9375em) {
-  table.stack thead {
-    display: none; }
-  table.stack tfoot {
-    display: none; }
-  table.stack tr,
-  table.stack th,
-  table.stack td {
-    display: block; }
-  table.stack td {
-    border-top: 0; } }
-
-table.scroll {
-  display: block;
-  width: 100%;
-  overflow-x: auto; }
-
-table.hover thead tr:hover {
-  background-color: #f3f3f3; }
-
-table.hover tfoot tr:hover {
-  background-color: #ececec; }
-
-table.hover tbody tr:hover {
-  background-color: #f9f9f9; }
-
-table.hover:not(.unstriped) tr:nth-of-type(even):hover {
-  background-color: #ececec; }
-
-.table-scroll {
-  overflow-x: auto; }
-  .table-scroll table {
-    width: auto; }
-
-.tabs {
-  margin: 0;
-  border: 1px solid #e6e6e6;
-  background: #fefefe;
-  list-style-type: none; }
-  .tabs::before, .tabs::after {
-    display: table;
-    content: ' '; }
-  .tabs::after {
-    clear: both; }
-
-.tabs.vertical > li {
-  display: block;
-  float: none;
-  width: auto; }
-
-.tabs.simple > li > a {
-  padding: 0; }
-  .tabs.simple > li > a:hover {
-    background: transparent; }
-
-.tabs.primary {
-  background: #1779ba; }
-  .tabs.primary > li > a {
-    color: #fefefe; }
-    .tabs.primary > li > a:hover, .tabs.primary > li > a:focus {
-      background: #1673b1; }
-
-.tabs-title {
-  float: left; }
-  .tabs-title > a {
-    display: block;
-    padding: 1.25rem 1.5rem;
-    font-size: 0.75rem;
-    line-height: 1;
-    color: #1779ba; }
-    .tabs-title > a:hover {
-      background: #fefefe;
-      color: #1468a0; }
-    .tabs-title > a:focus, .tabs-title > a[aria-selected='true'] {
-      background: #e6e6e6;
-      color: #1779ba; }
-
-.tabs-content {
-  border: 1px solid #e6e6e6;
-  border-top: 0;
-  background: #fefefe;
-  color: #0a0a0a;
-  transition: all 0.5s ease; }
-
-.tabs-content.vertical {
-  border: 1px solid #e6e6e6;
-  border-left: 0; }
-
-.tabs-panel {
-  display: none;
-  padding: 1rem; }
-  .tabs-panel[aria-hidden="false"] {
-    display: block; }
-
-.thumbnail {
-  display: inline-block;
-  max-width: 100%;
-  margin-bottom: 1rem;
-  border: solid 4px #fefefe;
-  border-radius: 0;
-  box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2);
-  line-height: 0; }
-
-a.thumbnail {
-  transition: box-shadow 200ms ease-out; }
-  a.thumbnail:hover, a.thumbnail:focus {
-    box-shadow: 0 0 6px 1px rgba(23, 121, 186, 0.5); }
-  a.thumbnail image {
-    box-shadow: none; }
-
-.title-bar {
-  padding: 0.5rem;
-  background: #0a0a0a;
-  color: #fefefe; }
-  .title-bar::before, .title-bar::after {
-    display: table;
-    content: ' '; }
-  .title-bar::after {
-    clear: both; }
-  .title-bar .menu-icon {
-    margin-left: 0.25rem;
-    margin-right: 0.25rem; }
-
-.title-bar-left {
-  float: left; }
-
-.title-bar-right {
-  float: right;
-  text-align: right; }
-
-.title-bar-title {
-  display: inline-block;
-  vertical-align: middle;
-  font-weight: bold; }
-
-.has-tip {
-  position: relative;
-  display: inline-block;
-  border-bottom: dotted 1px #8a8a8a;
-  font-weight: bold;
-  cursor: help; }
-
-.tooltip {
-  position: absolute;
-  top: calc(100% + 0.6495rem);
-  z-index: 1200;
-  max-width: 10rem;
-  padding: 0.75rem;
-  border-radius: 0;
-  background-color: #0a0a0a;
-  font-size: 80%;
-  color: #fefefe; }
-  .tooltip::before {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 0.75rem;
-    content: '';
-    border-top-width: 0;
-    border-bottom-style: solid;
-    border-color: transparent transparent #0a0a0a;
-    position: absolute;
-    bottom: 100%;
-    left: 50%;
-    -ms-transform: translateX(-50%);
-        transform: translateX(-50%); }
-  .tooltip.top::before {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 0.75rem;
-    content: '';
-    border-bottom-width: 0;
-    border-top-style: solid;
-    border-color: #0a0a0a transparent transparent;
-    top: 100%;
-    bottom: auto; }
-  .tooltip.left::before {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 0.75rem;
-    content: '';
-    border-right-width: 0;
-    border-left-style: solid;
-    border-color: transparent transparent transparent #0a0a0a;
-    top: 50%;
-    bottom: auto;
-    left: 100%;
-    -ms-transform: translateY(-50%);
-        transform: translateY(-50%); }
-  .tooltip.right::before {
-    display: block;
-    width: 0;
-    height: 0;
-    border: inset 0.75rem;
-    content: '';
-    border-left-width: 0;
-    border-right-style: solid;
-    border-color: transparent #0a0a0a transparent transparent;
-    top: 50%;
-    right: 100%;
-    bottom: auto;
-    left: auto;
-    -ms-transform: translateY(-50%);
-        transform: translateY(-50%); }
-
-.top-bar {
-  padding: 0.5rem; }
-  .top-bar::before, .top-bar::after {
-    display: table;
-    content: ' '; }
-  .top-bar::after {
-    clear: both; }
-  .top-bar,
-  .top-bar ul {
-    background-color: #e6e6e6; }
-  .top-bar input {
-    max-width: 200px;
-    margin-right: 1rem; }
-  .top-bar .input-group-field {
-    width: 100%;
-    margin-right: 0; }
-  .top-bar input.button {
-    width: auto; }
-  .top-bar .top-bar-left,
-  .top-bar .top-bar-right {
-    width: 100%; }
-  @media print, screen and (min-width: 40em) {
-    .top-bar .top-bar-left,
-    .top-bar .top-bar-right {
-      width: auto; } }
-  @media screen and (max-width: 63.9375em) {
-    .top-bar.stacked-for-medium .top-bar-left,
-    .top-bar.stacked-for-medium .top-bar-right {
-      width: 100%; } }
-  @media screen and (max-width: 74.9375em) {
-    .top-bar.stacked-for-large .top-bar-left,
-    .top-bar.stacked-for-large .top-bar-right {
-      width: 100%; } }
-
-.top-bar-title {
-  display: inline-block;
-  float: left;
-  padding: 0.5rem 1rem 0.5rem 0; }
-  .top-bar-title .menu-icon {
-    bottom: 2px; }
-
-.top-bar-left {
-  float: left; }
-
-.top-bar-right {
-  float: right; }
-
-.hide {
-  display: none !important; }
-
-.invisible {
-  visibility: hidden; }
-
-@media screen and (max-width: 39.9375em) {
-  .hide-for-small-only {
-    display: none !important; } }
-
-@media screen and (max-width: 0em), screen and (min-width: 40em) {
-  .show-for-small-only {
-    display: none !important; } }
-
-@media print, screen and (min-width: 40em) {
-  .hide-for-medium {
-    display: none !important; } }
-
-@media screen and (max-width: 39.9375em) {
-  .show-for-medium {
-    display: none !important; } }
-
-@media screen and (min-width: 40em) and (max-width: 63.9375em) {
-  .hide-for-medium-only {
-    display: none !important; } }
-
-@media screen and (max-width: 39.9375em), screen and (min-width: 64em) {
-  .show-for-medium-only {
-    display: none !important; } }
-
-@media print, screen and (min-width: 64em) {
-  .hide-for-large {
-    display: none !important; } }
-
-@media screen and (max-width: 63.9375em) {
-  .show-for-large {
-    display: none !important; } }
-
-@media screen and (min-width: 64em) and (max-width: 74.9375em) {
-  .hide-for-large-only {
-    display: none !important; } }
-
-@media screen and (max-width: 63.9375em), screen and (min-width: 75em) {
-  .show-for-large-only {
-    display: none !important; } }
-
-.show-for-sr,
-.show-on-focus {
-  position: absolute !important;
-  width: 1px;
-  height: 1px;
-  overflow: hidden;
-  clip: rect(0, 0, 0, 0); }
-
-.show-on-focus:active, .show-on-focus:focus {
-  position: static !important;
-  width: auto;
-  height: auto;
-  overflow: visible;
-  clip: auto; }
-
-.show-for-landscape,
-.hide-for-portrait {
-  display: block !important; }
-  @media screen and (orientation: landscape) {
-    .show-for-landscape,
-    .hide-for-portrait {
-      display: block !important; } }
-  @media screen and (orientation: portrait) {
-    .show-for-landscape,
-    .hide-for-portrait {
-      display: none !important; } }
-
-.hide-for-landscape,
-.show-for-portrait {
-  display: none !important; }
-  @media screen and (orientation: landscape) {
-    .hide-for-landscape,
-    .show-for-portrait {
-      display: none !important; } }
-  @media screen and (orientation: portrait) {
-    .hide-for-landscape,
-    .show-for-portrait {
-      display: block !important; } }
-
-.float-left {
-  float: left !important; }
-
-.float-right {
-  float: right !important; }
-
-.float-center {
-  display: block;
-  margin-right: auto;
-  margin-left: auto; }
-
-.clearfix::before, .clearfix::after {
-  display: table;
-  content: ' '; }
-
-.clearfix::after {
-  clear: both; }
-
-.slide-in-down.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateY(-100%);
-      transform: translateY(-100%);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-in-down.mui-enter.mui-enter-active {
-  -ms-transform: translateY(0);
-      transform: translateY(0); }
-
-.slide-in-left.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateX(-100%);
-      transform: translateX(-100%);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-in-left.mui-enter.mui-enter-active {
-  -ms-transform: translateX(0);
-      transform: translateX(0); }
-
-.slide-in-up.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateY(100%);
-      transform: translateY(100%);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-in-up.mui-enter.mui-enter-active {
-  -ms-transform: translateY(0);
-      transform: translateY(0); }
-
-.slide-in-right.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateX(100%);
-      transform: translateX(100%);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-in-right.mui-enter.mui-enter-active {
-  -ms-transform: translateX(0);
-      transform: translateX(0); }
-
-.slide-out-down.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateY(0);
-      transform: translateY(0);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-out-down.mui-leave.mui-leave-active {
-  -ms-transform: translateY(100%);
-      transform: translateY(100%); }
-
-.slide-out-right.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateX(0);
-      transform: translateX(0);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-out-right.mui-leave.mui-leave-active {
-  -ms-transform: translateX(100%);
-      transform: translateX(100%); }
-
-.slide-out-up.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateY(0);
-      transform: translateY(0);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-out-up.mui-leave.mui-leave-active {
-  -ms-transform: translateY(-100%);
-      transform: translateY(-100%); }
-
-.slide-out-left.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: translateX(0);
-      transform: translateX(0);
-  transition-property: transform, opacity;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden; }
-
-.slide-out-left.mui-leave.mui-leave-active {
-  -ms-transform: translateX(-100%);
-      transform: translateX(-100%); }
-
-.fade-in.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  opacity: 0;
-  transition-property: opacity; }
-
-.fade-in.mui-enter.mui-enter-active {
-  opacity: 1; }
-
-.fade-out.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  opacity: 1;
-  transition-property: opacity; }
-
-.fade-out.mui-leave.mui-leave-active {
-  opacity: 0; }
-
-.hinge-in-from-top.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateX(-90deg);
-  -ms-transform-origin: top;
-      transform-origin: top;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-top.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-in-from-right.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateY(-90deg);
-  -ms-transform-origin: right;
-      transform-origin: right;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-right.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-in-from-bottom.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateX(90deg);
-  -ms-transform-origin: bottom;
-      transform-origin: bottom;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-bottom.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-in-from-left.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateY(90deg);
-  -ms-transform-origin: left;
-      transform-origin: left;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-left.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-in-from-middle-x.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateX(-90deg);
-  -ms-transform-origin: center;
-      transform-origin: center;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-middle-x.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-in-from-middle-y.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotateY(-90deg);
-  -ms-transform-origin: center;
-      transform-origin: center;
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.hinge-in-from-middle-y.mui-enter.mui-enter-active {
-  transform: perspective(2000px) rotate(0deg);
-  opacity: 1; }
-
-.hinge-out-from-top.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: top;
-      transform-origin: top;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-top.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateX(-90deg);
-  opacity: 0; }
-
-.hinge-out-from-right.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: right;
-      transform-origin: right;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-right.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateY(-90deg);
-  opacity: 0; }
-
-.hinge-out-from-bottom.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: bottom;
-      transform-origin: bottom;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-bottom.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateX(90deg);
-  opacity: 0; }
-
-.hinge-out-from-left.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: left;
-      transform-origin: left;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-left.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateY(90deg);
-  opacity: 0; }
-
-.hinge-out-from-middle-x.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: center;
-      transform-origin: center;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-middle-x.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateX(-90deg);
-  opacity: 0; }
-
-.hinge-out-from-middle-y.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  transform: perspective(2000px) rotate(0deg);
-  -ms-transform-origin: center;
-      transform-origin: center;
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.hinge-out-from-middle-y.mui-leave.mui-leave-active {
-  transform: perspective(2000px) rotateY(-90deg);
-  opacity: 0; }
-
-.scale-in-up.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: scale(0.5);
-      transform: scale(0.5);
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.scale-in-up.mui-enter.mui-enter-active {
-  -ms-transform: scale(1);
-      transform: scale(1);
-  opacity: 1; }
-
-.scale-in-down.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: scale(1.5);
-      transform: scale(1.5);
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.scale-in-down.mui-enter.mui-enter-active {
-  -ms-transform: scale(1);
-      transform: scale(1);
-  opacity: 1; }
-
-.scale-out-up.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: scale(1);
-      transform: scale(1);
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.scale-out-up.mui-leave.mui-leave-active {
-  -ms-transform: scale(1.5);
-      transform: scale(1.5);
-  opacity: 0; }
-
-.scale-out-down.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: scale(1);
-      transform: scale(1);
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.scale-out-down.mui-leave.mui-leave-active {
-  -ms-transform: scale(0.5);
-      transform: scale(0.5);
-  opacity: 0; }
-
-.spin-in.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: rotate(-0.75turn);
-      transform: rotate(-0.75turn);
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.spin-in.mui-enter.mui-enter-active {
-  -ms-transform: rotate(0);
-      transform: rotate(0);
-  opacity: 1; }
-
-.spin-out.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: rotate(0);
-      transform: rotate(0);
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.spin-out.mui-leave.mui-leave-active {
-  -ms-transform: rotate(0.75turn);
-      transform: rotate(0.75turn);
-  opacity: 0; }
-
-.spin-in-ccw.mui-enter {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: rotate(0.75turn);
-      transform: rotate(0.75turn);
-  transition-property: transform, opacity;
-  opacity: 0; }
-
-.spin-in-ccw.mui-enter.mui-enter-active {
-  -ms-transform: rotate(0);
-      transform: rotate(0);
-  opacity: 1; }
-
-.spin-out-ccw.mui-leave {
-  transition-duration: 500ms;
-  transition-timing-function: linear;
-  -ms-transform: rotate(0);
-      transform: rotate(0);
-  transition-property: transform, opacity;
-  opacity: 1; }
-
-.spin-out-ccw.mui-leave.mui-leave-active {
-  -ms-transform: rotate(-0.75turn);
-      transform: rotate(-0.75turn);
-  opacity: 0; }
-
-.slow {
-  transition-duration: 750ms !important; }
-
-.fast {
-  transition-duration: 250ms !important; }
-
-.linear {
-  transition-timing-function: linear !important; }
-
-.ease {
-  transition-timing-function: ease !important; }
-
-.ease-in {
-  transition-timing-function: ease-in !important; }
-
-.ease-out {
-  transition-timing-function: ease-out !important; }
-
-.ease-in-out {
-  transition-timing-function: ease-in-out !important; }
-
-.bounce-in {
-  transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; }
-
-.bounce-out {
-  transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; }
-
-.bounce-in-out {
-  transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; }
-
-.short-delay {
-  transition-delay: 300ms !important; }
-
-.long-delay {
-  transition-delay: 700ms !important; }
-
-.shake {
-  animation-name: shake-7; }
-
-@keyframes shake-7 {
-  0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% {
-    transform: translateX(7%); }
-  5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% {
-    transform: translateX(-7%); } }
-
-.spin-cw {
-  animation-name: spin-cw-1turn; }
-
-@keyframes spin-cw-1turn {
-  0% {
-    transform: rotate(-1turn); }
-  100% {
-    transform: rotate(0); } }
-
-.spin-ccw {
-  animation-name: spin-cw-1turn; }
-
-@keyframes spin-cw-1turn {
-  0% {
-    transform: rotate(0); }
-  100% {
-    transform: rotate(1turn); } }
-
-.wiggle {
-  animation-name: wiggle-7deg; }
-
-@keyframes wiggle-7deg {
-  40%, 50%, 60% {
-    transform: rotate(7deg); }
-  35%, 45%, 55%, 65% {
-    transform: rotate(-7deg); }
-  0%, 30%, 70%, 100% {
-    transform: rotate(0); } }
-
-.shake,
-.spin-cw,
-.spin-ccw,
-.wiggle {
-  animation-duration: 500ms; }
-
-.infinite {
-  animation-iteration-count: infinite; }
-
-.slow {
-  animation-duration: 750ms !important; }
-
-.fast {
-  animation-duration: 250ms !important; }
-
-.linear {
-  animation-timing-function: linear !important; }
-
-.ease {
-  animation-timing-function: ease !important; }
-
-.ease-in {
-  animation-timing-function: ease-in !important; }
-
-.ease-out {
-  animation-timing-function: ease-out !important; }
-
-.ease-in-out {
-  animation-timing-function: ease-in-out !important; }
-
-.bounce-in {
-  animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important; }
-
-.bounce-out {
-  animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important; }
-
-.bounce-in-out {
-  animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important; }
-
-.short-delay {
-  animation-delay: 300ms !important; }
-
-.long-delay {
-  animation-delay: 700ms !important; }
diff --git a/packages/csslib/test/examples/materialize.css b/packages/csslib/test/examples/materialize.css
deleted file mode 100644
index 77ff749..0000000
--- a/packages/csslib/test/examples/materialize.css
+++ /dev/null
@@ -1,8952 +0,0 @@
-/*!
- * Materialize v0.98.2 (http://materializecss.com)
- * Copyright 2014-2015 Materialize
- * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)
- */
-.materialize-red {
-  background-color: #e51c23 !important;
-}
-
-.materialize-red-text {
-  color: #e51c23 !important;
-}
-
-.materialize-red.lighten-5 {
-  background-color: #fdeaeb !important;
-}
-
-.materialize-red-text.text-lighten-5 {
-  color: #fdeaeb !important;
-}
-
-.materialize-red.lighten-4 {
-  background-color: #f8c1c3 !important;
-}
-
-.materialize-red-text.text-lighten-4 {
-  color: #f8c1c3 !important;
-}
-
-.materialize-red.lighten-3 {
-  background-color: #f3989b !important;
-}
-
-.materialize-red-text.text-lighten-3 {
-  color: #f3989b !important;
-}
-
-.materialize-red.lighten-2 {
-  background-color: #ee6e73 !important;
-}
-
-.materialize-red-text.text-lighten-2 {
-  color: #ee6e73 !important;
-}
-
-.materialize-red.lighten-1 {
-  background-color: #ea454b !important;
-}
-
-.materialize-red-text.text-lighten-1 {
-  color: #ea454b !important;
-}
-
-.materialize-red.darken-1 {
-  background-color: #d0181e !important;
-}
-
-.materialize-red-text.text-darken-1 {
-  color: #d0181e !important;
-}
-
-.materialize-red.darken-2 {
-  background-color: #b9151b !important;
-}
-
-.materialize-red-text.text-darken-2 {
-  color: #b9151b !important;
-}
-
-.materialize-red.darken-3 {
-  background-color: #a21318 !important;
-}
-
-.materialize-red-text.text-darken-3 {
-  color: #a21318 !important;
-}
-
-.materialize-red.darken-4 {
-  background-color: #8b1014 !important;
-}
-
-.materialize-red-text.text-darken-4 {
-  color: #8b1014 !important;
-}
-
-.red {
-  background-color: #F44336 !important;
-}
-
-.red-text {
-  color: #F44336 !important;
-}
-
-.red.lighten-5 {
-  background-color: #FFEBEE !important;
-}
-
-.red-text.text-lighten-5 {
-  color: #FFEBEE !important;
-}
-
-.red.lighten-4 {
-  background-color: #FFCDD2 !important;
-}
-
-.red-text.text-lighten-4 {
-  color: #FFCDD2 !important;
-}
-
-.red.lighten-3 {
-  background-color: #EF9A9A !important;
-}
-
-.red-text.text-lighten-3 {
-  color: #EF9A9A !important;
-}
-
-.red.lighten-2 {
-  background-color: #E57373 !important;
-}
-
-.red-text.text-lighten-2 {
-  color: #E57373 !important;
-}
-
-.red.lighten-1 {
-  background-color: #EF5350 !important;
-}
-
-.red-text.text-lighten-1 {
-  color: #EF5350 !important;
-}
-
-.red.darken-1 {
-  background-color: #E53935 !important;
-}
-
-.red-text.text-darken-1 {
-  color: #E53935 !important;
-}
-
-.red.darken-2 {
-  background-color: #D32F2F !important;
-}
-
-.red-text.text-darken-2 {
-  color: #D32F2F !important;
-}
-
-.red.darken-3 {
-  background-color: #C62828 !important;
-}
-
-.red-text.text-darken-3 {
-  color: #C62828 !important;
-}
-
-.red.darken-4 {
-  background-color: #B71C1C !important;
-}
-
-.red-text.text-darken-4 {
-  color: #B71C1C !important;
-}
-
-.red.accent-1 {
-  background-color: #FF8A80 !important;
-}
-
-.red-text.text-accent-1 {
-  color: #FF8A80 !important;
-}
-
-.red.accent-2 {
-  background-color: #FF5252 !important;
-}
-
-.red-text.text-accent-2 {
-  color: #FF5252 !important;
-}
-
-.red.accent-3 {
-  background-color: #FF1744 !important;
-}
-
-.red-text.text-accent-3 {
-  color: #FF1744 !important;
-}
-
-.red.accent-4 {
-  background-color: #D50000 !important;
-}
-
-.red-text.text-accent-4 {
-  color: #D50000 !important;
-}
-
-.pink {
-  background-color: #e91e63 !important;
-}
-
-.pink-text {
-  color: #e91e63 !important;
-}
-
-.pink.lighten-5 {
-  background-color: #fce4ec !important;
-}
-
-.pink-text.text-lighten-5 {
-  color: #fce4ec !important;
-}
-
-.pink.lighten-4 {
-  background-color: #f8bbd0 !important;
-}
-
-.pink-text.text-lighten-4 {
-  color: #f8bbd0 !important;
-}
-
-.pink.lighten-3 {
-  background-color: #f48fb1 !important;
-}
-
-.pink-text.text-lighten-3 {
-  color: #f48fb1 !important;
-}
-
-.pink.lighten-2 {
-  background-color: #f06292 !important;
-}
-
-.pink-text.text-lighten-2 {
-  color: #f06292 !important;
-}
-
-.pink.lighten-1 {
-  background-color: #ec407a !important;
-}
-
-.pink-text.text-lighten-1 {
-  color: #ec407a !important;
-}
-
-.pink.darken-1 {
-  background-color: #d81b60 !important;
-}
-
-.pink-text.text-darken-1 {
-  color: #d81b60 !important;
-}
-
-.pink.darken-2 {
-  background-color: #c2185b !important;
-}
-
-.pink-text.text-darken-2 {
-  color: #c2185b !important;
-}
-
-.pink.darken-3 {
-  background-color: #ad1457 !important;
-}
-
-.pink-text.text-darken-3 {
-  color: #ad1457 !important;
-}
-
-.pink.darken-4 {
-  background-color: #880e4f !important;
-}
-
-.pink-text.text-darken-4 {
-  color: #880e4f !important;
-}
-
-.pink.accent-1 {
-  background-color: #ff80ab !important;
-}
-
-.pink-text.text-accent-1 {
-  color: #ff80ab !important;
-}
-
-.pink.accent-2 {
-  background-color: #ff4081 !important;
-}
-
-.pink-text.text-accent-2 {
-  color: #ff4081 !important;
-}
-
-.pink.accent-3 {
-  background-color: #f50057 !important;
-}
-
-.pink-text.text-accent-3 {
-  color: #f50057 !important;
-}
-
-.pink.accent-4 {
-  background-color: #c51162 !important;
-}
-
-.pink-text.text-accent-4 {
-  color: #c51162 !important;
-}
-
-.purple {
-  background-color: #9c27b0 !important;
-}
-
-.purple-text {
-  color: #9c27b0 !important;
-}
-
-.purple.lighten-5 {
-  background-color: #f3e5f5 !important;
-}
-
-.purple-text.text-lighten-5 {
-  color: #f3e5f5 !important;
-}
-
-.purple.lighten-4 {
-  background-color: #e1bee7 !important;
-}
-
-.purple-text.text-lighten-4 {
-  color: #e1bee7 !important;
-}
-
-.purple.lighten-3 {
-  background-color: #ce93d8 !important;
-}
-
-.purple-text.text-lighten-3 {
-  color: #ce93d8 !important;
-}
-
-.purple.lighten-2 {
-  background-color: #ba68c8 !important;
-}
-
-.purple-text.text-lighten-2 {
-  color: #ba68c8 !important;
-}
-
-.purple.lighten-1 {
-  background-color: #ab47bc !important;
-}
-
-.purple-text.text-lighten-1 {
-  color: #ab47bc !important;
-}
-
-.purple.darken-1 {
-  background-color: #8e24aa !important;
-}
-
-.purple-text.text-darken-1 {
-  color: #8e24aa !important;
-}
-
-.purple.darken-2 {
-  background-color: #7b1fa2 !important;
-}
-
-.purple-text.text-darken-2 {
-  color: #7b1fa2 !important;
-}
-
-.purple.darken-3 {
-  background-color: #6a1b9a !important;
-}
-
-.purple-text.text-darken-3 {
-  color: #6a1b9a !important;
-}
-
-.purple.darken-4 {
-  background-color: #4a148c !important;
-}
-
-.purple-text.text-darken-4 {
-  color: #4a148c !important;
-}
-
-.purple.accent-1 {
-  background-color: #ea80fc !important;
-}
-
-.purple-text.text-accent-1 {
-  color: #ea80fc !important;
-}
-
-.purple.accent-2 {
-  background-color: #e040fb !important;
-}
-
-.purple-text.text-accent-2 {
-  color: #e040fb !important;
-}
-
-.purple.accent-3 {
-  background-color: #d500f9 !important;
-}
-
-.purple-text.text-accent-3 {
-  color: #d500f9 !important;
-}
-
-.purple.accent-4 {
-  background-color: #aa00ff !important;
-}
-
-.purple-text.text-accent-4 {
-  color: #aa00ff !important;
-}
-
-.deep-purple {
-  background-color: #673ab7 !important;
-}
-
-.deep-purple-text {
-  color: #673ab7 !important;
-}
-
-.deep-purple.lighten-5 {
-  background-color: #ede7f6 !important;
-}
-
-.deep-purple-text.text-lighten-5 {
-  color: #ede7f6 !important;
-}
-
-.deep-purple.lighten-4 {
-  background-color: #d1c4e9 !important;
-}
-
-.deep-purple-text.text-lighten-4 {
-  color: #d1c4e9 !important;
-}
-
-.deep-purple.lighten-3 {
-  background-color: #b39ddb !important;
-}
-
-.deep-purple-text.text-lighten-3 {
-  color: #b39ddb !important;
-}
-
-.deep-purple.lighten-2 {
-  background-color: #9575cd !important;
-}
-
-.deep-purple-text.text-lighten-2 {
-  color: #9575cd !important;
-}
-
-.deep-purple.lighten-1 {
-  background-color: #7e57c2 !important;
-}
-
-.deep-purple-text.text-lighten-1 {
-  color: #7e57c2 !important;
-}
-
-.deep-purple.darken-1 {
-  background-color: #5e35b1 !important;
-}
-
-.deep-purple-text.text-darken-1 {
-  color: #5e35b1 !important;
-}
-
-.deep-purple.darken-2 {
-  background-color: #512da8 !important;
-}
-
-.deep-purple-text.text-darken-2 {
-  color: #512da8 !important;
-}
-
-.deep-purple.darken-3 {
-  background-color: #4527a0 !important;
-}
-
-.deep-purple-text.text-darken-3 {
-  color: #4527a0 !important;
-}
-
-.deep-purple.darken-4 {
-  background-color: #311b92 !important;
-}
-
-.deep-purple-text.text-darken-4 {
-  color: #311b92 !important;
-}
-
-.deep-purple.accent-1 {
-  background-color: #b388ff !important;
-}
-
-.deep-purple-text.text-accent-1 {
-  color: #b388ff !important;
-}
-
-.deep-purple.accent-2 {
-  background-color: #7c4dff !important;
-}
-
-.deep-purple-text.text-accent-2 {
-  color: #7c4dff !important;
-}
-
-.deep-purple.accent-3 {
-  background-color: #651fff !important;
-}
-
-.deep-purple-text.text-accent-3 {
-  color: #651fff !important;
-}
-
-.deep-purple.accent-4 {
-  background-color: #6200ea !important;
-}
-
-.deep-purple-text.text-accent-4 {
-  color: #6200ea !important;
-}
-
-.indigo {
-  background-color: #3f51b5 !important;
-}
-
-.indigo-text {
-  color: #3f51b5 !important;
-}
-
-.indigo.lighten-5 {
-  background-color: #e8eaf6 !important;
-}
-
-.indigo-text.text-lighten-5 {
-  color: #e8eaf6 !important;
-}
-
-.indigo.lighten-4 {
-  background-color: #c5cae9 !important;
-}
-
-.indigo-text.text-lighten-4 {
-  color: #c5cae9 !important;
-}
-
-.indigo.lighten-3 {
-  background-color: #9fa8da !important;
-}
-
-.indigo-text.text-lighten-3 {
-  color: #9fa8da !important;
-}
-
-.indigo.lighten-2 {
-  background-color: #7986cb !important;
-}
-
-.indigo-text.text-lighten-2 {
-  color: #7986cb !important;
-}
-
-.indigo.lighten-1 {
-  background-color: #5c6bc0 !important;
-}
-
-.indigo-text.text-lighten-1 {
-  color: #5c6bc0 !important;
-}
-
-.indigo.darken-1 {
-  background-color: #3949ab !important;
-}
-
-.indigo-text.text-darken-1 {
-  color: #3949ab !important;
-}
-
-.indigo.darken-2 {
-  background-color: #303f9f !important;
-}
-
-.indigo-text.text-darken-2 {
-  color: #303f9f !important;
-}
-
-.indigo.darken-3 {
-  background-color: #283593 !important;
-}
-
-.indigo-text.text-darken-3 {
-  color: #283593 !important;
-}
-
-.indigo.darken-4 {
-  background-color: #1a237e !important;
-}
-
-.indigo-text.text-darken-4 {
-  color: #1a237e !important;
-}
-
-.indigo.accent-1 {
-  background-color: #8c9eff !important;
-}
-
-.indigo-text.text-accent-1 {
-  color: #8c9eff !important;
-}
-
-.indigo.accent-2 {
-  background-color: #536dfe !important;
-}
-
-.indigo-text.text-accent-2 {
-  color: #536dfe !important;
-}
-
-.indigo.accent-3 {
-  background-color: #3d5afe !important;
-}
-
-.indigo-text.text-accent-3 {
-  color: #3d5afe !important;
-}
-
-.indigo.accent-4 {
-  background-color: #304ffe !important;
-}
-
-.indigo-text.text-accent-4 {
-  color: #304ffe !important;
-}
-
-.blue {
-  background-color: #2196F3 !important;
-}
-
-.blue-text {
-  color: #2196F3 !important;
-}
-
-.blue.lighten-5 {
-  background-color: #E3F2FD !important;
-}
-
-.blue-text.text-lighten-5 {
-  color: #E3F2FD !important;
-}
-
-.blue.lighten-4 {
-  background-color: #BBDEFB !important;
-}
-
-.blue-text.text-lighten-4 {
-  color: #BBDEFB !important;
-}
-
-.blue.lighten-3 {
-  background-color: #90CAF9 !important;
-}
-
-.blue-text.text-lighten-3 {
-  color: #90CAF9 !important;
-}
-
-.blue.lighten-2 {
-  background-color: #64B5F6 !important;
-}
-
-.blue-text.text-lighten-2 {
-  color: #64B5F6 !important;
-}
-
-.blue.lighten-1 {
-  background-color: #42A5F5 !important;
-}
-
-.blue-text.text-lighten-1 {
-  color: #42A5F5 !important;
-}
-
-.blue.darken-1 {
-  background-color: #1E88E5 !important;
-}
-
-.blue-text.text-darken-1 {
-  color: #1E88E5 !important;
-}
-
-.blue.darken-2 {
-  background-color: #1976D2 !important;
-}
-
-.blue-text.text-darken-2 {
-  color: #1976D2 !important;
-}
-
-.blue.darken-3 {
-  background-color: #1565C0 !important;
-}
-
-.blue-text.text-darken-3 {
-  color: #1565C0 !important;
-}
-
-.blue.darken-4 {
-  background-color: #0D47A1 !important;
-}
-
-.blue-text.text-darken-4 {
-  color: #0D47A1 !important;
-}
-
-.blue.accent-1 {
-  background-color: #82B1FF !important;
-}
-
-.blue-text.text-accent-1 {
-  color: #82B1FF !important;
-}
-
-.blue.accent-2 {
-  background-color: #448AFF !important;
-}
-
-.blue-text.text-accent-2 {
-  color: #448AFF !important;
-}
-
-.blue.accent-3 {
-  background-color: #2979FF !important;
-}
-
-.blue-text.text-accent-3 {
-  color: #2979FF !important;
-}
-
-.blue.accent-4 {
-  background-color: #2962FF !important;
-}
-
-.blue-text.text-accent-4 {
-  color: #2962FF !important;
-}
-
-.light-blue {
-  background-color: #03a9f4 !important;
-}
-
-.light-blue-text {
-  color: #03a9f4 !important;
-}
-
-.light-blue.lighten-5 {
-  background-color: #e1f5fe !important;
-}
-
-.light-blue-text.text-lighten-5 {
-  color: #e1f5fe !important;
-}
-
-.light-blue.lighten-4 {
-  background-color: #b3e5fc !important;
-}
-
-.light-blue-text.text-lighten-4 {
-  color: #b3e5fc !important;
-}
-
-.light-blue.lighten-3 {
-  background-color: #81d4fa !important;
-}
-
-.light-blue-text.text-lighten-3 {
-  color: #81d4fa !important;
-}
-
-.light-blue.lighten-2 {
-  background-color: #4fc3f7 !important;
-}
-
-.light-blue-text.text-lighten-2 {
-  color: #4fc3f7 !important;
-}
-
-.light-blue.lighten-1 {
-  background-color: #29b6f6 !important;
-}
-
-.light-blue-text.text-lighten-1 {
-  color: #29b6f6 !important;
-}
-
-.light-blue.darken-1 {
-  background-color: #039be5 !important;
-}
-
-.light-blue-text.text-darken-1 {
-  color: #039be5 !important;
-}
-
-.light-blue.darken-2 {
-  background-color: #0288d1 !important;
-}
-
-.light-blue-text.text-darken-2 {
-  color: #0288d1 !important;
-}
-
-.light-blue.darken-3 {
-  background-color: #0277bd !important;
-}
-
-.light-blue-text.text-darken-3 {
-  color: #0277bd !important;
-}
-
-.light-blue.darken-4 {
-  background-color: #01579b !important;
-}
-
-.light-blue-text.text-darken-4 {
-  color: #01579b !important;
-}
-
-.light-blue.accent-1 {
-  background-color: #80d8ff !important;
-}
-
-.light-blue-text.text-accent-1 {
-  color: #80d8ff !important;
-}
-
-.light-blue.accent-2 {
-  background-color: #40c4ff !important;
-}
-
-.light-blue-text.text-accent-2 {
-  color: #40c4ff !important;
-}
-
-.light-blue.accent-3 {
-  background-color: #00b0ff !important;
-}
-
-.light-blue-text.text-accent-3 {
-  color: #00b0ff !important;
-}
-
-.light-blue.accent-4 {
-  background-color: #0091ea !important;
-}
-
-.light-blue-text.text-accent-4 {
-  color: #0091ea !important;
-}
-
-.cyan {
-  background-color: #00bcd4 !important;
-}
-
-.cyan-text {
-  color: #00bcd4 !important;
-}
-
-.cyan.lighten-5 {
-  background-color: #e0f7fa !important;
-}
-
-.cyan-text.text-lighten-5 {
-  color: #e0f7fa !important;
-}
-
-.cyan.lighten-4 {
-  background-color: #b2ebf2 !important;
-}
-
-.cyan-text.text-lighten-4 {
-  color: #b2ebf2 !important;
-}
-
-.cyan.lighten-3 {
-  background-color: #80deea !important;
-}
-
-.cyan-text.text-lighten-3 {
-  color: #80deea !important;
-}
-
-.cyan.lighten-2 {
-  background-color: #4dd0e1 !important;
-}
-
-.cyan-text.text-lighten-2 {
-  color: #4dd0e1 !important;
-}
-
-.cyan.lighten-1 {
-  background-color: #26c6da !important;
-}
-
-.cyan-text.text-lighten-1 {
-  color: #26c6da !important;
-}
-
-.cyan.darken-1 {
-  background-color: #00acc1 !important;
-}
-
-.cyan-text.text-darken-1 {
-  color: #00acc1 !important;
-}
-
-.cyan.darken-2 {
-  background-color: #0097a7 !important;
-}
-
-.cyan-text.text-darken-2 {
-  color: #0097a7 !important;
-}
-
-.cyan.darken-3 {
-  background-color: #00838f !important;
-}
-
-.cyan-text.text-darken-3 {
-  color: #00838f !important;
-}
-
-.cyan.darken-4 {
-  background-color: #006064 !important;
-}
-
-.cyan-text.text-darken-4 {
-  color: #006064 !important;
-}
-
-.cyan.accent-1 {
-  background-color: #84ffff !important;
-}
-
-.cyan-text.text-accent-1 {
-  color: #84ffff !important;
-}
-
-.cyan.accent-2 {
-  background-color: #18ffff !important;
-}
-
-.cyan-text.text-accent-2 {
-  color: #18ffff !important;
-}
-
-.cyan.accent-3 {
-  background-color: #00e5ff !important;
-}
-
-.cyan-text.text-accent-3 {
-  color: #00e5ff !important;
-}
-
-.cyan.accent-4 {
-  background-color: #00b8d4 !important;
-}
-
-.cyan-text.text-accent-4 {
-  color: #00b8d4 !important;
-}
-
-.teal {
-  background-color: #009688 !important;
-}
-
-.teal-text {
-  color: #009688 !important;
-}
-
-.teal.lighten-5 {
-  background-color: #e0f2f1 !important;
-}
-
-.teal-text.text-lighten-5 {
-  color: #e0f2f1 !important;
-}
-
-.teal.lighten-4 {
-  background-color: #b2dfdb !important;
-}
-
-.teal-text.text-lighten-4 {
-  color: #b2dfdb !important;
-}
-
-.teal.lighten-3 {
-  background-color: #80cbc4 !important;
-}
-
-.teal-text.text-lighten-3 {
-  color: #80cbc4 !important;
-}
-
-.teal.lighten-2 {
-  background-color: #4db6ac !important;
-}
-
-.teal-text.text-lighten-2 {
-  color: #4db6ac !important;
-}
-
-.teal.lighten-1 {
-  background-color: #26a69a !important;
-}
-
-.teal-text.text-lighten-1 {
-  color: #26a69a !important;
-}
-
-.teal.darken-1 {
-  background-color: #00897b !important;
-}
-
-.teal-text.text-darken-1 {
-  color: #00897b !important;
-}
-
-.teal.darken-2 {
-  background-color: #00796b !important;
-}
-
-.teal-text.text-darken-2 {
-  color: #00796b !important;
-}
-
-.teal.darken-3 {
-  background-color: #00695c !important;
-}
-
-.teal-text.text-darken-3 {
-  color: #00695c !important;
-}
-
-.teal.darken-4 {
-  background-color: #004d40 !important;
-}
-
-.teal-text.text-darken-4 {
-  color: #004d40 !important;
-}
-
-.teal.accent-1 {
-  background-color: #a7ffeb !important;
-}
-
-.teal-text.text-accent-1 {
-  color: #a7ffeb !important;
-}
-
-.teal.accent-2 {
-  background-color: #64ffda !important;
-}
-
-.teal-text.text-accent-2 {
-  color: #64ffda !important;
-}
-
-.teal.accent-3 {
-  background-color: #1de9b6 !important;
-}
-
-.teal-text.text-accent-3 {
-  color: #1de9b6 !important;
-}
-
-.teal.accent-4 {
-  background-color: #00bfa5 !important;
-}
-
-.teal-text.text-accent-4 {
-  color: #00bfa5 !important;
-}
-
-.green {
-  background-color: #4CAF50 !important;
-}
-
-.green-text {
-  color: #4CAF50 !important;
-}
-
-.green.lighten-5 {
-  background-color: #E8F5E9 !important;
-}
-
-.green-text.text-lighten-5 {
-  color: #E8F5E9 !important;
-}
-
-.green.lighten-4 {
-  background-color: #C8E6C9 !important;
-}
-
-.green-text.text-lighten-4 {
-  color: #C8E6C9 !important;
-}
-
-.green.lighten-3 {
-  background-color: #A5D6A7 !important;
-}
-
-.green-text.text-lighten-3 {
-  color: #A5D6A7 !important;
-}
-
-.green.lighten-2 {
-  background-color: #81C784 !important;
-}
-
-.green-text.text-lighten-2 {
-  color: #81C784 !important;
-}
-
-.green.lighten-1 {
-  background-color: #66BB6A !important;
-}
-
-.green-text.text-lighten-1 {
-  color: #66BB6A !important;
-}
-
-.green.darken-1 {
-  background-color: #43A047 !important;
-}
-
-.green-text.text-darken-1 {
-  color: #43A047 !important;
-}
-
-.green.darken-2 {
-  background-color: #388E3C !important;
-}
-
-.green-text.text-darken-2 {
-  color: #388E3C !important;
-}
-
-.green.darken-3 {
-  background-color: #2E7D32 !important;
-}
-
-.green-text.text-darken-3 {
-  color: #2E7D32 !important;
-}
-
-.green.darken-4 {
-  background-color: #1B5E20 !important;
-}
-
-.green-text.text-darken-4 {
-  color: #1B5E20 !important;
-}
-
-.green.accent-1 {
-  background-color: #B9F6CA !important;
-}
-
-.green-text.text-accent-1 {
-  color: #B9F6CA !important;
-}
-
-.green.accent-2 {
-  background-color: #69F0AE !important;
-}
-
-.green-text.text-accent-2 {
-  color: #69F0AE !important;
-}
-
-.green.accent-3 {
-  background-color: #00E676 !important;
-}
-
-.green-text.text-accent-3 {
-  color: #00E676 !important;
-}
-
-.green.accent-4 {
-  background-color: #00C853 !important;
-}
-
-.green-text.text-accent-4 {
-  color: #00C853 !important;
-}
-
-.light-green {
-  background-color: #8bc34a !important;
-}
-
-.light-green-text {
-  color: #8bc34a !important;
-}
-
-.light-green.lighten-5 {
-  background-color: #f1f8e9 !important;
-}
-
-.light-green-text.text-lighten-5 {
-  color: #f1f8e9 !important;
-}
-
-.light-green.lighten-4 {
-  background-color: #dcedc8 !important;
-}
-
-.light-green-text.text-lighten-4 {
-  color: #dcedc8 !important;
-}
-
-.light-green.lighten-3 {
-  background-color: #c5e1a5 !important;
-}
-
-.light-green-text.text-lighten-3 {
-  color: #c5e1a5 !important;
-}
-
-.light-green.lighten-2 {
-  background-color: #aed581 !important;
-}
-
-.light-green-text.text-lighten-2 {
-  color: #aed581 !important;
-}
-
-.light-green.lighten-1 {
-  background-color: #9ccc65 !important;
-}
-
-.light-green-text.text-lighten-1 {
-  color: #9ccc65 !important;
-}
-
-.light-green.darken-1 {
-  background-color: #7cb342 !important;
-}
-
-.light-green-text.text-darken-1 {
-  color: #7cb342 !important;
-}
-
-.light-green.darken-2 {
-  background-color: #689f38 !important;
-}
-
-.light-green-text.text-darken-2 {
-  color: #689f38 !important;
-}
-
-.light-green.darken-3 {
-  background-color: #558b2f !important;
-}
-
-.light-green-text.text-darken-3 {
-  color: #558b2f !important;
-}
-
-.light-green.darken-4 {
-  background-color: #33691e !important;
-}
-
-.light-green-text.text-darken-4 {
-  color: #33691e !important;
-}
-
-.light-green.accent-1 {
-  background-color: #ccff90 !important;
-}
-
-.light-green-text.text-accent-1 {
-  color: #ccff90 !important;
-}
-
-.light-green.accent-2 {
-  background-color: #b2ff59 !important;
-}
-
-.light-green-text.text-accent-2 {
-  color: #b2ff59 !important;
-}
-
-.light-green.accent-3 {
-  background-color: #76ff03 !important;
-}
-
-.light-green-text.text-accent-3 {
-  color: #76ff03 !important;
-}
-
-.light-green.accent-4 {
-  background-color: #64dd17 !important;
-}
-
-.light-green-text.text-accent-4 {
-  color: #64dd17 !important;
-}
-
-.lime {
-  background-color: #cddc39 !important;
-}
-
-.lime-text {
-  color: #cddc39 !important;
-}
-
-.lime.lighten-5 {
-  background-color: #f9fbe7 !important;
-}
-
-.lime-text.text-lighten-5 {
-  color: #f9fbe7 !important;
-}
-
-.lime.lighten-4 {
-  background-color: #f0f4c3 !important;
-}
-
-.lime-text.text-lighten-4 {
-  color: #f0f4c3 !important;
-}
-
-.lime.lighten-3 {
-  background-color: #e6ee9c !important;
-}
-
-.lime-text.text-lighten-3 {
-  color: #e6ee9c !important;
-}
-
-.lime.lighten-2 {
-  background-color: #dce775 !important;
-}
-
-.lime-text.text-lighten-2 {
-  color: #dce775 !important;
-}
-
-.lime.lighten-1 {
-  background-color: #d4e157 !important;
-}
-
-.lime-text.text-lighten-1 {
-  color: #d4e157 !important;
-}
-
-.lime.darken-1 {
-  background-color: #c0ca33 !important;
-}
-
-.lime-text.text-darken-1 {
-  color: #c0ca33 !important;
-}
-
-.lime.darken-2 {
-  background-color: #afb42b !important;
-}
-
-.lime-text.text-darken-2 {
-  color: #afb42b !important;
-}
-
-.lime.darken-3 {
-  background-color: #9e9d24 !important;
-}
-
-.lime-text.text-darken-3 {
-  color: #9e9d24 !important;
-}
-
-.lime.darken-4 {
-  background-color: #827717 !important;
-}
-
-.lime-text.text-darken-4 {
-  color: #827717 !important;
-}
-
-.lime.accent-1 {
-  background-color: #f4ff81 !important;
-}
-
-.lime-text.text-accent-1 {
-  color: #f4ff81 !important;
-}
-
-.lime.accent-2 {
-  background-color: #eeff41 !important;
-}
-
-.lime-text.text-accent-2 {
-  color: #eeff41 !important;
-}
-
-.lime.accent-3 {
-  background-color: #c6ff00 !important;
-}
-
-.lime-text.text-accent-3 {
-  color: #c6ff00 !important;
-}
-
-.lime.accent-4 {
-  background-color: #aeea00 !important;
-}
-
-.lime-text.text-accent-4 {
-  color: #aeea00 !important;
-}
-
-.yellow {
-  background-color: #ffeb3b !important;
-}
-
-.yellow-text {
-  color: #ffeb3b !important;
-}
-
-.yellow.lighten-5 {
-  background-color: #fffde7 !important;
-}
-
-.yellow-text.text-lighten-5 {
-  color: #fffde7 !important;
-}
-
-.yellow.lighten-4 {
-  background-color: #fff9c4 !important;
-}
-
-.yellow-text.text-lighten-4 {
-  color: #fff9c4 !important;
-}
-
-.yellow.lighten-3 {
-  background-color: #fff59d !important;
-}
-
-.yellow-text.text-lighten-3 {
-  color: #fff59d !important;
-}
-
-.yellow.lighten-2 {
-  background-color: #fff176 !important;
-}
-
-.yellow-text.text-lighten-2 {
-  color: #fff176 !important;
-}
-
-.yellow.lighten-1 {
-  background-color: #ffee58 !important;
-}
-
-.yellow-text.text-lighten-1 {
-  color: #ffee58 !important;
-}
-
-.yellow.darken-1 {
-  background-color: #fdd835 !important;
-}
-
-.yellow-text.text-darken-1 {
-  color: #fdd835 !important;
-}
-
-.yellow.darken-2 {
-  background-color: #fbc02d !important;
-}
-
-.yellow-text.text-darken-2 {
-  color: #fbc02d !important;
-}
-
-.yellow.darken-3 {
-  background-color: #f9a825 !important;
-}
-
-.yellow-text.text-darken-3 {
-  color: #f9a825 !important;
-}
-
-.yellow.darken-4 {
-  background-color: #f57f17 !important;
-}
-
-.yellow-text.text-darken-4 {
-  color: #f57f17 !important;
-}
-
-.yellow.accent-1 {
-  background-color: #ffff8d !important;
-}
-
-.yellow-text.text-accent-1 {
-  color: #ffff8d !important;
-}
-
-.yellow.accent-2 {
-  background-color: #ffff00 !important;
-}
-
-.yellow-text.text-accent-2 {
-  color: #ffff00 !important;
-}
-
-.yellow.accent-3 {
-  background-color: #ffea00 !important;
-}
-
-.yellow-text.text-accent-3 {
-  color: #ffea00 !important;
-}
-
-.yellow.accent-4 {
-  background-color: #ffd600 !important;
-}
-
-.yellow-text.text-accent-4 {
-  color: #ffd600 !important;
-}
-
-.amber {
-  background-color: #ffc107 !important;
-}
-
-.amber-text {
-  color: #ffc107 !important;
-}
-
-.amber.lighten-5 {
-  background-color: #fff8e1 !important;
-}
-
-.amber-text.text-lighten-5 {
-  color: #fff8e1 !important;
-}
-
-.amber.lighten-4 {
-  background-color: #ffecb3 !important;
-}
-
-.amber-text.text-lighten-4 {
-  color: #ffecb3 !important;
-}
-
-.amber.lighten-3 {
-  background-color: #ffe082 !important;
-}
-
-.amber-text.text-lighten-3 {
-  color: #ffe082 !important;
-}
-
-.amber.lighten-2 {
-  background-color: #ffd54f !important;
-}
-
-.amber-text.text-lighten-2 {
-  color: #ffd54f !important;
-}
-
-.amber.lighten-1 {
-  background-color: #ffca28 !important;
-}
-
-.amber-text.text-lighten-1 {
-  color: #ffca28 !important;
-}
-
-.amber.darken-1 {
-  background-color: #ffb300 !important;
-}
-
-.amber-text.text-darken-1 {
-  color: #ffb300 !important;
-}
-
-.amber.darken-2 {
-  background-color: #ffa000 !important;
-}
-
-.amber-text.text-darken-2 {
-  color: #ffa000 !important;
-}
-
-.amber.darken-3 {
-  background-color: #ff8f00 !important;
-}
-
-.amber-text.text-darken-3 {
-  color: #ff8f00 !important;
-}
-
-.amber.darken-4 {
-  background-color: #ff6f00 !important;
-}
-
-.amber-text.text-darken-4 {
-  color: #ff6f00 !important;
-}
-
-.amber.accent-1 {
-  background-color: #ffe57f !important;
-}
-
-.amber-text.text-accent-1 {
-  color: #ffe57f !important;
-}
-
-.amber.accent-2 {
-  background-color: #ffd740 !important;
-}
-
-.amber-text.text-accent-2 {
-  color: #ffd740 !important;
-}
-
-.amber.accent-3 {
-  background-color: #ffc400 !important;
-}
-
-.amber-text.text-accent-3 {
-  color: #ffc400 !important;
-}
-
-.amber.accent-4 {
-  background-color: #ffab00 !important;
-}
-
-.amber-text.text-accent-4 {
-  color: #ffab00 !important;
-}
-
-.orange {
-  background-color: #ff9800 !important;
-}
-
-.orange-text {
-  color: #ff9800 !important;
-}
-
-.orange.lighten-5 {
-  background-color: #fff3e0 !important;
-}
-
-.orange-text.text-lighten-5 {
-  color: #fff3e0 !important;
-}
-
-.orange.lighten-4 {
-  background-color: #ffe0b2 !important;
-}
-
-.orange-text.text-lighten-4 {
-  color: #ffe0b2 !important;
-}
-
-.orange.lighten-3 {
-  background-color: #ffcc80 !important;
-}
-
-.orange-text.text-lighten-3 {
-  color: #ffcc80 !important;
-}
-
-.orange.lighten-2 {
-  background-color: #ffb74d !important;
-}
-
-.orange-text.text-lighten-2 {
-  color: #ffb74d !important;
-}
-
-.orange.lighten-1 {
-  background-color: #ffa726 !important;
-}
-
-.orange-text.text-lighten-1 {
-  color: #ffa726 !important;
-}
-
-.orange.darken-1 {
-  background-color: #fb8c00 !important;
-}
-
-.orange-text.text-darken-1 {
-  color: #fb8c00 !important;
-}
-
-.orange.darken-2 {
-  background-color: #f57c00 !important;
-}
-
-.orange-text.text-darken-2 {
-  color: #f57c00 !important;
-}
-
-.orange.darken-3 {
-  background-color: #ef6c00 !important;
-}
-
-.orange-text.text-darken-3 {
-  color: #ef6c00 !important;
-}
-
-.orange.darken-4 {
-  background-color: #e65100 !important;
-}
-
-.orange-text.text-darken-4 {
-  color: #e65100 !important;
-}
-
-.orange.accent-1 {
-  background-color: #ffd180 !important;
-}
-
-.orange-text.text-accent-1 {
-  color: #ffd180 !important;
-}
-
-.orange.accent-2 {
-  background-color: #ffab40 !important;
-}
-
-.orange-text.text-accent-2 {
-  color: #ffab40 !important;
-}
-
-.orange.accent-3 {
-  background-color: #ff9100 !important;
-}
-
-.orange-text.text-accent-3 {
-  color: #ff9100 !important;
-}
-
-.orange.accent-4 {
-  background-color: #ff6d00 !important;
-}
-
-.orange-text.text-accent-4 {
-  color: #ff6d00 !important;
-}
-
-.deep-orange {
-  background-color: #ff5722 !important;
-}
-
-.deep-orange-text {
-  color: #ff5722 !important;
-}
-
-.deep-orange.lighten-5 {
-  background-color: #fbe9e7 !important;
-}
-
-.deep-orange-text.text-lighten-5 {
-  color: #fbe9e7 !important;
-}
-
-.deep-orange.lighten-4 {
-  background-color: #ffccbc !important;
-}
-
-.deep-orange-text.text-lighten-4 {
-  color: #ffccbc !important;
-}
-
-.deep-orange.lighten-3 {
-  background-color: #ffab91 !important;
-}
-
-.deep-orange-text.text-lighten-3 {
-  color: #ffab91 !important;
-}
-
-.deep-orange.lighten-2 {
-  background-color: #ff8a65 !important;
-}
-
-.deep-orange-text.text-lighten-2 {
-  color: #ff8a65 !important;
-}
-
-.deep-orange.lighten-1 {
-  background-color: #ff7043 !important;
-}
-
-.deep-orange-text.text-lighten-1 {
-  color: #ff7043 !important;
-}
-
-.deep-orange.darken-1 {
-  background-color: #f4511e !important;
-}
-
-.deep-orange-text.text-darken-1 {
-  color: #f4511e !important;
-}
-
-.deep-orange.darken-2 {
-  background-color: #e64a19 !important;
-}
-
-.deep-orange-text.text-darken-2 {
-  color: #e64a19 !important;
-}
-
-.deep-orange.darken-3 {
-  background-color: #d84315 !important;
-}
-
-.deep-orange-text.text-darken-3 {
-  color: #d84315 !important;
-}
-
-.deep-orange.darken-4 {
-  background-color: #bf360c !important;
-}
-
-.deep-orange-text.text-darken-4 {
-  color: #bf360c !important;
-}
-
-.deep-orange.accent-1 {
-  background-color: #ff9e80 !important;
-}
-
-.deep-orange-text.text-accent-1 {
-  color: #ff9e80 !important;
-}
-
-.deep-orange.accent-2 {
-  background-color: #ff6e40 !important;
-}
-
-.deep-orange-text.text-accent-2 {
-  color: #ff6e40 !important;
-}
-
-.deep-orange.accent-3 {
-  background-color: #ff3d00 !important;
-}
-
-.deep-orange-text.text-accent-3 {
-  color: #ff3d00 !important;
-}
-
-.deep-orange.accent-4 {
-  background-color: #dd2c00 !important;
-}
-
-.deep-orange-text.text-accent-4 {
-  color: #dd2c00 !important;
-}
-
-.brown {
-  background-color: #795548 !important;
-}
-
-.brown-text {
-  color: #795548 !important;
-}
-
-.brown.lighten-5 {
-  background-color: #efebe9 !important;
-}
-
-.brown-text.text-lighten-5 {
-  color: #efebe9 !important;
-}
-
-.brown.lighten-4 {
-  background-color: #d7ccc8 !important;
-}
-
-.brown-text.text-lighten-4 {
-  color: #d7ccc8 !important;
-}
-
-.brown.lighten-3 {
-  background-color: #bcaaa4 !important;
-}
-
-.brown-text.text-lighten-3 {
-  color: #bcaaa4 !important;
-}
-
-.brown.lighten-2 {
-  background-color: #a1887f !important;
-}
-
-.brown-text.text-lighten-2 {
-  color: #a1887f !important;
-}
-
-.brown.lighten-1 {
-  background-color: #8d6e63 !important;
-}
-
-.brown-text.text-lighten-1 {
-  color: #8d6e63 !important;
-}
-
-.brown.darken-1 {
-  background-color: #6d4c41 !important;
-}
-
-.brown-text.text-darken-1 {
-  color: #6d4c41 !important;
-}
-
-.brown.darken-2 {
-  background-color: #5d4037 !important;
-}
-
-.brown-text.text-darken-2 {
-  color: #5d4037 !important;
-}
-
-.brown.darken-3 {
-  background-color: #4e342e !important;
-}
-
-.brown-text.text-darken-3 {
-  color: #4e342e !important;
-}
-
-.brown.darken-4 {
-  background-color: #3e2723 !important;
-}
-
-.brown-text.text-darken-4 {
-  color: #3e2723 !important;
-}
-
-.blue-grey {
-  background-color: #607d8b !important;
-}
-
-.blue-grey-text {
-  color: #607d8b !important;
-}
-
-.blue-grey.lighten-5 {
-  background-color: #eceff1 !important;
-}
-
-.blue-grey-text.text-lighten-5 {
-  color: #eceff1 !important;
-}
-
-.blue-grey.lighten-4 {
-  background-color: #cfd8dc !important;
-}
-
-.blue-grey-text.text-lighten-4 {
-  color: #cfd8dc !important;
-}
-
-.blue-grey.lighten-3 {
-  background-color: #b0bec5 !important;
-}
-
-.blue-grey-text.text-lighten-3 {
-  color: #b0bec5 !important;
-}
-
-.blue-grey.lighten-2 {
-  background-color: #90a4ae !important;
-}
-
-.blue-grey-text.text-lighten-2 {
-  color: #90a4ae !important;
-}
-
-.blue-grey.lighten-1 {
-  background-color: #78909c !important;
-}
-
-.blue-grey-text.text-lighten-1 {
-  color: #78909c !important;
-}
-
-.blue-grey.darken-1 {
-  background-color: #546e7a !important;
-}
-
-.blue-grey-text.text-darken-1 {
-  color: #546e7a !important;
-}
-
-.blue-grey.darken-2 {
-  background-color: #455a64 !important;
-}
-
-.blue-grey-text.text-darken-2 {
-  color: #455a64 !important;
-}
-
-.blue-grey.darken-3 {
-  background-color: #37474f !important;
-}
-
-.blue-grey-text.text-darken-3 {
-  color: #37474f !important;
-}
-
-.blue-grey.darken-4 {
-  background-color: #263238 !important;
-}
-
-.blue-grey-text.text-darken-4 {
-  color: #263238 !important;
-}
-
-.grey {
-  background-color: #9e9e9e !important;
-}
-
-.grey-text {
-  color: #9e9e9e !important;
-}
-
-.grey.lighten-5 {
-  background-color: #fafafa !important;
-}
-
-.grey-text.text-lighten-5 {
-  color: #fafafa !important;
-}
-
-.grey.lighten-4 {
-  background-color: #f5f5f5 !important;
-}
-
-.grey-text.text-lighten-4 {
-  color: #f5f5f5 !important;
-}
-
-.grey.lighten-3 {
-  background-color: #eeeeee !important;
-}
-
-.grey-text.text-lighten-3 {
-  color: #eeeeee !important;
-}
-
-.grey.lighten-2 {
-  background-color: #e0e0e0 !important;
-}
-
-.grey-text.text-lighten-2 {
-  color: #e0e0e0 !important;
-}
-
-.grey.lighten-1 {
-  background-color: #bdbdbd !important;
-}
-
-.grey-text.text-lighten-1 {
-  color: #bdbdbd !important;
-}
-
-.grey.darken-1 {
-  background-color: #757575 !important;
-}
-
-.grey-text.text-darken-1 {
-  color: #757575 !important;
-}
-
-.grey.darken-2 {
-  background-color: #616161 !important;
-}
-
-.grey-text.text-darken-2 {
-  color: #616161 !important;
-}
-
-.grey.darken-3 {
-  background-color: #424242 !important;
-}
-
-.grey-text.text-darken-3 {
-  color: #424242 !important;
-}
-
-.grey.darken-4 {
-  background-color: #212121 !important;
-}
-
-.grey-text.text-darken-4 {
-  color: #212121 !important;
-}
-
-.black {
-  background-color: #000000 !important;
-}
-
-.black-text {
-  color: #000000 !important;
-}
-
-.white {
-  background-color: #FFFFFF !important;
-}
-
-.white-text {
-  color: #FFFFFF !important;
-}
-
-.transparent {
-  background-color: transparent !important;
-}
-
-.transparent-text {
-  color: transparent !important;
-}
-
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-/**
- * 1. Set default font family to sans-serif.
- * 2. Prevent iOS and IE text size adjust after device orientation change,
- *    without disabling user zoom.
- */
-html {
-  font-family: sans-serif;
-  /* 1 */
-  -ms-text-size-adjust: 100%;
-  /* 2 */
-  -webkit-text-size-adjust: 100%;
-  /* 2 */
-}
-
-/**
- * Remove default margin.
- */
-body {
-  margin: 0;
-}
-
-/* HTML5 display definitions
-   ========================================================================== */
-/**
- * Correct `block` display not defined for any HTML5 element in IE 8/9.
- * Correct `block` display not defined for `details` or `summary` in IE 10/11
- * and Firefox.
- * Correct `block` display not defined for `main` in IE 11.
- */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-
-/**
- * 1. Correct `inline-block` display not defined in IE 8/9.
- * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
- */
-audio,
-canvas,
-progress,
-video {
-  display: inline-block;
-  /* 1 */
-  vertical-align: baseline;
-  /* 2 */
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-/**
- * Address `[hidden]` styling not present in IE 8/9/10.
- * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
- */
-[hidden],
-template {
-  display: none;
-}
-
-/* Links
-   ========================================================================== */
-/**
- * Remove the gray background color from active links in IE 10.
- */
-a {
-  background-color: transparent;
-}
-
-/**
- * Improve readability of focused elements when they are also in an
- * active/hover state.
- */
-a:active,
-a:hover {
-  outline: 0;
-}
-
-/* Text-level semantics
-   ========================================================================== */
-/**
- * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
- */
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
- */
-b,
-strong {
-  font-weight: bold;
-}
-
-/**
- * Address styling not present in Safari and Chrome.
- */
-dfn {
-  font-style: italic;
-}
-
-/**
- * Address variable `h1` font-size and margin within `section` and `article`
- * contexts in Firefox 4+, Safari, and Chrome.
- */
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-/**
- * Address styling not present in IE 8/9.
- */
-mark {
-  background: #ff0;
-  color: #000;
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-small {
-  font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-/* Embedded content
-   ========================================================================== */
-/**
- * Remove border when inside `a` element in IE 8/9/10.
- */
-img {
-  border: 0;
-}
-
-/**
- * Correct overflow not hidden in IE 9/10/11.
- */
-svg:not(:root) {
-  overflow: hidden;
-}
-
-/* Grouping content
-   ========================================================================== */
-/**
- * Address margin not present in IE 8/9 and Safari.
- */
-figure {
-  margin: 1em 40px;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- */
-hr {
-  box-sizing: content-box;
-  height: 0;
-}
-
-/**
- * Contain overflow in all browsers.
- */
-pre {
-  overflow: auto;
-}
-
-/**
- * Address odd `em`-unit font size rendering in all browsers.
- */
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-/* Forms
-   ========================================================================== */
-/**
- * Known limitation: by default, Chrome and Safari on OS X allow very limited
- * styling of `select`, unless a `border` property is set.
- */
-/**
- * 1. Correct color not being inherited.
- *    Known issue: affects color of disabled elements.
- * 2. Correct font properties not being inherited.
- * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
- */
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit;
-  /* 1 */
-  font: inherit;
-  /* 2 */
-  margin: 0;
-  /* 3 */
-}
-
-/**
- * Address `overflow` set to `hidden` in IE 8/9/10/11.
- */
-button {
-  overflow: visible;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
- * Correct `select` style inheritance in Firefox.
- */
-button,
-select {
-  text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- *    `input` and others.
- */
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button;
-  /* 2 */
-  cursor: pointer;
-  /* 3 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-
-/**
- * Remove inner padding and border in Firefox 4+.
- */
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-
-/**
- * Address Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-input {
-  line-height: normal;
-}
-
-/**
- * It's recommended that you don't attempt to style these elements.
- * Firefox's implementation doesn't respect box-sizing, padding, or width.
- *
- * 1. Address box sizing set to `content-box` in IE 8/9/10.
- * 2. Remove excess padding in IE 8/9/10.
- */
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box;
-  /* 1 */
-  padding: 0;
-  /* 2 */
-}
-
-/**
- * Fix the cursor style for Chrome's increment/decrement buttons. For certain
- * `font-size` values of the `input`, it causes the cursor style of the
- * decrement button to change from `default` to `text`.
- */
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
- */
-input[type="search"] {
-  -webkit-appearance: textfield;
-  /* 1 */
-  box-sizing: content-box;
-  /* 2 */
-}
-
-/**
- * Remove inner padding and search cancel button in Safari and Chrome on OS X.
- * Safari (but not Chrome) clips the cancel button when the search input has
- * padding (and `textfield` appearance).
- */
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-/**
- * Define consistent border, margin, and padding.
- */
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct `color` not being inherited in IE 8/9/10/11.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-legend {
-  border: 0;
-  /* 1 */
-  padding: 0;
-  /* 2 */
-}
-
-/**
- * Remove default vertical scrollbar in IE 8/9/10/11.
- */
-textarea {
-  overflow: auto;
-}
-
-/**
- * Don't inherit the `font-weight` (applied by a rule above).
- * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
- */
-optgroup {
-  font-weight: bold;
-}
-
-/* Tables
-   ========================================================================== */
-/**
- * Remove most spacing between table cells.
- */
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-}
-
-html {
-  box-sizing: border-box;
-}
-
-*, *:before, *:after {
-  box-sizing: inherit;
-}
-
-ul:not(.browser-default) {
-  padding-left: 0;
-  list-style-type: none;
-}
-
-ul:not(.browser-default) li {
-  list-style-type: none;
-}
-
-a {
-  color: #039be5;
-  text-decoration: none;
-  -webkit-tap-highlight-color: transparent;
-}
-
-.valign-wrapper {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-}
-
-.clearfix {
-  clear: both;
-}
-
-.z-depth-0 {
-  box-shadow: none !important;
-}
-
-.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible, .side-nav {
-  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
-}
-
-.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover {
-  box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);
-}
-
-.z-depth-2 {
-  box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
-}
-
-.z-depth-3 {
-  box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3);
-}
-
-.z-depth-4, .modal {
-  box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3);
-}
-
-.z-depth-5 {
-  box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3);
-}
-
-.hoverable {
-  transition: box-shadow .25s;
-  box-shadow: 0;
-}
-
-.hoverable:hover {
-  transition: box-shadow .25s;
-  box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
-}
-
-.divider {
-  height: 1px;
-  overflow: hidden;
-  background-color: #e0e0e0;
-}
-
-blockquote {
-  margin: 20px 0;
-  padding-left: 1.5rem;
-  border-left: 5px solid #ee6e73;
-}
-
-i {
-  line-height: inherit;
-}
-
-i.left {
-  float: left;
-  margin-right: 15px;
-}
-
-i.right {
-  float: right;
-  margin-left: 15px;
-}
-
-i.tiny {
-  font-size: 1rem;
-}
-
-i.small {
-  font-size: 2rem;
-}
-
-i.medium {
-  font-size: 4rem;
-}
-
-i.large {
-  font-size: 6rem;
-}
-
-img.responsive-img,
-video.responsive-video {
-  max-width: 100%;
-  height: auto;
-}
-
-.pagination li {
-  display: inline-block;
-  border-radius: 2px;
-  text-align: center;
-  vertical-align: top;
-  height: 30px;
-}
-
-.pagination li a {
-  color: #444;
-  display: inline-block;
-  font-size: 1.2rem;
-  padding: 0 10px;
-  line-height: 30px;
-}
-
-.pagination li.active a {
-  color: #fff;
-}
-
-.pagination li.active {
-  background-color: #ee6e73;
-}
-
-.pagination li.disabled a {
-  cursor: default;
-  color: #999;
-}
-
-.pagination li i {
-  font-size: 2rem;
-}
-
-.pagination li.pages ul li {
-  display: inline-block;
-  float: none;
-}
-
-@media only screen and (max-width: 992px) {
-  .pagination {
-    width: 100%;
-  }
-  .pagination li.prev,
-  .pagination li.next {
-    width: 10%;
-  }
-  .pagination li.pages {
-    width: 80%;
-    overflow: hidden;
-    white-space: nowrap;
-  }
-}
-
-.breadcrumb {
-  font-size: 18px;
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.breadcrumb i,
-.breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"],
-.breadcrumb i.material-icons {
-  display: inline-block;
-  float: left;
-  font-size: 24px;
-}
-
-.breadcrumb:before {
-  content: '\E5CC';
-  color: rgba(255, 255, 255, 0.7);
-  vertical-align: top;
-  display: inline-block;
-  font-family: 'Material Icons';
-  font-weight: normal;
-  font-style: normal;
-  font-size: 25px;
-  margin: 0 10px 0 8px;
-  -webkit-font-smoothing: antialiased;
-}
-
-.breadcrumb:first-child:before {
-  display: none;
-}
-
-.breadcrumb:last-child {
-  color: #fff;
-}
-
-.parallax-container {
-  position: relative;
-  overflow: hidden;
-  height: 500px;
-}
-
-.parallax {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: -1;
-}
-
-.parallax img {
-  display: none;
-  position: absolute;
-  left: 50%;
-  bottom: 0;
-  min-width: 100%;
-  min-height: 100%;
-  -webkit-transform: translate3d(0, 0, 0);
-  transform: translate3d(0, 0, 0);
-  -webkit-transform: translateX(-50%);
-          transform: translateX(-50%);
-}
-
-.pin-top, .pin-bottom {
-  position: relative;
-}
-
-.pinned {
-  position: fixed !important;
-}
-
-/*********************
-  Transition Classes
-**********************/
-ul.staggered-list li {
-  opacity: 0;
-}
-
-.fade-in {
-  opacity: 0;
-  -webkit-transform-origin: 0 50%;
-          transform-origin: 0 50%;
-}
-
-/*********************
-  Media Query Classes
-**********************/
-@media only screen and (max-width: 600px) {
-  .hide-on-small-only, .hide-on-small-and-down {
-    display: none !important;
-  }
-}
-
-@media only screen and (max-width: 992px) {
-  .hide-on-med-and-down {
-    display: none !important;
-  }
-}
-
-@media only screen and (min-width: 601px) {
-  .hide-on-med-and-up {
-    display: none !important;
-  }
-}
-
-@media only screen and (min-width: 600px) and (max-width: 992px) {
-  .hide-on-med-only {
-    display: none !important;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  .hide-on-large-only {
-    display: none !important;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  .show-on-large {
-    display: block !important;
-  }
-}
-
-@media only screen and (min-width: 600px) and (max-width: 992px) {
-  .show-on-medium {
-    display: block !important;
-  }
-}
-
-@media only screen and (max-width: 600px) {
-  .show-on-small {
-    display: block !important;
-  }
-}
-
-@media only screen and (min-width: 601px) {
-  .show-on-medium-and-up {
-    display: block !important;
-  }
-}
-
-@media only screen and (max-width: 992px) {
-  .show-on-medium-and-down {
-    display: block !important;
-  }
-}
-
-@media only screen and (max-width: 600px) {
-  .center-on-small-only {
-    text-align: center;
-  }
-}
-
-.page-footer {
-  padding-top: 20px;
-  background-color: #ee6e73;
-}
-
-.page-footer .footer-copyright {
-  overflow: hidden;
-  min-height: 50px;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  padding: 10px 0px;
-  color: rgba(255, 255, 255, 0.8);
-  background-color: rgba(51, 51, 51, 0.08);
-}
-
-table, th, td {
-  border: none;
-}
-
-table {
-  width: 100%;
-  display: table;
-}
-
-table.bordered > thead > tr,
-table.bordered > tbody > tr {
-  border-bottom: 1px solid #d0d0d0;
-}
-
-table.striped > tbody > tr:nth-child(odd) {
-  background-color: #f2f2f2;
-}
-
-table.striped > tbody > tr > td {
-  border-radius: 0;
-}
-
-table.highlight > tbody > tr {
-  transition: background-color .25s ease;
-}
-
-table.highlight > tbody > tr:hover {
-  background-color: #f2f2f2;
-}
-
-table.centered thead tr th, table.centered tbody tr td {
-  text-align: center;
-}
-
-thead {
-  border-bottom: 1px solid #d0d0d0;
-}
-
-td, th {
-  padding: 15px 5px;
-  display: table-cell;
-  text-align: left;
-  vertical-align: middle;
-  border-radius: 2px;
-}
-
-@media only screen and (max-width: 992px) {
-  table.responsive-table {
-    width: 100%;
-    border-collapse: collapse;
-    border-spacing: 0;
-    display: block;
-    position: relative;
-    /* sort out borders */
-  }
-  table.responsive-table td:empty:before {
-    content: '\00a0';
-  }
-  table.responsive-table th,
-  table.responsive-table td {
-    margin: 0;
-    vertical-align: top;
-  }
-  table.responsive-table th {
-    text-align: left;
-  }
-  table.responsive-table thead {
-    display: block;
-    float: left;
-  }
-  table.responsive-table thead tr {
-    display: block;
-    padding: 0 10px 0 0;
-  }
-  table.responsive-table thead tr th::before {
-    content: "\00a0";
-  }
-  table.responsive-table tbody {
-    display: block;
-    width: auto;
-    position: relative;
-    overflow-x: auto;
-    white-space: nowrap;
-  }
-  table.responsive-table tbody tr {
-    display: inline-block;
-    vertical-align: top;
-  }
-  table.responsive-table th {
-    display: block;
-    text-align: right;
-  }
-  table.responsive-table td {
-    display: block;
-    min-height: 1.25em;
-    text-align: left;
-  }
-  table.responsive-table tr {
-    padding: 0 10px;
-  }
-  table.responsive-table thead {
-    border: 0;
-    border-right: 1px solid #d0d0d0;
-  }
-  table.responsive-table.bordered th {
-    border-bottom: 0;
-    border-left: 0;
-  }
-  table.responsive-table.bordered td {
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 0;
-  }
-  table.responsive-table.bordered tr {
-    border: 0;
-  }
-  table.responsive-table.bordered tbody tr {
-    border-right: 1px solid #d0d0d0;
-  }
-}
-
-.collection {
-  margin: 0.5rem 0 1rem 0;
-  border: 1px solid #e0e0e0;
-  border-radius: 2px;
-  overflow: hidden;
-  position: relative;
-}
-
-.collection .collection-item {
-  background-color: #fff;
-  line-height: 1.5rem;
-  padding: 10px 20px;
-  margin: 0;
-  border-bottom: 1px solid #e0e0e0;
-}
-
-.collection .collection-item.avatar {
-  min-height: 84px;
-  padding-left: 72px;
-  position: relative;
-}
-
-.collection .collection-item.avatar .circle {
-  position: absolute;
-  width: 42px;
-  height: 42px;
-  overflow: hidden;
-  left: 15px;
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.collection .collection-item.avatar i.circle {
-  font-size: 18px;
-  line-height: 42px;
-  color: #fff;
-  background-color: #999;
-  text-align: center;
-}
-
-.collection .collection-item.avatar .title {
-  font-size: 16px;
-}
-
-.collection .collection-item.avatar p {
-  margin: 0;
-}
-
-.collection .collection-item.avatar .secondary-content {
-  position: absolute;
-  top: 16px;
-  right: 16px;
-}
-
-.collection .collection-item:last-child {
-  border-bottom: none;
-}
-
-.collection .collection-item.active {
-  background-color: #26a69a;
-  color: #eafaf9;
-}
-
-.collection .collection-item.active .secondary-content {
-  color: #fff;
-}
-
-.collection a.collection-item {
-  display: block;
-  transition: .25s;
-  color: #26a69a;
-}
-
-.collection a.collection-item:not(.active):hover {
-  background-color: #ddd;
-}
-
-.collection.with-header .collection-header {
-  background-color: #fff;
-  border-bottom: 1px solid #e0e0e0;
-  padding: 10px 20px;
-}
-
-.collection.with-header .collection-item {
-  padding-left: 30px;
-}
-
-.collection.with-header .collection-item.avatar {
-  padding-left: 72px;
-}
-
-.secondary-content {
-  float: right;
-  color: #26a69a;
-}
-
-.collapsible .collection {
-  margin: 0;
-  border: none;
-}
-
-.video-container {
-  position: relative;
-  padding-bottom: 56.25%;
-  height: 0;
-  overflow: hidden;
-}
-
-.video-container iframe, .video-container object, .video-container embed {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.progress {
-  position: relative;
-  height: 4px;
-  display: block;
-  width: 100%;
-  background-color: #acece6;
-  border-radius: 2px;
-  margin: 0.5rem 0 1rem 0;
-  overflow: hidden;
-}
-
-.progress .determinate {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  background-color: #26a69a;
-  transition: width .3s linear;
-}
-
-.progress .indeterminate {
-  background-color: #26a69a;
-}
-
-.progress .indeterminate:before {
-  content: '';
-  position: absolute;
-  background-color: inherit;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  will-change: left, right;
-  -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
-          animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
-}
-
-.progress .indeterminate:after {
-  content: '';
-  position: absolute;
-  background-color: inherit;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  will-change: left, right;
-  -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-          animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
-  -webkit-animation-delay: 1.15s;
-          animation-delay: 1.15s;
-}
-
-@-webkit-keyframes indeterminate {
-  0% {
-    left: -35%;
-    right: 100%;
-  }
-  60% {
-    left: 100%;
-    right: -90%;
-  }
-  100% {
-    left: 100%;
-    right: -90%;
-  }
-}
-
-@keyframes indeterminate {
-  0% {
-    left: -35%;
-    right: 100%;
-  }
-  60% {
-    left: 100%;
-    right: -90%;
-  }
-  100% {
-    left: 100%;
-    right: -90%;
-  }
-}
-
-@-webkit-keyframes indeterminate-short {
-  0% {
-    left: -200%;
-    right: 100%;
-  }
-  60% {
-    left: 107%;
-    right: -8%;
-  }
-  100% {
-    left: 107%;
-    right: -8%;
-  }
-}
-
-@keyframes indeterminate-short {
-  0% {
-    left: -200%;
-    right: 100%;
-  }
-  60% {
-    left: 107%;
-    right: -8%;
-  }
-  100% {
-    left: 107%;
-    right: -8%;
-  }
-}
-
-/*******************
-  Utility Classes
-*******************/
-.hide {
-  display: none !important;
-}
-
-.left-align {
-  text-align: left;
-}
-
-.right-align {
-  text-align: right;
-}
-
-.center, .center-align {
-  text-align: center;
-}
-
-.left {
-  float: left !important;
-}
-
-.right {
-  float: right !important;
-}
-
-.no-select, input[type=range],
-input[type=range] + .thumb {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.circle {
-  border-radius: 50%;
-}
-
-.center-block {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.truncate {
-  display: block;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.no-padding {
-  padding: 0 !important;
-}
-
-span.badge {
-  min-width: 3rem;
-  padding: 0 6px;
-  margin-left: 14px;
-  text-align: center;
-  font-size: 1rem;
-  line-height: 22px;
-  height: 22px;
-  color: #757575;
-  float: right;
-  box-sizing: border-box;
-}
-
-span.badge.new {
-  font-weight: 300;
-  font-size: 0.8rem;
-  color: #fff;
-  background-color: #26a69a;
-  border-radius: 2px;
-}
-
-span.badge.new:after {
-  content: " new";
-}
-
-span.badge[data-badge-caption]::after {
-  content: " " attr(data-badge-caption);
-}
-
-nav ul a span.badge {
-  display: inline-block;
-  float: none;
-  margin-left: 4px;
-  line-height: 22px;
-  height: 22px;
-}
-
-.collection-item span.badge {
-  margin-top: calc(0.75rem - 11px);
-}
-
-.collapsible span.badge {
-  margin-top: calc(1.5rem - 11px);
-}
-
-.side-nav span.badge {
-  margin-top: calc(24px - 11px);
-}
-
-/* This is needed for some mobile phones to display the Google Icon font properly */
-.material-icons {
-  text-rendering: optimizeLegibility;
-  -webkit-font-feature-settings: 'liga';
-     -moz-font-feature-settings: 'liga';
-          font-feature-settings: 'liga';
-}
-
-.container {
-  margin: 0 auto;
-  max-width: 1280px;
-  width: 90%;
-}
-
-@media only screen and (min-width: 601px) {
-  .container {
-    width: 85%;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  .container {
-    width: 70%;
-  }
-}
-
-.container .row {
-  margin-left: -0.75rem;
-  margin-right: -0.75rem;
-}
-
-.section {
-  padding-top: 1rem;
-  padding-bottom: 1rem;
-}
-
-.section.no-pad {
-  padding: 0;
-}
-
-.section.no-pad-bot {
-  padding-bottom: 0;
-}
-
-.section.no-pad-top {
-  padding-top: 0;
-}
-
-.row {
-  margin-left: auto;
-  margin-right: auto;
-  margin-bottom: 20px;
-}
-
-.row:after {
-  content: "";
-  display: table;
-  clear: both;
-}
-
-.row .col {
-  float: left;
-  box-sizing: border-box;
-  padding: 0 0.75rem;
-  min-height: 1px;
-}
-
-.row .col[class*="push-"], .row .col[class*="pull-"] {
-  position: relative;
-}
-
-.row .col.s1 {
-  width: 8.3333333333%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s2 {
-  width: 16.6666666667%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s3 {
-  width: 25%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s4 {
-  width: 33.3333333333%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s5 {
-  width: 41.6666666667%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s6 {
-  width: 50%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s7 {
-  width: 58.3333333333%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s8 {
-  width: 66.6666666667%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s9 {
-  width: 75%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s10 {
-  width: 83.3333333333%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s11 {
-  width: 91.6666666667%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.s12 {
-  width: 100%;
-  margin-left: auto;
-  left: auto;
-  right: auto;
-}
-
-.row .col.offset-s1 {
-  margin-left: 8.3333333333%;
-}
-
-.row .col.pull-s1 {
-  right: 8.3333333333%;
-}
-
-.row .col.push-s1 {
-  left: 8.3333333333%;
-}
-
-.row .col.offset-s2 {
-  margin-left: 16.6666666667%;
-}
-
-.row .col.pull-s2 {
-  right: 16.6666666667%;
-}
-
-.row .col.push-s2 {
-  left: 16.6666666667%;
-}
-
-.row .col.offset-s3 {
-  margin-left: 25%;
-}
-
-.row .col.pull-s3 {
-  right: 25%;
-}
-
-.row .col.push-s3 {
-  left: 25%;
-}
-
-.row .col.offset-s4 {
-  margin-left: 33.3333333333%;
-}
-
-.row .col.pull-s4 {
-  right: 33.3333333333%;
-}
-
-.row .col.push-s4 {
-  left: 33.3333333333%;
-}
-
-.row .col.offset-s5 {
-  margin-left: 41.6666666667%;
-}
-
-.row .col.pull-s5 {
-  right: 41.6666666667%;
-}
-
-.row .col.push-s5 {
-  left: 41.6666666667%;
-}
-
-.row .col.offset-s6 {
-  margin-left: 50%;
-}
-
-.row .col.pull-s6 {
-  right: 50%;
-}
-
-.row .col.push-s6 {
-  left: 50%;
-}
-
-.row .col.offset-s7 {
-  margin-left: 58.3333333333%;
-}
-
-.row .col.pull-s7 {
-  right: 58.3333333333%;
-}
-
-.row .col.push-s7 {
-  left: 58.3333333333%;
-}
-
-.row .col.offset-s8 {
-  margin-left: 66.6666666667%;
-}
-
-.row .col.pull-s8 {
-  right: 66.6666666667%;
-}
-
-.row .col.push-s8 {
-  left: 66.6666666667%;
-}
-
-.row .col.offset-s9 {
-  margin-left: 75%;
-}
-
-.row .col.pull-s9 {
-  right: 75%;
-}
-
-.row .col.push-s9 {
-  left: 75%;
-}
-
-.row .col.offset-s10 {
-  margin-left: 83.3333333333%;
-}
-
-.row .col.pull-s10 {
-  right: 83.3333333333%;
-}
-
-.row .col.push-s10 {
-  left: 83.3333333333%;
-}
-
-.row .col.offset-s11 {
-  margin-left: 91.6666666667%;
-}
-
-.row .col.pull-s11 {
-  right: 91.6666666667%;
-}
-
-.row .col.push-s11 {
-  left: 91.6666666667%;
-}
-
-.row .col.offset-s12 {
-  margin-left: 100%;
-}
-
-.row .col.pull-s12 {
-  right: 100%;
-}
-
-.row .col.push-s12 {
-  left: 100%;
-}
-
-@media only screen and (min-width: 601px) {
-  .row .col.m1 {
-    width: 8.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m2 {
-    width: 16.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m3 {
-    width: 25%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m4 {
-    width: 33.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m5 {
-    width: 41.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m6 {
-    width: 50%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m7 {
-    width: 58.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m8 {
-    width: 66.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m9 {
-    width: 75%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m10 {
-    width: 83.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m11 {
-    width: 91.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.m12 {
-    width: 100%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.offset-m1 {
-    margin-left: 8.3333333333%;
-  }
-  .row .col.pull-m1 {
-    right: 8.3333333333%;
-  }
-  .row .col.push-m1 {
-    left: 8.3333333333%;
-  }
-  .row .col.offset-m2 {
-    margin-left: 16.6666666667%;
-  }
-  .row .col.pull-m2 {
-    right: 16.6666666667%;
-  }
-  .row .col.push-m2 {
-    left: 16.6666666667%;
-  }
-  .row .col.offset-m3 {
-    margin-left: 25%;
-  }
-  .row .col.pull-m3 {
-    right: 25%;
-  }
-  .row .col.push-m3 {
-    left: 25%;
-  }
-  .row .col.offset-m4 {
-    margin-left: 33.3333333333%;
-  }
-  .row .col.pull-m4 {
-    right: 33.3333333333%;
-  }
-  .row .col.push-m4 {
-    left: 33.3333333333%;
-  }
-  .row .col.offset-m5 {
-    margin-left: 41.6666666667%;
-  }
-  .row .col.pull-m5 {
-    right: 41.6666666667%;
-  }
-  .row .col.push-m5 {
-    left: 41.6666666667%;
-  }
-  .row .col.offset-m6 {
-    margin-left: 50%;
-  }
-  .row .col.pull-m6 {
-    right: 50%;
-  }
-  .row .col.push-m6 {
-    left: 50%;
-  }
-  .row .col.offset-m7 {
-    margin-left: 58.3333333333%;
-  }
-  .row .col.pull-m7 {
-    right: 58.3333333333%;
-  }
-  .row .col.push-m7 {
-    left: 58.3333333333%;
-  }
-  .row .col.offset-m8 {
-    margin-left: 66.6666666667%;
-  }
-  .row .col.pull-m8 {
-    right: 66.6666666667%;
-  }
-  .row .col.push-m8 {
-    left: 66.6666666667%;
-  }
-  .row .col.offset-m9 {
-    margin-left: 75%;
-  }
-  .row .col.pull-m9 {
-    right: 75%;
-  }
-  .row .col.push-m9 {
-    left: 75%;
-  }
-  .row .col.offset-m10 {
-    margin-left: 83.3333333333%;
-  }
-  .row .col.pull-m10 {
-    right: 83.3333333333%;
-  }
-  .row .col.push-m10 {
-    left: 83.3333333333%;
-  }
-  .row .col.offset-m11 {
-    margin-left: 91.6666666667%;
-  }
-  .row .col.pull-m11 {
-    right: 91.6666666667%;
-  }
-  .row .col.push-m11 {
-    left: 91.6666666667%;
-  }
-  .row .col.offset-m12 {
-    margin-left: 100%;
-  }
-  .row .col.pull-m12 {
-    right: 100%;
-  }
-  .row .col.push-m12 {
-    left: 100%;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  .row .col.l1 {
-    width: 8.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l2 {
-    width: 16.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l3 {
-    width: 25%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l4 {
-    width: 33.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l5 {
-    width: 41.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l6 {
-    width: 50%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l7 {
-    width: 58.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l8 {
-    width: 66.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l9 {
-    width: 75%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l10 {
-    width: 83.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l11 {
-    width: 91.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.l12 {
-    width: 100%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.offset-l1 {
-    margin-left: 8.3333333333%;
-  }
-  .row .col.pull-l1 {
-    right: 8.3333333333%;
-  }
-  .row .col.push-l1 {
-    left: 8.3333333333%;
-  }
-  .row .col.offset-l2 {
-    margin-left: 16.6666666667%;
-  }
-  .row .col.pull-l2 {
-    right: 16.6666666667%;
-  }
-  .row .col.push-l2 {
-    left: 16.6666666667%;
-  }
-  .row .col.offset-l3 {
-    margin-left: 25%;
-  }
-  .row .col.pull-l3 {
-    right: 25%;
-  }
-  .row .col.push-l3 {
-    left: 25%;
-  }
-  .row .col.offset-l4 {
-    margin-left: 33.3333333333%;
-  }
-  .row .col.pull-l4 {
-    right: 33.3333333333%;
-  }
-  .row .col.push-l4 {
-    left: 33.3333333333%;
-  }
-  .row .col.offset-l5 {
-    margin-left: 41.6666666667%;
-  }
-  .row .col.pull-l5 {
-    right: 41.6666666667%;
-  }
-  .row .col.push-l5 {
-    left: 41.6666666667%;
-  }
-  .row .col.offset-l6 {
-    margin-left: 50%;
-  }
-  .row .col.pull-l6 {
-    right: 50%;
-  }
-  .row .col.push-l6 {
-    left: 50%;
-  }
-  .row .col.offset-l7 {
-    margin-left: 58.3333333333%;
-  }
-  .row .col.pull-l7 {
-    right: 58.3333333333%;
-  }
-  .row .col.push-l7 {
-    left: 58.3333333333%;
-  }
-  .row .col.offset-l8 {
-    margin-left: 66.6666666667%;
-  }
-  .row .col.pull-l8 {
-    right: 66.6666666667%;
-  }
-  .row .col.push-l8 {
-    left: 66.6666666667%;
-  }
-  .row .col.offset-l9 {
-    margin-left: 75%;
-  }
-  .row .col.pull-l9 {
-    right: 75%;
-  }
-  .row .col.push-l9 {
-    left: 75%;
-  }
-  .row .col.offset-l10 {
-    margin-left: 83.3333333333%;
-  }
-  .row .col.pull-l10 {
-    right: 83.3333333333%;
-  }
-  .row .col.push-l10 {
-    left: 83.3333333333%;
-  }
-  .row .col.offset-l11 {
-    margin-left: 91.6666666667%;
-  }
-  .row .col.pull-l11 {
-    right: 91.6666666667%;
-  }
-  .row .col.push-l11 {
-    left: 91.6666666667%;
-  }
-  .row .col.offset-l12 {
-    margin-left: 100%;
-  }
-  .row .col.pull-l12 {
-    right: 100%;
-  }
-  .row .col.push-l12 {
-    left: 100%;
-  }
-}
-
-@media only screen and (min-width: 1201px) {
-  .row .col.xl1 {
-    width: 8.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl2 {
-    width: 16.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl3 {
-    width: 25%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl4 {
-    width: 33.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl5 {
-    width: 41.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl6 {
-    width: 50%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl7 {
-    width: 58.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl8 {
-    width: 66.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl9 {
-    width: 75%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl10 {
-    width: 83.3333333333%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl11 {
-    width: 91.6666666667%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.xl12 {
-    width: 100%;
-    margin-left: auto;
-    left: auto;
-    right: auto;
-  }
-  .row .col.offset-xl1 {
-    margin-left: 8.3333333333%;
-  }
-  .row .col.pull-xl1 {
-    right: 8.3333333333%;
-  }
-  .row .col.push-xl1 {
-    left: 8.3333333333%;
-  }
-  .row .col.offset-xl2 {
-    margin-left: 16.6666666667%;
-  }
-  .row .col.pull-xl2 {
-    right: 16.6666666667%;
-  }
-  .row .col.push-xl2 {
-    left: 16.6666666667%;
-  }
-  .row .col.offset-xl3 {
-    margin-left: 25%;
-  }
-  .row .col.pull-xl3 {
-    right: 25%;
-  }
-  .row .col.push-xl3 {
-    left: 25%;
-  }
-  .row .col.offset-xl4 {
-    margin-left: 33.3333333333%;
-  }
-  .row .col.pull-xl4 {
-    right: 33.3333333333%;
-  }
-  .row .col.push-xl4 {
-    left: 33.3333333333%;
-  }
-  .row .col.offset-xl5 {
-    margin-left: 41.6666666667%;
-  }
-  .row .col.pull-xl5 {
-    right: 41.6666666667%;
-  }
-  .row .col.push-xl5 {
-    left: 41.6666666667%;
-  }
-  .row .col.offset-xl6 {
-    margin-left: 50%;
-  }
-  .row .col.pull-xl6 {
-    right: 50%;
-  }
-  .row .col.push-xl6 {
-    left: 50%;
-  }
-  .row .col.offset-xl7 {
-    margin-left: 58.3333333333%;
-  }
-  .row .col.pull-xl7 {
-    right: 58.3333333333%;
-  }
-  .row .col.push-xl7 {
-    left: 58.3333333333%;
-  }
-  .row .col.offset-xl8 {
-    margin-left: 66.6666666667%;
-  }
-  .row .col.pull-xl8 {
-    right: 66.6666666667%;
-  }
-  .row .col.push-xl8 {
-    left: 66.6666666667%;
-  }
-  .row .col.offset-xl9 {
-    margin-left: 75%;
-  }
-  .row .col.pull-xl9 {
-    right: 75%;
-  }
-  .row .col.push-xl9 {
-    left: 75%;
-  }
-  .row .col.offset-xl10 {
-    margin-left: 83.3333333333%;
-  }
-  .row .col.pull-xl10 {
-    right: 83.3333333333%;
-  }
-  .row .col.push-xl10 {
-    left: 83.3333333333%;
-  }
-  .row .col.offset-xl11 {
-    margin-left: 91.6666666667%;
-  }
-  .row .col.pull-xl11 {
-    right: 91.6666666667%;
-  }
-  .row .col.push-xl11 {
-    left: 91.6666666667%;
-  }
-  .row .col.offset-xl12 {
-    margin-left: 100%;
-  }
-  .row .col.pull-xl12 {
-    right: 100%;
-  }
-  .row .col.push-xl12 {
-    left: 100%;
-  }
-}
-
-nav {
-  color: #fff;
-  background-color: #ee6e73;
-  width: 100%;
-  height: 56px;
-  line-height: 56px;
-}
-
-nav.nav-extended {
-  height: auto;
-}
-
-nav.nav-extended .nav-wrapper {
-  min-height: 56px;
-  height: auto;
-}
-
-nav.nav-extended .nav-content {
-  position: relative;
-  line-height: normal;
-}
-
-nav a {
-  color: #fff;
-}
-
-nav i,
-nav [class^="mdi-"], nav [class*="mdi-"],
-nav i.material-icons {
-  display: block;
-  font-size: 24px;
-  height: 56px;
-  line-height: 56px;
-}
-
-nav .nav-wrapper {
-  position: relative;
-  height: 100%;
-}
-
-@media only screen and (min-width: 993px) {
-  nav a.button-collapse {
-    display: none;
-  }
-}
-
-nav .button-collapse {
-  float: left;
-  position: relative;
-  z-index: 1;
-  height: 56px;
-  margin: 0 18px;
-}
-
-nav .button-collapse i {
-  height: 56px;
-  line-height: 56px;
-}
-
-nav .brand-logo {
-  position: absolute;
-  color: #fff;
-  display: inline-block;
-  font-size: 2.1rem;
-  padding: 0;
-  white-space: nowrap;
-}
-
-nav .brand-logo.center {
-  left: 50%;
-  -webkit-transform: translateX(-50%);
-          transform: translateX(-50%);
-}
-
-@media only screen and (max-width: 992px) {
-  nav .brand-logo {
-    left: 50%;
-    -webkit-transform: translateX(-50%);
-            transform: translateX(-50%);
-  }
-  nav .brand-logo.left, nav .brand-logo.right {
-    padding: 0;
-    -webkit-transform: none;
-            transform: none;
-  }
-  nav .brand-logo.left {
-    left: 0.5rem;
-  }
-  nav .brand-logo.right {
-    right: 0.5rem;
-    left: auto;
-  }
-}
-
-nav .brand-logo.right {
-  right: 0.5rem;
-  padding: 0;
-}
-
-nav .brand-logo i,
-nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"],
-nav .brand-logo i.material-icons {
-  float: left;
-  margin-right: 15px;
-}
-
-nav .nav-title {
-  display: inline-block;
-  font-size: 32px;
-  padding: 28px 0;
-}
-
-nav ul {
-  margin: 0;
-}
-
-nav ul li {
-  transition: background-color .3s;
-  float: left;
-  padding: 0;
-}
-
-nav ul li.active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-nav ul a {
-  transition: background-color .3s;
-  font-size: 1rem;
-  color: #fff;
-  display: block;
-  padding: 0 15px;
-  cursor: pointer;
-}
-
-nav ul a.btn, nav ul a.btn-large, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating {
-  margin-top: -2px;
-  margin-left: 15px;
-  margin-right: 15px;
-}
-
-nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons {
-  height: inherit;
-  line-height: inherit;
-}
-
-nav ul a:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-nav ul.left {
-  float: left;
-}
-
-nav form {
-  height: 100%;
-}
-
-nav .input-field {
-  margin: 0;
-  height: 100%;
-}
-
-nav .input-field input {
-  height: 100%;
-  font-size: 1.2rem;
-  border: none;
-  padding-left: 2rem;
-}
-
-nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid {
-  border: none;
-  box-shadow: none;
-}
-
-nav .input-field label {
-  top: 0;
-  left: 0;
-}
-
-nav .input-field label i {
-  color: rgba(255, 255, 255, 0.7);
-  transition: color .3s;
-}
-
-nav .input-field label.active i {
-  color: #fff;
-}
-
-.navbar-fixed {
-  position: relative;
-  height: 56px;
-  z-index: 997;
-}
-
-.navbar-fixed nav {
-  position: fixed;
-}
-
-@media only screen and (min-width: 601px) {
-  nav.nav-extended .nav-wrapper {
-    min-height: 64px;
-  }
-  nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i {
-    height: 64px;
-    line-height: 64px;
-  }
-  .navbar-fixed {
-    height: 64px;
-  }
-}
-
-@font-face {
-  font-family: "Roboto";
-  src: local(Roboto Thin), url("../fonts/roboto/Roboto-Thin.woff2") format("woff2"), url("../fonts/roboto/Roboto-Thin.woff") format("woff");
-  font-weight: 100;
-}
-
-@font-face {
-  font-family: "Roboto";
-  src: local(Roboto Light), url("../fonts/roboto/Roboto-Light.woff2") format("woff2"), url("../fonts/roboto/Roboto-Light.woff") format("woff");
-  font-weight: 300;
-}
-
-@font-face {
-  font-family: "Roboto";
-  src: local(Roboto Regular), url("../fonts/roboto/Roboto-Regular.woff2") format("woff2"), url("../fonts/roboto/Roboto-Regular.woff") format("woff");
-  font-weight: 400;
-}
-
-@font-face {
-  font-family: "Roboto";
-  src: local(Roboto Medium), url("../fonts/roboto/Roboto-Medium.woff2") format("woff2"), url("../fonts/roboto/Roboto-Medium.woff") format("woff");
-  font-weight: 500;
-}
-
-@font-face {
-  font-family: "Roboto";
-  src: local(Roboto Bold), url("../fonts/roboto/Roboto-Bold.woff2") format("woff2"), url("../fonts/roboto/Roboto-Bold.woff") format("woff");
-  font-weight: 700;
-}
-
-a {
-  text-decoration: none;
-}
-
-html {
-  line-height: 1.5;
-  font-family: "Roboto", sans-serif;
-  font-weight: normal;
-  color: rgba(0, 0, 0, 0.87);
-}
-
-@media only screen and (min-width: 0) {
-  html {
-    font-size: 14px;
-  }
-}
-
-@media only screen and (min-width: 992px) {
-  html {
-    font-size: 14.5px;
-  }
-}
-
-@media only screen and (min-width: 1200px) {
-  html {
-    font-size: 15px;
-  }
-}
-
-h1, h2, h3, h4, h5, h6 {
-  font-weight: 400;
-  line-height: 1.1;
-}
-
-h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
-  font-weight: inherit;
-}
-
-h1 {
-  font-size: 4.2rem;
-  line-height: 110%;
-  margin: 2.1rem 0 1.68rem 0;
-}
-
-h2 {
-  font-size: 3.56rem;
-  line-height: 110%;
-  margin: 1.78rem 0 1.424rem 0;
-}
-
-h3 {
-  font-size: 2.92rem;
-  line-height: 110%;
-  margin: 1.46rem 0 1.168rem 0;
-}
-
-h4 {
-  font-size: 2.28rem;
-  line-height: 110%;
-  margin: 1.14rem 0 0.912rem 0;
-}
-
-h5 {
-  font-size: 1.64rem;
-  line-height: 110%;
-  margin: 0.82rem 0 0.656rem 0;
-}
-
-h6 {
-  font-size: 1rem;
-  line-height: 110%;
-  margin: 0.5rem 0 0.4rem 0;
-}
-
-em {
-  font-style: italic;
-}
-
-strong {
-  font-weight: 500;
-}
-
-small {
-  font-size: 75%;
-}
-
-.light, .page-footer .footer-copyright {
-  font-weight: 300;
-}
-
-.thin {
-  font-weight: 200;
-}
-
-.flow-text {
-  font-weight: 300;
-}
-
-@media only screen and (min-width: 360px) {
-  .flow-text {
-    font-size: 1.2rem;
-  }
-}
-
-@media only screen and (min-width: 390px) {
-  .flow-text {
-    font-size: 1.224rem;
-  }
-}
-
-@media only screen and (min-width: 420px) {
-  .flow-text {
-    font-size: 1.248rem;
-  }
-}
-
-@media only screen and (min-width: 450px) {
-  .flow-text {
-    font-size: 1.272rem;
-  }
-}
-
-@media only screen and (min-width: 480px) {
-  .flow-text {
-    font-size: 1.296rem;
-  }
-}
-
-@media only screen and (min-width: 510px) {
-  .flow-text {
-    font-size: 1.32rem;
-  }
-}
-
-@media only screen and (min-width: 540px) {
-  .flow-text {
-    font-size: 1.344rem;
-  }
-}
-
-@media only screen and (min-width: 570px) {
-  .flow-text {
-    font-size: 1.368rem;
-  }
-}
-
-@media only screen and (min-width: 600px) {
-  .flow-text {
-    font-size: 1.392rem;
-  }
-}
-
-@media only screen and (min-width: 630px) {
-  .flow-text {
-    font-size: 1.416rem;
-  }
-}
-
-@media only screen and (min-width: 660px) {
-  .flow-text {
-    font-size: 1.44rem;
-  }
-}
-
-@media only screen and (min-width: 690px) {
-  .flow-text {
-    font-size: 1.464rem;
-  }
-}
-
-@media only screen and (min-width: 720px) {
-  .flow-text {
-    font-size: 1.488rem;
-  }
-}
-
-@media only screen and (min-width: 750px) {
-  .flow-text {
-    font-size: 1.512rem;
-  }
-}
-
-@media only screen and (min-width: 780px) {
-  .flow-text {
-    font-size: 1.536rem;
-  }
-}
-
-@media only screen and (min-width: 810px) {
-  .flow-text {
-    font-size: 1.56rem;
-  }
-}
-
-@media only screen and (min-width: 840px) {
-  .flow-text {
-    font-size: 1.584rem;
-  }
-}
-
-@media only screen and (min-width: 870px) {
-  .flow-text {
-    font-size: 1.608rem;
-  }
-}
-
-@media only screen and (min-width: 900px) {
-  .flow-text {
-    font-size: 1.632rem;
-  }
-}
-
-@media only screen and (min-width: 930px) {
-  .flow-text {
-    font-size: 1.656rem;
-  }
-}
-
-@media only screen and (min-width: 960px) {
-  .flow-text {
-    font-size: 1.68rem;
-  }
-}
-
-@media only screen and (max-width: 360px) {
-  .flow-text {
-    font-size: 1.2rem;
-  }
-}
-
-.scale-transition {
-  transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;
-  transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;
-  transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;
-}
-
-.scale-transition.scale-out {
-  -webkit-transform: scale(0);
-          transform: scale(0);
-  transition: -webkit-transform .2s !important;
-  transition: transform .2s !important;
-  transition: transform .2s, -webkit-transform .2s !important;
-}
-
-.scale-transition.scale-in {
-  -webkit-transform: scale(1);
-          transform: scale(1);
-}
-
-.card-panel {
-  transition: box-shadow .25s;
-  padding: 24px;
-  margin: 0.5rem 0 1rem 0;
-  border-radius: 2px;
-  background-color: #fff;
-}
-
-.card {
-  position: relative;
-  margin: 0.5rem 0 1rem 0;
-  background-color: #fff;
-  transition: box-shadow .25s;
-  border-radius: 2px;
-}
-
-.card .card-title {
-  font-size: 24px;
-  font-weight: 300;
-}
-
-.card .card-title.activator {
-  cursor: pointer;
-}
-
-.card.small, .card.medium, .card.large {
-  position: relative;
-}
-
-.card.small .card-image, .card.medium .card-image, .card.large .card-image {
-  max-height: 60%;
-  overflow: hidden;
-}
-
-.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content {
-  max-height: 40%;
-}
-
-.card.small .card-content, .card.medium .card-content, .card.large .card-content {
-  max-height: 100%;
-  overflow: hidden;
-}
-
-.card.small .card-action, .card.medium .card-action, .card.large .card-action {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  right: 0;
-}
-
-.card.small {
-  height: 300px;
-}
-
-.card.medium {
-  height: 400px;
-}
-
-.card.large {
-  height: 500px;
-}
-
-.card.horizontal {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image {
-  height: 100%;
-  max-height: none;
-  overflow: visible;
-}
-
-.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img {
-  height: 100%;
-}
-
-.card.horizontal .card-image {
-  max-width: 50%;
-}
-
-.card.horizontal .card-image img {
-  border-radius: 2px 0 0 2px;
-  max-width: 100%;
-  width: auto;
-}
-
-.card.horizontal .card-stacked {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-direction: column;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-flex: 1;
-      -ms-flex: 1;
-          flex: 1;
-  position: relative;
-}
-
-.card.horizontal .card-stacked .card-content {
-  -webkit-flex-grow: 1;
-      -ms-flex-positive: 1;
-          flex-grow: 1;
-}
-
-.card.sticky-action .card-action {
-  z-index: 2;
-}
-
-.card.sticky-action .card-reveal {
-  z-index: 1;
-  padding-bottom: 64px;
-}
-
-.card .card-image {
-  position: relative;
-}
-
-.card .card-image img {
-  display: block;
-  border-radius: 2px 2px 0 0;
-  position: relative;
-  left: 0;
-  right: 0;
-  top: 0;
-  bottom: 0;
-  width: 100%;
-}
-
-.card .card-image .card-title {
-  color: #fff;
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  max-width: 100%;
-  padding: 24px;
-}
-
-.card .card-content {
-  padding: 24px;
-  border-radius: 0 0 2px 2px;
-}
-
-.card .card-content p {
-  margin: 0;
-  color: inherit;
-}
-
-.card .card-content .card-title {
-  display: block;
-  line-height: 32px;
-  margin-bottom: 8px;
-}
-
-.card .card-content .card-title i {
-  line-height: 32px;
-}
-
-.card .card-action {
-  position: relative;
-  background-color: inherit;
-  border-top: 1px solid rgba(160, 160, 160, 0.2);
-  padding: 16px 24px;
-}
-
-.card .card-action:last-child {
-  border-radius: 0 0 2px 2px;
-}
-
-.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating) {
-  color: #ffab40;
-  margin-right: 24px;
-  transition: color .3s ease;
-  text-transform: uppercase;
-}
-
-.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover {
-  color: #ffd8a6;
-}
-
-.card .card-reveal {
-  padding: 24px;
-  position: absolute;
-  background-color: #fff;
-  width: 100%;
-  overflow-y: auto;
-  left: 0;
-  top: 100%;
-  height: 100%;
-  z-index: 3;
-  display: none;
-}
-
-.card .card-reveal .card-title {
-  cursor: pointer;
-  display: block;
-}
-
-#toast-container {
-  display: block;
-  position: fixed;
-  z-index: 10000;
-}
-
-@media only screen and (max-width: 600px) {
-  #toast-container {
-    min-width: 100%;
-    bottom: 0%;
-  }
-}
-
-@media only screen and (min-width: 601px) and (max-width: 992px) {
-  #toast-container {
-    left: 5%;
-    bottom: 7%;
-    max-width: 90%;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  #toast-container {
-    top: 10%;
-    right: 7%;
-    max-width: 86%;
-  }
-}
-
-.toast {
-  border-radius: 2px;
-  top: 35px;
-  width: auto;
-  clear: both;
-  margin-top: 10px;
-  position: relative;
-  max-width: 100%;
-  height: auto;
-  min-height: 48px;
-  line-height: 1.5em;
-  word-break: break-all;
-  background-color: #323232;
-  padding: 10px 25px;
-  font-size: 1.1rem;
-  font-weight: 300;
-  color: #fff;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-justify-content: space-between;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-}
-
-.toast .btn, .toast .btn-large, .toast .btn-flat {
-  margin: 0;
-  margin-left: 3rem;
-}
-
-.toast.rounded {
-  border-radius: 24px;
-}
-
-@media only screen and (max-width: 600px) {
-  .toast {
-    width: 100%;
-    border-radius: 0;
-  }
-}
-
-@media only screen and (min-width: 601px) and (max-width: 992px) {
-  .toast {
-    float: left;
-  }
-}
-
-@media only screen and (min-width: 993px) {
-  .toast {
-    float: right;
-  }
-}
-
-.tabs {
-  position: relative;
-  overflow-x: auto;
-  overflow-y: hidden;
-  height: 48px;
-  width: 100%;
-  background-color: #fff;
-  margin: 0 auto;
-  white-space: nowrap;
-}
-
-.tabs.tabs-transparent {
-  background-color: transparent;
-}
-
-.tabs.tabs-transparent .tab a,
-.tabs.tabs-transparent .tab.disabled a,
-.tabs.tabs-transparent .tab.disabled a:hover {
-  color: rgba(255, 255, 255, 0.7);
-}
-
-.tabs.tabs-transparent .tab a:hover,
-.tabs.tabs-transparent .tab a.active {
-  color: #fff;
-}
-
-.tabs.tabs-transparent .indicator {
-  background-color: #fff;
-}
-
-.tabs.tabs-fixed-width {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-}
-
-.tabs.tabs-fixed-width .tab {
-  -webkit-flex-grow: 1;
-  -ms-flex-positive: 1;
-  flex-grow: 1;
-}
-
-.tabs .tab {
-  display: inline-block;
-  text-align: center;
-  line-height: 48px;
-  height: 48px;
-  padding: 0;
-  margin: 0;
-  text-transform: uppercase;
-}
-
-.tabs .tab a {
-  color: rgba(238, 110, 115, 0.7);
-  display: block;
-  width: 100%;
-  height: 100%;
-  padding: 0 24px;
-  font-size: 14px;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  transition: color .28s ease;
-}
-
-.tabs .tab a:hover, .tabs .tab a.active {
-  background-color: transparent;
-  color: #ee6e73;
-}
-
-.tabs .tab.disabled a,
-.tabs .tab.disabled a:hover {
-  color: rgba(238, 110, 115, 0.7);
-  cursor: default;
-}
-
-.tabs .indicator {
-  position: absolute;
-  bottom: 0;
-  height: 2px;
-  background-color: #f6b2b5;
-  will-change: left, right;
-}
-
-@media only screen and (max-width: 992px) {
-  .tabs {
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-  }
-  .tabs .tab {
-    -webkit-flex-grow: 1;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-  }
-  .tabs .tab a {
-    padding: 0 12px;
-  }
-}
-
-.material-tooltip {
-  padding: 10px 8px;
-  font-size: 1rem;
-  z-index: 2000;
-  background-color: transparent;
-  border-radius: 2px;
-  color: #fff;
-  min-height: 36px;
-  line-height: 120%;
-  opacity: 0;
-  position: absolute;
-  text-align: center;
-  max-width: calc(100% - 4px);
-  overflow: hidden;
-  left: 0;
-  top: 0;
-  pointer-events: none;
-  visibility: hidden;
-}
-
-.backdrop {
-  position: absolute;
-  opacity: 0;
-  height: 7px;
-  width: 14px;
-  border-radius: 0 0 50% 50%;
-  background-color: #323232;
-  z-index: -1;
-  -webkit-transform-origin: 50% 0%;
-          transform-origin: 50% 0%;
-  visibility: hidden;
-}
-
-.btn, .btn-large,
-.btn-flat {
-  border: none;
-  border-radius: 2px;
-  display: inline-block;
-  height: 36px;
-  line-height: 36px;
-  padding: 0 2rem;
-  text-transform: uppercase;
-  vertical-align: middle;
-  -webkit-tap-highlight-color: transparent;
-}
-
-.btn.disabled, .disabled.btn-large,
-.btn-floating.disabled,
-.btn-large.disabled,
-.btn-flat.disabled,
-.btn:disabled,
-.btn-large:disabled,
-.btn-floating:disabled,
-.btn-large:disabled,
-.btn-flat:disabled,
-.btn[disabled],
-[disabled].btn-large,
-.btn-floating[disabled],
-.btn-large[disabled],
-.btn-flat[disabled] {
-  pointer-events: none;
-  background-color: #DFDFDF !important;
-  box-shadow: none;
-  color: #9F9F9F !important;
-  cursor: default;
-}
-
-.btn.disabled:hover, .disabled.btn-large:hover,
-.btn-floating.disabled:hover,
-.btn-large.disabled:hover,
-.btn-flat.disabled:hover,
-.btn:disabled:hover,
-.btn-large:disabled:hover,
-.btn-floating:disabled:hover,
-.btn-large:disabled:hover,
-.btn-flat:disabled:hover,
-.btn[disabled]:hover,
-[disabled].btn-large:hover,
-.btn-floating[disabled]:hover,
-.btn-large[disabled]:hover,
-.btn-flat[disabled]:hover {
-  background-color: #DFDFDF !important;
-  color: #9F9F9F !important;
-}
-
-.btn, .btn-large,
-.btn-floating,
-.btn-large,
-.btn-flat {
-  font-size: 1rem;
-  outline: 0;
-}
-
-.btn i, .btn-large i,
-.btn-floating i,
-.btn-large i,
-.btn-flat i {
-  font-size: 1.3rem;
-  line-height: inherit;
-}
-
-.btn:focus, .btn-large:focus,
-.btn-floating:focus {
-  background-color: #1d7d74;
-}
-
-.btn, .btn-large {
-  text-decoration: none;
-  color: #fff;
-  background-color: #26a69a;
-  text-align: center;
-  letter-spacing: .5px;
-  transition: .2s ease-out;
-  cursor: pointer;
-}
-
-.btn:hover, .btn-large:hover {
-  background-color: #2bbbad;
-}
-
-.btn-floating {
-  display: inline-block;
-  color: #fff;
-  position: relative;
-  overflow: hidden;
-  z-index: 1;
-  width: 40px;
-  height: 40px;
-  line-height: 40px;
-  padding: 0;
-  background-color: #26a69a;
-  border-radius: 50%;
-  transition: .3s;
-  cursor: pointer;
-  vertical-align: middle;
-}
-
-.btn-floating:hover {
-  background-color: #26a69a;
-}
-
-.btn-floating:before {
-  border-radius: 0;
-}
-
-.btn-floating.btn-large {
-  width: 56px;
-  height: 56px;
-}
-
-.btn-floating.btn-large.halfway-fab {
-  bottom: -28px;
-}
-
-.btn-floating.btn-large i {
-  line-height: 56px;
-}
-
-.btn-floating.halfway-fab {
-  position: absolute;
-  right: 24px;
-  bottom: -20px;
-}
-
-.btn-floating.halfway-fab.left {
-  right: auto;
-  left: 24px;
-}
-
-.btn-floating i {
-  width: inherit;
-  display: inline-block;
-  text-align: center;
-  color: #fff;
-  font-size: 1.6rem;
-  line-height: 40px;
-}
-
-button.btn-floating {
-  border: none;
-}
-
-.fixed-action-btn {
-  position: fixed;
-  right: 23px;
-  bottom: 23px;
-  padding-top: 15px;
-  margin-bottom: 0;
-  z-index: 998;
-}
-
-.fixed-action-btn.active ul {
-  visibility: visible;
-}
-
-.fixed-action-btn.horizontal {
-  padding: 0 0 0 15px;
-}
-
-.fixed-action-btn.horizontal ul {
-  text-align: right;
-  right: 64px;
-  top: 50%;
-  -webkit-transform: translateY(-50%);
-          transform: translateY(-50%);
-  height: 100%;
-  left: auto;
-  width: 500px;
-  /*width 100% only goes to width of button container */
-}
-
-.fixed-action-btn.horizontal ul li {
-  display: inline-block;
-  margin: 15px 15px 0 0;
-}
-
-.fixed-action-btn.toolbar {
-  padding: 0;
-  height: 56px;
-}
-
-.fixed-action-btn.toolbar.active > a i {
-  opacity: 0;
-}
-
-.fixed-action-btn.toolbar ul {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  top: 0;
-  bottom: 0;
-}
-
-.fixed-action-btn.toolbar ul li {
-  -webkit-flex: 1;
-      -ms-flex: 1;
-          flex: 1;
-  display: inline-block;
-  margin: 0;
-  height: 100%;
-  transition: none;
-}
-
-.fixed-action-btn.toolbar ul li a {
-  display: block;
-  overflow: hidden;
-  position: relative;
-  width: 100%;
-  height: 100%;
-  background-color: transparent;
-  box-shadow: none;
-  color: #fff;
-  line-height: 56px;
-  z-index: 1;
-}
-
-.fixed-action-btn.toolbar ul li a i {
-  line-height: inherit;
-}
-
-.fixed-action-btn ul {
-  left: 0;
-  right: 0;
-  text-align: center;
-  position: absolute;
-  bottom: 64px;
-  margin: 0;
-  visibility: hidden;
-}
-
-.fixed-action-btn ul li {
-  margin-bottom: 15px;
-}
-
-.fixed-action-btn ul a.btn-floating {
-  opacity: 0;
-}
-
-.fixed-action-btn .fab-backdrop {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: -1;
-  width: 40px;
-  height: 40px;
-  background-color: #26a69a;
-  border-radius: 50%;
-  -webkit-transform: scale(0);
-          transform: scale(0);
-}
-
-.btn-flat {
-  box-shadow: none;
-  background-color: transparent;
-  color: #343434;
-  cursor: pointer;
-  transition: background-color .2s;
-}
-
-.btn-flat:focus, .btn-flat:active {
-  background-color: transparent;
-}
-
-.btn-flat:focus, .btn-flat:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-  box-shadow: none;
-}
-
-.btn-flat:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-
-.btn-flat.disabled {
-  background-color: transparent !important;
-  color: #b3b3b3 !important;
-  cursor: default;
-}
-
-.btn-large {
-  height: 54px;
-  line-height: 54px;
-}
-
-.btn-large i {
-  font-size: 1.6rem;
-}
-
-.btn-block {
-  display: block;
-}
-
-.dropdown-content {
-  background-color: #fff;
-  margin: 0;
-  display: none;
-  min-width: 100px;
-  max-height: 650px;
-  overflow-y: auto;
-  opacity: 0;
-  position: absolute;
-  z-index: 999;
-  will-change: width, height;
-}
-
-.dropdown-content li {
-  clear: both;
-  color: rgba(0, 0, 0, 0.87);
-  cursor: pointer;
-  min-height: 50px;
-  line-height: 1.5rem;
-  width: 100%;
-  text-align: left;
-  text-transform: none;
-}
-
-.dropdown-content li:hover, .dropdown-content li.active, .dropdown-content li.selected {
-  background-color: #eee;
-}
-
-.dropdown-content li.active.selected {
-  background-color: #e1e1e1;
-}
-
-.dropdown-content li.divider {
-  min-height: 0;
-  height: 1px;
-}
-
-.dropdown-content li > a, .dropdown-content li > span {
-  font-size: 16px;
-  color: #26a69a;
-  display: block;
-  line-height: 22px;
-  padding: 14px 16px;
-}
-
-.dropdown-content li > span > label {
-  top: 1px;
-  left: 0;
-  height: 18px;
-}
-
-.dropdown-content li > a > i {
-  height: inherit;
-  line-height: inherit;
-  float: left;
-  margin: 0 24px 0 0;
-  width: 24px;
-}
-
-.input-field.col .dropdown-content [type="checkbox"] + label {
-  top: 1px;
-  left: 0;
-  height: 18px;
-}
-
-/*!
- * Waves v0.6.0
- * http://fian.my.id/Waves
- *
- * Copyright 2014 Alfiana E. Sibuea and other contributors
- * Released under the MIT license
- * https://github.com/fians/Waves/blob/master/LICENSE
- */
-.waves-effect {
-  position: relative;
-  cursor: pointer;
-  display: inline-block;
-  overflow: hidden;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-tap-highlight-color: transparent;
-  vertical-align: middle;
-  z-index: 1;
-  transition: .3s ease-out;
-}
-
-.waves-effect .waves-ripple {
-  position: absolute;
-  border-radius: 50%;
-  width: 20px;
-  height: 20px;
-  margin-top: -10px;
-  margin-left: -10px;
-  opacity: 0;
-  background: rgba(0, 0, 0, 0.2);
-  transition: all 0.7s ease-out;
-  transition-property: opacity, -webkit-transform;
-  transition-property: transform, opacity;
-  transition-property: transform, opacity, -webkit-transform;
-  -webkit-transform: scale(0);
-          transform: scale(0);
-  pointer-events: none;
-}
-
-.waves-effect.waves-light .waves-ripple {
-  background-color: rgba(255, 255, 255, 0.45);
-}
-
-.waves-effect.waves-red .waves-ripple {
-  background-color: rgba(244, 67, 54, 0.7);
-}
-
-.waves-effect.waves-yellow .waves-ripple {
-  background-color: rgba(255, 235, 59, 0.7);
-}
-
-.waves-effect.waves-orange .waves-ripple {
-  background-color: rgba(255, 152, 0, 0.7);
-}
-
-.waves-effect.waves-purple .waves-ripple {
-  background-color: rgba(156, 39, 176, 0.7);
-}
-
-.waves-effect.waves-green .waves-ripple {
-  background-color: rgba(76, 175, 80, 0.7);
-}
-
-.waves-effect.waves-teal .waves-ripple {
-  background-color: rgba(0, 150, 136, 0.7);
-}
-
-.waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] {
-  border: 0;
-  font-style: normal;
-  font-size: inherit;
-  text-transform: inherit;
-  background: none;
-}
-
-.waves-effect img {
-  position: relative;
-  z-index: -1;
-}
-
-.waves-notransition {
-  transition: none !important;
-}
-
-.waves-circle {
-  -webkit-transform: translateZ(0);
-          transform: translateZ(0);
-  -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
-}
-
-.waves-input-wrapper {
-  border-radius: 0.2em;
-  vertical-align: bottom;
-}
-
-.waves-input-wrapper .waves-button-input {
-  position: relative;
-  top: 0;
-  left: 0;
-  z-index: 1;
-}
-
-.waves-circle {
-  text-align: center;
-  width: 2.5em;
-  height: 2.5em;
-  line-height: 2.5em;
-  border-radius: 50%;
-  -webkit-mask-image: none;
-}
-
-.waves-block {
-  display: block;
-}
-
-/* Firefox Bug: link not triggered */
-.waves-effect .waves-ripple {
-  z-index: -1;
-}
-
-.modal {
-  display: none;
-  position: fixed;
-  left: 0;
-  right: 0;
-  background-color: #fafafa;
-  padding: 0;
-  max-height: 70%;
-  width: 55%;
-  margin: auto;
-  overflow-y: auto;
-  border-radius: 2px;
-  will-change: top, opacity;
-}
-
-@media only screen and (max-width: 992px) {
-  .modal {
-    width: 80%;
-  }
-}
-
-.modal h1, .modal h2, .modal h3, .modal h4 {
-  margin-top: 0;
-}
-
-.modal .modal-content {
-  padding: 24px;
-}
-
-.modal .modal-close {
-  cursor: pointer;
-}
-
-.modal .modal-footer {
-  border-radius: 0 0 2px 2px;
-  background-color: #fafafa;
-  padding: 4px 6px;
-  height: 56px;
-  width: 100%;
-}
-
-.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-flat {
-  float: right;
-  margin: 6px 0;
-}
-
-.modal-overlay {
-  position: fixed;
-  z-index: 999;
-  top: -100px;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  height: 125%;
-  width: 100%;
-  background: #000;
-  display: none;
-  will-change: opacity;
-}
-
-.modal.modal-fixed-footer {
-  padding: 0;
-  height: 70%;
-}
-
-.modal.modal-fixed-footer .modal-content {
-  position: absolute;
-  height: calc(100% - 56px);
-  max-height: 100%;
-  width: 100%;
-  overflow-y: auto;
-}
-
-.modal.modal-fixed-footer .modal-footer {
-  border-top: 1px solid rgba(0, 0, 0, 0.1);
-  position: absolute;
-  bottom: 0;
-}
-
-.modal.bottom-sheet {
-  top: auto;
-  bottom: -100%;
-  margin: 0;
-  width: 100%;
-  max-height: 45%;
-  border-radius: 0;
-  will-change: bottom, opacity;
-}
-
-.collapsible {
-  border-top: 1px solid #ddd;
-  border-right: 1px solid #ddd;
-  border-left: 1px solid #ddd;
-  margin: 0.5rem 0 1rem 0;
-}
-
-.collapsible-header {
-  display: block;
-  cursor: pointer;
-  min-height: 3rem;
-  line-height: 3rem;
-  padding: 0 1rem;
-  background-color: #fff;
-  border-bottom: 1px solid #ddd;
-}
-
-.collapsible-header i {
-  width: 2rem;
-  font-size: 1.6rem;
-  line-height: 3rem;
-  display: block;
-  float: left;
-  text-align: center;
-  margin-right: 1rem;
-}
-
-.collapsible-body {
-  display: none;
-  border-bottom: 1px solid #ddd;
-  box-sizing: border-box;
-  padding: 2rem;
-}
-
-.side-nav .collapsible,
-.side-nav.fixed .collapsible {
-  border: none;
-  box-shadow: none;
-}
-
-.side-nav .collapsible li,
-.side-nav.fixed .collapsible li {
-  padding: 0;
-}
-
-.side-nav .collapsible-header,
-.side-nav.fixed .collapsible-header {
-  background-color: transparent;
-  border: none;
-  line-height: inherit;
-  height: inherit;
-  padding: 0 16px;
-}
-
-.side-nav .collapsible-header:hover,
-.side-nav.fixed .collapsible-header:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.side-nav .collapsible-header i,
-.side-nav.fixed .collapsible-header i {
-  line-height: inherit;
-}
-
-.side-nav .collapsible-body,
-.side-nav.fixed .collapsible-body {
-  border: 0;
-  background-color: #fff;
-}
-
-.side-nav .collapsible-body li a,
-.side-nav.fixed .collapsible-body li a {
-  padding: 0 23.5px 0 31px;
-}
-
-.collapsible.popout {
-  border: none;
-  box-shadow: none;
-}
-
-.collapsible.popout > li {
-  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
-  margin: 0 24px;
-  transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
-}
-
-.collapsible.popout > li.active {
-  box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
-  margin: 16px 0;
-}
-
-.chip {
-  display: inline-block;
-  height: 32px;
-  font-size: 13px;
-  font-weight: 500;
-  color: rgba(0, 0, 0, 0.6);
-  line-height: 32px;
-  padding: 0 12px;
-  border-radius: 16px;
-  background-color: #e4e4e4;
-  margin-bottom: 5px;
-  margin-right: 5px;
-}
-
-.chip > img {
-  float: left;
-  margin: 0 8px 0 -12px;
-  height: 32px;
-  width: 32px;
-  border-radius: 50%;
-}
-
-.chip .close {
-  cursor: pointer;
-  float: right;
-  font-size: 16px;
-  line-height: 32px;
-  padding-left: 8px;
-}
-
-.chips {
-  border: none;
-  border-bottom: 1px solid #9e9e9e;
-  box-shadow: none;
-  margin: 0 0 20px 0;
-  min-height: 45px;
-  outline: none;
-  transition: all .3s;
-}
-
-.chips.focus {
-  border-bottom: 1px solid #26a69a;
-  box-shadow: 0 1px 0 0 #26a69a;
-}
-
-.chips:hover {
-  cursor: text;
-}
-
-.chips .chip.selected {
-  background-color: #26a69a;
-  color: #fff;
-}
-
-.chips .input {
-  background: none;
-  border: 0;
-  color: rgba(0, 0, 0, 0.6);
-  display: inline-block;
-  font-size: 1rem;
-  height: 3rem;
-  line-height: 32px;
-  outline: 0;
-  margin: 0;
-  padding: 0 !important;
-  width: 120px !important;
-}
-
-.chips .input:focus {
-  border: 0 !important;
-  box-shadow: none !important;
-}
-
-.chips .autocomplete-content {
-  margin-top: 0;
-}
-
-.prefix ~ .chips {
-  margin-left: 3rem;
-  width: 92%;
-  width: calc(100% - 3rem);
-}
-
-.chips:empty ~ label {
-  font-size: 0.8rem;
-  -webkit-transform: translateY(-140%);
-          transform: translateY(-140%);
-}
-
-.materialboxed {
-  display: block;
-  cursor: -webkit-zoom-in;
-  cursor: zoom-in;
-  position: relative;
-  transition: opacity .4s;
-  -webkit-backface-visibility: hidden;
-}
-
-.materialboxed:hover:not(.active) {
-  opacity: .8;
-}
-
-.materialboxed.active {
-  cursor: -webkit-zoom-out;
-  cursor: zoom-out;
-}
-
-#materialbox-overlay {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  background-color: #292929;
-  z-index: 1000;
-  will-change: opacity;
-}
-
-.materialbox-caption {
-  position: fixed;
-  display: none;
-  color: #fff;
-  line-height: 50px;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  text-align: center;
-  padding: 0% 15%;
-  height: 50px;
-  z-index: 1000;
-  -webkit-font-smoothing: antialiased;
-}
-
-select:focus {
-  outline: 1px solid #c9f3ef;
-}
-
-button:focus {
-  outline: none;
-  background-color: #2ab7a9;
-}
-
-label {
-  font-size: 0.8rem;
-  color: #9e9e9e;
-}
-
-/* Text Inputs + Textarea
-   ========================================================================== */
-/* Style Placeholders */
-::-webkit-input-placeholder {
-  color: #d1d1d1;
-}
-
-:-moz-placeholder {
-  /* Firefox 18- */
-  color: #d1d1d1;
-}
-
-::-moz-placeholder {
-  /* Firefox 19+ */
-  color: #d1d1d1;
-}
-
-:-ms-input-placeholder {
-  color: #d1d1d1;
-}
-
-/* Text inputs */
-input:not([type]),
-input[type=text],
-input[type=password],
-input[type=email],
-input[type=url],
-input[type=time],
-input[type=date],
-input[type=datetime],
-input[type=datetime-local],
-input[type=tel],
-input[type=number],
-input[type=search],
-textarea.materialize-textarea {
-  background-color: transparent;
-  border: none;
-  border-bottom: 1px solid #9e9e9e;
-  border-radius: 0;
-  outline: none;
-  height: 3rem;
-  width: 100%;
-  font-size: 1rem;
-  margin: 0 0 20px 0;
-  padding: 0;
-  box-shadow: none;
-  box-sizing: content-box;
-  transition: all 0.3s;
-}
-
-input:not([type]):disabled, input:not([type])[readonly="readonly"],
-input[type=text]:disabled,
-input[type=text][readonly="readonly"],
-input[type=password]:disabled,
-input[type=password][readonly="readonly"],
-input[type=email]:disabled,
-input[type=email][readonly="readonly"],
-input[type=url]:disabled,
-input[type=url][readonly="readonly"],
-input[type=time]:disabled,
-input[type=time][readonly="readonly"],
-input[type=date]:disabled,
-input[type=date][readonly="readonly"],
-input[type=datetime]:disabled,
-input[type=datetime][readonly="readonly"],
-input[type=datetime-local]:disabled,
-input[type=datetime-local][readonly="readonly"],
-input[type=tel]:disabled,
-input[type=tel][readonly="readonly"],
-input[type=number]:disabled,
-input[type=number][readonly="readonly"],
-input[type=search]:disabled,
-input[type=search][readonly="readonly"],
-textarea.materialize-textarea:disabled,
-textarea.materialize-textarea[readonly="readonly"] {
-  color: rgba(0, 0, 0, 0.26);
-  border-bottom: 1px dotted rgba(0, 0, 0, 0.26);
-}
-
-input:not([type]):disabled + label,
-input:not([type])[readonly="readonly"] + label,
-input[type=text]:disabled + label,
-input[type=text][readonly="readonly"] + label,
-input[type=password]:disabled + label,
-input[type=password][readonly="readonly"] + label,
-input[type=email]:disabled + label,
-input[type=email][readonly="readonly"] + label,
-input[type=url]:disabled + label,
-input[type=url][readonly="readonly"] + label,
-input[type=time]:disabled + label,
-input[type=time][readonly="readonly"] + label,
-input[type=date]:disabled + label,
-input[type=date][readonly="readonly"] + label,
-input[type=datetime]:disabled + label,
-input[type=datetime][readonly="readonly"] + label,
-input[type=datetime-local]:disabled + label,
-input[type=datetime-local][readonly="readonly"] + label,
-input[type=tel]:disabled + label,
-input[type=tel][readonly="readonly"] + label,
-input[type=number]:disabled + label,
-input[type=number][readonly="readonly"] + label,
-input[type=search]:disabled + label,
-input[type=search][readonly="readonly"] + label,
-textarea.materialize-textarea:disabled + label,
-textarea.materialize-textarea[readonly="readonly"] + label {
-  color: rgba(0, 0, 0, 0.26);
-}
-
-input:not([type]):focus:not([readonly]),
-input[type=text]:focus:not([readonly]),
-input[type=password]:focus:not([readonly]),
-input[type=email]:focus:not([readonly]),
-input[type=url]:focus:not([readonly]),
-input[type=time]:focus:not([readonly]),
-input[type=date]:focus:not([readonly]),
-input[type=datetime]:focus:not([readonly]),
-input[type=datetime-local]:focus:not([readonly]),
-input[type=tel]:focus:not([readonly]),
-input[type=number]:focus:not([readonly]),
-input[type=search]:focus:not([readonly]),
-textarea.materialize-textarea:focus:not([readonly]) {
-  border-bottom: 1px solid #26a69a;
-  box-shadow: 0 1px 0 0 #26a69a;
-}
-
-input:not([type]):focus:not([readonly]) + label,
-input[type=text]:focus:not([readonly]) + label,
-input[type=password]:focus:not([readonly]) + label,
-input[type=email]:focus:not([readonly]) + label,
-input[type=url]:focus:not([readonly]) + label,
-input[type=time]:focus:not([readonly]) + label,
-input[type=date]:focus:not([readonly]) + label,
-input[type=datetime]:focus:not([readonly]) + label,
-input[type=datetime-local]:focus:not([readonly]) + label,
-input[type=tel]:focus:not([readonly]) + label,
-input[type=number]:focus:not([readonly]) + label,
-input[type=search]:focus:not([readonly]) + label,
-textarea.materialize-textarea:focus:not([readonly]) + label {
-  color: #26a69a;
-}
-
-input:not([type]).valid, input:not([type]):focus.valid,
-input[type=text].valid,
-input[type=text]:focus.valid,
-input[type=password].valid,
-input[type=password]:focus.valid,
-input[type=email].valid,
-input[type=email]:focus.valid,
-input[type=url].valid,
-input[type=url]:focus.valid,
-input[type=time].valid,
-input[type=time]:focus.valid,
-input[type=date].valid,
-input[type=date]:focus.valid,
-input[type=datetime].valid,
-input[type=datetime]:focus.valid,
-input[type=datetime-local].valid,
-input[type=datetime-local]:focus.valid,
-input[type=tel].valid,
-input[type=tel]:focus.valid,
-input[type=number].valid,
-input[type=number]:focus.valid,
-input[type=search].valid,
-input[type=search]:focus.valid,
-textarea.materialize-textarea.valid,
-textarea.materialize-textarea:focus.valid {
-  border-bottom: 1px solid #4CAF50;
-  box-shadow: 0 1px 0 0 #4CAF50;
-}
-
-input:not([type]).valid + label:after,
-input:not([type]):focus.valid + label:after,
-input[type=text].valid + label:after,
-input[type=text]:focus.valid + label:after,
-input[type=password].valid + label:after,
-input[type=password]:focus.valid + label:after,
-input[type=email].valid + label:after,
-input[type=email]:focus.valid + label:after,
-input[type=url].valid + label:after,
-input[type=url]:focus.valid + label:after,
-input[type=time].valid + label:after,
-input[type=time]:focus.valid + label:after,
-input[type=date].valid + label:after,
-input[type=date]:focus.valid + label:after,
-input[type=datetime].valid + label:after,
-input[type=datetime]:focus.valid + label:after,
-input[type=datetime-local].valid + label:after,
-input[type=datetime-local]:focus.valid + label:after,
-input[type=tel].valid + label:after,
-input[type=tel]:focus.valid + label:after,
-input[type=number].valid + label:after,
-input[type=number]:focus.valid + label:after,
-input[type=search].valid + label:after,
-input[type=search]:focus.valid + label:after,
-textarea.materialize-textarea.valid + label:after,
-textarea.materialize-textarea:focus.valid + label:after {
-  content: attr(data-success);
-  color: #4CAF50;
-  opacity: 1;
-}
-
-input:not([type]).invalid, input:not([type]):focus.invalid,
-input[type=text].invalid,
-input[type=text]:focus.invalid,
-input[type=password].invalid,
-input[type=password]:focus.invalid,
-input[type=email].invalid,
-input[type=email]:focus.invalid,
-input[type=url].invalid,
-input[type=url]:focus.invalid,
-input[type=time].invalid,
-input[type=time]:focus.invalid,
-input[type=date].invalid,
-input[type=date]:focus.invalid,
-input[type=datetime].invalid,
-input[type=datetime]:focus.invalid,
-input[type=datetime-local].invalid,
-input[type=datetime-local]:focus.invalid,
-input[type=tel].invalid,
-input[type=tel]:focus.invalid,
-input[type=number].invalid,
-input[type=number]:focus.invalid,
-input[type=search].invalid,
-input[type=search]:focus.invalid,
-textarea.materialize-textarea.invalid,
-textarea.materialize-textarea:focus.invalid {
-  border-bottom: 1px solid #F44336;
-  box-shadow: 0 1px 0 0 #F44336;
-}
-
-input:not([type]).invalid + label:after,
-input:not([type]):focus.invalid + label:after,
-input[type=text].invalid + label:after,
-input[type=text]:focus.invalid + label:after,
-input[type=password].invalid + label:after,
-input[type=password]:focus.invalid + label:after,
-input[type=email].invalid + label:after,
-input[type=email]:focus.invalid + label:after,
-input[type=url].invalid + label:after,
-input[type=url]:focus.invalid + label:after,
-input[type=time].invalid + label:after,
-input[type=time]:focus.invalid + label:after,
-input[type=date].invalid + label:after,
-input[type=date]:focus.invalid + label:after,
-input[type=datetime].invalid + label:after,
-input[type=datetime]:focus.invalid + label:after,
-input[type=datetime-local].invalid + label:after,
-input[type=datetime-local]:focus.invalid + label:after,
-input[type=tel].invalid + label:after,
-input[type=tel]:focus.invalid + label:after,
-input[type=number].invalid + label:after,
-input[type=number]:focus.invalid + label:after,
-input[type=search].invalid + label:after,
-input[type=search]:focus.invalid + label:after,
-textarea.materialize-textarea.invalid + label:after,
-textarea.materialize-textarea:focus.invalid + label:after {
-  content: attr(data-error);
-  color: #F44336;
-  opacity: 1;
-}
-
-input:not([type]).validate + label,
-input[type=text].validate + label,
-input[type=password].validate + label,
-input[type=email].validate + label,
-input[type=url].validate + label,
-input[type=time].validate + label,
-input[type=date].validate + label,
-input[type=datetime].validate + label,
-input[type=datetime-local].validate + label,
-input[type=tel].validate + label,
-input[type=number].validate + label,
-input[type=search].validate + label,
-textarea.materialize-textarea.validate + label {
-  width: 100%;
-  pointer-events: none;
-}
-
-input:not([type]) + label:after,
-input[type=text] + label:after,
-input[type=password] + label:after,
-input[type=email] + label:after,
-input[type=url] + label:after,
-input[type=time] + label:after,
-input[type=date] + label:after,
-input[type=datetime] + label:after,
-input[type=datetime-local] + label:after,
-input[type=tel] + label:after,
-input[type=number] + label:after,
-input[type=search] + label:after,
-textarea.materialize-textarea + label:after {
-  display: block;
-  content: "";
-  position: absolute;
-  top: 60px;
-  opacity: 0;
-  transition: .2s opacity ease-out, .2s color ease-out;
-}
-
-.input-field {
-  position: relative;
-  margin-top: 1rem;
-}
-
-.input-field.inline {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 5px;
-}
-
-.input-field.inline input,
-.input-field.inline .select-dropdown {
-  margin-bottom: 1rem;
-}
-
-.input-field.col label {
-  left: 0.75rem;
-}
-
-.input-field.col .prefix ~ label,
-.input-field.col .prefix ~ .validate ~ label {
-  width: calc(100% - 3rem - 1.5rem);
-}
-
-.input-field label {
-  color: #9e9e9e;
-  position: absolute;
-  top: 0.8rem;
-  left: 0;
-  font-size: 1rem;
-  cursor: text;
-  transition: .2s ease-out;
-  text-align: initial;
-}
-
-.input-field label:not(.label-icon).active {
-  font-size: 0.8rem;
-  -webkit-transform: translateY(-140%);
-          transform: translateY(-140%);
-}
-
-.input-field .prefix {
-  position: absolute;
-  width: 3rem;
-  font-size: 2rem;
-  transition: color .2s;
-}
-
-.input-field .prefix.active {
-  color: #26a69a;
-}
-
-.input-field .prefix ~ input,
-.input-field .prefix ~ textarea,
-.input-field .prefix ~ label,
-.input-field .prefix ~ .validate ~ label,
-.input-field .prefix ~ .autocomplete-content {
-  margin-left: 3rem;
-  width: 92%;
-  width: calc(100% - 3rem);
-}
-
-.input-field .prefix ~ label {
-  margin-left: 3rem;
-}
-
-@media only screen and (max-width: 992px) {
-  .input-field .prefix ~ input {
-    width: 86%;
-    width: calc(100% - 3rem);
-  }
-}
-
-@media only screen and (max-width: 600px) {
-  .input-field .prefix ~ input {
-    width: 80%;
-    width: calc(100% - 3rem);
-  }
-}
-
-/* Search Field */
-.input-field input[type=search] {
-  display: block;
-  line-height: inherit;
-  padding-left: 4rem;
-  width: calc(100% - 4rem);
-}
-
-.input-field input[type=search]:focus {
-  background-color: #fff;
-  border: 0;
-  box-shadow: none;
-  color: #444;
-}
-
-.input-field input[type=search]:focus + label i,
-.input-field input[type=search]:focus ~ .mdi-navigation-close,
-.input-field input[type=search]:focus ~ .material-icons {
-  color: #444;
-}
-
-.input-field input[type=search] + label {
-  left: 1rem;
-}
-
-.input-field input[type=search] ~ .mdi-navigation-close,
-.input-field input[type=search] ~ .material-icons {
-  position: absolute;
-  top: 0;
-  right: 1rem;
-  color: transparent;
-  cursor: pointer;
-  font-size: 2rem;
-  transition: .3s color;
-}
-
-/* Textarea */
-textarea {
-  width: 100%;
-  height: 3rem;
-  background-color: transparent;
-}
-
-textarea.materialize-textarea {
-  overflow-y: hidden;
-  /* prevents scroll bar flash */
-  padding: .8rem 0 1.6rem 0;
-  /* prevents text jump on Enter keypress */
-  resize: none;
-  min-height: 3rem;
-}
-
-.hiddendiv {
-  display: none;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-  overflow-wrap: break-word;
-  /* future version of deprecated 'word-wrap' */
-  padding-top: 1.2rem;
-  /* prevents text jump on Enter keypress */
-  position: absolute;
-  top: 0;
-}
-
-/* Autocomplete */
-.autocomplete-content {
-  margin-top: -20px;
-  display: block;
-  opacity: 1;
-  position: static;
-}
-
-.autocomplete-content li .highlight {
-  color: #444;
-}
-
-.autocomplete-content li img {
-  height: 40px;
-  width: 40px;
-  margin: 5px 15px;
-}
-
-/* Radio Buttons
-   ========================================================================== */
-[type="radio"]:not(:checked),
-[type="radio"]:checked {
-  position: absolute;
-  left: -9999px;
-  opacity: 0;
-}
-
-[type="radio"]:not(:checked) + label,
-[type="radio"]:checked + label {
-  position: relative;
-  padding-left: 35px;
-  cursor: pointer;
-  display: inline-block;
-  height: 25px;
-  line-height: 25px;
-  font-size: 1rem;
-  transition: .28s ease;
-  /* webkit (konqueror) browsers */
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
-
-[type="radio"] + label:before,
-[type="radio"] + label:after {
-  content: '';
-  position: absolute;
-  left: 0;
-  top: 0;
-  margin: 4px;
-  width: 16px;
-  height: 16px;
-  z-index: 0;
-  transition: .28s ease;
-}
-
-/* Unchecked styles */
-[type="radio"]:not(:checked) + label:before,
-[type="radio"]:not(:checked) + label:after,
-[type="radio"]:checked + label:before,
-[type="radio"]:checked + label:after,
-[type="radio"].with-gap:checked + label:before,
-[type="radio"].with-gap:checked + label:after {
-  border-radius: 50%;
-}
-
-[type="radio"]:not(:checked) + label:before,
-[type="radio"]:not(:checked) + label:after {
-  border: 2px solid #5a5a5a;
-}
-
-[type="radio"]:not(:checked) + label:after {
-  -webkit-transform: scale(0);
-          transform: scale(0);
-}
-
-/* Checked styles */
-[type="radio"]:checked + label:before {
-  border: 2px solid transparent;
-}
-
-[type="radio"]:checked + label:after,
-[type="radio"].with-gap:checked + label:before,
-[type="radio"].with-gap:checked + label:after {
-  border: 2px solid #26a69a;
-}
-
-[type="radio"]:checked + label:after,
-[type="radio"].with-gap:checked + label:after {
-  background-color: #26a69a;
-}
-
-[type="radio"]:checked + label:after {
-  -webkit-transform: scale(1.02);
-          transform: scale(1.02);
-}
-
-/* Radio With gap */
-[type="radio"].with-gap:checked + label:after {
-  -webkit-transform: scale(0.5);
-          transform: scale(0.5);
-}
-
-/* Focused styles */
-[type="radio"].tabbed:focus + label:before {
-  box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
-}
-
-/* Disabled Radio With gap */
-[type="radio"].with-gap:disabled:checked + label:before {
-  border: 2px solid rgba(0, 0, 0, 0.26);
-}
-
-[type="radio"].with-gap:disabled:checked + label:after {
-  border: none;
-  background-color: rgba(0, 0, 0, 0.26);
-}
-
-/* Disabled style */
-[type="radio"]:disabled:not(:checked) + label:before,
-[type="radio"]:disabled:checked + label:before {
-  background-color: transparent;
-  border-color: rgba(0, 0, 0, 0.26);
-}
-
-[type="radio"]:disabled + label {
-  color: rgba(0, 0, 0, 0.26);
-}
-
-[type="radio"]:disabled:not(:checked) + label:before {
-  border-color: rgba(0, 0, 0, 0.26);
-}
-
-[type="radio"]:disabled:checked + label:after {
-  background-color: rgba(0, 0, 0, 0.26);
-  border-color: #BDBDBD;
-}
-
-/* Checkboxes
-   ========================================================================== */
-/* CUSTOM CSS CHECKBOXES */
-form p {
-  margin-bottom: 10px;
-  text-align: left;
-}
-
-form p:last-child {
-  margin-bottom: 0;
-}
-
-/* Remove default checkbox */
-[type="checkbox"]:not(:checked),
-[type="checkbox"]:checked {
-  position: absolute;
-  left: -9999px;
-  opacity: 0;
-}
-
-[type="checkbox"] {
-  /* checkbox aspect */
-}
-
-[type="checkbox"] + label {
-  position: relative;
-  padding-left: 35px;
-  cursor: pointer;
-  display: inline-block;
-  height: 25px;
-  line-height: 25px;
-  font-size: 1rem;
-  -webkit-user-select: none;
-  /* webkit (safari, chrome) browsers */
-  -moz-user-select: none;
-  /* mozilla browsers */
-  -khtml-user-select: none;
-  /* webkit (konqueror) browsers */
-  -ms-user-select: none;
-  /* IE10+ */
-}
-
-[type="checkbox"] + label:before,
-[type="checkbox"]:not(.filled-in) + label:after {
-  content: '';
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 18px;
-  height: 18px;
-  z-index: 0;
-  border: 2px solid #5a5a5a;
-  border-radius: 1px;
-  margin-top: 2px;
-  transition: .2s;
-}
-
-[type="checkbox"]:not(.filled-in) + label:after {
-  border: 0;
-  -webkit-transform: scale(0);
-          transform: scale(0);
-}
-
-[type="checkbox"]:not(:checked):disabled + label:before {
-  border: none;
-  background-color: rgba(0, 0, 0, 0.26);
-}
-
-[type="checkbox"].tabbed:focus + label:after {
-  -webkit-transform: scale(1);
-          transform: scale(1);
-  border: 0;
-  border-radius: 50%;
-  box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-[type="checkbox"]:checked + label:before {
-  top: -4px;
-  left: -5px;
-  width: 12px;
-  height: 22px;
-  border-top: 2px solid transparent;
-  border-left: 2px solid transparent;
-  border-right: 2px solid #26a69a;
-  border-bottom: 2px solid #26a69a;
-  -webkit-transform: rotate(40deg);
-          transform: rotate(40deg);
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  -webkit-transform-origin: 100% 100%;
-          transform-origin: 100% 100%;
-}
-
-[type="checkbox"]:checked:disabled + label:before {
-  border-right: 2px solid rgba(0, 0, 0, 0.26);
-  border-bottom: 2px solid rgba(0, 0, 0, 0.26);
-}
-
-/* Indeterminate checkbox */
-[type="checkbox"]:indeterminate + label:before {
-  top: -11px;
-  left: -12px;
-  width: 10px;
-  height: 22px;
-  border-top: none;
-  border-left: none;
-  border-right: 2px solid #26a69a;
-  border-bottom: none;
-  -webkit-transform: rotate(90deg);
-          transform: rotate(90deg);
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  -webkit-transform-origin: 100% 100%;
-          transform-origin: 100% 100%;
-}
-
-[type="checkbox"]:indeterminate:disabled + label:before {
-  border-right: 2px solid rgba(0, 0, 0, 0.26);
-  background-color: transparent;
-}
-
-[type="checkbox"].filled-in + label:after {
-  border-radius: 2px;
-}
-
-[type="checkbox"].filled-in + label:before,
-[type="checkbox"].filled-in + label:after {
-  content: '';
-  left: 0;
-  position: absolute;
-  /* .1s delay is for check animation */
-  transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;
-  z-index: 1;
-}
-
-[type="checkbox"].filled-in:not(:checked) + label:before {
-  width: 0;
-  height: 0;
-  border: 3px solid transparent;
-  left: 6px;
-  top: 10px;
-  -webkit-transform: rotateZ(37deg);
-  transform: rotateZ(37deg);
-  -webkit-transform-origin: 20% 40%;
-  transform-origin: 100% 100%;
-}
-
-[type="checkbox"].filled-in:not(:checked) + label:after {
-  height: 20px;
-  width: 20px;
-  background-color: transparent;
-  border: 2px solid #5a5a5a;
-  top: 0px;
-  z-index: 0;
-}
-
-[type="checkbox"].filled-in:checked + label:before {
-  top: 0;
-  left: 1px;
-  width: 8px;
-  height: 13px;
-  border-top: 2px solid transparent;
-  border-left: 2px solid transparent;
-  border-right: 2px solid #fff;
-  border-bottom: 2px solid #fff;
-  -webkit-transform: rotateZ(37deg);
-  transform: rotateZ(37deg);
-  -webkit-transform-origin: 100% 100%;
-  transform-origin: 100% 100%;
-}
-
-[type="checkbox"].filled-in:checked + label:after {
-  top: 0;
-  width: 20px;
-  height: 20px;
-  border: 2px solid #26a69a;
-  background-color: #26a69a;
-  z-index: 0;
-}
-
-[type="checkbox"].filled-in.tabbed:focus + label:after {
-  border-radius: 2px;
-  border-color: #5a5a5a;
-  background-color: rgba(0, 0, 0, 0.1);
-}
-
-[type="checkbox"].filled-in.tabbed:checked:focus + label:after {
-  border-radius: 2px;
-  background-color: #26a69a;
-  border-color: #26a69a;
-}
-
-[type="checkbox"].filled-in:disabled:not(:checked) + label:before {
-  background-color: transparent;
-  border: 2px solid transparent;
-}
-
-[type="checkbox"].filled-in:disabled:not(:checked) + label:after {
-  border-color: transparent;
-  background-color: #BDBDBD;
-}
-
-[type="checkbox"].filled-in:disabled:checked + label:before {
-  background-color: transparent;
-}
-
-[type="checkbox"].filled-in:disabled:checked + label:after {
-  background-color: #BDBDBD;
-  border-color: #BDBDBD;
-}
-
-/* Switch
-   ========================================================================== */
-.switch,
-.switch * {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -khtml-user-select: none;
-  -ms-user-select: none;
-}
-
-.switch label {
-  cursor: pointer;
-}
-
-.switch label input[type=checkbox] {
-  opacity: 0;
-  width: 0;
-  height: 0;
-}
-
-.switch label input[type=checkbox]:checked + .lever {
-  background-color: #84c7c1;
-}
-
-.switch label input[type=checkbox]:checked + .lever:after {
-  background-color: #26a69a;
-  left: 24px;
-}
-
-.switch label .lever {
-  content: "";
-  display: inline-block;
-  position: relative;
-  width: 40px;
-  height: 15px;
-  background-color: #818181;
-  border-radius: 15px;
-  margin-right: 10px;
-  transition: background 0.3s ease;
-  vertical-align: middle;
-  margin: 0 16px;
-}
-
-.switch label .lever:after {
-  content: "";
-  position: absolute;
-  display: inline-block;
-  width: 21px;
-  height: 21px;
-  background-color: #F1F1F1;
-  border-radius: 21px;
-  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4);
-  left: -5px;
-  top: -3px;
-  transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease;
-}
-
-input[type=checkbox]:checked:not(:disabled) ~ .lever:active::after,
-input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::after {
-  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(38, 166, 154, 0.1);
-}
-
-input[type=checkbox]:not(:disabled) ~ .lever:active:after,
-input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::after {
-  box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.08);
-}
-
-.switch input[type=checkbox][disabled] + .lever {
-  cursor: default;
-}
-
-.switch label input[type=checkbox][disabled] + .lever:after,
-.switch label input[type=checkbox][disabled]:checked + .lever:after {
-  background-color: #BDBDBD;
-}
-
-/* Select Field
-   ========================================================================== */
-select {
-  display: none;
-}
-
-select.browser-default {
-  display: block;
-}
-
-select {
-  background-color: rgba(255, 255, 255, 0.9);
-  width: 100%;
-  padding: 5px;
-  border: 1px solid #f2f2f2;
-  border-radius: 2px;
-  height: 3rem;
-}
-
-.select-label {
-  position: absolute;
-}
-
-.select-wrapper {
-  position: relative;
-}
-
-.select-wrapper input.select-dropdown {
-  position: relative;
-  cursor: pointer;
-  background-color: transparent;
-  border: none;
-  border-bottom: 1px solid #9e9e9e;
-  outline: none;
-  height: 3rem;
-  line-height: 3rem;
-  width: 100%;
-  font-size: 1rem;
-  margin: 0 0 20px 0;
-  padding: 0;
-  display: block;
-}
-
-.select-wrapper span.caret {
-  color: initial;
-  position: absolute;
-  right: 0;
-  top: 0;
-  bottom: 0;
-  height: 10px;
-  margin: auto 0;
-  font-size: 10px;
-  line-height: 10px;
-}
-
-.select-wrapper span.caret.disabled {
-  color: rgba(0, 0, 0, 0.26);
-}
-
-.select-wrapper + label {
-  position: absolute;
-  top: -14px;
-  font-size: 0.8rem;
-}
-
-select:disabled {
-  color: rgba(0, 0, 0, 0.3);
-}
-
-.select-wrapper input.select-dropdown:disabled {
-  color: rgba(0, 0, 0, 0.3);
-  cursor: default;
-  -webkit-user-select: none;
-  /* webkit (safari, chrome) browsers */
-  -moz-user-select: none;
-  /* mozilla browsers */
-  -ms-user-select: none;
-  /* IE10+ */
-  border-bottom: 1px solid rgba(0, 0, 0, 0.3);
-}
-
-.select-wrapper i {
-  color: rgba(0, 0, 0, 0.3);
-}
-
-.select-dropdown li.disabled,
-.select-dropdown li.disabled > span,
-.select-dropdown li.optgroup {
-  color: rgba(0, 0, 0, 0.3);
-  background-color: transparent;
-}
-
-.prefix ~ .select-wrapper {
-  margin-left: 3rem;
-  width: 92%;
-  width: calc(100% - 3rem);
-}
-
-.prefix ~ label {
-  margin-left: 3rem;
-}
-
-.select-dropdown li img {
-  height: 40px;
-  width: 40px;
-  margin: 5px 15px;
-  float: right;
-}
-
-.select-dropdown li.optgroup {
-  border-top: 1px solid #eee;
-}
-
-.select-dropdown li.optgroup.selected > span {
-  color: rgba(0, 0, 0, 0.7);
-}
-
-.select-dropdown li.optgroup > span {
-  color: rgba(0, 0, 0, 0.4);
-}
-
-.select-dropdown li.optgroup ~ li.optgroup-option {
-  padding-left: 1rem;
-}
-
-/* File Input
-   ========================================================================== */
-.file-field {
-  position: relative;
-}
-
-.file-field .file-path-wrapper {
-  overflow: hidden;
-  padding-left: 10px;
-}
-
-.file-field input.file-path {
-  width: 100%;
-}
-
-.file-field .btn, .file-field .btn-large {
-  float: left;
-  height: 3rem;
-  line-height: 3rem;
-}
-
-.file-field span {
-  cursor: pointer;
-}
-
-.file-field input[type=file] {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  margin: 0;
-  padding: 0;
-  font-size: 20px;
-  cursor: pointer;
-  opacity: 0;
-  filter: alpha(opacity=0);
-}
-
-/* Range
-   ========================================================================== */
-.range-field {
-  position: relative;
-}
-
-input[type=range],
-input[type=range] + .thumb {
-  cursor: pointer;
-}
-
-input[type=range] {
-  position: relative;
-  background-color: transparent;
-  border: none;
-  outline: none;
-  width: 100%;
-  margin: 15px 0;
-  padding: 0;
-}
-
-input[type=range]:focus {
-  outline: none;
-}
-
-input[type=range] + .thumb {
-  position: absolute;
-  top: 10px;
-  left: 0;
-  border: none;
-  height: 0;
-  width: 0;
-  border-radius: 50%;
-  background-color: #26a69a;
-  margin-left: 7px;
-  -webkit-transform-origin: 50% 50%;
-          transform-origin: 50% 50%;
-  -webkit-transform: rotate(-45deg);
-          transform: rotate(-45deg);
-}
-
-input[type=range] + .thumb .value {
-  display: block;
-  width: 30px;
-  text-align: center;
-  color: #26a69a;
-  font-size: 0;
-  -webkit-transform: rotate(45deg);
-          transform: rotate(45deg);
-}
-
-input[type=range] + .thumb.active {
-  border-radius: 50% 50% 50% 0;
-}
-
-input[type=range] + .thumb.active .value {
-  color: #fff;
-  margin-left: -1px;
-  margin-top: 8px;
-  font-size: 10px;
-}
-
-input[type=range] {
-  -webkit-appearance: none;
-}
-
-input[type=range]::-webkit-slider-runnable-track {
-  height: 3px;
-  background: #c2c0c2;
-  border: none;
-}
-
-input[type=range]::-webkit-slider-thumb {
-  -webkit-appearance: none;
-  border: none;
-  height: 14px;
-  width: 14px;
-  border-radius: 50%;
-  background-color: #26a69a;
-  -webkit-transform-origin: 50% 50%;
-          transform-origin: 50% 50%;
-  margin: -5px 0 0 0;
-  transition: .3s;
-}
-
-input[type=range]:focus::-webkit-slider-runnable-track {
-  background: #ccc;
-}
-
-input[type=range] {
-  /* fix for FF unable to apply focus style bug  */
-  border: 1px solid white;
-  /*required for proper track sizing in FF*/
-}
-
-input[type=range]::-moz-range-track {
-  height: 3px;
-  background: #ddd;
-  border: none;
-}
-
-input[type=range]::-moz-range-thumb {
-  border: none;
-  height: 14px;
-  width: 14px;
-  border-radius: 50%;
-  background: #26a69a;
-  margin-top: -5px;
-}
-
-input[type=range]:-moz-focusring {
-  outline: 1px solid #fff;
-  outline-offset: -1px;
-}
-
-input[type=range]:focus::-moz-range-track {
-  background: #ccc;
-}
-
-input[type=range]::-ms-track {
-  height: 3px;
-  background: transparent;
-  border-color: transparent;
-  border-width: 6px 0;
-  /*remove default tick marks*/
-  color: transparent;
-}
-
-input[type=range]::-ms-fill-lower {
-  background: #777;
-}
-
-input[type=range]::-ms-fill-upper {
-  background: #ddd;
-}
-
-input[type=range]::-ms-thumb {
-  border: none;
-  height: 14px;
-  width: 14px;
-  border-radius: 50%;
-  background: #26a69a;
-}
-
-input[type=range]:focus::-ms-fill-lower {
-  background: #888;
-}
-
-input[type=range]:focus::-ms-fill-upper {
-  background: #ccc;
-}
-
-/***************
-    Nav List
-***************/
-.table-of-contents.fixed {
-  position: fixed;
-}
-
-.table-of-contents li {
-  padding: 2px 0;
-}
-
-.table-of-contents a {
-  display: inline-block;
-  font-weight: 300;
-  color: #757575;
-  padding-left: 20px;
-  height: 1.5rem;
-  line-height: 1.5rem;
-  letter-spacing: .4;
-  display: inline-block;
-}
-
-.table-of-contents a:hover {
-  color: #a8a8a8;
-  padding-left: 19px;
-  border-left: 1px solid #ee6e73;
-}
-
-.table-of-contents a.active {
-  font-weight: 500;
-  padding-left: 18px;
-  border-left: 2px solid #ee6e73;
-}
-
-.side-nav {
-  position: fixed;
-  width: 300px;
-  left: 0;
-  top: 0;
-  margin: 0;
-  -webkit-transform: translateX(-100%);
-          transform: translateX(-100%);
-  height: 100%;
-  height: calc(100% + 60px);
-  height: -moz-calc(100%);
-  padding-bottom: 60px;
-  background-color: #fff;
-  z-index: 999;
-  overflow-y: auto;
-  will-change: transform;
-  -webkit-backface-visibility: hidden;
-          backface-visibility: hidden;
-  -webkit-transform: translateX(-105%);
-          transform: translateX(-105%);
-}
-
-.side-nav.right-aligned {
-  right: 0;
-  -webkit-transform: translateX(105%);
-          transform: translateX(105%);
-  left: auto;
-  -webkit-transform: translateX(100%);
-          transform: translateX(100%);
-}
-
-.side-nav .collapsible {
-  margin: 0;
-}
-
-.side-nav li {
-  float: none;
-  line-height: 48px;
-}
-
-.side-nav li.active {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.side-nav li > a {
-  color: rgba(0, 0, 0, 0.87);
-  display: block;
-  font-size: 14px;
-  font-weight: 500;
-  height: 48px;
-  line-height: 48px;
-  padding: 0 32px;
-}
-
-.side-nav li > a:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-
-.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-flat, .side-nav li > a.btn-floating {
-  margin: 10px 15px;
-}
-
-.side-nav li > a.btn, .side-nav li > a.btn-large, .side-nav li > a.btn-large, .side-nav li > a.btn-floating {
-  color: #fff;
-}
-
-.side-nav li > a.btn-flat {
-  color: #343434;
-}
-
-.side-nav li > a.btn:hover, .side-nav li > a.btn-large:hover, .side-nav li > a.btn-large:hover {
-  background-color: #2bbbad;
-}
-
-.side-nav li > a.btn-floating:hover {
-  background-color: #26a69a;
-}
-
-.side-nav li > a > i,
-.side-nav li > a > [class^="mdi-"], .side-nav li > a li > a > [class*="mdi-"],
-.side-nav li > a > i.material-icons {
-  float: left;
-  height: 48px;
-  line-height: 48px;
-  margin: 0 32px 0 0;
-  width: 24px;
-  color: rgba(0, 0, 0, 0.54);
-}
-
-.side-nav .divider {
-  margin: 8px 0 0 0;
-}
-
-.side-nav .subheader {
-  cursor: initial;
-  pointer-events: none;
-  color: rgba(0, 0, 0, 0.54);
-  font-size: 14px;
-  font-weight: 500;
-  line-height: 48px;
-}
-
-.side-nav .subheader:hover {
-  background-color: transparent;
-}
-
-.side-nav .userView {
-  position: relative;
-  padding: 32px 32px 0;
-  margin-bottom: 8px;
-}
-
-.side-nav .userView > a {
-  height: auto;
-  padding: 0;
-}
-
-.side-nav .userView > a:hover {
-  background-color: transparent;
-}
-
-.side-nav .userView .background {
-  overflow: hidden;
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: -1;
-}
-
-.side-nav .userView .circle, .side-nav .userView .name, .side-nav .userView .email {
-  display: block;
-}
-
-.side-nav .userView .circle {
-  height: 64px;
-  width: 64px;
-}
-
-.side-nav .userView .name,
-.side-nav .userView .email {
-  font-size: 14px;
-  line-height: 24px;
-}
-
-.side-nav .userView .name {
-  margin-top: 16px;
-  font-weight: 500;
-}
-
-.side-nav .userView .email {
-  padding-bottom: 16px;
-  font-weight: 400;
-}
-
-.drag-target {
-  height: 100%;
-  width: 10px;
-  position: fixed;
-  top: 0;
-  z-index: 998;
-}
-
-.side-nav.fixed {
-  left: 0;
-  -webkit-transform: translateX(0);
-          transform: translateX(0);
-  position: fixed;
-}
-
-.side-nav.fixed.right-aligned {
-  right: 0;
-  left: auto;
-}
-
-@media only screen and (max-width: 992px) {
-  .side-nav.fixed {
-    -webkit-transform: translateX(-105%);
-            transform: translateX(-105%);
-  }
-  .side-nav.fixed.right-aligned {
-    -webkit-transform: translateX(105%);
-            transform: translateX(105%);
-  }
-  .side-nav a {
-    padding: 0 16px;
-  }
-  .side-nav .userView {
-    padding: 16px 16px 0;
-  }
-}
-
-.side-nav .collapsible-body > ul:not(.collapsible) > li.active,
-.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active {
-  background-color: #ee6e73;
-}
-
-.side-nav .collapsible-body > ul:not(.collapsible) > li.active a,
-.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active a {
-  color: #fff;
-}
-
-.side-nav .collapsible-body {
-  padding: 0;
-}
-
-#sidenav-overlay {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 120vh;
-  background-color: rgba(0, 0, 0, 0.5);
-  z-index: 997;
-  will-change: opacity;
-}
-
-/*
-    @license
-    Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-    Code distributed by Google as part of the polymer project is also
-    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-/**************************/
-/* STYLES FOR THE SPINNER */
-/**************************/
-/*
- * Constants:
- *      STROKEWIDTH = 3px
- *      ARCSIZE     = 270 degrees (amount of circle the arc takes up)
- *      ARCTIME     = 1333ms (time it takes to expand and contract arc)
- *      ARCSTARTROT = 216 degrees (how much the start location of the arc
- *                                should rotate each time, 216 gives us a
- *                                5 pointed star shape (it's 360/5 * 3).
- *                                For a 7 pointed star, we might do
- *                                360/7 * 3 = 154.286)
- *      CONTAINERWIDTH = 28px
- *      SHRINK_TIME = 400ms
- */
-.preloader-wrapper {
-  display: inline-block;
-  position: relative;
-  width: 50px;
-  height: 50px;
-}
-
-.preloader-wrapper.small {
-  width: 36px;
-  height: 36px;
-}
-
-.preloader-wrapper.big {
-  width: 64px;
-  height: 64px;
-}
-
-.preloader-wrapper.active {
-  /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */
-  -webkit-animation: container-rotate 1568ms linear infinite;
-  animation: container-rotate 1568ms linear infinite;
-}
-
-@-webkit-keyframes container-rotate {
-  to {
-    -webkit-transform: rotate(360deg);
-  }
-}
-
-@keyframes container-rotate {
-  to {
-    -webkit-transform: rotate(360deg);
-            transform: rotate(360deg);
-  }
-}
-
-.spinner-layer {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  opacity: 0;
-  border-color: #26a69a;
-}
-
-.spinner-blue,
-.spinner-blue-only {
-  border-color: #4285f4;
-}
-
-.spinner-red,
-.spinner-red-only {
-  border-color: #db4437;
-}
-
-.spinner-yellow,
-.spinner-yellow-only {
-  border-color: #f4b400;
-}
-
-.spinner-green,
-.spinner-green-only {
-  border-color: #0f9d58;
-}
-
-/**
- * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):
- *
- * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't
- * guarantee that the animation will start _exactly_ after that value. So we avoid using
- * animation-delay and instead set custom keyframes for each color (as redundant as it
- * seems).
- *
- * We write out each animation in full (instead of separating animation-name,
- * animation-duration, etc.) because under the polyfill, Safari does not recognize those
- * specific properties properly, treats them as -webkit-animation, and overrides the
- * other animation rules. See https://github.com/Polymer/platform/issues/53.
- */
-.active .spinner-layer.spinner-blue {
-  /* durations: 4 * ARCTIME */
-  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-.active .spinner-layer.spinner-red {
-  /* durations: 4 * ARCTIME */
-  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-.active .spinner-layer.spinner-yellow {
-  /* durations: 4 * ARCTIME */
-  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-.active .spinner-layer.spinner-green {
-  /* durations: 4 * ARCTIME */
-  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-.active .spinner-layer,
-.active .spinner-layer.spinner-blue-only,
-.active .spinner-layer.spinner-red-only,
-.active .spinner-layer.spinner-yellow-only,
-.active .spinner-layer.spinner-green-only {
-  /* durations: 4 * ARCTIME */
-  opacity: 1;
-  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-@-webkit-keyframes fill-unfill-rotate {
-  12.5% {
-    -webkit-transform: rotate(135deg);
-  }
-  /* 0.5 * ARCSIZE */
-  25% {
-    -webkit-transform: rotate(270deg);
-  }
-  /* 1   * ARCSIZE */
-  37.5% {
-    -webkit-transform: rotate(405deg);
-  }
-  /* 1.5 * ARCSIZE */
-  50% {
-    -webkit-transform: rotate(540deg);
-  }
-  /* 2   * ARCSIZE */
-  62.5% {
-    -webkit-transform: rotate(675deg);
-  }
-  /* 2.5 * ARCSIZE */
-  75% {
-    -webkit-transform: rotate(810deg);
-  }
-  /* 3   * ARCSIZE */
-  87.5% {
-    -webkit-transform: rotate(945deg);
-  }
-  /* 3.5 * ARCSIZE */
-  to {
-    -webkit-transform: rotate(1080deg);
-  }
-  /* 4   * ARCSIZE */
-}
-
-@keyframes fill-unfill-rotate {
-  12.5% {
-    -webkit-transform: rotate(135deg);
-            transform: rotate(135deg);
-  }
-  /* 0.5 * ARCSIZE */
-  25% {
-    -webkit-transform: rotate(270deg);
-            transform: rotate(270deg);
-  }
-  /* 1   * ARCSIZE */
-  37.5% {
-    -webkit-transform: rotate(405deg);
-            transform: rotate(405deg);
-  }
-  /* 1.5 * ARCSIZE */
-  50% {
-    -webkit-transform: rotate(540deg);
-            transform: rotate(540deg);
-  }
-  /* 2   * ARCSIZE */
-  62.5% {
-    -webkit-transform: rotate(675deg);
-            transform: rotate(675deg);
-  }
-  /* 2.5 * ARCSIZE */
-  75% {
-    -webkit-transform: rotate(810deg);
-            transform: rotate(810deg);
-  }
-  /* 3   * ARCSIZE */
-  87.5% {
-    -webkit-transform: rotate(945deg);
-            transform: rotate(945deg);
-  }
-  /* 3.5 * ARCSIZE */
-  to {
-    -webkit-transform: rotate(1080deg);
-            transform: rotate(1080deg);
-  }
-  /* 4   * ARCSIZE */
-}
-
-@-webkit-keyframes blue-fade-in-out {
-  from {
-    opacity: 1;
-  }
-  25% {
-    opacity: 1;
-  }
-  26% {
-    opacity: 0;
-  }
-  89% {
-    opacity: 0;
-  }
-  90% {
-    opacity: 1;
-  }
-  100% {
-    opacity: 1;
-  }
-}
-
-@keyframes blue-fade-in-out {
-  from {
-    opacity: 1;
-  }
-  25% {
-    opacity: 1;
-  }
-  26% {
-    opacity: 0;
-  }
-  89% {
-    opacity: 0;
-  }
-  90% {
-    opacity: 1;
-  }
-  100% {
-    opacity: 1;
-  }
-}
-
-@-webkit-keyframes red-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  15% {
-    opacity: 0;
-  }
-  25% {
-    opacity: 1;
-  }
-  50% {
-    opacity: 1;
-  }
-  51% {
-    opacity: 0;
-  }
-}
-
-@keyframes red-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  15% {
-    opacity: 0;
-  }
-  25% {
-    opacity: 1;
-  }
-  50% {
-    opacity: 1;
-  }
-  51% {
-    opacity: 0;
-  }
-}
-
-@-webkit-keyframes yellow-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  40% {
-    opacity: 0;
-  }
-  50% {
-    opacity: 1;
-  }
-  75% {
-    opacity: 1;
-  }
-  76% {
-    opacity: 0;
-  }
-}
-
-@keyframes yellow-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  40% {
-    opacity: 0;
-  }
-  50% {
-    opacity: 1;
-  }
-  75% {
-    opacity: 1;
-  }
-  76% {
-    opacity: 0;
-  }
-}
-
-@-webkit-keyframes green-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  65% {
-    opacity: 0;
-  }
-  75% {
-    opacity: 1;
-  }
-  90% {
-    opacity: 1;
-  }
-  100% {
-    opacity: 0;
-  }
-}
-
-@keyframes green-fade-in-out {
-  from {
-    opacity: 0;
-  }
-  65% {
-    opacity: 0;
-  }
-  75% {
-    opacity: 1;
-  }
-  90% {
-    opacity: 1;
-  }
-  100% {
-    opacity: 0;
-  }
-}
-
-/**
- * Patch the gap that appear between the two adjacent div.circle-clipper while the
- * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11).
- */
-.gap-patch {
-  position: absolute;
-  top: 0;
-  left: 45%;
-  width: 10%;
-  height: 100%;
-  overflow: hidden;
-  border-color: inherit;
-}
-
-.gap-patch .circle {
-  width: 1000%;
-  left: -450%;
-}
-
-.circle-clipper {
-  display: inline-block;
-  position: relative;
-  width: 50%;
-  height: 100%;
-  overflow: hidden;
-  border-color: inherit;
-}
-
-.circle-clipper .circle {
-  width: 200%;
-  height: 100%;
-  border-width: 3px;
-  /* STROKEWIDTH */
-  border-style: solid;
-  border-color: inherit;
-  border-bottom-color: transparent !important;
-  border-radius: 50%;
-  -webkit-animation: none;
-  animation: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.circle-clipper.left .circle {
-  left: 0;
-  border-right-color: transparent !important;
-  -webkit-transform: rotate(129deg);
-  transform: rotate(129deg);
-}
-
-.circle-clipper.right .circle {
-  left: -100%;
-  border-left-color: transparent !important;
-  -webkit-transform: rotate(-129deg);
-  transform: rotate(-129deg);
-}
-
-.active .circle-clipper.left .circle {
-  /* duration: ARCTIME */
-  -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-.active .circle-clipper.right .circle {
-  /* duration: ARCTIME */
-  -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-  animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
-}
-
-@-webkit-keyframes left-spin {
-  from {
-    -webkit-transform: rotate(130deg);
-  }
-  50% {
-    -webkit-transform: rotate(-5deg);
-  }
-  to {
-    -webkit-transform: rotate(130deg);
-  }
-}
-
-@keyframes left-spin {
-  from {
-    -webkit-transform: rotate(130deg);
-            transform: rotate(130deg);
-  }
-  50% {
-    -webkit-transform: rotate(-5deg);
-            transform: rotate(-5deg);
-  }
-  to {
-    -webkit-transform: rotate(130deg);
-            transform: rotate(130deg);
-  }
-}
-
-@-webkit-keyframes right-spin {
-  from {
-    -webkit-transform: rotate(-130deg);
-  }
-  50% {
-    -webkit-transform: rotate(5deg);
-  }
-  to {
-    -webkit-transform: rotate(-130deg);
-  }
-}
-
-@keyframes right-spin {
-  from {
-    -webkit-transform: rotate(-130deg);
-            transform: rotate(-130deg);
-  }
-  50% {
-    -webkit-transform: rotate(5deg);
-            transform: rotate(5deg);
-  }
-  to {
-    -webkit-transform: rotate(-130deg);
-            transform: rotate(-130deg);
-  }
-}
-
-#spinnerContainer.cooldown {
-  /* duration: SHRINK_TIME */
-  -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);
-  animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-@-webkit-keyframes fade-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-
-@keyframes fade-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-
-.slider {
-  position: relative;
-  height: 400px;
-  width: 100%;
-}
-
-.slider.fullscreen {
-  height: 100%;
-  width: 100%;
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.slider.fullscreen ul.slides {
-  height: 100%;
-}
-
-.slider.fullscreen ul.indicators {
-  z-index: 2;
-  bottom: 30px;
-}
-
-.slider .slides {
-  background-color: #9e9e9e;
-  margin: 0;
-  height: 400px;
-}
-
-.slider .slides li {
-  opacity: 0;
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 1;
-  width: 100%;
-  height: inherit;
-  overflow: hidden;
-}
-
-.slider .slides li img {
-  height: 100%;
-  width: 100%;
-  background-size: cover;
-  background-position: center;
-}
-
-.slider .slides li .caption {
-  color: #fff;
-  position: absolute;
-  top: 15%;
-  left: 15%;
-  width: 70%;
-  opacity: 0;
-}
-
-.slider .slides li .caption p {
-  color: #e0e0e0;
-}
-
-.slider .slides li.active {
-  z-index: 2;
-}
-
-.slider .indicators {
-  position: absolute;
-  text-align: center;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: 0;
-}
-
-.slider .indicators .indicator-item {
-  display: inline-block;
-  position: relative;
-  cursor: pointer;
-  height: 16px;
-  width: 16px;
-  margin: 0 12px;
-  background-color: #e0e0e0;
-  transition: background-color .3s;
-  border-radius: 50%;
-}
-
-.slider .indicators .indicator-item.active {
-  background-color: #4CAF50;
-}
-
-.carousel {
-  overflow: hidden;
-  position: relative;
-  width: 100%;
-  height: 400px;
-  -webkit-perspective: 500px;
-          perspective: 500px;
-  -webkit-transform-style: preserve-3d;
-          transform-style: preserve-3d;
-  -webkit-transform-origin: 0% 50%;
-          transform-origin: 0% 50%;
-}
-
-.carousel.carousel-slider {
-  top: 0;
-  left: 0;
-  height: 0;
-}
-
-.carousel.carousel-slider .carousel-fixed-item {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: 20px;
-  z-index: 1;
-}
-
-.carousel.carousel-slider .carousel-fixed-item.with-indicators {
-  bottom: 68px;
-}
-
-.carousel.carousel-slider .carousel-item {
-  width: 100%;
-  height: 100%;
-  min-height: 400px;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-
-.carousel.carousel-slider .carousel-item h2 {
-  font-size: 24px;
-  font-weight: 500;
-  line-height: 32px;
-}
-
-.carousel.carousel-slider .carousel-item p {
-  font-size: 15px;
-}
-
-.carousel .carousel-item {
-  display: none;
-  width: 200px;
-  height: 200px;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-
-.carousel .carousel-item > img {
-  width: 100%;
-}
-
-.carousel .indicators {
-  position: absolute;
-  text-align: center;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: 0;
-}
-
-.carousel .indicators .indicator-item {
-  display: inline-block;
-  position: relative;
-  cursor: pointer;
-  height: 8px;
-  width: 8px;
-  margin: 24px 4px;
-  background-color: rgba(255, 255, 255, 0.5);
-  transition: background-color .3s;
-  border-radius: 50%;
-}
-
-.carousel .indicators .indicator-item.active {
-  background-color: #fff;
-}
-
-.carousel.scrolling .carousel-item .materialboxed,
-.carousel .carousel-item:not(.active) .materialboxed {
-  pointer-events: none;
-}
-
-.tap-target-wrapper {
-  width: 800px;
-  height: 800px;
-  position: fixed;
-  z-index: 1000;
-  visibility: hidden;
-  transition: visibility 0s .3s;
-}
-
-.tap-target-wrapper.open {
-  visibility: visible;
-  transition: visibility 0s;
-}
-
-.tap-target-wrapper.open .tap-target {
-  -webkit-transform: scale(1);
-          transform: scale(1);
-  opacity: .95;
-  transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-}
-
-.tap-target-wrapper.open .tap-target-wave::before {
-  -webkit-transform: scale(1);
-          transform: scale(1);
-}
-
-.tap-target-wrapper.open .tap-target-wave::after {
-  visibility: visible;
-  -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
-          animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
-  transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s;
-  transition: opacity .3s, transform .3s, visibility 0s 1s;
-  transition: opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s;
-}
-
-.tap-target {
-  position: absolute;
-  font-size: 1rem;
-  border-radius: 50%;
-  background-color: #ee6e73;
-  box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2);
-  width: 100%;
-  height: 100%;
-  opacity: 0;
-  -webkit-transform: scale(0);
-          transform: scale(0);
-  transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);
-}
-
-.tap-target-content {
-  position: relative;
-  display: table-cell;
-}
-
-.tap-target-wave {
-  position: absolute;
-  border-radius: 50%;
-  z-index: 10001;
-}
-
-.tap-target-wave::before, .tap-target-wave::after {
-  content: '';
-  display: block;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  border-radius: 50%;
-  background-color: #ffffff;
-}
-
-.tap-target-wave::before {
-  -webkit-transform: scale(0);
-          transform: scale(0);
-  transition: -webkit-transform .3s;
-  transition: transform .3s;
-  transition: transform .3s, -webkit-transform .3s;
-}
-
-.tap-target-wave::after {
-  visibility: hidden;
-  transition: opacity .3s, visibility 0s, -webkit-transform .3s;
-  transition: opacity .3s, transform .3s, visibility 0s;
-  transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;
-  z-index: -1;
-}
-
-.tap-target-origin {
-  top: 50%;
-  left: 50%;
-  -webkit-transform: translate(-50%, -50%);
-          transform: translate(-50%, -50%);
-  z-index: 10002;
-  position: absolute !important;
-}
-
-.tap-target-origin:not(.btn):not(.btn-large), .tap-target-origin:not(.btn):not(.btn-large):hover {
-  background: none;
-}
-
-@media only screen and (max-width: 600px) {
-  .tap-target, .tap-target-wrapper {
-    width: 600px;
-    height: 600px;
-  }
-}
-
-.pulse {
-  overflow: initial;
-  position: relative;
-}
-
-.pulse::before {
-  content: '';
-  display: block;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  background-color: inherit;
-  border-radius: inherit;
-  transition: opacity .3s, -webkit-transform .3s;
-  transition: opacity .3s, transform .3s;
-  transition: opacity .3s, transform .3s, -webkit-transform .3s;
-  -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
-          animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;
-  z-index: -1;
-}
-
-@-webkit-keyframes pulse-animation {
-  0% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-            transform: scale(1);
-  }
-  50% {
-    opacity: 0;
-    -webkit-transform: scale(1.5);
-            transform: scale(1.5);
-  }
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(1.5);
-            transform: scale(1.5);
-  }
-}
-
-@keyframes pulse-animation {
-  0% {
-    opacity: 1;
-    -webkit-transform: scale(1);
-            transform: scale(1);
-  }
-  50% {
-    opacity: 0;
-    -webkit-transform: scale(1.5);
-            transform: scale(1.5);
-  }
-  100% {
-    opacity: 0;
-    -webkit-transform: scale(1.5);
-            transform: scale(1.5);
-  }
-}
-
-/* ==========================================================================
-   $BASE-PICKER
-   ========================================================================== */
-/**
- * Note: the root picker element should *NOT* be styled more than what's here.
- */
-.picker {
-  font-size: 16px;
-  text-align: left;
-  line-height: 1.2;
-  color: #000000;
-  position: absolute;
-  z-index: 10000;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-/**
- * The picker input element.
- */
-.picker__input {
-  cursor: default;
-}
-
-/**
- * When the picker is opened, the input element is "activated".
- */
-.picker__input.picker__input--active {
-  border-color: #0089ec;
-}
-
-/**
- * The holder is the only "scrollable" top-level container element.
- */
-.picker__holder {
-  width: 100%;
-  overflow-y: auto;
-  -webkit-overflow-scrolling: touch;
-}
-
-/*!
- * Default mobile-first, responsive styling for pickadate.js
- * Demo: http://amsul.github.io/pickadate.js
- */
-/**
- * Note: the root picker element should *NOT* be styled more than what's here.
- */
-/**
- * Make the holder and frame fullscreen.
- */
-.picker__holder,
-.picker__frame {
-  bottom: 0;
-  left: 0;
-  right: 0;
-  top: 100%;
-}
-
-/**
- * The holder should overlay the entire screen.
- */
-.picker__holder {
-  position: fixed;
-  transition: background 0.15s ease-out, top 0s 0.15s;
-  -webkit-backface-visibility: hidden;
-}
-
-/**
- * The frame that bounds the box contents of the picker.
- */
-.picker__frame {
-  position: absolute;
-  margin: 0 auto;
-  min-width: 256px;
-  width: 300px;
-  max-height: 350px;
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
-  filter: alpha(opacity=0);
-  -moz-opacity: 0;
-  opacity: 0;
-  transition: all 0.15s ease-out;
-}
-
-@media (min-height: 28.875em) {
-  .picker__frame {
-    overflow: visible;
-    top: auto;
-    bottom: -100%;
-    max-height: 80%;
-  }
-}
-
-@media (min-height: 40.125em) {
-  .picker__frame {
-    margin-bottom: 7.5%;
-  }
-}
-
-/**
- * The wrapper sets the stage to vertically align the box contents.
- */
-.picker__wrap {
-  display: table;
-  width: 100%;
-  height: 100%;
-}
-
-@media (min-height: 28.875em) {
-  .picker__wrap {
-    display: block;
-  }
-}
-
-/**
- * The box contains all the picker contents.
- */
-.picker__box {
-  background: #ffffff;
-  display: table-cell;
-  vertical-align: middle;
-}
-
-@media (min-height: 28.875em) {
-  .picker__box {
-    display: block;
-    border: 1px solid #777777;
-    border-top-color: #898989;
-    border-bottom-width: 0;
-    border-radius: 5px 5px 0 0;
-    box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24);
-  }
-}
-
-/**
- * When the picker opens...
- */
-.picker--opened .picker__holder {
-  top: 0;
-  background: transparent;
-  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";
-  zoom: 1;
-  background: rgba(0, 0, 0, 0.32);
-  transition: background 0.15s ease-out;
-}
-
-.picker--opened .picker__frame {
-  top: 0;
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
-  filter: alpha(opacity=100);
-  -moz-opacity: 1;
-  opacity: 1;
-}
-
-@media (min-height: 35.875em) {
-  .picker--opened .picker__frame {
-    top: 10%;
-    bottom: auto;
-  }
-}
-
-/**
- * For `large` screens, transform into an inline picker.
- */
-/* ==========================================================================
-   CUSTOM MATERIALIZE STYLES
-   ========================================================================== */
-.picker__input.picker__input--active {
-  border-color: #E3F2FD;
-}
-
-.picker__frame {
-  margin: 0 auto;
-  max-width: 325px;
-}
-
-@media (min-height: 38.875em) {
-  .picker--opened .picker__frame {
-    top: 10%;
-    bottom: auto;
-  }
-}
-
-/* ==========================================================================
-   $BASE-DATE-PICKER
-   ========================================================================== */
-/**
- * The picker box.
- */
-.picker__box {
-  padding: 0 1em;
-}
-
-/**
- * The header containing the month and year stuff.
- */
-.picker__header {
-  text-align: center;
-  position: relative;
-  margin-top: .75em;
-}
-
-/**
- * The month and year labels.
- */
-.picker__month,
-.picker__year {
-  display: inline-block;
-  margin-left: .25em;
-  margin-right: .25em;
-}
-
-/**
- * The month and year selectors.
- */
-.picker__select--month,
-.picker__select--year {
-  height: 2em;
-  padding: 0;
-  margin-left: .25em;
-  margin-right: .25em;
-}
-
-.picker__select--month.browser-default {
-  display: inline;
-  background-color: #FFFFFF;
-  width: 40%;
-}
-
-.picker__select--year.browser-default {
-  display: inline;
-  background-color: #FFFFFF;
-  width: 26%;
-}
-
-.picker__select--month:focus,
-.picker__select--year:focus {
-  border-color: rgba(0, 0, 0, 0.05);
-}
-
-/**
- * The month navigation buttons.
- */
-.picker__nav--prev,
-.picker__nav--next {
-  position: absolute;
-  padding: .5em 1.25em;
-  width: 1em;
-  height: 1em;
-  box-sizing: content-box;
-  top: -0.25em;
-}
-
-.picker__nav--prev {
-  left: -1em;
-  padding-right: 1.25em;
-}
-
-.picker__nav--next {
-  right: -1em;
-  padding-left: 1.25em;
-}
-
-.picker__nav--disabled,
-.picker__nav--disabled:hover,
-.picker__nav--disabled:before,
-.picker__nav--disabled:before:hover {
-  cursor: default;
-  background: none;
-  border-right-color: #f5f5f5;
-  border-left-color: #f5f5f5;
-}
-
-/**
- * The calendar table of dates
- */
-.picker__table {
-  text-align: center;
-  border-collapse: collapse;
-  border-spacing: 0;
-  table-layout: fixed;
-  font-size: 1rem;
-  width: 100%;
-  margin-top: .75em;
-  margin-bottom: .5em;
-}
-
-.picker__table th, .picker__table td {
-  text-align: center;
-}
-
-.picker__table td {
-  margin: 0;
-  padding: 0;
-}
-
-/**
- * The weekday labels
- */
-.picker__weekday {
-  width: 14.285714286%;
-  font-size: .75em;
-  padding-bottom: .25em;
-  color: #999999;
-  font-weight: 500;
-  /* Increase the spacing a tad */
-}
-
-@media (min-height: 33.875em) {
-  .picker__weekday {
-    padding-bottom: .5em;
-  }
-}
-
-/**
- * The days on the calendar
- */
-.picker__day--today {
-  position: relative;
-  color: #595959;
-  letter-spacing: -.3;
-  padding: .75rem 0;
-  font-weight: 400;
-  border: 1px solid transparent;
-}
-
-.picker__day--disabled:before {
-  border-top-color: #aaaaaa;
-}
-
-.picker__day--infocus:hover {
-  cursor: pointer;
-  color: #000;
-  font-weight: 500;
-}
-
-.picker__day--outfocus {
-  display: none;
-  padding: .75rem 0;
-  color: #fff;
-}
-
-.picker__day--outfocus:hover {
-  cursor: pointer;
-  color: #dddddd;
-  font-weight: 500;
-}
-
-.picker__day--highlighted:hover,
-.picker--focused .picker__day--highlighted {
-  cursor: pointer;
-}
-
-.picker__day--selected,
-.picker__day--selected:hover,
-.picker--focused .picker__day--selected {
-  border-radius: 50%;
-  -webkit-transform: scale(0.75);
-          transform: scale(0.75);
-  background: #0089ec;
-  color: #ffffff;
-}
-
-.picker__day--disabled,
-.picker__day--disabled:hover,
-.picker--focused .picker__day--disabled {
-  background: #f5f5f5;
-  border-color: #f5f5f5;
-  color: #dddddd;
-  cursor: default;
-}
-
-.picker__day--highlighted.picker__day--disabled,
-.picker__day--highlighted.picker__day--disabled:hover {
-  background: #bbbbbb;
-}
-
-/**
- * The footer containing the "today", "clear", and "close" buttons.
- */
-.picker__footer {
-  text-align: center;
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-align-items: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-justify-content: space-between;
-      -ms-flex-pack: justify;
-          justify-content: space-between;
-}
-
-.picker__button--today,
-.picker__button--clear,
-.picker__button--close {
-  border: 1px solid #ffffff;
-  background: #ffffff;
-  font-size: .8em;
-  padding: .66em 0;
-  font-weight: bold;
-  width: 33%;
-  display: inline-block;
-  vertical-align: bottom;
-}
-
-.picker__button--today:hover,
-.picker__button--clear:hover,
-.picker__button--close:hover {
-  cursor: pointer;
-  color: #000000;
-  background: #b1dcfb;
-  border-bottom-color: #b1dcfb;
-}
-
-.picker__button--today:focus,
-.picker__button--clear:focus,
-.picker__button--close:focus {
-  background: #b1dcfb;
-  border-color: rgba(0, 0, 0, 0.05);
-  outline: none;
-}
-
-.picker__button--today:before,
-.picker__button--clear:before,
-.picker__button--close:before {
-  position: relative;
-  display: inline-block;
-  height: 0;
-}
-
-.picker__button--today:before,
-.picker__button--clear:before {
-  content: " ";
-  margin-right: .45em;
-}
-
-.picker__button--today:before {
-  top: -0.05em;
-  width: 0;
-  border-top: 0.66em solid #0059bc;
-  border-left: .66em solid transparent;
-}
-
-.picker__button--clear:before {
-  top: -0.25em;
-  width: .66em;
-  border-top: 3px solid #ee2200;
-}
-
-.picker__button--close:before {
-  content: "\D7";
-  top: -0.1em;
-  vertical-align: top;
-  font-size: 1.1em;
-  margin-right: .35em;
-  color: #777777;
-}
-
-.picker__button--today[disabled],
-.picker__button--today[disabled]:hover {
-  background: #f5f5f5;
-  border-color: #f5f5f5;
-  color: #dddddd;
-  cursor: default;
-}
-
-.picker__button--today[disabled]:before {
-  border-top-color: #aaaaaa;
-}
-
-/* ==========================================================================
-   CUSTOM MATERIALIZE STYLES
-   ========================================================================== */
-.picker__box {
-  border-radius: 2px;
-  overflow: hidden;
-}
-
-.picker__date-display {
-  text-align: center;
-  background-color: #26a69a;
-  color: #fff;
-  padding-bottom: 15px;
-  font-weight: 300;
-}
-
-.picker__nav--prev:hover,
-.picker__nav--next:hover {
-  cursor: pointer;
-  color: #000000;
-  background: #a1ded8;
-}
-
-.picker__weekday-display {
-  background-color: #1f897f;
-  padding: 10px;
-  font-weight: 200;
-  letter-spacing: .5;
-  font-size: 1rem;
-  margin-bottom: 15px;
-}
-
-.picker__month-display {
-  text-transform: uppercase;
-  font-size: 2rem;
-}
-
-.picker__day-display {
-  font-size: 4.5rem;
-  font-weight: 400;
-}
-
-.picker__year-display {
-  font-size: 1.8rem;
-  color: rgba(255, 255, 255, 0.4);
-}
-
-.picker__box {
-  padding: 0;
-}
-
-.picker__calendar-container {
-  padding: 0 1rem;
-}
-
-.picker__calendar-container thead {
-  border: none;
-}
-
-.picker__table {
-  margin-top: 0;
-  margin-bottom: .5em;
-}
-
-.picker__day--infocus {
-  color: #595959;
-  letter-spacing: -.3;
-  padding: .75rem 0;
-  font-weight: 400;
-  border: 1px solid transparent;
-}
-
-.picker__day.picker__day--today {
-  color: #26a69a;
-}
-
-.picker__day.picker__day--today.picker__day--selected {
-  color: #fff;
-}
-
-.picker__weekday {
-  font-size: .9rem;
-}
-
-.picker__day--selected,
-.picker__day--selected:hover,
-.picker--focused .picker__day--selected {
-  border-radius: 50%;
-  -webkit-transform: scale(0.9);
-          transform: scale(0.9);
-  background-color: #26a69a;
-  color: #ffffff;
-}
-
-.picker__day--selected.picker__day--outfocus,
-.picker__day--selected:hover.picker__day--outfocus,
-.picker--focused .picker__day--selected.picker__day--outfocus {
-  background-color: #a1ded8;
-}
-
-.picker__footer {
-  text-align: right;
-  padding: 5px 10px;
-}
-
-.picker__close, .picker__today {
-  font-size: 1.1rem;
-  padding: 0 1rem;
-  color: #26a69a;
-}
-
-.picker__nav--prev:before,
-.picker__nav--next:before {
-  content: " ";
-  border-top: .5em solid transparent;
-  border-bottom: .5em solid transparent;
-  border-right: 0.75em solid #676767;
-  width: 0;
-  height: 0;
-  display: block;
-  margin: 0 auto;
-}
-
-.picker__nav--next:before {
-  border-right: 0;
-  border-left: 0.75em solid #676767;
-}
-
-button.picker__today:focus, button.picker__clear:focus, button.picker__close:focus {
-  background-color: #a1ded8;
-}
-
-/* ==========================================================================
-   $BASE-TIME-PICKER
-   ========================================================================== */
-/**
- * The list of times.
- */
-.picker__list {
-  list-style: none;
-  padding: 0.75em 0 4.2em;
-  margin: 0;
-}
-
-/**
- * The times on the clock.
- */
-.picker__list-item {
-  border-bottom: 1px solid #dddddd;
-  border-top: 1px solid #dddddd;
-  margin-bottom: -1px;
-  position: relative;
-  background: #ffffff;
-  padding: .75em 1.25em;
-}
-
-@media (min-height: 46.75em) {
-  .picker__list-item {
-    padding: .5em 1em;
-  }
-}
-
-/* Hovered time */
-.picker__list-item:hover {
-  cursor: pointer;
-  color: #000000;
-  background: #b1dcfb;
-  border-color: #0089ec;
-  z-index: 10;
-}
-
-/* Highlighted and hovered/focused time */
-.picker__list-item--highlighted {
-  border-color: #0089ec;
-  z-index: 10;
-}
-
-.picker__list-item--highlighted:hover,
-.picker--focused .picker__list-item--highlighted {
-  cursor: pointer;
-  color: #000000;
-  background: #b1dcfb;
-}
-
-/* Selected and hovered/focused time */
-.picker__list-item--selected,
-.picker__list-item--selected:hover,
-.picker--focused .picker__list-item--selected {
-  background: #0089ec;
-  color: #ffffff;
-  z-index: 10;
-}
-
-/* Disabled time */
-.picker__list-item--disabled,
-.picker__list-item--disabled:hover,
-.picker--focused .picker__list-item--disabled {
-  background: #f5f5f5;
-  border-color: #f5f5f5;
-  color: #dddddd;
-  cursor: default;
-  border-color: #dddddd;
-  z-index: auto;
-}
-
-/**
- * The clear button
- */
-.picker--time .picker__button--clear {
-  display: block;
-  width: 80%;
-  margin: 1em auto 0;
-  padding: 1em 1.25em;
-  background: none;
-  border: 0;
-  font-weight: 500;
-  font-size: .67em;
-  text-align: center;
-  text-transform: uppercase;
-  color: #666;
-}
-
-.picker--time .picker__button--clear:hover,
-.picker--time .picker__button--clear:focus {
-  color: #000000;
-  background: #b1dcfb;
-  background: #ee2200;
-  border-color: #ee2200;
-  cursor: pointer;
-  color: #ffffff;
-  outline: none;
-}
-
-.picker--time .picker__button--clear:before {
-  top: -0.25em;
-  color: #666;
-  font-size: 1.25em;
-  font-weight: bold;
-}
-
-.picker--time .picker__button--clear:hover:before,
-.picker--time .picker__button--clear:focus:before {
-  color: #ffffff;
-}
-
-/* ==========================================================================
-   $DEFAULT-TIME-PICKER
-   ========================================================================== */
-/**
- * The frame the bounds the time picker.
- */
-.picker--time .picker__frame {
-  min-width: 256px;
-  max-width: 320px;
-}
-
-/**
- * The picker box.
- */
-.picker--time .picker__box {
-  font-size: 1em;
-  background: #f2f2f2;
-  padding: 0;
-}
-
-@media (min-height: 40.125em) {
-  .picker--time .picker__box {
-    margin-bottom: 5em;
-  }
-}
diff --git a/packages/csslib/test/examples/mdc-card.css b/packages/csslib/test/examples/mdc-card.css
deleted file mode 100644
index 72c5d43..0000000
--- a/packages/csslib/test/examples/mdc-card.css
+++ /dev/null
@@ -1,412 +0,0 @@
-/**
-* Copyright 2017 Google Inc. All Rights Reserved.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-**/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box-property(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-.mdc-card {
-  box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14);
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-end;
-  padding: 0;
-  box-sizing: border-box; }
-  .mdc-card__primary {
-    padding: 16px; }
-    .mdc-card__primary .mdc-card__title--large {
-      padding-top: 8px; }
-    .mdc-card__primary:last-child {
-      padding-bottom: 24px; }
-  .mdc-card__supporting-text {
-    padding: 8px 16px;
-    box-sizing: border-box;
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 400;
-    letter-spacing: 0.04em;
-    line-height: 1.25rem;
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); }
-    .mdc-card--theme-dark .mdc-card__supporting-text, .mdc-theme--dark .mdc-card__supporting-text {
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-    .mdc-card__primary + .mdc-card__supporting-text {
-      margin-top: -8px;
-      padding-top: 0; }
-    .mdc-card__supporting-text:last-child {
-      padding-bottom: 24px; }
-  .mdc-card__actions {
-    display: flex;
-    padding: 8px;
-    box-sizing: border-box; }
-    .mdc-card--theme-dark .mdc-card__actions, .mdc-theme--dark .mdc-card__actions {
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-    .mdc-card__actions .mdc-card__action {
-      margin: 0 8px 0 0; }
-      [dir="rtl"] .mdc-card__actions .mdc-card__action, .mdc-card__actions .mdc-card__action[dir="rtl"] {
-        margin: 0 0 0 8px; }
-    .mdc-card__actions .mdc-card__action:last-child {
-      margin-left: 0;
-      margin-right: 0; }
-      [dir="rtl"] .mdc-card__actions .mdc-card__action:last-child, .mdc-card__actions .mdc-card__action:last-child[dir="rtl"] {
-        margin-left: 0;
-        margin-right: 0; }
-    .mdc-card__actions--vertical {
-      flex-flow: column;
-      align-items: flex-start; }
-      .mdc-card__actions--vertical .mdc-card__action {
-        margin: 0 0 4px; }
-      .mdc-card__actions--vertical .mdc-card__action:last-child {
-        margin-bottom: 0; }
-  .mdc-card__media {
-    display: flex;
-    flex-direction: column;
-    justify-content: flex-end;
-    padding: 16px;
-    box-sizing: border-box; }
-  .mdc-card__media-item {
-    display: inline-block;
-    width: auto;
-    height: 80px;
-    margin: 16px 0 0;
-    padding: 0; }
-    .mdc-card__media-item--1dot5x {
-      width: auto;
-      height: 120px; }
-    .mdc-card__media-item--2x {
-      width: auto;
-      height: 160px; }
-    .mdc-card__media-item--3x {
-      width: auto;
-      height: 240px; }
-  .mdc-card__title {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 500;
-    letter-spacing: 0.04em;
-    line-height: 1.5rem;
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));
-    margin: -.063rem 0; }
-    .mdc-card--theme-dark .mdc-card__title, .mdc-theme--dark .mdc-card__title {
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-  .mdc-card__title--large {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 1.5rem;
-    font-weight: 400;
-    letter-spacing: normal;
-    line-height: 2rem;
-    margin: 0; }
-  .mdc-card__subtitle {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 400;
-    letter-spacing: 0.04em;
-    line-height: 1.25rem;
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));
-    margin: -.063rem 0; }
-    .mdc-card--theme-dark .mdc-card__subtitle, .mdc-theme--dark .mdc-card__subtitle {
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-  .mdc-card__horizontal-block {
-    display: flex;
-    flex-direction: row;
-    align-items: flex-start;
-    justify-content: space-between;
-    box-sizing: border-box;
-    padding: 0;
-    padding-left: 0;
-    padding-right: 16px; }
-    [dir="rtl"] .mdc-card__horizontal-block, .mdc-card__horizontal-block[dir="rtl"] {
-      padding-left: 16px;
-      padding-right: 0; }
-    .mdc-card__horizontal-block .mdc-card__actions--vertical {
-      margin: 16px; }
-    .mdc-card__horizontal-block .mdc-card__media-item {
-      margin-left: 16px;
-      margin-right: 0; }
-      [dir="rtl"] .mdc-card__horizontal-block .mdc-card__media-item, .mdc-card__horizontal-block .mdc-card__media-item[dir="rtl"] {
-        margin-left: 0;
-        margin-right: 16px; }
-    .mdc-card__horizontal-block .mdc-card__media-item--3x {
-      margin-bottom: 16px; }
-
-/*# sourceMappingURL=mdc-card.css.map */
diff --git a/packages/csslib/test/examples/mdc-layout.css b/packages/csslib/test/examples/mdc-layout.css
deleted file mode 100644
index 75e6390..0000000
--- a/packages/csslib/test/examples/mdc-layout.css
+++ /dev/null
@@ -1,434 +0,0 @@
-/**
-* Copyright 2017 Google Inc. All Rights Reserved.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-**/
-.mdc-layout-grid {
-  display: flex;
-  flex-flow: row wrap;
-  align-items: stretch;
-  margin: 0 auto;
-  box-sizing: border-box;
-  padding: 8px;
-  padding: calc(var(--mdc-layout-grid-margin, 16px) - var(--mdc-layout-grid-gutter, 16px) / 2); }
-  @supports (display: grid) {
-    .mdc-layout-grid {
-      display: grid;
-      grid-gap: 16px;
-      grid-gap: var(--mdc-layout-grid-gutter, 16px);
-      padding: 16px;
-      padding: var(--mdc-layout-grid-margin, 16px); }
-      @media (min-width: 840px) {
-        .mdc-layout-grid {
-          grid-template-columns: repeat(12, minmax(0, 1fr)); } }
-      @media (min-width: 480px) and (max-width: 839px) {
-        .mdc-layout-grid {
-          grid-template-columns: repeat(8, minmax(0, 1fr)); } }
-      @media (max-width: 479px) {
-        .mdc-layout-grid {
-          grid-template-columns: repeat(4, minmax(0, 1fr)); } } }
-
-.mdc-layout-grid__cell {
-  margin: 8px;
-  margin: calc(var(--mdc-layout-grid-gutter, 16px) / 2);
-  box-sizing: border-box; }
-  @supports (display: grid) {
-    .mdc-layout-grid__cell {
-      margin: 0; } }
-  @media (min-width: 840px) {
-    .mdc-layout-grid__cell {
-      width: calc(33.33333% - 16px);
-      width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell {
-          width: auto;
-          grid-column-end: span 4; } } }
-  @media (min-width: 480px) and (max-width: 839px) {
-    .mdc-layout-grid__cell {
-      width: calc(50% - 16px);
-      width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell {
-          width: auto;
-          grid-column-end: span 4; } } }
-  @media (max-width: 479px) {
-    .mdc-layout-grid__cell {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell {
-          width: auto;
-          grid-column-end: span 4; } } }
-  @media (min-width: 840px) {
-    .mdc-layout-grid__cell--span-1,
-    .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop {
-      width: calc(8.33333% - 16px);
-      width: calc(8.33333% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-1,
-        .mdc-layout-grid__cell--span-1-desktop.mdc-layout-grid__cell--span-1-desktop {
-          width: auto;
-          grid-column-end: span 1; } }
-    .mdc-layout-grid__cell--span-2,
-    .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop {
-      width: calc(16.66667% - 16px);
-      width: calc(16.66667% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-2,
-        .mdc-layout-grid__cell--span-2-desktop.mdc-layout-grid__cell--span-2-desktop {
-          width: auto;
-          grid-column-end: span 2; } }
-    .mdc-layout-grid__cell--span-3,
-    .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop {
-      width: calc(25% - 16px);
-      width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-3,
-        .mdc-layout-grid__cell--span-3-desktop.mdc-layout-grid__cell--span-3-desktop {
-          width: auto;
-          grid-column-end: span 3; } }
-    .mdc-layout-grid__cell--span-4,
-    .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop {
-      width: calc(33.33333% - 16px);
-      width: calc(33.33333% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-4,
-        .mdc-layout-grid__cell--span-4-desktop.mdc-layout-grid__cell--span-4-desktop {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-5,
-    .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop {
-      width: calc(41.66667% - 16px);
-      width: calc(41.66667% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-5,
-        .mdc-layout-grid__cell--span-5-desktop.mdc-layout-grid__cell--span-5-desktop {
-          width: auto;
-          grid-column-end: span 5; } }
-    .mdc-layout-grid__cell--span-6,
-    .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop {
-      width: calc(50% - 16px);
-      width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-6,
-        .mdc-layout-grid__cell--span-6-desktop.mdc-layout-grid__cell--span-6-desktop {
-          width: auto;
-          grid-column-end: span 6; } }
-    .mdc-layout-grid__cell--span-7,
-    .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop {
-      width: calc(58.33333% - 16px);
-      width: calc(58.33333% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-7,
-        .mdc-layout-grid__cell--span-7-desktop.mdc-layout-grid__cell--span-7-desktop {
-          width: auto;
-          grid-column-end: span 7; } }
-    .mdc-layout-grid__cell--span-8,
-    .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop {
-      width: calc(66.66667% - 16px);
-      width: calc(66.66667% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-8,
-        .mdc-layout-grid__cell--span-8-desktop.mdc-layout-grid__cell--span-8-desktop {
-          width: auto;
-          grid-column-end: span 8; } }
-    .mdc-layout-grid__cell--span-9,
-    .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop {
-      width: calc(75% - 16px);
-      width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-9,
-        .mdc-layout-grid__cell--span-9-desktop.mdc-layout-grid__cell--span-9-desktop {
-          width: auto;
-          grid-column-end: span 9; } }
-    .mdc-layout-grid__cell--span-10,
-    .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop {
-      width: calc(83.33333% - 16px);
-      width: calc(83.33333% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-10,
-        .mdc-layout-grid__cell--span-10-desktop.mdc-layout-grid__cell--span-10-desktop {
-          width: auto;
-          grid-column-end: span 10; } }
-    .mdc-layout-grid__cell--span-11,
-    .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop {
-      width: calc(91.66667% - 16px);
-      width: calc(91.66667% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-11,
-        .mdc-layout-grid__cell--span-11-desktop.mdc-layout-grid__cell--span-11-desktop {
-          width: auto;
-          grid-column-end: span 11; } }
-    .mdc-layout-grid__cell--span-12,
-    .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-12,
-        .mdc-layout-grid__cell--span-12-desktop.mdc-layout-grid__cell--span-12-desktop {
-          width: auto;
-          grid-column-end: span 12; } } }
-  @media (min-width: 480px) and (max-width: 839px) {
-    .mdc-layout-grid__cell--span-1,
-    .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet {
-      width: calc(12.5% - 16px);
-      width: calc(12.5% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-1,
-        .mdc-layout-grid__cell--span-1-tablet.mdc-layout-grid__cell--span-1-tablet {
-          width: auto;
-          grid-column-end: span 1; } }
-    .mdc-layout-grid__cell--span-2,
-    .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet {
-      width: calc(25% - 16px);
-      width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-2,
-        .mdc-layout-grid__cell--span-2-tablet.mdc-layout-grid__cell--span-2-tablet {
-          width: auto;
-          grid-column-end: span 2; } }
-    .mdc-layout-grid__cell--span-3,
-    .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet {
-      width: calc(37.5% - 16px);
-      width: calc(37.5% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-3,
-        .mdc-layout-grid__cell--span-3-tablet.mdc-layout-grid__cell--span-3-tablet {
-          width: auto;
-          grid-column-end: span 3; } }
-    .mdc-layout-grid__cell--span-4,
-    .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet {
-      width: calc(50% - 16px);
-      width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-4,
-        .mdc-layout-grid__cell--span-4-tablet.mdc-layout-grid__cell--span-4-tablet {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-5,
-    .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet {
-      width: calc(62.5% - 16px);
-      width: calc(62.5% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-5,
-        .mdc-layout-grid__cell--span-5-tablet.mdc-layout-grid__cell--span-5-tablet {
-          width: auto;
-          grid-column-end: span 5; } }
-    .mdc-layout-grid__cell--span-6,
-    .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet {
-      width: calc(75% - 16px);
-      width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-6,
-        .mdc-layout-grid__cell--span-6-tablet.mdc-layout-grid__cell--span-6-tablet {
-          width: auto;
-          grid-column-end: span 6; } }
-    .mdc-layout-grid__cell--span-7,
-    .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet {
-      width: calc(87.5% - 16px);
-      width: calc(87.5% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-7,
-        .mdc-layout-grid__cell--span-7-tablet.mdc-layout-grid__cell--span-7-tablet {
-          width: auto;
-          grid-column-end: span 7; } }
-    .mdc-layout-grid__cell--span-8,
-    .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-8,
-        .mdc-layout-grid__cell--span-8-tablet.mdc-layout-grid__cell--span-8-tablet {
-          width: auto;
-          grid-column-end: span 8; } }
-    .mdc-layout-grid__cell--span-9,
-    .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-9,
-        .mdc-layout-grid__cell--span-9-tablet.mdc-layout-grid__cell--span-9-tablet {
-          width: auto;
-          grid-column-end: span 8; } }
-    .mdc-layout-grid__cell--span-10,
-    .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-10,
-        .mdc-layout-grid__cell--span-10-tablet.mdc-layout-grid__cell--span-10-tablet {
-          width: auto;
-          grid-column-end: span 8; } }
-    .mdc-layout-grid__cell--span-11,
-    .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-11,
-        .mdc-layout-grid__cell--span-11-tablet.mdc-layout-grid__cell--span-11-tablet {
-          width: auto;
-          grid-column-end: span 8; } }
-    .mdc-layout-grid__cell--span-12,
-    .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-12,
-        .mdc-layout-grid__cell--span-12-tablet.mdc-layout-grid__cell--span-12-tablet {
-          width: auto;
-          grid-column-end: span 8; } } }
-  @media (max-width: 479px) {
-    .mdc-layout-grid__cell--span-1,
-    .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone {
-      width: calc(25% - 16px);
-      width: calc(25% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-1,
-        .mdc-layout-grid__cell--span-1-phone.mdc-layout-grid__cell--span-1-phone {
-          width: auto;
-          grid-column-end: span 1; } }
-    .mdc-layout-grid__cell--span-2,
-    .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone {
-      width: calc(50% - 16px);
-      width: calc(50% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-2,
-        .mdc-layout-grid__cell--span-2-phone.mdc-layout-grid__cell--span-2-phone {
-          width: auto;
-          grid-column-end: span 2; } }
-    .mdc-layout-grid__cell--span-3,
-    .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone {
-      width: calc(75% - 16px);
-      width: calc(75% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-3,
-        .mdc-layout-grid__cell--span-3-phone.mdc-layout-grid__cell--span-3-phone {
-          width: auto;
-          grid-column-end: span 3; } }
-    .mdc-layout-grid__cell--span-4,
-    .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-4,
-        .mdc-layout-grid__cell--span-4-phone.mdc-layout-grid__cell--span-4-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-5,
-    .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-5,
-        .mdc-layout-grid__cell--span-5-phone.mdc-layout-grid__cell--span-5-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-6,
-    .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-6,
-        .mdc-layout-grid__cell--span-6-phone.mdc-layout-grid__cell--span-6-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-7,
-    .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-7,
-        .mdc-layout-grid__cell--span-7-phone.mdc-layout-grid__cell--span-7-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-8,
-    .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-8,
-        .mdc-layout-grid__cell--span-8-phone.mdc-layout-grid__cell--span-8-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-9,
-    .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-9,
-        .mdc-layout-grid__cell--span-9-phone.mdc-layout-grid__cell--span-9-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-10,
-    .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-10,
-        .mdc-layout-grid__cell--span-10-phone.mdc-layout-grid__cell--span-10-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-11,
-    .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-11,
-        .mdc-layout-grid__cell--span-11-phone.mdc-layout-grid__cell--span-11-phone {
-          width: auto;
-          grid-column-end: span 4; } }
-    .mdc-layout-grid__cell--span-12,
-    .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone {
-      width: calc(100% - 16px);
-      width: calc(100% - var(--mdc-layout-grid-gutter, 16px)); }
-      @supports (display: grid) {
-        .mdc-layout-grid__cell--span-12,
-        .mdc-layout-grid__cell--span-12-phone.mdc-layout-grid__cell--span-12-phone {
-          width: auto;
-          grid-column-end: span 4; } } }
-  .mdc-layout-grid__cell--order-1 {
-    order: 1; }
-  .mdc-layout-grid__cell--order-2 {
-    order: 2; }
-  .mdc-layout-grid__cell--order-3 {
-    order: 3; }
-  .mdc-layout-grid__cell--order-4 {
-    order: 4; }
-  .mdc-layout-grid__cell--order-5 {
-    order: 5; }
-  .mdc-layout-grid__cell--order-6 {
-    order: 6; }
-  .mdc-layout-grid__cell--order-7 {
-    order: 7; }
-  .mdc-layout-grid__cell--order-8 {
-    order: 8; }
-  .mdc-layout-grid__cell--order-9 {
-    order: 9; }
-  .mdc-layout-grid__cell--order-10 {
-    order: 10; }
-  .mdc-layout-grid__cell--order-11 {
-    order: 11; }
-  .mdc-layout-grid__cell--order-12 {
-    order: 12; }
-  .mdc-layout-grid__cell--align-top {
-    align-self: flex-start; }
-    @supports (display: grid) {
-      .mdc-layout-grid__cell--align-top {
-        align-self: start; } }
-  .mdc-layout-grid__cell--align-middle {
-    align-self: center; }
-  .mdc-layout-grid__cell--align-bottom {
-    align-self: flex-end; }
-    @supports (display: grid) {
-      .mdc-layout-grid__cell--align-bottom {
-        align-self: end; } }
diff --git a/packages/csslib/test/examples/pure.css b/packages/csslib/test/examples/pure.css
deleted file mode 100644
index 9f3d66a..0000000
--- a/packages/csslib/test/examples/pure.css
+++ /dev/null
@@ -1,1507 +0,0 @@
-/*!
-Pure v0.6.2
-Copyright 2013 Yahoo!
-Licensed under the BSD License.
-https://github.com/yahoo/pure/blob/master/LICENSE.md
-*/
-/*!
-normalize.css v^3.0 | MIT License | git.io/normalize
-Copyright (c) Nicolas Gallagher and Jonathan Neal
-*/
-/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
-
-/**
- * 1. Set default font family to sans-serif.
- * 2. Prevent iOS and IE text size adjust after device orientation change,
- *    without disabling user zoom.
- */
-html {
-  font-family: sans-serif; /* 1 */
-  -ms-text-size-adjust: 100%; /* 2 */
-  -webkit-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * Remove default margin.
- */
-
-body {
-  margin: 0;
-}
-
-/* HTML5 display definitions
-   ========================================================================== */
-
-/**
- * Correct `block` display not defined for any HTML5 element in IE 8/9.
- * Correct `block` display not defined for `details` or `summary` in IE 10/11
- * and Firefox.
- * Correct `block` display not defined for `main` in IE 11.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-menu,
-nav,
-section,
-summary {
-  display: block;
-}
-
-/**
- * 1. Correct `inline-block` display not defined in IE 8/9.
- * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
- */
-
-audio,
-canvas,
-progress,
-video {
-  display: inline-block; /* 1 */
-  vertical-align: baseline; /* 2 */
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-/**
- * Address `[hidden]` styling not present in IE 8/9/10.
- * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
- */
-
-[hidden],
-template {
-  display: none;
-}
-
-/* Links
-   ========================================================================== */
-
-/**
- * Remove the gray background color from active links in IE 10.
- */
-
-a {
-  background-color: transparent;
-}
-
-/**
- * Improve readability of focused elements when they are also in an
- * active/hover state.
- */
-
-a:active,
-a:hover {
-  outline: 0;
-}
-
-/* Text-level semantics
-   ========================================================================== */
-
-/**
- * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
- */
-
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
- */
-
-b,
-strong {
-  font-weight: bold;
-}
-
-/**
- * Address styling not present in Safari and Chrome.
- */
-
-dfn {
-  font-style: italic;
-}
-
-/**
- * Address variable `h1` font-size and margin within `section` and `article`
- * contexts in Firefox 4+, Safari, and Chrome.
- */
-
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-/**
- * Address styling not present in IE 8/9.
- */
-
-mark {
-  background: #ff0;
-  color: #000;
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-
-small {
-  font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-/* Embedded content
-   ========================================================================== */
-
-/**
- * Remove border when inside `a` element in IE 8/9/10.
- */
-
-img {
-  border: 0;
-}
-
-/**
- * Correct overflow not hidden in IE 9/10/11.
- */
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
-/* Grouping content
-   ========================================================================== */
-
-/**
- * Address margin not present in IE 8/9 and Safari.
- */
-
-figure {
-  margin: 1em 40px;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- */
-
-hr {
-  box-sizing: content-box;
-  height: 0;
-}
-
-/**
- * Contain overflow in all browsers.
- */
-
-pre {
-  overflow: auto;
-}
-
-/**
- * Address odd `em`-unit font size rendering in all browsers.
- */
-
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-/* Forms
-   ========================================================================== */
-
-/**
- * Known limitation: by default, Chrome and Safari on OS X allow very limited
- * styling of `select`, unless a `border` property is set.
- */
-
-/**
- * 1. Correct color not being inherited.
- *    Known issue: affects color of disabled elements.
- * 2. Correct font properties not being inherited.
- * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
- */
-
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit; /* 1 */
-  font: inherit; /* 2 */
-  margin: 0; /* 3 */
-}
-
-/**
- * Address `overflow` set to `hidden` in IE 8/9/10/11.
- */
-
-button {
-  overflow: visible;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
- * Correct `select` style inheritance in Firefox.
- */
-
-button,
-select {
-  text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- *    `input` and others.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button; /* 2 */
-  cursor: pointer; /* 3 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-
-/**
- * Remove inner padding and border in Firefox 4+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-
-/**
- * Address Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-input {
-  line-height: normal;
-}
-
-/**
- * It's recommended that you don't attempt to style these elements.
- * Firefox's implementation doesn't respect box-sizing, padding, or width.
- *
- * 1. Address box sizing set to `content-box` in IE 8/9/10.
- * 2. Remove excess padding in IE 8/9/10.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box; /* 1 */
-  padding: 0; /* 2 */
-}
-
-/**
- * Fix the cursor style for Chrome's increment/decrement buttons. For certain
- * `font-size` values of the `input`, it causes the cursor style of the
- * decrement button to change from `default` to `text`.
- */
-
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
- */
-
-input[type="search"] {
-  -webkit-appearance: textfield; /* 1 */
-  box-sizing: content-box; /* 2 */
-}
-
-/**
- * Remove inner padding and search cancel button in Safari and Chrome on OS X.
- * Safari (but not Chrome) clips the cancel button when the search input has
- * padding (and `textfield` appearance).
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-/**
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct `color` not being inherited in IE 8/9/10/11.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-
-legend {
-  border: 0; /* 1 */
-  padding: 0; /* 2 */
-}
-
-/**
- * Remove default vertical scrollbar in IE 8/9/10/11.
- */
-
-textarea {
-  overflow: auto;
-}
-
-/**
- * Don't inherit the `font-weight` (applied by a rule above).
- * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
- */
-
-optgroup {
-  font-weight: bold;
-}
-
-/* Tables
-   ========================================================================== */
-
-/**
- * Remove most spacing between table cells.
- */
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-}
-
-/*csslint important:false*/
-
-/* ==========================================================================
-   Pure Base Extras
-   ========================================================================== */
-
-/**
- * Extra rules that Pure adds on top of Normalize.css
- */
-
-/**
- * Always hide an element when it has the `hidden` HTML attribute.
- */
-
-.hidden,
-[hidden] {
-    display: none !important;
-}
-
-/**
- * Add this class to an image to make it fit within it's fluid parent wrapper while maintaining
- * aspect ratio.
- */
-.pure-img {
-    max-width: 100%;
-    height: auto;
-    display: block;
-}
-
-/*csslint regex-selectors:false, known-properties:false, duplicate-properties:false*/
-
-.pure-g {
-    letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
-    *letter-spacing: normal; /* reset IE < 8 */
-    *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
-    text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */
-
-    /*
-    Sets the font stack to fonts known to work properly with the above letter
-    and word spacings. See: https://github.com/yahoo/pure/issues/41/
-
-    The following font stack makes Pure Grids work on all known environments.
-
-    * FreeSans: Ships with many Linux distros, including Ubuntu
-
-    * Arimo: Ships with Chrome OS. Arimo has to be defined before Helvetica and
-      Arial to get picked up by the browser, even though neither is available
-      in Chrome OS.
-
-    * Droid Sans: Ships with all versions of Android.
-
-    * Helvetica, Arial, sans-serif: Common font stack on OS X and Windows.
-    */
-    font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
-
-    /* Use flexbox when possible to avoid `letter-spacing` side-effects. */
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-flow: row wrap;
-        -ms-flex-flow: row wrap;
-            flex-flow: row wrap;
-
-    /* Prevents distributing space between rows */
-    -webkit-align-content: flex-start;
-        -ms-flex-line-pack: start;
-            align-content: flex-start;
-}
-
-/* IE10 display: -ms-flexbox (and display: flex in IE 11) does not work inside a table; fall back to block and rely on font hack */
-@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
-	table .pure-g {
-		display: block;
-	}
-}
-
-/* Opera as of 12 on Windows needs word-spacing.
-   The ".opera-only" selector is used to prevent actual prefocus styling
-   and is not required in markup.
-*/
-.opera-only :-o-prefocus,
-.pure-g {
-    word-spacing: -0.43em;
-}
-
-.pure-u {
-    display: inline-block;
-    *display: inline; /* IE < 8: fake inline-block */
-    zoom: 1;
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
-}
-
-/*
-Resets the font family back to the OS/browser's default sans-serif font,
-this the same font stack that Normalize.css sets for the `body`.
-*/
-.pure-g [class *= "pure-u"] {
-    font-family: sans-serif;
-}
-
-.pure-u-1,
-.pure-u-1-1,
-.pure-u-1-2,
-.pure-u-1-3,
-.pure-u-2-3,
-.pure-u-1-4,
-.pure-u-3-4,
-.pure-u-1-5,
-.pure-u-2-5,
-.pure-u-3-5,
-.pure-u-4-5,
-.pure-u-5-5,
-.pure-u-1-6,
-.pure-u-5-6,
-.pure-u-1-8,
-.pure-u-3-8,
-.pure-u-5-8,
-.pure-u-7-8,
-.pure-u-1-12,
-.pure-u-5-12,
-.pure-u-7-12,
-.pure-u-11-12,
-.pure-u-1-24,
-.pure-u-2-24,
-.pure-u-3-24,
-.pure-u-4-24,
-.pure-u-5-24,
-.pure-u-6-24,
-.pure-u-7-24,
-.pure-u-8-24,
-.pure-u-9-24,
-.pure-u-10-24,
-.pure-u-11-24,
-.pure-u-12-24,
-.pure-u-13-24,
-.pure-u-14-24,
-.pure-u-15-24,
-.pure-u-16-24,
-.pure-u-17-24,
-.pure-u-18-24,
-.pure-u-19-24,
-.pure-u-20-24,
-.pure-u-21-24,
-.pure-u-22-24,
-.pure-u-23-24,
-.pure-u-24-24 {
-    display: inline-block;
-    *display: inline;
-    zoom: 1;
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
-}
-
-.pure-u-1-24 {
-    width: 4.1667%;
-    *width: 4.1357%;
-}
-
-.pure-u-1-12,
-.pure-u-2-24 {
-    width: 8.3333%;
-    *width: 8.3023%;
-}
-
-.pure-u-1-8,
-.pure-u-3-24 {
-    width: 12.5000%;
-    *width: 12.4690%;
-}
-
-.pure-u-1-6,
-.pure-u-4-24 {
-    width: 16.6667%;
-    *width: 16.6357%;
-}
-
-.pure-u-1-5 {
-    width: 20%;
-    *width: 19.9690%;
-}
-
-.pure-u-5-24 {
-    width: 20.8333%;
-    *width: 20.8023%;
-}
-
-.pure-u-1-4,
-.pure-u-6-24 {
-    width: 25%;
-    *width: 24.9690%;
-}
-
-.pure-u-7-24 {
-    width: 29.1667%;
-    *width: 29.1357%;
-}
-
-.pure-u-1-3,
-.pure-u-8-24 {
-    width: 33.3333%;
-    *width: 33.3023%;
-}
-
-.pure-u-3-8,
-.pure-u-9-24 {
-    width: 37.5000%;
-    *width: 37.4690%;
-}
-
-.pure-u-2-5 {
-    width: 40%;
-    *width: 39.9690%;
-}
-
-.pure-u-5-12,
-.pure-u-10-24 {
-    width: 41.6667%;
-    *width: 41.6357%;
-}
-
-.pure-u-11-24 {
-    width: 45.8333%;
-    *width: 45.8023%;
-}
-
-.pure-u-1-2,
-.pure-u-12-24 {
-    width: 50%;
-    *width: 49.9690%;
-}
-
-.pure-u-13-24 {
-    width: 54.1667%;
-    *width: 54.1357%;
-}
-
-.pure-u-7-12,
-.pure-u-14-24 {
-    width: 58.3333%;
-    *width: 58.3023%;
-}
-
-.pure-u-3-5 {
-    width: 60%;
-    *width: 59.9690%;
-}
-
-.pure-u-5-8,
-.pure-u-15-24 {
-    width: 62.5000%;
-    *width: 62.4690%;
-}
-
-.pure-u-2-3,
-.pure-u-16-24 {
-    width: 66.6667%;
-    *width: 66.6357%;
-}
-
-.pure-u-17-24 {
-    width: 70.8333%;
-    *width: 70.8023%;
-}
-
-.pure-u-3-4,
-.pure-u-18-24 {
-    width: 75%;
-    *width: 74.9690%;
-}
-
-.pure-u-19-24 {
-    width: 79.1667%;
-    *width: 79.1357%;
-}
-
-.pure-u-4-5 {
-    width: 80%;
-    *width: 79.9690%;
-}
-
-.pure-u-5-6,
-.pure-u-20-24 {
-    width: 83.3333%;
-    *width: 83.3023%;
-}
-
-.pure-u-7-8,
-.pure-u-21-24 {
-    width: 87.5000%;
-    *width: 87.4690%;
-}
-
-.pure-u-11-12,
-.pure-u-22-24 {
-    width: 91.6667%;
-    *width: 91.6357%;
-}
-
-.pure-u-23-24 {
-    width: 95.8333%;
-    *width: 95.8023%;
-}
-
-.pure-u-1,
-.pure-u-1-1,
-.pure-u-5-5,
-.pure-u-24-24 {
-    width: 100%;
-}
-.pure-button {
-    /* Structure */
-    display: inline-block;
-    zoom: 1;
-    line-height: normal;
-    white-space: nowrap;
-    vertical-align: middle;
-    text-align: center;
-    cursor: pointer;
-    -webkit-user-drag: none;
-    -webkit-user-select: none;
-       -moz-user-select: none;
-        -ms-user-select: none;
-            user-select: none;
-    box-sizing: border-box;
-}
-
-/* Firefox: Get rid of the inner focus border */
-.pure-button::-moz-focus-inner {
-    padding: 0;
-    border: 0;
-}
-
-/* Inherit .pure-g styles */
-.pure-button-group {
-    letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
-    *letter-spacing: normal; /* reset IE < 8 */
-    *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
-    text-rendering: optimizespeed; /* Webkit: fixes text-rendering: optimizeLegibility */
-}
-
-.opera-only :-o-prefocus,
-.pure-button-group {
-    word-spacing: -0.43em;
-}
-
-.pure-button-group .pure-button {
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
-}
-
-/*csslint outline-none:false*/
-
-.pure-button {
-    font-family: inherit;
-    font-size: 100%;
-    padding: 0.5em 1em;
-    color: #444; /* rgba not supported (IE 8) */
-    color: rgba(0, 0, 0, 0.80); /* rgba supported */
-    border: 1px solid #999;  /*IE 6/7/8*/
-    border: none rgba(0, 0, 0, 0);  /*IE9 + everything else*/
-    background-color: #E6E6E6;
-    text-decoration: none;
-    border-radius: 2px;
-}
-
-.pure-button-hover,
-.pure-button:hover,
-.pure-button:focus {
-    /* csslint ignore:start */
-    filter: alpha(opacity=90);
-    /* csslint ignore:end */
-    background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10));
-    background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, rgba(0,0,0, 0.10));
-}
-.pure-button:focus {
-    outline: 0;
-}
-.pure-button-active,
-.pure-button:active {
-    box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) inset;
-    border-color: #000\9;
-}
-
-.pure-button[disabled],
-.pure-button-disabled,
-.pure-button-disabled:hover,
-.pure-button-disabled:focus,
-.pure-button-disabled:active {
-    border: none;
-    background-image: none;
-    /* csslint ignore:start */
-    filter: alpha(opacity=40);
-    /* csslint ignore:end */
-    opacity: 0.40;
-    cursor: not-allowed;
-    box-shadow: none;
-    pointer-events: none;
-}
-
-.pure-button-hidden {
-    display: none;
-}
-
-.pure-button-primary,
-.pure-button-selected,
-a.pure-button-primary,
-a.pure-button-selected {
-    background-color: rgb(0, 120, 231);
-    color: #fff;
-}
-
-/* Button Groups */
-.pure-button-group .pure-button {
-    margin: 0;
-    border-radius: 0;
-    border-right: 1px solid #111;  /* fallback color for rgba() for IE7/8 */
-    border-right: 1px solid rgba(0, 0, 0, 0.2);
-
-}
-
-.pure-button-group .pure-button:first-child {
-    border-top-left-radius: 2px;
-    border-bottom-left-radius: 2px;
-}
-.pure-button-group .pure-button:last-child {
-    border-top-right-radius: 2px;
-    border-bottom-right-radius: 2px;
-    border-right: none;
-}
-
-/*csslint box-model:false*/
-/*
-Box-model set to false because we're setting a height on select elements, which
-also have border and padding. This is done because some browsers don't render
-the padding. We explicitly set the box-model for select elements to border-box,
-so we can ignore the csslint warning.
-*/
-
-.pure-form input[type="text"],
-.pure-form input[type="password"],
-.pure-form input[type="email"],
-.pure-form input[type="url"],
-.pure-form input[type="date"],
-.pure-form input[type="month"],
-.pure-form input[type="time"],
-.pure-form input[type="datetime"],
-.pure-form input[type="datetime-local"],
-.pure-form input[type="week"],
-.pure-form input[type="number"],
-.pure-form input[type="search"],
-.pure-form input[type="tel"],
-.pure-form input[type="color"],
-.pure-form select,
-.pure-form textarea {
-    padding: 0.5em 0.6em;
-    display: inline-block;
-    border: 1px solid #ccc;
-    box-shadow: inset 0 1px 3px #ddd;
-    border-radius: 4px;
-    vertical-align: middle;
-    box-sizing: border-box;
-}
-
-/*
-Need to separate out the :not() selector from the rest of the CSS 2.1 selectors
-since IE8 won't execute CSS that contains a CSS3 selector.
-*/
-.pure-form input:not([type]) {
-    padding: 0.5em 0.6em;
-    display: inline-block;
-    border: 1px solid #ccc;
-    box-shadow: inset 0 1px 3px #ddd;
-    border-radius: 4px;
-    box-sizing: border-box;
-}
-
-
-/* Chrome (as of v.32/34 on OS X) needs additional room for color to display. */
-/* May be able to remove this tweak as color inputs become more standardized across browsers. */
-.pure-form input[type="color"] {
-    padding: 0.2em 0.5em;
-}
-
-
-.pure-form input[type="text"]:focus,
-.pure-form input[type="password"]:focus,
-.pure-form input[type="email"]:focus,
-.pure-form input[type="url"]:focus,
-.pure-form input[type="date"]:focus,
-.pure-form input[type="month"]:focus,
-.pure-form input[type="time"]:focus,
-.pure-form input[type="datetime"]:focus,
-.pure-form input[type="datetime-local"]:focus,
-.pure-form input[type="week"]:focus,
-.pure-form input[type="number"]:focus,
-.pure-form input[type="search"]:focus,
-.pure-form input[type="tel"]:focus,
-.pure-form input[type="color"]:focus,
-.pure-form select:focus,
-.pure-form textarea:focus {
-    outline: 0;
-    border-color: #129FEA;
-}
-
-/*
-Need to separate out the :not() selector from the rest of the CSS 2.1 selectors
-since IE8 won't execute CSS that contains a CSS3 selector.
-*/
-.pure-form input:not([type]):focus {
-    outline: 0;
-    border-color: #129FEA;
-}
-
-.pure-form input[type="file"]:focus,
-.pure-form input[type="radio"]:focus,
-.pure-form input[type="checkbox"]:focus {
-    outline: thin solid #129FEA;
-    outline: 1px auto #129FEA;
-}
-.pure-form .pure-checkbox,
-.pure-form .pure-radio {
-    margin: 0.5em 0;
-    display: block;
-}
-
-.pure-form input[type="text"][disabled],
-.pure-form input[type="password"][disabled],
-.pure-form input[type="email"][disabled],
-.pure-form input[type="url"][disabled],
-.pure-form input[type="date"][disabled],
-.pure-form input[type="month"][disabled],
-.pure-form input[type="time"][disabled],
-.pure-form input[type="datetime"][disabled],
-.pure-form input[type="datetime-local"][disabled],
-.pure-form input[type="week"][disabled],
-.pure-form input[type="number"][disabled],
-.pure-form input[type="search"][disabled],
-.pure-form input[type="tel"][disabled],
-.pure-form input[type="color"][disabled],
-.pure-form select[disabled],
-.pure-form textarea[disabled] {
-    cursor: not-allowed;
-    background-color: #eaeded;
-    color: #cad2d3;
-}
-
-/*
-Need to separate out the :not() selector from the rest of the CSS 2.1 selectors
-since IE8 won't execute CSS that contains a CSS3 selector.
-*/
-.pure-form input:not([type])[disabled] {
-    cursor: not-allowed;
-    background-color: #eaeded;
-    color: #cad2d3;
-}
-.pure-form input[readonly],
-.pure-form select[readonly],
-.pure-form textarea[readonly] {
-    background-color: #eee; /* menu hover bg color */
-    color: #777; /* menu text color */
-    border-color: #ccc;
-}
-
-.pure-form input:focus:invalid,
-.pure-form textarea:focus:invalid,
-.pure-form select:focus:invalid {
-    color: #b94a48;
-    border-color: #e9322d;
-}
-.pure-form input[type="file"]:focus:invalid:focus,
-.pure-form input[type="radio"]:focus:invalid:focus,
-.pure-form input[type="checkbox"]:focus:invalid:focus {
-    outline-color: #e9322d;
-}
-.pure-form select {
-    /* Normalizes the height; padding is not sufficient. */
-    height: 2.25em;
-    border: 1px solid #ccc;
-    background-color: white;
-}
-.pure-form select[multiple] {
-    height: auto;
-}
-.pure-form label {
-    margin: 0.5em 0 0.2em;
-}
-.pure-form fieldset {
-    margin: 0;
-    padding: 0.35em 0 0.75em;
-    border: 0;
-}
-.pure-form legend {
-    display: block;
-    width: 100%;
-    padding: 0.3em 0;
-    margin-bottom: 0.3em;
-    color: #333;
-    border-bottom: 1px solid #e5e5e5;
-}
-
-.pure-form-stacked input[type="text"],
-.pure-form-stacked input[type="password"],
-.pure-form-stacked input[type="email"],
-.pure-form-stacked input[type="url"],
-.pure-form-stacked input[type="date"],
-.pure-form-stacked input[type="month"],
-.pure-form-stacked input[type="time"],
-.pure-form-stacked input[type="datetime"],
-.pure-form-stacked input[type="datetime-local"],
-.pure-form-stacked input[type="week"],
-.pure-form-stacked input[type="number"],
-.pure-form-stacked input[type="search"],
-.pure-form-stacked input[type="tel"],
-.pure-form-stacked input[type="color"],
-.pure-form-stacked input[type="file"],
-.pure-form-stacked select,
-.pure-form-stacked label,
-.pure-form-stacked textarea {
-    display: block;
-    margin: 0.25em 0;
-}
-
-/*
-Need to separate out the :not() selector from the rest of the CSS 2.1 selectors
-since IE8 won't execute CSS that contains a CSS3 selector.
-*/
-.pure-form-stacked input:not([type]) {
-    display: block;
-    margin: 0.25em 0;
-}
-.pure-form-aligned input,
-.pure-form-aligned textarea,
-.pure-form-aligned select,
-/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */
-.pure-form-aligned .pure-help-inline,
-.pure-form-message-inline {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-    vertical-align: middle;
-}
-.pure-form-aligned textarea {
-    vertical-align: top;
-}
-
-/* Aligned Forms */
-.pure-form-aligned .pure-control-group {
-    margin-bottom: 0.5em;
-}
-.pure-form-aligned .pure-control-group label {
-    text-align: right;
-    display: inline-block;
-    vertical-align: middle;
-    width: 10em;
-    margin: 0 1em 0 0;
-}
-.pure-form-aligned .pure-controls {
-    margin: 1.5em 0 0 11em;
-}
-
-/* Rounded Inputs */
-.pure-form input.pure-input-rounded,
-.pure-form .pure-input-rounded {
-    border-radius: 2em;
-    padding: 0.5em 1em;
-}
-
-/* Grouped Inputs */
-.pure-form .pure-group fieldset {
-    margin-bottom: 10px;
-}
-.pure-form .pure-group input,
-.pure-form .pure-group textarea {
-    display: block;
-    padding: 10px;
-    margin: 0 0 -1px;
-    border-radius: 0;
-    position: relative;
-    top: -1px;
-}
-.pure-form .pure-group input:focus,
-.pure-form .pure-group textarea:focus {
-    z-index: 3;
-}
-.pure-form .pure-group input:first-child,
-.pure-form .pure-group textarea:first-child {
-    top: 1px;
-    border-radius: 4px 4px 0 0;
-    margin: 0;
-}
-.pure-form .pure-group input:first-child:last-child,
-.pure-form .pure-group textarea:first-child:last-child {
-    top: 1px;
-    border-radius: 4px;
-    margin: 0;
-}
-.pure-form .pure-group input:last-child,
-.pure-form .pure-group textarea:last-child {
-    top: -2px;
-    border-radius: 0 0 4px 4px;
-    margin: 0;
-}
-.pure-form .pure-group button {
-    margin: 0.35em 0;
-}
-
-.pure-form .pure-input-1 {
-    width: 100%;
-}
-.pure-form .pure-input-3-4 {
-    width: 75%;
-}
-.pure-form .pure-input-2-3 {
-    width: 66%;
-}
-.pure-form .pure-input-1-2 {
-    width: 50%;
-}
-.pure-form .pure-input-1-3 {
-    width: 33%;
-}
-.pure-form .pure-input-1-4 {
-    width: 25%;
-}
-
-/* Inline help for forms */
-/* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */
-.pure-form .pure-help-inline,
-.pure-form-message-inline {
-    display: inline-block;
-    padding-left: 0.3em;
-    color: #666;
-    vertical-align: middle;
-    font-size: 0.875em;
-}
-
-/* Block help for forms */
-.pure-form-message {
-    display: block;
-    color: #666;
-    font-size: 0.875em;
-}
-
-@media only screen and (max-width : 480px) {
-    .pure-form button[type="submit"] {
-        margin: 0.7em 0 0;
-    }
-
-    .pure-form input:not([type]),
-    .pure-form input[type="text"],
-    .pure-form input[type="password"],
-    .pure-form input[type="email"],
-    .pure-form input[type="url"],
-    .pure-form input[type="date"],
-    .pure-form input[type="month"],
-    .pure-form input[type="time"],
-    .pure-form input[type="datetime"],
-    .pure-form input[type="datetime-local"],
-    .pure-form input[type="week"],
-    .pure-form input[type="number"],
-    .pure-form input[type="search"],
-    .pure-form input[type="tel"],
-    .pure-form input[type="color"],
-    .pure-form label {
-        margin-bottom: 0.3em;
-        display: block;
-    }
-
-    .pure-group input:not([type]),
-    .pure-group input[type="text"],
-    .pure-group input[type="password"],
-    .pure-group input[type="email"],
-    .pure-group input[type="url"],
-    .pure-group input[type="date"],
-    .pure-group input[type="month"],
-    .pure-group input[type="time"],
-    .pure-group input[type="datetime"],
-    .pure-group input[type="datetime-local"],
-    .pure-group input[type="week"],
-    .pure-group input[type="number"],
-    .pure-group input[type="search"],
-    .pure-group input[type="tel"],
-    .pure-group input[type="color"] {
-        margin-bottom: 0;
-    }
-
-    .pure-form-aligned .pure-control-group label {
-        margin-bottom: 0.3em;
-        text-align: left;
-        display: block;
-        width: 100%;
-    }
-
-    .pure-form-aligned .pure-controls {
-        margin: 1.5em 0 0 0;
-    }
-
-    /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline instead. */
-    .pure-form .pure-help-inline,
-    .pure-form-message-inline,
-    .pure-form-message {
-        display: block;
-        font-size: 0.75em;
-        /* Increased bottom padding to make it group with its related input element. */
-        padding: 0.2em 0 0.8em;
-    }
-}
-
-/*csslint adjoining-classes: false, box-model:false*/
-.pure-menu {
-    box-sizing: border-box;
-}
-
-.pure-menu-fixed {
-    position: fixed;
-    left: 0;
-    top: 0;
-    z-index: 3;
-}
-
-.pure-menu-list,
-.pure-menu-item {
-    position: relative;
-}
-
-.pure-menu-list {
-    list-style: none;
-    margin: 0;
-    padding: 0;
-}
-
-.pure-menu-item {
-    padding: 0;
-    margin: 0;
-    height: 100%;
-}
-
-.pure-menu-link,
-.pure-menu-heading {
-    display: block;
-    text-decoration: none;
-    white-space: nowrap;
-}
-
-/* HORIZONTAL MENU */
-.pure-menu-horizontal {
-    width: 100%;
-    white-space: nowrap;
-}
-
-.pure-menu-horizontal .pure-menu-list {
-    display: inline-block;
-}
-
-/* Initial menus should be inline-block so that they are horizontal */
-.pure-menu-horizontal .pure-menu-item,
-.pure-menu-horizontal .pure-menu-heading,
-.pure-menu-horizontal .pure-menu-separator {
-    display: inline-block;
-    *display: inline;
-    zoom: 1;
-    vertical-align: middle;
-}
-
-/* Submenus should still be display: block; */
-.pure-menu-item .pure-menu-item {
-    display: block;
-}
-
-.pure-menu-children {
-    display: none;
-    position: absolute;
-    left: 100%;
-    top: 0;
-    margin: 0;
-    padding: 0;
-    z-index: 3;
-}
-
-.pure-menu-horizontal .pure-menu-children {
-    left: 0;
-    top: auto;
-    width: inherit;
-}
-
-.pure-menu-allow-hover:hover > .pure-menu-children,
-.pure-menu-active > .pure-menu-children {
-    display: block;
-    position: absolute;
-}
-
-/* Vertical Menus - show the dropdown arrow */
-.pure-menu-has-children > .pure-menu-link:after {
-    padding-left: 0.5em;
-    content: "\25B8";
-    font-size: small;
-}
-
-/* Horizontal Menus - show the dropdown arrow */
-.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after {
-    content: "\25BE";
-}
-
-/* scrollable menus */
-.pure-menu-scrollable {
-    overflow-y: scroll;
-    overflow-x: hidden;
-}
-
-.pure-menu-scrollable .pure-menu-list {
-    display: block;
-}
-
-.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list {
-    display: inline-block;
-}
-
-.pure-menu-horizontal.pure-menu-scrollable {
-    white-space: nowrap;
-    overflow-y: hidden;
-    overflow-x: auto;
-    -ms-overflow-style: none;
-    -webkit-overflow-scrolling: touch;
-    /* a little extra padding for this style to allow for scrollbars */
-    padding: .5em 0;
-}
-
-.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar {
-    display: none;
-}
-
-/* misc default styling */
-
-.pure-menu-separator,
-.pure-menu-horizontal .pure-menu-children .pure-menu-separator {
-    background-color: #ccc;
-    height: 1px;
-    margin: .3em 0;
-}
-
-.pure-menu-horizontal .pure-menu-separator {
-    width: 1px;
-    height: 1.3em;
-    margin: 0 .3em ;
-}
-
-/* Need to reset the separator since submenu is vertical */
-.pure-menu-horizontal .pure-menu-children .pure-menu-separator {
-    display: block;
-    width: auto;
-}
-
-.pure-menu-heading {
-    text-transform: uppercase;
-    color: #565d64;
-}
-
-.pure-menu-link {
-    color: #777;
-}
-
-.pure-menu-children {
-    background-color: #fff;
-}
-
-.pure-menu-link,
-.pure-menu-disabled,
-.pure-menu-heading {
-    padding: .5em 1em;
-}
-
-.pure-menu-disabled {
-    opacity: .5;
-}
-
-.pure-menu-disabled .pure-menu-link:hover {
-    background-color: transparent;
-}
-
-.pure-menu-active > .pure-menu-link,
-.pure-menu-link:hover,
-.pure-menu-link:focus {
-    background-color: #eee;
-}
-
-.pure-menu-selected .pure-menu-link,
-.pure-menu-selected .pure-menu-link:visited {
-    color: #000;
-}
-
-.pure-table {
-    /* Remove spacing between table cells (from Normalize.css) */
-    border-collapse: collapse;
-    border-spacing: 0;
-    empty-cells: show;
-    border: 1px solid #cbcbcb;
-}
-
-.pure-table caption {
-    color: #000;
-    font: italic 85%/1 arial, sans-serif;
-    padding: 1em 0;
-    text-align: center;
-}
-
-.pure-table td,
-.pure-table th {
-    border-left: 1px solid #cbcbcb;/*  inner column border */
-    border-width: 0 0 0 1px;
-    font-size: inherit;
-    margin: 0;
-    overflow: visible; /*to make ths where the title is really long work*/
-    padding: 0.5em 1em; /* cell padding */
-}
-
-/* Consider removing this next declaration block, as it causes problems when
-there's a rowspan on the first cell. Case added to the tests. issue#432 */
-.pure-table td:first-child,
-.pure-table th:first-child {
-    border-left-width: 0;
-}
-
-.pure-table thead {
-    background-color: #e0e0e0;
-    color: #000;
-    text-align: left;
-    vertical-align: bottom;
-}
-
-/*
-striping:
-   even - #fff (white)
-   odd  - #f2f2f2 (light gray)
-*/
-.pure-table td {
-    background-color: transparent;
-}
-.pure-table-odd td {
-    background-color: #f2f2f2;
-}
-
-/* nth-child selector for modern browsers */
-.pure-table-striped tr:nth-child(2n-1) td {
-    background-color: #f2f2f2;
-}
-
-/* BORDERED TABLES */
-.pure-table-bordered td {
-    border-bottom: 1px solid #cbcbcb;
-}
-.pure-table-bordered tbody > tr:last-child > td {
-    border-bottom-width: 0;
-}
-
-
-/* HORIZONTAL BORDERED TABLES */
-
-.pure-table-horizontal td,
-.pure-table-horizontal th {
-    border-width: 0 0 1px 0;
-    border-bottom: 1px solid #cbcbcb;
-}
-.pure-table-horizontal tbody > tr:last-child > td {
-    border-bottom-width: 0;
-}
diff --git a/packages/csslib/test/examples/skeleton.css b/packages/csslib/test/examples/skeleton.css
deleted file mode 100644
index f28bf6c..0000000
--- a/packages/csslib/test/examples/skeleton.css
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
-* Skeleton V2.0.4
-* Copyright 2014, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 12/29/2014
-*/
-
-
-/* Table of contents
-––––––––––––––––––––––––––––––––––––––––––––––––––
-- Grid
-- Base Styles
-- Typography
-- Links
-- Buttons
-- Forms
-- Lists
-- Code
-- Tables
-- Spacing
-- Utilities
-- Clearing
-- Media Queries
-*/
-
-
-/* Grid
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-.container {
-  position: relative;
-  width: 100%;
-  max-width: 960px;
-  margin: 0 auto;
-  padding: 0 20px;
-  box-sizing: border-box; }
-.column,
-.columns {
-  width: 100%;
-  float: left;
-  box-sizing: border-box; }
-
-/* For devices larger than 400px */
-@media (min-width: 400px) {
-  .container {
-    width: 85%;
-    padding: 0; }
-}
-
-/* For devices larger than 550px */
-@media (min-width: 550px) {
-  .container {
-    width: 80%; }
-  .column,
-  .columns {
-    margin-left: 4%; }
-  .column:first-child,
-  .columns:first-child {
-    margin-left: 0; }
-
-  .one.column,
-  .one.columns                    { width: 4.66666666667%; }
-  .two.columns                    { width: 13.3333333333%; }
-  .three.columns                  { width: 22%;            }
-  .four.columns                   { width: 30.6666666667%; }
-  .five.columns                   { width: 39.3333333333%; }
-  .six.columns                    { width: 48%;            }
-  .seven.columns                  { width: 56.6666666667%; }
-  .eight.columns                  { width: 65.3333333333%; }
-  .nine.columns                   { width: 74.0%;          }
-  .ten.columns                    { width: 82.6666666667%; }
-  .eleven.columns                 { width: 91.3333333333%; }
-  .twelve.columns                 { width: 100%; margin-left: 0; }
-
-  .one-third.column               { width: 30.6666666667%; }
-  .two-thirds.column              { width: 65.3333333333%; }
-
-  .one-half.column                { width: 48%; }
-
-  /* Offsets */
-  .offset-by-one.column,
-  .offset-by-one.columns          { margin-left: 8.66666666667%; }
-  .offset-by-two.column,
-  .offset-by-two.columns          { margin-left: 17.3333333333%; }
-  .offset-by-three.column,
-  .offset-by-three.columns        { margin-left: 26%;            }
-  .offset-by-four.column,
-  .offset-by-four.columns         { margin-left: 34.6666666667%; }
-  .offset-by-five.column,
-  .offset-by-five.columns         { margin-left: 43.3333333333%; }
-  .offset-by-six.column,
-  .offset-by-six.columns          { margin-left: 52%;            }
-  .offset-by-seven.column,
-  .offset-by-seven.columns        { margin-left: 60.6666666667%; }
-  .offset-by-eight.column,
-  .offset-by-eight.columns        { margin-left: 69.3333333333%; }
-  .offset-by-nine.column,
-  .offset-by-nine.columns         { margin-left: 78.0%;          }
-  .offset-by-ten.column,
-  .offset-by-ten.columns          { margin-left: 86.6666666667%; }
-  .offset-by-eleven.column,
-  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }
-
-  .offset-by-one-third.column,
-  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }
-  .offset-by-two-thirds.column,
-  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }
-
-  .offset-by-one-half.column,
-  .offset-by-one-half.columns     { margin-left: 52%; }
-
-}
-
-
-/* Base Styles
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-/* NOTE
-html is set to 62.5% so that all the REM measurements throughout Skeleton
-are based on 10px sizing. So basically 1.5rem = 15px :) */
-html {
-  font-size: 62.5%; }
-body {
-  font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
-  line-height: 1.6;
-  font-weight: 400;
-  font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  color: #222; }
-
-
-/* Typography
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-h1, h2, h3, h4, h5, h6 {
-  margin-top: 0;
-  margin-bottom: 2rem;
-  font-weight: 300; }
-h1 { font-size: 4.0rem; line-height: 1.2;  letter-spacing: -.1rem;}
-h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
-h3 { font-size: 3.0rem; line-height: 1.3;  letter-spacing: -.1rem; }
-h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
-h5 { font-size: 1.8rem; line-height: 1.5;  letter-spacing: -.05rem; }
-h6 { font-size: 1.5rem; line-height: 1.6;  letter-spacing: 0; }
-
-/* Larger than phablet */
-@media (min-width: 550px) {
-  h1 { font-size: 5.0rem; }
-  h2 { font-size: 4.2rem; }
-  h3 { font-size: 3.6rem; }
-  h4 { font-size: 3.0rem; }
-  h5 { font-size: 2.4rem; }
-  h6 { font-size: 1.5rem; }
-}
-
-p {
-  margin-top: 0; }
-
-
-/* Links
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-a {
-  color: #1EAEDB; }
-a:hover {
-  color: #0FA0CE; }
-
-
-/* Buttons
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-.button,
-button,
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
-  display: inline-block;
-  height: 38px;
-  padding: 0 30px;
-  color: #555;
-  text-align: center;
-  font-size: 11px;
-  font-weight: 600;
-  line-height: 38px;
-  letter-spacing: .1rem;
-  text-transform: uppercase;
-  text-decoration: none;
-  white-space: nowrap;
-  background-color: transparent;
-  border-radius: 4px;
-  border: 1px solid #bbb;
-  cursor: pointer;
-  box-sizing: border-box; }
-.button:hover,
-button:hover,
-input[type="submit"]:hover,
-input[type="reset"]:hover,
-input[type="button"]:hover,
-.button:focus,
-button:focus,
-input[type="submit"]:focus,
-input[type="reset"]:focus,
-input[type="button"]:focus {
-  color: #333;
-  border-color: #888;
-  outline: 0; }
-.button.button-primary,
-button.button-primary,
-input[type="submit"].button-primary,
-input[type="reset"].button-primary,
-input[type="button"].button-primary {
-  color: #FFF;
-  background-color: #33C3F0;
-  border-color: #33C3F0; }
-.button.button-primary:hover,
-button.button-primary:hover,
-input[type="submit"].button-primary:hover,
-input[type="reset"].button-primary:hover,
-input[type="button"].button-primary:hover,
-.button.button-primary:focus,
-button.button-primary:focus,
-input[type="submit"].button-primary:focus,
-input[type="reset"].button-primary:focus,
-input[type="button"].button-primary:focus {
-  color: #FFF;
-  background-color: #1EAEDB;
-  border-color: #1EAEDB; }
-
-
-/* Forms
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-input[type="email"],
-input[type="number"],
-input[type="search"],
-input[type="text"],
-input[type="tel"],
-input[type="url"],
-input[type="password"],
-textarea,
-select {
-  height: 38px;
-  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
-  background-color: #fff;
-  border: 1px solid #D1D1D1;
-  border-radius: 4px;
-  box-shadow: none;
-  box-sizing: border-box; }
-/* Removes awkward default styles on some inputs for iOS */
-input[type="email"],
-input[type="number"],
-input[type="search"],
-input[type="text"],
-input[type="tel"],
-input[type="url"],
-input[type="password"],
-textarea {
-  -webkit-appearance: none;
-     -moz-appearance: none;
-          appearance: none; }
-textarea {
-  min-height: 65px;
-  padding-top: 6px;
-  padding-bottom: 6px; }
-input[type="email"]:focus,
-input[type="number"]:focus,
-input[type="search"]:focus,
-input[type="text"]:focus,
-input[type="tel"]:focus,
-input[type="url"]:focus,
-input[type="password"]:focus,
-textarea:focus,
-select:focus {
-  border: 1px solid #33C3F0;
-  outline: 0; }
-label,
-legend {
-  display: block;
-  margin-bottom: .5rem;
-  font-weight: 600; }
-fieldset {
-  padding: 0;
-  border-width: 0; }
-input[type="checkbox"],
-input[type="radio"] {
-  display: inline; }
-label > .label-body {
-  display: inline-block;
-  margin-left: .5rem;
-  font-weight: normal; }
-
-
-/* Lists
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-ul {
-  list-style: circle inside; }
-ol {
-  list-style: decimal inside; }
-ol, ul {
-  padding-left: 0;
-  margin-top: 0; }
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin: 1.5rem 0 1.5rem 3rem;
-  font-size: 90%; }
-li {
-  margin-bottom: 1rem; }
-
-
-/* Code
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-code {
-  padding: .2rem .5rem;
-  margin: 0 .2rem;
-  font-size: 90%;
-  white-space: nowrap;
-  background: #F1F1F1;
-  border: 1px solid #E1E1E1;
-  border-radius: 4px; }
-pre > code {
-  display: block;
-  padding: 1rem 1.5rem;
-  white-space: pre; }
-
-
-/* Tables
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-th,
-td {
-  padding: 12px 15px;
-  text-align: left;
-  border-bottom: 1px solid #E1E1E1; }
-th:first-child,
-td:first-child {
-  padding-left: 0; }
-th:last-child,
-td:last-child {
-  padding-right: 0; }
-
-
-/* Spacing
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-button,
-.button {
-  margin-bottom: 1rem; }
-input,
-textarea,
-select,
-fieldset {
-  margin-bottom: 1.5rem; }
-pre,
-blockquote,
-dl,
-figure,
-table,
-p,
-ul,
-ol,
-form {
-  margin-bottom: 2.5rem; }
-
-
-/* Utilities
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-.u-full-width {
-  width: 100%;
-  box-sizing: border-box; }
-.u-max-full-width {
-  max-width: 100%;
-  box-sizing: border-box; }
-.u-pull-right {
-  float: right; }
-.u-pull-left {
-  float: left; }
-
-
-/* Misc
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-hr {
-  margin-top: 3rem;
-  margin-bottom: 3.5rem;
-  border-width: 0;
-  border-top: 1px solid #E1E1E1; }
-
-
-/* Clearing
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-
-/* Self Clearing Goodness */
-.container:after,
-.row:after,
-.u-cf {
-  content: "";
-  display: table;
-  clear: both; }
-
-
-/* Media Queries
-–––––––––––––––––––––––––––––––––––––––––––––––––– */
-/*
-Note: The best way to structure the use of media queries is to create the queries
-near the relevant code. For example, if you wanted to change the styles for buttons
-on small devices, paste the mobile query code up in the buttons section and style it
-there.
-*/
-
-
-/* Larger than mobile */
-@media (min-width: 400px) {}
-
-/* Larger than phablet (also point when grid becomes active) */
-@media (min-width: 550px) {}
-
-/* Larger than tablet */
-@media (min-width: 750px) {}
-
-/* Larger than desktop */
-@media (min-width: 1000px) {}
-
-/* Larger than Desktop HD */
-@media (min-width: 1200px) {}
diff --git a/packages/csslib/test/extend_test.dart b/packages/csslib/test/extend_test.dart
deleted file mode 100644
index 7df68c5..0000000
--- a/packages/csslib/test/extend_test.dart
+++ /dev/null
@@ -1,246 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-compileAndValidate(String input, String generated) {
-  var errors = <Message>[];
-  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/packages/csslib/test/mixin_test.dart b/packages/csslib/test/mixin_test.dart
deleted file mode 100644
index 59071f9..0000000
--- a/packages/csslib/test/mixin_test.dart
+++ /dev/null
@@ -1,675 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-compileAndValidate(String input, String generated) {
-  var errors = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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/packages/csslib/test/nested_test.dart b/packages/csslib/test/nested_test.dart
deleted file mode 100644
index a5cadab..0000000
--- a/packages/csslib/test/nested_test.dart
+++ /dev/null
@@ -1,632 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-compileAndValidate(String input, String generated) {
-  var errors = <Message>[];
-  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/packages/csslib/test/samples_test.dart b/packages/csslib/test/samples_test.dart
deleted file mode 100644
index 4607a05..0000000
--- a/packages/csslib/test/samples_test.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-@TestOn('vm')
-library samples_test;
-
-import 'dart:io';
-import 'dart:mirrors';
-
-import 'package:test/test.dart';
-import 'package:csslib/parser.dart';
-
-const testOptions = const PreprocessorOptions(
-    useColors: false,
-    checked: false,
-    warningsAsErrors: true,
-    inputFile: 'memory');
-
-void testCSSFile(File cssFile) {
-  final errors = <Message>[];
-  final css = cssFile.readAsStringSync();
-  final stylesheet = parse(css, errors: errors, options: testOptions);
-
-  expect(stylesheet, isNotNull);
-  expect(errors, isEmpty, reason: errors.toString());
-}
-
-main() {
-  final libraryUri = currentMirrorSystem().findLibrary(#samples_test).uri;
-  final cssDir = new Directory.fromUri(libraryUri.resolve('examples'));
-  for (var element in cssDir.listSync())
-    if (element is File && element.uri.pathSegments.last.endsWith('.css')) {
-      test(element.uri.pathSegments.last, () => testCSSFile(element));
-    }
-}
diff --git a/packages/csslib/test/selector_test.dart b/packages/csslib/test/selector_test.dart
deleted file mode 100644
index 66e2080..0000000
--- a/packages/csslib/test/selector_test.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-void testSelectorSuccesses() {
-  var errors = <Message>[];
-  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));
-
-  selectorAst = selector(':host', errors: errors..clear());
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(compactOuptut(selectorAst), ':host');
-
-  selectorAst = selector(':host(.foo)', errors: errors..clear());
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(compactOuptut(selectorAst), ':host(.foo)');
-
-  selectorAst = selector(':host-context(.foo)', errors: errors..clear());
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(compactOuptut(selectorAst), ':host-context(.foo)');
-
-  selectorAst = selector('.a /deep/ .b', errors: errors..clear());
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(compactOuptut(selectorAst), '.a /deep/ .b');
-
-  selectorAst = selector('.x >>> .y', errors: errors..clear());
-  expect(errors.isEmpty, true, reason: errors.toString());
-  expect(compactOuptut(selectorAst), '.x >>> .y');
-}
-
-// 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 = <Message>[];
-
-  // 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/packages/csslib/test/testing.dart b/packages/csslib/test/testing.dart
deleted file mode 100644
index 6807576..0000000
--- a/packages/csslib/test/testing.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// 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/packages/csslib/test/var_test.dart b/packages/csslib/test/var_test.dart
deleted file mode 100644
index 39e7c45..0000000
--- a/packages/csslib/test/var_test.dart
+++ /dev/null
@@ -1,950 +0,0 @@
-// 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:csslib/src/messages.dart';
-import 'package:test/test.dart';
-
-import 'testing.dart';
-
-compileAndValidate(String input, String generated) {
-  var errors = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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 = <Message>[];
-  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/packages/csslib/test/visitor_test.dart b/packages/csslib/test/visitor_test.dart
deleted file mode 100644
index 02784c4..0000000
--- a/packages/csslib/test/visitor_test.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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/src/messages.dart';
-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 = <Message>[];
-  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 = <Message>[];
-  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/packages/dart_to_js_script_rewriter/.gitignore b/packages/dart_to_js_script_rewriter/.gitignore
deleted file mode 100644
index a1f5747..0000000
--- a/packages/dart_to_js_script_rewriter/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-.pub/
-.settings/
-build
-coverage/
-packages
-pubspec.lock
-.packages
diff --git a/packages/dart_to_js_script_rewriter/.travis.yml b/packages/dart_to_js_script_rewriter/.travis.yml
deleted file mode 100644
index 05577f3..0000000
--- a/packages/dart_to_js_script_rewriter/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: dart
-dart:
-  - stable
-script:
-  - pub run dart_dev format --check
-  - pub run dart_dev analyze
-  - pub run dart_dev test
-  - pub run dart_dev coverage --no-html
-  - bash <(curl -s https://codecov.io/bash) -f coverage/coverage.lcov
diff --git a/packages/dart_to_js_script_rewriter/CHANGELOG.md b/packages/dart_to_js_script_rewriter/CHANGELOG.md
deleted file mode 100644
index 2e70d1f..0000000
--- a/packages/dart_to_js_script_rewriter/CHANGELOG.md
+++ /dev/null
@@ -1,40 +0,0 @@
-## 1.0.2
-
-* Updated dependencies on `html` and `dartdoc`.
-
-## 0.1.0+4
-
-* [fix] only rewrite dart.js from browser package
-
-## 0.1.0+3
-
-* Update dependencies
-
-## 0.1.0+2
-
-* Removed special handling of the csp mode - dart2js no longer uses a special
-  output file name
-
-## 0.1.0+1
-
-* Added tests
-
-## 0.0.2
-
-* CSP support (thanks to claudiodangelis)
-
-## 0.0.1+3
-
-* Bump dependency versions (thanks to kaendfinger)
-
-## 0.0.1+2
-
-* Add a "why?" section to the README.
-
-## 0.0.1+1
-
-* Tweak readme.
-
-## 0.0.1
-
-* Initial version.
diff --git a/packages/dart_to_js_script_rewriter/COPYRIGHT_TRANSFER b/packages/dart_to_js_script_rewriter/COPYRIGHT_TRANSFER
deleted file mode 100644
index 57f8d39..0000000
--- a/packages/dart_to_js_script_rewriter/COPYRIGHT_TRANSFER
+++ /dev/null
@@ -1 +0,0 @@
-I, Seth Ladd, hereby assign copyright of dart_to_js_script_rewriter to Workiva Inc.
diff --git a/packages/dart_to_js_script_rewriter/LICENSE b/packages/dart_to_js_script_rewriter/LICENSE
deleted file mode 100644
index 325c381..0000000
--- a/packages/dart_to_js_script_rewriter/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2014 Seth Ladd. 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/packages/dart_to_js_script_rewriter/README.md b/packages/dart_to_js_script_rewriter/README.md
deleted file mode 100644
index 1fb5a30..0000000
--- a/packages/dart_to_js_script_rewriter/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# dart_to_js_script_rewriter
-
-<a href="https://pub.dartlang.org/packages/dart_to_js_script_rewriter"><img src="https://img.shields.io/pub/v/dart_to_js_script_rewriter.svg" alt="Pub" /></a>
-<a href="https://travis-ci.org/Workiva/dart_to_js_script_rewriter"><img src="https://travis-ci.org/Workiva/dart_to_js_script_rewriter.svg?branch=travis-ci" alt="Build Status" /></a>
-<a href="http://codecov.io/github/Workiva/dart_to_js_script_rewriter?branch=master"><img src="http://codecov.io/github/Workiva/dart_to_js_script_rewriter/coverage.svg?branch=master" alt="codecov.io" /></a>
-
-
-A pub transformer that rewrites Dart script tags to
-JavaScript script tags, eliminating
-404s and speeding up initial loads.
-Useful when building for deployment.
-
-## Why? Load your app quicker!
-
-A traditional Dart application is deployed with HTML that looks something
-like this:
-
-    <script async type="application/dart" src="test.dart"></script>
-    <script async src="packages/browser/dart.js"></script>
-
-This is a performance problem for initial startup, because:
-
-* Some browsers will attempt to download test.dart, but that file is not
-  deployed. This causes unnecessary server strain and noisy 404s.
-* The browser needs to run dart.js to replace a script tag in the DOM,
-  so that the actual JavaScript version of the app can be downloaded. This is
-  an unnecessary delay, since today no production browser includes Dart VM
-  and thus only the JavaScript version is required.
-
-With this transformer, you can address the above issues, speed up the load
-time of your apps, and make happier users.
-
-## Configuring
-
-Add the transformer to your pubspec.yaml:
-
-    transformers:
-    - dart_to_js_script_rewriter
-
-(Assuming you already added this package to your pubspec.yaml file.)
-
-## How it works
-
-**When run in "release" mode**, this transformer does two things:
-
-* Removes script tags that point to `browser/dart.js`.
-* Rewrites a Dart script tag to a JavaScript script tag.
-
-For example, this code:
-
-    <script async type="application/dart" src="test.dart"></script>
-    <script async src="packages/browser/dart.js"></script>
-
-is turned into this code:
-
-    <script async src="test.dart.js"></script>
-
-## Pub, modes, and this transformer
-
-**This transformer only runs when pub is running in release mode.**
-
-This transformer only makes sense when you want to build your app for a
-production deployment. You probably do not want to run this transformer
-during the normal develop/reload cycles.
-
-Pub can run in different _modes_, which have different semantics. The
-_debug mode_, for example, can disable minification. The _release mode_
-can turn on optimizations.
-
-By default, `pub serve` runs in _debug_ mode. By default, `pub build`
-runs in _release_ mode.
-
-See the [pub docs][pubdocs] for more on modes.
-
-## Reporting issues
-
-Please use the [issue tracker][issues].
-
-[issues]: https://github.com/Workiva/dart_to_js_script_rewriter/issues
-[pubdocs]: https://www.dartlang.org/tools/pub/
-
-Thanks to Seth Ladd, <sethladd@gmail.com>, for creating the original version of this [library](https://github.com/sethladd/dart_to_js_script_rewriter).
diff --git a/packages/dart_to_js_script_rewriter/analysis_options.yaml b/packages/dart_to_js_script_rewriter/analysis_options.yaml
deleted file mode 100644
index 59964a7..0000000
--- a/packages/dart_to_js_script_rewriter/analysis_options.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-analyzer:
-  strong-mode: true
-
-linter:
-  rules:
-    - cancel_subscriptions
-    - close_sinks
\ No newline at end of file
diff --git a/packages/dart_to_js_script_rewriter/docs.yml b/packages/dart_to_js_script_rewriter/docs.yml
deleted file mode 100644
index e2c97cc..0000000
--- a/packages/dart_to_js_script_rewriter/docs.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-title: dart_to_js_script_rewriter
-base: github:Workiva/dart_to_js_script_rewriter/
-src: README.md
diff --git a/packages/dart_to_js_script_rewriter/example/index.html b/packages/dart_to_js_script_rewriter/example/index.html
deleted file mode 100644
index 55384fe..0000000
--- a/packages/dart_to_js_script_rewriter/example/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>Test</title>
-
-    <script async type="application/dart" src="test.dart"></script>
-    <script async src="packages/browser/dart.js"></script>
-
-    <link rel="stylesheet" href="test.css">
-  </head>
-  <body>
-    <h1>Test</h1>
-
-    <p>Hello world from Dart!</p>
-
-    <div id="sample_container_id">
-      <p id="sample_text_id">Click me!</p>
-    </div>
-
-  </body>
-</html>
diff --git a/packages/dart_to_js_script_rewriter/example/test.css b/packages/dart_to_js_script_rewriter/example/test.css
deleted file mode 100644
index bd14ffa..0000000
--- a/packages/dart_to_js_script_rewriter/example/test.css
+++ /dev/null
@@ -1,29 +0,0 @@
-
-body {
-  background-color: #F8F8F8;
-  font-family: 'Open Sans', sans-serif;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 1.2em;
-  margin: 15px;
-}
-
-h1, p {
-  color: #333;
-}
-
-#sample_container_id {
-  width: 100%;
-  height: 400px;
-  position: relative;
-  border: 1px solid #ccc;
-  background-color: #fff;
-}
-
-#sample_text_id {
-  font-size: 24pt;
-  text-align: center;
-  margin-top: 140px;
-  -webkit-user-select: none;
-  user-select: none;
-}
diff --git a/packages/dart_to_js_script_rewriter/example/test.dart b/packages/dart_to_js_script_rewriter/example/test.dart
deleted file mode 100644
index 72f77b9..0000000
--- a/packages/dart_to_js_script_rewriter/example/test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-import 'dart:html';
-
-void main() {
-  querySelector("#sample_text_id")
-    ..text = "Click me!"
-    ..onClick.listen(reverseText);
-}
-
-void reverseText(MouseEvent event) {
-  var text = querySelector("#sample_text_id").text;
-  var buffer = new StringBuffer();
-  for (int i = text.length - 1; i >= 0; i--) {
-    buffer.write(text[i]);
-  }
-  querySelector("#sample_text_id").text = buffer.toString();
-}
diff --git a/packages/dart_to_js_script_rewriter/lib/dart_to_js_script_rewriter.dart b/packages/dart_to_js_script_rewriter/lib/dart_to_js_script_rewriter.dart
deleted file mode 100644
index 8b19c2a..0000000
--- a/packages/dart_to_js_script_rewriter/lib/dart_to_js_script_rewriter.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-library dart_to_js_script_rewriter;
-
-import 'dart:async' show Future;
-
-import 'package:barback/barback.dart'
-    show Asset, AssetId, BarbackMode, BarbackSettings, Transform, Transformer;
-import 'package:html/dom.dart' show Document, Element;
-
-/// Finds script tags with type equals `application/dart` and rewrites them to
-/// point to the JS version. This eliminates a 404 get on the .dart file and
-/// speeds up initial loads. Win!
-class DartToJsScriptRewriter extends Transformer {
-  final BarbackSettings settings;
-
-  DartToJsScriptRewriter.asPlugin(this.settings);
-
-  bool isPrimary(AssetId id) =>
-      settings.mode == BarbackMode.RELEASE &&
-      ['.html', '.htm'].contains(id.extension) &&
-      !id.path.startsWith('lib');
-
-  Future apply(Transform transform) async {
-    final htmlSource = await transform.primaryInput.readAsString();
-    Document document = new Document.html(htmlSource);
-
-    // only apply changes to files with either a dart script (which has to be
-    // rewritten), or a browser/dart.js script (which has to be removed)
-    if (!document.querySelectorAll('script').any((script) =>
-        scriptShouldBeRewritten(script) || scriptShouldBeRemoved(script))) {
-      return new Future.value(null);
-    }
-    removeBrowserPackageScript(document);
-    rewriteDartScriptTag(document);
-
-    final id = transform.primaryInput.id;
-    transform.addOutput(new Asset.fromString(id, document.outerHtml));
-  }
-
-  void removeBrowserPackageScript(Document document) {
-    document
-        .querySelectorAll('script')
-        .where((tag) => scriptShouldBeRemoved(tag))
-        .forEach((tag) => tag.remove());
-  }
-
-  void rewriteDartScriptTag(Document document) {
-    document
-        .querySelectorAll('script')
-        .where((tag) => scriptShouldBeRewritten(tag))
-        .forEach((tag) {
-      final src = tag.attributes['src'];
-
-      tag.attributes['src'] = src.replaceFirstMapped(
-          new RegExp(r'\.dart($|[\?#])'), (match) => '.dart.js${match[1]}');
-      tag.attributes.remove('type');
-    });
-  }
-
-  bool scriptShouldBeRewritten(Element el) =>
-      el.attributes['type'] == 'application/dart' &&
-      el.attributes['src'] != null;
-
-  bool scriptShouldBeRemoved(Element el) =>
-      el.attributes['src'] != null &&
-      el.attributes['src'].endsWith('browser/dart.js');
-}
diff --git a/packages/dart_to_js_script_rewriter/pubspec.yaml b/packages/dart_to_js_script_rewriter/pubspec.yaml
deleted file mode 100644
index 17afbde..0000000
--- a/packages/dart_to_js_script_rewriter/pubspec.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: dart_to_js_script_rewriter
-description: Replaces Dart script tags with JavaScript script tags,
-             speeding up initial loads and reducing 404s. Use when
-             ready to deploy.
-authors:
-  - Seth Ladd <sethladd@gmail.com>
-  - Workiva Client Platform Team <clientplatform@workiva.com>
-  - Dustin Lessard <dustin.lessard@workiva.com>
-  - Evan Weible <evan.weible@workiva.com>
-  - Jay Udey <jay.udey@workiva.com>
-  - Max Peterson <maxwell.peterson@workiva.com>
-  - Trent Grover <trent.grover@workiva.com>
-version: 1.0.3
-homepage: https://github.com/Workiva/dart_to_js_script_rewriter
-environment:
-  sdk: ">=1.12.0 <2.0.0"
-dependencies:
-  barback: "^0.15.2+7"
-  html: ">=0.12.2+1 <0.14.0"
-dev_dependencies:
-  browser: "^0.10.0+2"
-  coverage: "^0.7.2"
-  dart_dev: "^1.0.6"
-  dart_style: ">=0.1.8 <0.3.0"
-  dartdoc: ">=0.4.0 <0.10.0"
-  grinder: "^0.8.0+1"
-  mockito: any
-  test: "^0.12.6+2"
-transformers:
-- dart_to_js_script_rewriter
-- test/pub_serve:
-    $include: test/**_test{.*,}.dart
diff --git a/packages/dart_to_js_script_rewriter/smithy.yaml b/packages/dart_to_js_script_rewriter/smithy.yaml
deleted file mode 100644
index edd91a9..0000000
--- a/packages/dart_to_js_script_rewriter/smithy.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-project: dart
-language: dart
-
-# dart 1.19.1
-runner_image: drydock-prod.workiva.org/workiva/smithy-runner-generator:92530
-
-script:
-  - pub get
-
-artifacts:
-  build:
-    - ./pubspec.lock
diff --git a/packages/dart_to_js_script_rewriter/test/expected.html b/packages/dart_to_js_script_rewriter/test/expected.html
deleted file mode 100644
index 1710d86..0000000
--- a/packages/dart_to_js_script_rewriter/test/expected.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html><html><head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>Test</title>
-
-    <script async="" src="test.dart.js"></script>
-    
-
-    <link rel="stylesheet" href="test.css">
-  </head>
-  <body>
-    <h1>Test</h1>
-
-    <p>Hello world from Dart!</p>
-
-    <div id="sample_container_id">
-      <p id="sample_text_id">Click me!</p>
-    </div>
-
-  
-
-</body></html>
\ No newline at end of file
diff --git a/packages/dart_to_js_script_rewriter/test/integration_test.dart b/packages/dart_to_js_script_rewriter/test/integration_test.dart
deleted file mode 100644
index 8390d95..0000000
--- a/packages/dart_to_js_script_rewriter/test/integration_test.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-@TestOn('vm')
-library dart_to_js_script_rewriter.test.integration_test;
-
-import 'package:test/test.dart';
-import 'package:grinder/grinder.dart';
-import 'dart:io';
-
-void main() {
-  test('transformer is activated in pub build release', () async {
-    Pub.build(mode: 'release', directories: ['example']);
-    final testHtml = new File('build/example/index.html');
-    final content = await testHtml.readAsString();
-
-    File expectedHtml = new File('test/expected.html');
-    expect(content, await expectedHtml.readAsString());
-  });
-}
diff --git a/packages/dart_to_js_script_rewriter/test/test_data/test_file.html b/packages/dart_to_js_script_rewriter/test/test_data/test_file.html
deleted file mode 100644
index 49d4315..0000000
--- a/packages/dart_to_js_script_rewriter/test/test_data/test_file.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <script async type="application/dart" src="test.dart"></script>
-    <script async src="packages/browser/dart.js"></script>
-</head>
-</html>
\ No newline at end of file
diff --git a/packages/dart_to_js_script_rewriter/test/transformer_mocks.dart b/packages/dart_to_js_script_rewriter/test/transformer_mocks.dart
deleted file mode 100644
index b0a7516..0000000
--- a/packages/dart_to_js_script_rewriter/test/transformer_mocks.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-library dart_to_js_script_rewriter.test.transformer_mocks;
-
-import 'package:barback/barback.dart';
-import 'package:mockito/mockito.dart';
-
-class MockAsset extends Mock implements Asset {}
-
-class MockTransform extends Mock implements Transform {}
diff --git a/packages/dart_to_js_script_rewriter/test/unit_test.dart b/packages/dart_to_js_script_rewriter/test/unit_test.dart
deleted file mode 100644
index ae10b70..0000000
--- a/packages/dart_to_js_script_rewriter/test/unit_test.dart
+++ /dev/null
@@ -1,182 +0,0 @@
-@TestOn('vm')
-library dart_to_js_script_rewriter.test.unit_test;
-
-import 'dart:io';
-
-import 'package:barback/barback.dart';
-import 'package:html/dom.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-import 'package:dart_to_js_script_rewriter/dart_to_js_script_rewriter.dart';
-
-import 'transformer_mocks.dart';
-
-main() {
-  final transformer = new DartToJsScriptRewriter.asPlugin(
-      new BarbackSettings({}, BarbackMode.RELEASE));
-
-  group('apply()', () {
-    test('when run in release mode', () async {
-      AssetId fakeInputFileAssetId =
-          new AssetId('testid', 'test/test_data/test_file.html');
-
-      MockAsset inputFile;
-      MockTransform mockTransform;
-
-      String transformedFile;
-
-      inputFile = new MockAsset();
-      mockTransform = new MockTransform();
-
-      when(inputFile.id).thenReturn(fakeInputFileAssetId);
-      when(inputFile.readAsString()).thenReturn(
-          new File.fromUri(Uri.parse('test/test_data/test_file.html'))
-              .readAsString());
-
-      when(mockTransform.primaryInput).thenReturn(inputFile);
-      when(mockTransform.readInputAsString(fakeInputFileAssetId))
-          .thenAnswer((_) {
-        return new File.fromUri(Uri.parse('test/test_data/test_file.html'))
-            .readAsString();
-      });
-
-      await transformer.apply(mockTransform);
-
-      Asset fileAsset =
-          verify(mockTransform.addOutput(captureAny)).captured.first;
-
-      transformedFile = await fileAsset.readAsString();
-      expect(
-          transformedFile.contains(
-              '<script async type="application/dart" src="test.dart"></script>'),
-          isFalse);
-      expect(
-          transformedFile.contains(
-              '<script async src="packages/browser/dart.js"></script>'),
-          isFalse);
-      expect(
-          transformedFile
-              .contains('<script async="" src="test.dart.js"></script>'),
-          isTrue);
-    });
-  });
-
-  group('rewriteDartScriptTag', () {
-    testScriptShouldBeRewritten(String script, bool shouldRewrite) {
-      final document = documentFromScript(script);
-      final oldScript = document.querySelector('script');
-      expect(transformer.scriptShouldBeRewritten(oldScript), shouldRewrite);
-
-      transformer.rewriteDartScriptTag(document);
-
-      final scripts = document.querySelectorAll('script');
-      if (shouldRewrite) {
-        expect(scripts.first.attributes["src"], 'main.dart.js');
-      } else {
-        expect(scripts.first.attributes["src"], oldScript.attributes["src"]);
-      }
-    }
-
-    test('do rewrite script with src specified and of type application/dart',
-        () {
-      final script =
-          '<script src="main.dart" type="application/dart"></script>';
-      testScriptShouldBeRewritten(script, true);
-    });
-
-    test('don\'t rewrite inline scripts', () {
-      final script = '<script type="application/dart"></script>';
-      testScriptShouldBeRewritten(script, false);
-    });
-
-    test('don\'t rewrite script of type type="text/javascript"', () {
-      final script = '<script type="text/javascript"></script>';
-      testScriptShouldBeRewritten(script, false);
-    });
-
-    test('don\'t rewrite script of without type', () {
-      final script = '<script src="main.js"></script>';
-      testScriptShouldBeRewritten(script, false);
-    });
-  });
-
-  group('removeBrowserPackageScript', () {
-    testScriptShouldBeRemoved(String script, bool shouldRemove) {
-      final document = documentFromScript(script);
-      final oldScript = document.querySelector('script');
-      expect(transformer.scriptShouldBeRemoved(oldScript), shouldRemove);
-
-      transformer.removeBrowserPackageScript(document);
-      final dartJsScripts = document.querySelectorAll('script');
-      if (shouldRemove) {
-        expect(dartJsScripts, isEmpty);
-      } else {
-        expect(dartJsScripts, isNotEmpty);
-      }
-    }
-
-    test('do rewrite scripts where src="browser/dart.js"', () {
-      final script = '<script src="browser/dart.js"></script>';
-      testScriptShouldBeRemoved(script, true);
-    });
-
-    test('don\'t remove other scripts where src ends with dart.js', () {
-      final script = '<script src="dart.js"></script>';
-      testScriptShouldBeRemoved(script, false);
-    });
-  });
-
-  group('isPrimary', () {
-    test('do touch html files in web', () {
-      AssetId assetId = new AssetId('my_package', 'web/index.html');
-      expect(transformer.isPrimary(assetId), isTrue);
-    });
-
-    test('do touch html files in example', () {
-      AssetId assetId = new AssetId('my_package', 'example/index.html');
-      expect(transformer.isPrimary(assetId), isTrue);
-    });
-
-    test('do not touch html files in lib', () {
-      AssetId assetId = new AssetId('my_package', 'lib/app.component.html');
-      expect(transformer.isPrimary(assetId), isFalse);
-    });
-
-    test('don\'t touch html in DEBUG mode', () {
-      final settings = new BarbackSettings({}, BarbackMode.DEBUG);
-      final transformer = new DartToJsScriptRewriter.asPlugin(settings);
-      AssetId assetId = new AssetId('my_package', 'web/index.html');
-      expect(transformer.isPrimary(assetId), isFalse);
-    });
-
-    test('don\'t touch dart files', () {
-      AssetId assetId = new AssetId('my_package', 'web/main.dart');
-      expect(transformer.isPrimary(assetId), isFalse);
-    });
-  });
-}
-
-Document documentFromScript(String script) => new Document.html('''
-<!DOCTYPE html>
-
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>Test</title>
-    $script
-    <link rel="stylesheet" href="test.css">
-  </head>
-  <body>
-    <h1>Test</h1>
-
-    <p>Hello world from Dart!</p>
-
-    <div id="sample_container_id">
-      <p id="sample_text_id">Click me!</p>
-    </div>
-
-  </body>
-</html>
-''');
diff --git a/packages/dart_to_js_script_rewriter/tool/dev.dart b/packages/dart_to_js_script_rewriter/tool/dev.dart
deleted file mode 100644
index 0e5c3ca..0000000
--- a/packages/dart_to_js_script_rewriter/tool/dev.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-library dart_to_js_script_rewriter.tool.dev;
-
-import 'package:dart_dev/dart_dev.dart' show dev, config;
-
-main(List<String> args) async {
-  List<String> directories = ['example/', 'lib/', 'test/', 'tool/'];
-
-  config.analyze.entryPoints = directories;
-  config.analyze.strong = true;
-  config.format.directories = directories;
-  config.test
-    ..platforms = ['vm']
-    ..pubServe = true
-    ..unitTests = ['test/unit_test.dart']
-    ..integrationTests = ['test/integration_test.dart'];
-
-  config.coverage.pubServe = true;
-
-  await dev(args);
-}
diff --git a/packages/html/.gitignore b/packages/html/.gitignore
deleted file mode 100644
index 3ab3a44..0000000
--- a/packages/html/.gitignore
+++ /dev/null
@@ -1,19 +0,0 @@
-# Don’t commit the following directories created by pub.
-.pub
-.dart_tool/
-build/
-packages
-.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/packages/html/.test_config b/packages/html/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/html/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/html/.travis.yml b/packages/html/.travis.yml
deleted file mode 100644
index 5b7ab84..0000000
--- a/packages/html/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: dart
-dart:
-  - dev
-  - stable
-
-dart_task:
-  - test: -p vm
-  - test: -p chrome,firefox
-  - dartanalyzer
-
-matrix:
-  include:
-    - dart: dev
-      dart_task: dartfmt
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-cache:
- directories:
-   - $HOME/.pub-cache
diff --git a/packages/html/CHANGELOG.md b/packages/html/CHANGELOG.md
deleted file mode 100644
index 25215a1..0000000
--- a/packages/html/CHANGELOG.md
+++ /dev/null
@@ -1,64 +0,0 @@
-## 0.13.3
-
- * Update the signatures of `FilteredElementList.indexOf` and
-   `FilteredElementList.lastIndexOf` to include type annotations.
-
-## 0.13.2+2
-
- * Update signature for implementations of `Iterable.singleWhere` to include
-   optional argument.
-
-## 0.13.2+1
-
- * Changed the implementation of `Set` and `List` classes to use base classes
-   from `dart:collection`.
-
-## 0.13.2
-
- * Support the latest release of `pkg/csslib`.
-
-## 0.13.1
- * Update Set.difference to take a Set<Object>.
-
-## 0.13.0
-
- * **BREAKING** Fix all [strong mode][] errors and warnings.
-   This involved adding more precise types on some public APIs, which is why it
-   may break users.
-
-[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
-
-#### Pub version 0.12.2+2
-  * Support `csslib` versions `0.13.x`.
-  
-#### Pub version 0.12.2+1
-  * Exclude `.packages` file from the published 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/packages/html/LICENSE b/packages/html/LICENSE
deleted file mode 100644
index d5ee641..0000000
--- a/packages/html/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-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/packages/html/README.md b/packages/html/README.md
deleted file mode 100644
index 27db3ce..0000000
--- a/packages/html/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-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/packages/html/analysis_options.yaml b/packages/html/analysis_options.yaml
deleted file mode 100644
index da17516..0000000
--- a/packages/html/analysis_options.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-analyzer:
-  strong-mode: true
-  errors:
-    unused_import: error
-    unused_local_variable: error
-    dead_code: error
-    override_on_non_overriding_method: error
-linter:
-  rules:
-    # Errors
-    - avoid_empty_else
-    - await_only_futures
-    #- comment_references
-    - control_flow_in_finally
-    - empty_statements
-    - hash_and_equals
-    - iterable_contains_unrelated_type
-    - no_duplicate_case_values
-    - test_types_in_equals
-    - throw_in_finally
-    - unawaited_futures
-    - unnecessary_statements
-    - unrelated_type_equality_checks
-    - valid_regexps
-
-    # Style
-    #- annotate_overrides
-    #- avoid_function_literals_in_foreach_calls
-    - avoid_init_to_null
-    - avoid_return_types_on_setters
-    - avoid_returning_null
-    - avoid_unused_constructor_parameters
-    - camel_case_types
-    - directives_ordering
-    - empty_catches
-    - empty_constructor_bodies
-    - library_names
-    - library_prefixes
-    #- non_constant_identifier_names
-    #- prefer_conditional_assignment
-    - prefer_final_fields
-    - prefer_is_empty
-    - prefer_is_not_empty
-    #- prefer_typing_uninitialized_variables
-    - recursive_getters
-    #- slash_for_doc_comments
-    - type_init_formals
-    #- unnecessary_brace_in_string_interps
-    - unnecessary_getters_setters
-    - unnecessary_lambdas
-    - unnecessary_null_aware_assignments
diff --git a/packages/html/lib/dom.dart b/packages/html/lib/dom.dart
deleted file mode 100644
index 2e57f64..0000000
--- a/packages/html/lib/dom.dart
+++ /dev/null
@@ -1,1007 +0,0 @@
-/// 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 'dom_parsing.dart';
-import 'parser.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';
-
-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.isNotEmpty;
-
-  /// 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.isNotEmpty;
-
-  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.
-  dynamic _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.isNotEmpty) {
-      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.isNotEmpty) {
-      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 _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, Iterable<Node> from,
-      [int startFrom = 0]) {
-    List<Node> from_ = from as List<Node>;
-    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(Node e)) {
-    for (var node in where(test)) {
-      node.parentNode = null;
-    }
-    super.removeWhere(test);
-  }
-
-  void retainWhere(bool test(Node 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);
-  }
-
-  List<Node> _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 = <Node>[];
-    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 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;
-
-  // 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);
-  }
-
-  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(Object 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<T> map<T>(T f(Element element)) => _filtered.map(f);
-  Iterable<Element> where(bool f(Element element)) => _filtered.where(f);
-  Iterable<T> expand<T>(Iterable<T> 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);
-  }
-
-  T fold<T>(T initialValue, T combine(T 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), {Element orElse()}) {
-    if (orElse != null) throw new UnimplementedError('orElse');
-    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);
-  // TODO(sigmund): this should be typed Element, but we currently run into a
-  // bug where ListMixin<E>.indexOf() expects Object as the argument.
-  int indexOf(Object element, [int start = 0]) =>
-      _filtered.indexOf(element, start);
-
-  // TODO(sigmund): this should be typed Element, but we currently run into a
-  // bug where ListMixin<E>.lastIndexOf() expects Object as the argument.
-  int lastIndexOf(Object element, [int start]) {
-    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/packages/html/lib/dom_parsing.dart b/packages/html/lib/dom_parsing.dart
deleted file mode 100644
index 3435a81..0000000
--- a/packages/html/lib/dom_parsing.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-/// 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.isNotEmpty) {
-      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.isNotEmpty) {
-      _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;
-  for (int i = 0; i < text.length; i++) {
-    var ch = text[i];
-    String replace;
-    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/packages/html/lib/parser.dart b/packages/html/lib/parser.dart
deleted file mode 100644
index 75a5c62..0000000
--- a/packages/html/lib/parser.dart
+++ /dev/null
@@ -1,3917 +0,0 @@
-/// 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 'dom.dart';
-import 'src/constants.dart';
-import 'src/encoding_parser.dart';
-import 'src/token.dart';
-import 'src/tokenizer.dart';
-import 'src/treebuilder.dart';
-import 'src/utils.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 (_) {
-        // 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.isEmpty) 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: new LinkedHashMap<dynamic, String>()));
-    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':
-        startTagHead(token);
-        return null;
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "head":
-      case "body":
-      case "html":
-      case "br":
-        return endTagImplyHead(token);
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  bool processEOF() {
-    startTagHead(
-        new StartTagToken("head", data: new LinkedHashMap<dynamic, String>()));
-    return true;
-  }
-
-  Token processSpaceCharacters(SpaceCharactersToken token) {
-    return null;
-  }
-
-  Token processCharacters(CharactersToken token) {
-    startTagHead(
-        new StartTagToken("head", data: new LinkedHashMap<dynamic, String>()));
-    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: new LinkedHashMap<dynamic, String>()));
-    return token;
-  }
-
-  Token endTagImplyHead(EndTagToken token) {
-    startTagHead(
-        new StartTagToken("head", data: new LinkedHashMap<dynamic, String>()));
-    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":
-        startTagTitle(token);
-        return null;
-      case "noscript":
-      case "noframes":
-      case "style":
-        startTagNoScriptNoFramesStyle(token);
-        return null;
-      case "script":
-        startTagScript(token);
-        return null;
-      case "base":
-      case "basefont":
-      case "bgsound":
-      case "command":
-      case "link":
-        startTagBaseLinkCommand(token);
-        return null;
-      case "meta":
-        startTagMeta(token);
-        return null;
-      case "head":
-        startTagHead(token);
-        return null;
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "head":
-        endTagHead(token);
-        return null;
-      case "br":
-      case "html":
-      case "body":
-        return endTagHtmlBodyBr(token);
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  // 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":
-        startTagBody(token);
-        return null;
-      case "frameset":
-        startTagFrameset(token);
-        return null;
-      case "base":
-      case "basefont":
-      case "bgsound":
-      case "link":
-      case "meta":
-      case "noframes":
-      case "script":
-      case "style":
-      case "title":
-        startTagFromHead(token);
-        return null;
-      case "head":
-        startTagHead(token);
-        return null;
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "body":
-      case "html":
-      case "br":
-        return endTagHtmlBodyBr(token);
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  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: new LinkedHashMap<dynamic, String>()));
-    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":
-        startTagBody(token);
-        return null;
-      case "frameset":
-        startTagFrameset(token);
-        return null;
-      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 "menu":
-      case "nav":
-      case "ol":
-      case "p":
-      case "section":
-      case "summary":
-      case "ul":
-        startTagCloseP(token);
-        return null;
-      // headingElements
-      case "h1":
-      case "h2":
-      case "h3":
-      case "h4":
-      case "h5":
-      case "h6":
-        startTagHeading(token);
-        return null;
-      case "pre":
-      case "listing":
-        startTagPreListing(token);
-        return null;
-      case "form":
-        startTagForm(token);
-        return null;
-      case "li":
-      case "dd":
-      case "dt":
-        startTagListItem(token);
-        return null;
-      case "plaintext":
-        startTagPlaintext(token);
-        return null;
-      case "a":
-        startTagA(token);
-        return null;
-      case "b":
-      case "big":
-      case "code":
-      case "em":
-      case "font":
-      case "i":
-      case "s":
-      case "small":
-      case "strike":
-      case "strong":
-      case "tt":
-      case "u":
-        startTagFormatting(token);
-        return null;
-      case "nobr":
-        startTagNobr(token);
-        return null;
-      case "button":
-        return startTagButton(token);
-      case "applet":
-      case "marquee":
-      case "object":
-        startTagAppletMarqueeObject(token);
-        return null;
-      case "xmp":
-        startTagXmp(token);
-        return null;
-      case "table":
-        startTagTable(token);
-        return null;
-      case "area":
-      case "br":
-      case "embed":
-      case "img":
-      case "keygen":
-      case "wbr":
-        startTagVoidFormatting(token);
-        return null;
-      case "param":
-      case "source":
-      case "track":
-        startTagParamSource(token);
-        return null;
-      case "input":
-        startTagInput(token);
-        return null;
-      case "hr":
-        startTagHr(token);
-        return null;
-      case "image":
-        startTagImage(token);
-        return null;
-      case "isindex":
-        startTagIsIndex(token);
-        return null;
-      case "textarea":
-        startTagTextarea(token);
-        return null;
-      case "iframe":
-        startTagIFrame(token);
-        return null;
-      case "noembed":
-      case "noscript":
-        startTagRawtext(token);
-        return null;
-      case "select":
-        startTagSelect(token);
-        return null;
-      case "rp":
-      case "rt":
-        startTagRpRt(token);
-        return null;
-      case "option":
-      case "optgroup":
-        startTagOpt(token);
-        return null;
-      case "math":
-        startTagMath(token);
-        return null;
-      case "svg":
-        startTagSvg(token);
-        return null;
-      case "caption":
-      case "col":
-      case "colgroup":
-      case "frame":
-      case "head":
-      case "tbody":
-      case "td":
-      case "tfoot":
-      case "th":
-      case "thead":
-      case "tr":
-        startTagMisplaced(token);
-        return null;
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "body":
-        endTagBody(token);
-        return null;
-      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":
-        endTagBlock(token);
-        return null;
-      case "form":
-        endTagForm(token);
-        return null;
-      case "p":
-        endTagP(token);
-        return null;
-      case "dd":
-      case "dt":
-      case "li":
-        endTagListItem(token);
-        return null;
-      // headingElements
-      case "h1":
-      case "h2":
-      case "h3":
-      case "h4":
-      case "h5":
-      case "h6":
-        endTagHeading(token);
-        return null;
-      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":
-        endTagFormatting(token);
-        return null;
-      case "applet":
-      case "marquee":
-      case "object":
-        endTagAppletMarqueeObject(token);
-        return null;
-      case "br":
-        endTagBr(token);
-        return null;
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  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.isNotEmpty) {
-      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 = new LinkedHashMap<dynamic, String>();
-    var dataAction = token.data["action"];
-    if (dataAction != null) {
-      formAttrs["action"] = dataAction;
-    }
-    processStartTag(new StartTagToken("form", data: formAttrs));
-    processStartTag(
-        new StartTagToken("hr", data: new LinkedHashMap<dynamic, String>()));
-    processStartTag(
-        new StartTagToken("label", data: new LinkedHashMap<dynamic, String>()));
-    // 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<dynamic, String>.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: new LinkedHashMap<dynamic, String>()));
-    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: new LinkedHashMap<dynamic, String>()));
-      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) {
-    String 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.
-  void 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;
-      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: new LinkedHashMap<dynamic, String>()));
-    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) {
-          // noop
-        }
-        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') {
-      endTagScript(token);
-      return null;
-    }
-    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":
-        startTagCaption(token);
-        return null;
-      case "colgroup":
-        startTagColgroup(token);
-        return null;
-      case "col":
-        return startTagCol(token);
-      case "tbody":
-      case "tfoot":
-      case "thead":
-        startTagRowGroup(token);
-        return null;
-      case "td":
-      case "th":
-      case "tr":
-        return startTagImplyTbody(token);
-      case "table":
-        return startTagTable(token);
-      case "style":
-      case "script":
-        return startTagStyleScript(token);
-      case "input":
-        startTagInput(token);
-        return null;
-      case "form":
-        startTagForm(token);
-        return null;
-      default:
-        startTagOther(token);
-        return null;
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "table":
-        endTagTable(token);
-        return null;
-      case "body":
-      case "caption":
-      case "col":
-      case "colgroup":
-      case "html":
-      case "tbody":
-      case "td":
-      case "tfoot":
-      case "th":
-      case "thead":
-      case "tr":
-        endTagIgnore(token);
-        return null;
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  // 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: new LinkedHashMap<dynamic, String>()));
-    return token;
-  }
-
-  void startTagRowGroup(StartTagToken token) {
-    clearStackToTableContext();
-    tree.insertElement(token);
-    parser.phase = parser._inTableBodyPhase;
-  }
-
-  Token startTagImplyTbody(StartTagToken token) {
-    startTagRowGroup(
-        new StartTagToken("tbody", data: new LinkedHashMap<dynamic, String>()));
-    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(HtmlParser parser)
-      : characterTokens = <StringToken>[],
-        super(parser);
-
-  void flushCharacters() {
-    if (characterTokens.isEmpty) return;
-
-    // TODO(sigmund,jmesserly): remove '' (dartbug.com/8480)
-    var data = characterTokens.map((t) => t.data).join('');
-    FileSpan span;
-
-    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.isNotEmpty) {
-      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":
-        endTagCaption(token);
-        return null;
-      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":
-        endTagIgnore(token);
-        return null;
-      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":
-        startTagCol(token);
-        return null;
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "colgroup":
-        endTagColgroup(token);
-        return null;
-      case "col":
-        endTagCol(token);
-        return null;
-      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":
-        startTagTr(token);
-        return null;
-      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":
-        endTagTableRowGroup(token);
-        return null;
-      case "table":
-        return endTagTable(token);
-      case "body":
-      case "caption":
-      case "col":
-      case "colgroup":
-      case "html":
-      case "td":
-      case "th":
-      case "tr":
-        endTagIgnore(token);
-        return null;
-      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: new LinkedHashMap<dynamic, String>()));
-    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":
-        startTagTableCell(token);
-        return null;
-      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":
-        endTagTr(token);
-        return null;
-      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":
-        endTagIgnore(token);
-        return null;
-      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":
-        endTagTableCell(token);
-        return null;
-      case "body":
-      case "caption":
-      case "col":
-      case "colgroup":
-      case "html":
-        endTagIgnore(token);
-        return null;
-      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":
-        startTagOption(token);
-        return null;
-      case "optgroup":
-        startTagOptgroup(token);
-        return null;
-      case "select":
-        startTagSelect(token);
-        return null;
-      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":
-        endTagOption(token);
-        return null;
-      case "optgroup":
-        endTagOptgroup(token);
-        return null;
-      case "select":
-        endTagSelect(token);
-        return null;
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  // 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});
-    }
-
-    Token newToken;
-    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.isNotEmpty);
-        }
-        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") {
-      endTagHtml(token);
-      return null;
-    }
-    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":
-        startTagFrameset(token);
-        return null;
-      case "frame":
-        startTagFrame(token);
-        return null;
-      case "noframes":
-        return startTagNoframes(token);
-      default:
-        return startTagOther(token);
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "frameset":
-        endTagFrameset(token);
-        return null;
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  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:
-        startTagOther(token);
-        return null;
-    }
-  }
-
-  processEndTag(EndTagToken token) {
-    switch (token.name) {
-      case "html":
-        endTagHtml(token);
-        return null;
-      default:
-        endTagOther(token);
-        return null;
-    }
-  }
-
-  // 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:
-        startTagOther(token);
-        return null;
-    }
-  }
-
-  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/packages/html/lib/parser_console.dart b/packages/html/lib/parser_console.dart
deleted file mode 100644
index 515f891..0000000
--- a/packages/html/lib/parser_console.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-/// 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/packages/html/lib/src/char_encodings.dart b/packages/html/lib/src/char_encodings.dart
deleted file mode 100644
index bf1fa47..0000000
--- a/packages/html/lib/src/char_encodings.dart
+++ /dev/null
@@ -1,228 +0,0 @@
-/// 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(this.bytes,
-      [this.offset = 0,
-      this.length,
-      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/packages/html/lib/src/constants.dart b/packages/html/lib/src/constants.dart
deleted file mode 100644
index 9f4878f..0000000
--- a/packages/html/lib/src/constants.dart
+++ /dev/null
@@ -1,3092 +0,0 @@
-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/packages/html/lib/src/css_class_set.dart b/packages/html/lib/src/css_class_set.dart
deleted file mode 100644
index eca2400..0000000
--- a/packages/html/lib/src/css_class_set.dart
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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.isNotEmpty) {
-        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(Object 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<Object> 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 extends SetBase<String> 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;
-
-  Iterator<String> get iterator => readClasses().iterator;
-
-  int get length => readClasses().length;
-
-  // 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(Object value) => readClasses().contains(value);
-
-  /** Lookup from the Set interface. Not interesting for a String set. */
-  String lookup(Object value) => contains(value) ? value as String : null;
-
-  Set<String> toSet() => readClasses().toSet();
-
-  /**
-   * 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;
-  }
-
-  /**
-   * 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));
-  }
-
-  /**
-   * 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.
-   */
-  bool _modify(bool 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/packages/html/lib/src/encoding_parser.dart b/packages/html/lib/src/encoding_parser.dart
deleted file mode 100644
index ef5e708..0000000
--- a/packages/html/lib/src/encoding_parser.dart
+++ /dev/null
@@ -1,376 +0,0 @@
-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);
-  }
-}
-
-typedef bool _MethodHandler();
-
-class _DispatchEntry {
-  final String pattern;
-  final _MethodHandler handler;
-  _DispatchEntry(this.pattern, this.handler);
-}
-
-/// 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 = [
-      new _DispatchEntry("<!--", handleComment),
-      new _DispatchEntry("<meta", handleMeta),
-      new _DispatchEntry("</", handlePossibleEndTag),
-      new _DispatchEntry("<!", handleOther),
-      new _DispatchEntry("<?", handleOther),
-      new _DispatchEntry("<", handlePossibleStartTag),
-    ];
-
-    try {
-      for (;;) {
-        for (var dispatch in methodDispatch) {
-          if (data.matchBytes(dispatch.pattern)) {
-            var keepParsing = dispatch.handler();
-            if (keepParsing) break;
-
-            // We found an encoding. Stop.
-            return encoding;
-          }
-        }
-        data.position += 1;
-      }
-    } on StateError catch (_) {
-      // 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;
-        }
-      }
-    }
-  }
-
-  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.isNotEmpty) {
-        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);
-      }
-    }
-  }
-}
-
-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 (_) {
-          //Return the whole remaining value
-          return data.slice(oldPosition);
-        }
-      }
-    } on StateError catch (_) {
-      return null;
-    }
-  }
-}
-
-bool isSpaceOrAngleBracket(String char) {
-  return char == ">" || char == "<" || isWhitespace(char);
-}
-
-typedef bool CharPreciate(String char);
diff --git a/packages/html/lib/src/inputstream.dart b/packages/html/lib/src/inputstream.dart
deleted file mode 100644
index d683277..0000000
--- a/packages/html/lib/src/inputstream.dart
+++ /dev/null
@@ -1,321 +0,0 @@
-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 'encoding_parser.dart';
-import 'utils.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/packages/html/lib/src/list_proxy.dart b/packages/html/lib/src/list_proxy.dart
deleted file mode 100644
index 63aeea6..0000000
--- a/packages/html/lib/src/list_proxy.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-/// A [List] proxy that you can subclass.
-library list_proxy;
-
-import 'dart:collection';
-
-abstract class ListProxy<E> extends ListBase<E> {
-  /// The inner [List<T>] with the actual storage.
-  final List<E> _list = <E>[];
-
-  bool remove(Object item) => _list.remove(item);
-
-  int get length => _list.length;
-
-  // 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 insert(int index, E item) => _list.insert(index, item);
-
-  void addAll(Iterable<E> collection) {
-    _list.addAll(collection);
-  }
-
-  void insertAll(int index, Iterable<E> iterable) {
-    _list.insertAll(index, iterable);
-  }
-
-  E removeAt(int index) => _list.removeAt(index);
-
-  void removeRange(int start, int length) {
-    _list.removeRange(start, length);
-  }
-}
diff --git a/packages/html/lib/src/query_selector.dart b/packages/html/lib/src/query_selector.dart
deleted file mode 100644
index 38045d4..0000000
--- a/packages/html/lib/src/query_selector.dart
+++ /dev/null
@@ -1,294 +0,0 @@
-/// 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/src/messages.dart' show Message;
-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 = <Element>[];
-  new SelectorEvaluator()
-      .querySelectorAll(node, _parseSelectorList(selector), results);
-  return results;
-}
-
-// http://dev.w3.org/csswg/selectors-4/#grouping
-SelectorGroup _parseSelectorList(String selector) {
-  var errors = <Message>[];
-  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;
-    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/packages/html/lib/src/token.dart b/packages/html/lib/src/token.dart
deleted file mode 100644
index 877a6a3..0000000
--- a/packages/html/lib/src/token.dart
+++ /dev/null
@@ -1,144 +0,0 @@
-/// 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/packages/html/lib/src/tokenizer.dart b/packages/html/lib/src/tokenizer.dart
deleted file mode 100644
index 30092a2..0000000
--- a/packages/html/lib/src/tokenizer.dart
+++ /dev/null
@@ -1,1913 +0,0 @@
-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 = <String, List<String>>{};
-  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.isEmpty && tokenQueue.isEmpty) {
-      if (!state()) {
-        _current = null;
-        return false;
-      }
-    }
-    if (stream.errors.isNotEmpty) {
-      _current = new ParseErrorToken(stream.errors.removeFirst());
-    } else {
-      assert(tokenQueue.isNotEmpty);
-      _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.isEmpty) {
-          break;
-        }
-        charStack.add(stream.char());
-      }
-
-      // At this point we have a string that starts with some characters
-      // that may match an entity
-      String entityName;
-
-      // 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 {
-      Token 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.isNotEmpty &&
-        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.isNotEmpty) {
-      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.isNotEmpty) {
-      _addToken(new CharactersToken(data.join()));
-    }
-    state = dataState;
-    return true;
-  }
-}
diff --git a/packages/html/lib/src/treebuilder.dart b/packages/html/lib/src/treebuilder.dart
deleted file mode 100644
index 12cdbbb..0000000
--- a/packages/html/lib/src/treebuilder.dart
+++ /dev/null
@@ -1,398 +0,0 @@
-/// 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> {
-  // 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.isEmpty) 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.isEmpty) {
-      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.isNotEmpty && 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.isNotEmpty && 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;
-    Node fosterParent;
-    Node insertBefore;
-    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/packages/html/lib/src/utils.dart b/packages/html/lib/src/utils.dart
deleted file mode 100644
index 909b899..0000000
--- a/packages/html/lib/src/utils.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-/// 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<T> slice<T>(List<T> 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/packages/html/pubspec.yaml b/packages/html/pubspec.yaml
deleted file mode 100644
index f962aeb..0000000
--- a/packages/html/pubspec.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: html
-version: 0.13.3
-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.21.0 <2.0.0'
-dependencies:
-  csslib: '>=0.13.2 <0.15.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'
-  test: '^0.12.0'
diff --git a/packages/html/test/data/parser_feature/raw_file.html b/packages/html/test/data/parser_feature/raw_file.html
deleted file mode 100644
index bcdbf76..0000000
--- a/packages/html/test/data/parser_feature/raw_file.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!doctype html>
-<html>
-<body>
-Hello world!
-</body>
-</html>
diff --git a/packages/html/test/data/tokenizer/contentModelFlags.test b/packages/html/test/data/tokenizer/contentModelFlags.test
deleted file mode 100644
index a8b1695..0000000
--- a/packages/html/test/data/tokenizer/contentModelFlags.test
+++ /dev/null
@@ -1,75 +0,0 @@
-{"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/packages/html/test/data/tokenizer/domjs.test b/packages/html/test/data/tokenizer/domjs.test
deleted file mode 100644
index 74771e2..0000000
--- a/packages/html/test/data/tokenizer/domjs.test
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-    "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/packages/html/test/data/tokenizer/entities.test b/packages/html/test/data/tokenizer/entities.test
deleted file mode 100644
index 1cb17a7..0000000
--- a/packages/html/test/data/tokenizer/entities.test
+++ /dev/null
@@ -1,283 +0,0 @@
-{"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/packages/html/test/data/tokenizer/escapeFlag.test b/packages/html/test/data/tokenizer/escapeFlag.test
deleted file mode 100644
index 18cb430..0000000
--- a/packages/html/test/data/tokenizer/escapeFlag.test
+++ /dev/null
@@ -1,33 +0,0 @@
-{"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/packages/html/test/data/tokenizer/namedEntities.test b/packages/html/test/data/tokenizer/namedEntities.test
deleted file mode 100644
index 4a51c9c..0000000
--- a/packages/html/test/data/tokenizer/namedEntities.test
+++ /dev/null
@@ -1,44189 +0,0 @@
-{
-    "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/packages/html/test/data/tokenizer/numericEntities.test b/packages/html/test/data/tokenizer/numericEntities.test
deleted file mode 100644
index 36c8228..0000000
--- a/packages/html/test/data/tokenizer/numericEntities.test
+++ /dev/null
@@ -1,1313 +0,0 @@
-{"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/packages/html/test/data/tokenizer/pendingSpecChanges.test b/packages/html/test/data/tokenizer/pendingSpecChanges.test
deleted file mode 100644
index 1b7dc3c..0000000
--- a/packages/html/test/data/tokenizer/pendingSpecChanges.test
+++ /dev/null
@@ -1,7 +0,0 @@
-{"tests": [
-
-{"description":"<!---- >",
-"input":"<!---- >",
-"output":["ParseError", "ParseError", ["Comment","-- >"]]}
-
-]}
diff --git a/packages/html/test/data/tokenizer/test1.test b/packages/html/test/data/tokenizer/test1.test
deleted file mode 100644
index 5de66f5..0000000
--- a/packages/html/test/data/tokenizer/test1.test
+++ /dev/null
@@ -1,196 +0,0 @@
-{"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/packages/html/test/data/tokenizer/test2.test b/packages/html/test/data/tokenizer/test2.test
deleted file mode 100644
index e157514..0000000
--- a/packages/html/test/data/tokenizer/test2.test
+++ /dev/null
@@ -1,179 +0,0 @@
-{"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/packages/html/test/data/tokenizer/test3.test b/packages/html/test/data/tokenizer/test3.test
deleted file mode 100644
index 58519e8..0000000
--- a/packages/html/test/data/tokenizer/test3.test
+++ /dev/null
@@ -1,6047 +0,0 @@
-{"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/packages/html/test/data/tokenizer/test4.test b/packages/html/test/data/tokenizer/test4.test
deleted file mode 100644
index c0f3b2b..0000000
--- a/packages/html/test/data/tokenizer/test4.test
+++ /dev/null
@@ -1,336 +0,0 @@
-{"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":"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/packages/html/test/data/tokenizer/unicodeChars.test b/packages/html/test/data/tokenizer/unicodeChars.test
deleted file mode 100644
index c778668..0000000
--- a/packages/html/test/data/tokenizer/unicodeChars.test
+++ /dev/null
@@ -1,1295 +0,0 @@
-{"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/packages/html/test/data/tokenizer/unicodeCharsProblematic.test b/packages/html/test/data/tokenizer/unicodeCharsProblematic.test
deleted file mode 100644
index cf2fbe6..0000000
--- a/packages/html/test/data/tokenizer/unicodeCharsProblematic.test
+++ /dev/null
@@ -1,27 +0,0 @@
-{"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/packages/html/test/data/tokenizer/xmlViolation.test b/packages/html/test/data/tokenizer/xmlViolation.test
deleted file mode 100644
index 137d964..0000000
--- a/packages/html/test/data/tokenizer/xmlViolation.test
+++ /dev/null
@@ -1,22 +0,0 @@
-{"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/packages/html/test/data/tree-construction/adoption01.dat b/packages/html/test/data/tree-construction/adoption01.dat
deleted file mode 100644
index 787e1b0..0000000
--- a/packages/html/test/data/tree-construction/adoption01.dat
+++ /dev/null
@@ -1,194 +0,0 @@
-#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/packages/html/test/data/tree-construction/adoption02.dat b/packages/html/test/data/tree-construction/adoption02.dat
deleted file mode 100644
index d18151b..0000000
--- a/packages/html/test/data/tree-construction/adoption02.dat
+++ /dev/null
@@ -1,31 +0,0 @@
-#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/packages/html/test/data/tree-construction/comments01.dat b/packages/html/test/data/tree-construction/comments01.dat
deleted file mode 100644
index 44f1876..0000000
--- a/packages/html/test/data/tree-construction/comments01.dat
+++ /dev/null
@@ -1,135 +0,0 @@
-#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/packages/html/test/data/tree-construction/doctype01.dat b/packages/html/test/data/tree-construction/doctype01.dat
deleted file mode 100644
index ae45732..0000000
--- a/packages/html/test/data/tree-construction/doctype01.dat
+++ /dev/null
@@ -1,370 +0,0 @@
-#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/packages/html/test/data/tree-construction/domjs-unsafe.dat b/packages/html/test/data/tree-construction/domjs-unsafe.dat
deleted file mode 100644
index 905b94e..0000000
--- a/packages/html/test/data/tree-construction/domjs-unsafe.dat
+++ /dev/null
Binary files differ
diff --git a/packages/html/test/data/tree-construction/entities01.dat b/packages/html/test/data/tree-construction/entities01.dat
deleted file mode 100644
index c8073b7..0000000
--- a/packages/html/test/data/tree-construction/entities01.dat
+++ /dev/null
@@ -1,603 +0,0 @@
-#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/packages/html/test/data/tree-construction/entities02.dat b/packages/html/test/data/tree-construction/entities02.dat
deleted file mode 100644
index e2fb42a..0000000
--- a/packages/html/test/data/tree-construction/entities02.dat
+++ /dev/null
@@ -1,249 +0,0 @@
-#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/packages/html/test/data/tree-construction/html5test-com.dat b/packages/html/test/data/tree-construction/html5test-com.dat
deleted file mode 100644
index d7cb71d..0000000
--- a/packages/html/test/data/tree-construction/html5test-com.dat
+++ /dev/null
@@ -1,246 +0,0 @@
-#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/packages/html/test/data/tree-construction/inbody01.dat b/packages/html/test/data/tree-construction/inbody01.dat
deleted file mode 100644
index 3f2bd37..0000000
--- a/packages/html/test/data/tree-construction/inbody01.dat
+++ /dev/null
@@ -1,43 +0,0 @@
-#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/packages/html/test/data/tree-construction/isindex.dat b/packages/html/test/data/tree-construction/isindex.dat
deleted file mode 100644
index 88325ff..0000000
--- a/packages/html/test/data/tree-construction/isindex.dat
+++ /dev/null
@@ -1,40 +0,0 @@
-#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/packages/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat b/packages/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat
deleted file mode 100644
index a5ebb1e..0000000
--- a/packages/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat
+++ /dev/null
Binary files differ
diff --git a/packages/html/test/data/tree-construction/pending-spec-changes.dat b/packages/html/test/data/tree-construction/pending-spec-changes.dat
deleted file mode 100644
index 5a92084..0000000
--- a/packages/html/test/data/tree-construction/pending-spec-changes.dat
+++ /dev/null
@@ -1,52 +0,0 @@
-#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/packages/html/test/data/tree-construction/plain-text-unsafe.dat b/packages/html/test/data/tree-construction/plain-text-unsafe.dat
deleted file mode 100644
index 04cc11f..0000000
--- a/packages/html/test/data/tree-construction/plain-text-unsafe.dat
+++ /dev/null
Binary files differ
diff --git a/packages/html/test/data/tree-construction/scriptdata01.dat b/packages/html/test/data/tree-construction/scriptdata01.dat
deleted file mode 100644
index 76b67f4..0000000
--- a/packages/html/test/data/tree-construction/scriptdata01.dat
+++ /dev/null
@@ -1,308 +0,0 @@
-#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/packages/html/test/data/tree-construction/scripted/adoption01.dat b/packages/html/test/data/tree-construction/scripted/adoption01.dat
deleted file mode 100644
index 4e08d0e..0000000
--- a/packages/html/test/data/tree-construction/scripted/adoption01.dat
+++ /dev/null
@@ -1,15 +0,0 @@
-#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/packages/html/test/data/tree-construction/scripted/ark.dat b/packages/html/test/data/tree-construction/scripted/ark.dat
deleted file mode 100644
index acbac41..0000000
--- a/packages/html/test/data/tree-construction/scripted/ark.dat
+++ /dev/null
@@ -1,26 +0,0 @@
-#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/packages/html/test/data/tree-construction/scripted/webkit01.dat b/packages/html/test/data/tree-construction/scripted/webkit01.dat
deleted file mode 100644
index ef4a41c..0000000
--- a/packages/html/test/data/tree-construction/scripted/webkit01.dat
+++ /dev/null
@@ -1,28 +0,0 @@
-#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/packages/html/test/data/tree-construction/tables01.dat b/packages/html/test/data/tree-construction/tables01.dat
deleted file mode 100644
index c4b47e4..0000000
--- a/packages/html/test/data/tree-construction/tables01.dat
+++ /dev/null
@@ -1,212 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests1.dat b/packages/html/test/data/tree-construction/tests1.dat
deleted file mode 100644
index cbf8bdd..0000000
--- a/packages/html/test/data/tree-construction/tests1.dat
+++ /dev/null
@@ -1,1952 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests10.dat b/packages/html/test/data/tree-construction/tests10.dat
deleted file mode 100644
index 4f8df86..0000000
--- a/packages/html/test/data/tree-construction/tests10.dat
+++ /dev/null
@@ -1,799 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests11.dat b/packages/html/test/data/tree-construction/tests11.dat
deleted file mode 100644
index 638cde4..0000000
--- a/packages/html/test/data/tree-construction/tests11.dat
+++ /dev/null
@@ -1,482 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests12.dat b/packages/html/test/data/tree-construction/tests12.dat
deleted file mode 100644
index 63107d2..0000000
--- a/packages/html/test/data/tree-construction/tests12.dat
+++ /dev/null
@@ -1,62 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests14.dat b/packages/html/test/data/tree-construction/tests14.dat
deleted file mode 100644
index b8713f8..0000000
--- a/packages/html/test/data/tree-construction/tests14.dat
+++ /dev/null
@@ -1,74 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests15.dat b/packages/html/test/data/tree-construction/tests15.dat
deleted file mode 100644
index 6ce1c0d..0000000
--- a/packages/html/test/data/tree-construction/tests15.dat
+++ /dev/null
@@ -1,208 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests16.dat b/packages/html/test/data/tree-construction/tests16.dat
deleted file mode 100644
index c8ef66f..0000000
--- a/packages/html/test/data/tree-construction/tests16.dat
+++ /dev/null
@@ -1,2299 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests17.dat b/packages/html/test/data/tree-construction/tests17.dat
deleted file mode 100644
index 7b555f8..0000000
--- a/packages/html/test/data/tree-construction/tests17.dat
+++ /dev/null
@@ -1,153 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests18.dat b/packages/html/test/data/tree-construction/tests18.dat
deleted file mode 100644
index 680e1f0..0000000
--- a/packages/html/test/data/tree-construction/tests18.dat
+++ /dev/null
@@ -1,269 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests19.dat b/packages/html/test/data/tree-construction/tests19.dat
deleted file mode 100644
index 0d62f5a..0000000
--- a/packages/html/test/data/tree-construction/tests19.dat
+++ /dev/null
@@ -1,1237 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests2.dat b/packages/html/test/data/tree-construction/tests2.dat
deleted file mode 100644
index 60d8592..0000000
--- a/packages/html/test/data/tree-construction/tests2.dat
+++ /dev/null
@@ -1,763 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests20.dat b/packages/html/test/data/tree-construction/tests20.dat
deleted file mode 100644
index 6bd8256..0000000
--- a/packages/html/test/data/tree-construction/tests20.dat
+++ /dev/null
@@ -1,455 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests21.dat b/packages/html/test/data/tree-construction/tests21.dat
deleted file mode 100644
index 1260ec0..0000000
--- a/packages/html/test/data/tree-construction/tests21.dat
+++ /dev/null
@@ -1,221 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests22.dat b/packages/html/test/data/tree-construction/tests22.dat
deleted file mode 100644
index aab27b2..0000000
--- a/packages/html/test/data/tree-construction/tests22.dat
+++ /dev/null
@@ -1,157 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests23.dat b/packages/html/test/data/tree-construction/tests23.dat
deleted file mode 100644
index 34d2a73..0000000
--- a/packages/html/test/data/tree-construction/tests23.dat
+++ /dev/null
@@ -1,155 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests24.dat b/packages/html/test/data/tree-construction/tests24.dat
deleted file mode 100644
index f6dc7eb..0000000
--- a/packages/html/test/data/tree-construction/tests24.dat
+++ /dev/null
@@ -1,79 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests25.dat b/packages/html/test/data/tree-construction/tests25.dat
deleted file mode 100644
index 00de729..0000000
--- a/packages/html/test/data/tree-construction/tests25.dat
+++ /dev/null
@@ -1,219 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests26.dat b/packages/html/test/data/tree-construction/tests26.dat
deleted file mode 100644
index fae11ff..0000000
--- a/packages/html/test/data/tree-construction/tests26.dat
+++ /dev/null
@@ -1,313 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests3.dat b/packages/html/test/data/tree-construction/tests3.dat
deleted file mode 100644
index 38dc501..0000000
--- a/packages/html/test/data/tree-construction/tests3.dat
+++ /dev/null
@@ -1,305 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests4.dat b/packages/html/test/data/tree-construction/tests4.dat
deleted file mode 100644
index 3c50632..0000000
--- a/packages/html/test/data/tree-construction/tests4.dat
+++ /dev/null
@@ -1,59 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests5.dat b/packages/html/test/data/tree-construction/tests5.dat
deleted file mode 100644
index d7b5128..0000000
--- a/packages/html/test/data/tree-construction/tests5.dat
+++ /dev/null
@@ -1,191 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests6.dat b/packages/html/test/data/tree-construction/tests6.dat
deleted file mode 100644
index f28ece4..0000000
--- a/packages/html/test/data/tree-construction/tests6.dat
+++ /dev/null
@@ -1,663 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests7.dat b/packages/html/test/data/tree-construction/tests7.dat
deleted file mode 100644
index f5193c6..0000000
--- a/packages/html/test/data/tree-construction/tests7.dat
+++ /dev/null
@@ -1,390 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests8.dat b/packages/html/test/data/tree-construction/tests8.dat
deleted file mode 100644
index 90e6c91..0000000
--- a/packages/html/test/data/tree-construction/tests8.dat
+++ /dev/null
@@ -1,148 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests9.dat b/packages/html/test/data/tree-construction/tests9.dat
deleted file mode 100644
index 554e27a..0000000
--- a/packages/html/test/data/tree-construction/tests9.dat
+++ /dev/null
@@ -1,457 +0,0 @@
-#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/packages/html/test/data/tree-construction/tests_innerHTML_1.dat b/packages/html/test/data/tree-construction/tests_innerHTML_1.dat
deleted file mode 100644
index 6c78661..0000000
--- a/packages/html/test/data/tree-construction/tests_innerHTML_1.dat
+++ /dev/null
@@ -1,741 +0,0 @@
-#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/packages/html/test/data/tree-construction/tricky01.dat b/packages/html/test/data/tree-construction/tricky01.dat
deleted file mode 100644
index 0841992..0000000
--- a/packages/html/test/data/tree-construction/tricky01.dat
+++ /dev/null
@@ -1,261 +0,0 @@
-#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/packages/html/test/data/tree-construction/webkit01.dat b/packages/html/test/data/tree-construction/webkit01.dat
deleted file mode 100644
index 06bc436..0000000
--- a/packages/html/test/data/tree-construction/webkit01.dat
+++ /dev/null
@@ -1,594 +0,0 @@
-#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/packages/html/test/data/tree-construction/webkit02.dat b/packages/html/test/data/tree-construction/webkit02.dat
deleted file mode 100644
index 468879b..0000000
--- a/packages/html/test/data/tree-construction/webkit02.dat
+++ /dev/null
@@ -1,94 +0,0 @@
-#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/packages/html/test/dom_test.dart b/packages/html/test/dom_test.dart
deleted file mode 100644
index 671d0b1..0000000
--- a/packages/html/test/dom_test.dart
+++ /dev/null
@@ -1,190 +0,0 @@
-/// Additional feature tests that aren't based on test data.
-library dom_test;
-
-import 'package:test/test.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 as Element).id, 'foo');
-      expect((Foo as Element).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 as Element).className, ' bar baz');
-      expect((quxBaz as Element).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] as Element).localName, 'x-foo');
-      doc.body.nodes.add(parseFragment('<x-bar>'));
-      expect((doc.body.nodes[1] as Element).localName, 'x-bar');
-    });
-
-    test('addLast', () {
-      var doc = parse('<body>');
-      doc.body.nodes.addLast(parseFragment('<x-foo>'));
-      expect((doc.body.nodes[0] as Element).localName, 'x-foo');
-      doc.body.nodes.addLast(parseFragment('<x-bar>'));
-      expect((doc.body.nodes[1] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'x-b');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-b');
-      expect((doc.body.nodes[1] as Element).localName, 'x-c');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'x-b');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-b');
-      expect((doc.body.nodes[1] as Element).localName, 'x-c');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-b');
-      expect((doc.body.nodes[1] as Element).localName, 'x-c');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'x-b');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-b');
-      expect((doc.body.nodes[1] as Element).localName, 'x-c');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-b');
-      expect((doc.body.nodes[1] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).localName, 'y-c');
-      expect((doc.body.nodes[3] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).localName, 'y-c');
-      expect((doc.body.nodes[3] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).localName, 'y-c');
-      expect((doc.body.nodes[3] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).localName, 'y-c');
-      expect((doc.body.nodes[3] as Element).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] as Element).localName, 'x-a');
-      expect((doc.body.nodes[1] as Element).localName, 'y-b');
-      expect((doc.body.nodes[2] as Element).localName, 'y-c');
-      expect((doc.body.nodes[3] as Element).localName, 'x-c');
-      expect(doc.body.nodes.length, 4);
-    });
-  });
-}
diff --git a/packages/html/test/parser_feature_test.dart b/packages/html/test/parser_feature_test.dart
deleted file mode 100644
index de8843b..0000000
--- a/packages/html/test/parser_feature_test.dart
+++ /dev/null
@@ -1,486 +0,0 @@
-/// Additional feature tests that aren't based on test data.
-library parser_feature_test;
-
-import 'package:test/test.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] as Element).namespaceUri, Namespaces.html);
-  });
-
-  test('namespace html elements off', () {
-    var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse();
-    expect((doc.nodes[0] as Element).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 as Comment).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(String 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');
-    });
-
-    test('parses content attr', () {
-      expect(
-          getEncoding(
-              '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'),
-          null);
-    });
-  });
-}
-
-_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>');
-      }
-    });
-  });
-}
diff --git a/packages/html/test/parser_test.dart b/packages/html/test/parser_test.dart
deleted file mode 100644
index 69a52a5..0000000
--- a/packages/html/test/parser_test.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-@TestOn('vm')
-library parser_test;
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:path/path.dart' as pathos;
-import 'package:test/test.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/packages/html/test/selectors/LICENSE b/packages/html/test/selectors/LICENSE
deleted file mode 100644
index 0dc0193..0000000
--- a/packages/html/test/selectors/LICENSE
+++ /dev/null
@@ -1,9 +0,0 @@
-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/packages/html/test/selectors/README b/packages/html/test/selectors/README
deleted file mode 100644
index d6e3852..0000000
--- a/packages/html/test/selectors/README
+++ /dev/null
@@ -1,9 +0,0 @@
-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/packages/html/test/selectors/level1-content.html b/packages/html/test/selectors/level1-content.html
deleted file mode 100644
index b90d918..0000000
--- a/packages/html/test/selectors/level1-content.html
+++ /dev/null
@@ -1,377 +0,0 @@
-<!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="台北Táibě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="台北Táibě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/packages/html/test/selectors/level1_baseline_test.dart b/packages/html/test/selectors/level1_baseline_test.dart
deleted file mode 100644
index 9066842..0000000
--- a/packages/html/test/selectors/level1_baseline_test.dart
+++ /dev/null
@@ -1,127 +0,0 @@
-/// 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.
-
-@TestOn('vm')
-library html.test.selectors.level1_baseline_test;
-
-import 'dart:io';
-import 'package:html/dom.dart';
-import 'package:html/parser.dart';
-import 'package:path/path.dart' as p;
-import 'package:test/test.dart';
-
-import '../support.dart';
-import 'level1_lib.dart';
-import 'selectors.dart';
-
-Document getTestContentDocument() {
-  var testPath = p.join(testDir, 'selectors', 'level1-content.html');
-  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/packages/html/test/selectors/level1_lib.dart b/packages/html/test/selectors/level1_lib.dart
deleted file mode 100644
index 4ffa9a8..0000000
--- a/packages/html/test/selectors/level1_lib.dart
+++ /dev/null
@@ -1,316 +0,0 @@
-/// 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 [runTest] 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:test/test.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) {
-  runTest(() {
-    var q = obj.querySelector is Function;
-    assertTrue(q, type + " supports querySelector.");
-  }, type + " supports querySelector");
-
-  runTest(() {
-    var qa = obj.querySelectorAll is Function;
-    assertTrue(qa, type + " supports querySelectorAll.");
-  }, type + " supports querySelectorAll");
-
-  runTest(() {
-    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.
-    assertTrue(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;
-
-  runTest(() {
-    pre = root.querySelectorAll("div");
-    preLength = pre.length;
-
-    var div = doc.createElement("div");
-    (root is Document ? root.body : root).append(div);
-
-    assertEquals(
-        pre.length, preLength, "The length of the NodeList should not change.");
-  }, type + ": static NodeList");
-
-  runTest(() {
-    post = root.querySelectorAll("div");
-    assertEquals(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.
-  runTest(() {
-    // 1
-    assertEquals(root.querySelectorAll('null').length, 1,
-        "This should find one element with the tag name 'NULL'.");
-  }, type + ".querySelectorAll null");
-
-  runTest(() {
-    // 2
-    assertEquals(root.querySelectorAll('undefined').length, 1,
-        "This should find one element with the tag name 'UNDEFINED'.");
-  }, type + ".querySelectorAll undefined");
-
-  runTest(() {
-    // 3
-    assertThrows((e) => e is NoSuchMethodError, () {
-      root.querySelectorAll();
-    }, "This should throw a TypeError.");
-  }, type + ".querySelectorAll no parameter");
-
-  runTest(() {
-    // 4
-    var elm = root.querySelector('null');
-    assertNotEquals(elm, null, "This should find an element.");
-    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
-    assertEquals(
-        elm.localName.toUpperCase(), "NULL", "The tag name should be 'NULL'.");
-  }, type + ".querySelector null");
-
-  runTest(() {
-    // 5
-    var elm = root.querySelector('undefined');
-    assertNotEquals(elm, 'undefined', "This should find an element.");
-    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
-    assertEquals(elm.localName.toUpperCase(), "UNDEFINED",
-        "The tag name should be 'UNDEFINED'.");
-  }, type + ".querySelector undefined");
-
-  runTest(() {
-    // 6
-    assertThrows((e) => e is NoSuchMethodError, () {
-      root.querySelector();
-    }, "This should throw a TypeError.");
-  }, type + ".querySelector no parameter");
-
-  runTest(() {
-    // 7
-    var result = root.querySelectorAll("*");
-    var i = 0;
-    traverse(root, (elem) {
-      if (!identical(elem, root)) {
-        assertEquals(
-            elem, result[i], "The result in index $i should be in tree order.");
-        i++;
-      }
-    });
-  }, type + ".querySelectorAll tree order");
-}
-
-/// Tests containing this string fail for an unknown reason
-final _failureName = 'matching custom data-* attribute with';
-
-String _getSkip(String name) {
-  if (name.contains(_failureName)) {
-    return 'Tests related to `$_failureName` fail for an unknown reason.';
-  }
-  return null;
-}
-
-/*
- * 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(String type, root, List<Map<String, dynamic>> 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 skip = _getSkip(n);
-    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;
-
-      runTest(() {
-        foundall = root.querySelectorAll(q);
-        assertNotEquals(foundall, null, "The method should not return null.");
-        assertEquals(foundall.length, e.length,
-            "The method should return the expected number of matches.");
-
-        for (var i = 0; i < e.length; i++) {
-          assertNotEquals(
-              foundall[i], null, "The item in index $i should not be null.");
-          assertEquals(foundall[i].attributes["id"], e[i],
-              "The item in index $i should have the expected ID.");
-          assertFalse(foundall[i].attributes.containsKey("data-clone"),
-              "This should not be a cloned element.");
-        }
-      }, type + ".querySelectorAll: " + n + ": " + q, skip: skip);
-
-      runTest(() {
-        found = root.querySelector(q);
-
-        if (e.isNotEmpty) {
-          assertNotEquals(found, null, "The method should return a match.");
-          assertEquals(found.attributes["id"], e[0],
-              "The method should return the first match.");
-          assertEquals(found, foundall[0],
-              "The result should match the first item from querySelectorAll.");
-          assertFalse(found.attributes.containsKey("data-clone"),
-              "This should not be annotated as a cloned element.");
-        } else {
-          assertEquals(found, null, "The method should not match anything.");
-        }
-      }, type + ".querySelector: " + n + ": " + q, skip: skip);
-    } 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(String type, root, List 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
-    runTest(() {
-      assertThrows((e) => e is FormatException, () {
-        root.querySelector(q);
-      });
-    }, type + ".querySelector: " + n + ": " + q);
-
-    runTest(() {
-      assertThrows((e) => e is FormatException, () {
-        root.querySelectorAll(q);
-      });
-    }, type + ".querySelectorAll: " + n + ": " + q);
-  }
-}
-
-traverse(Node elem, void fn(Node elem)) {
-  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);
-  }
-}
-
-runTest(Function body, String name, {String skip}) =>
-    unittest.test(name, body, skip: skip);
-
-assertTrue(bool value, String reason) =>
-    unittest.expect(value, unittest.isTrue, reason: reason);
-
-assertFalse(bool value, String reason) =>
-    unittest.expect(value, unittest.isFalse, reason: reason);
-
-assertEquals(x, y, String reason) => unittest.expect(x, y, reason: reason);
-
-assertNotEquals(x, y, String reason) =>
-    unittest.expect(x, unittest.isNot(y), reason: reason);
-
-assertThrows(exception, body(), [String reason]) =>
-    unittest.expect(body, unittest.throwsA(exception), reason: reason);
diff --git a/packages/html/test/selectors/selectors.dart b/packages/html/test/selectors/selectors.dart
deleted file mode 100644
index d25b14b..0000000
--- a/packages/html/test/selectors/selectors.dart
+++ /dev/null
@@ -1,1875 +0,0 @@
-/// 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': ".台北Táibě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': ".台北Táibě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': "#台北Táiběi",
-    'expect': ["台北Táibě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': "#台北Táiběi, #台北",
-    'expect': ["台北Táibě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/packages/html/test/support.dart b/packages/html/test/support.dart
deleted file mode 100644
index 022da35..0000000
--- a/packages/html/test/support.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-/// Support code for the tests in this directory.
-library support;
-
-import 'dart:collection';
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:html/src/treebuilder.dart';
-import 'package:html/dom.dart';
-import 'package:html/dom_parsing.dart';
-
-typedef TreeBuilder TreeBuilderFactory(bool namespaceHTMLElements);
-
-Map<String, TreeBuilderFactory> _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 testDir = p.join(p.dirname(p.fromUri(Platform.packageConfig)), 'test');
-
-final testDataDir = p.join(testDir, 'data');
-
-Iterable<String> getDataFiles(String subdirectory) {
-  var dir = new Directory(p.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>{};
-    String key;
-    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.isNotEmpty && 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.isNotEmpty) {
-      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) => _visitDocumentOrFragment(node);
-
-  _visitDocumentOrFragment(node) {
-    indent += 1;
-    for (var child in node.nodes) visit(child);
-    indent -= 1;
-  }
-
-  visitDocumentFragment(DocumentFragment node) =>
-      _visitDocumentOrFragment(node);
-
-  visitElement(Element node) {
-    _newline();
-    _str.write(node);
-    if (node.attributes.isNotEmpty) {
-      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/packages/html/test/tokenizer_test.dart b/packages/html/test/tokenizer_test.dart
deleted file mode 100644
index dba4ece..0000000
--- a/packages/html/test/tokenizer_test.dart
+++ /dev/null
@@ -1,266 +0,0 @@
-@TestOn('vm')
-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:test/test.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;
-  String _lastStartTag;
-  List outputTokens;
-
-  TokenizerTestParser(String initialState, [String 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.isNotEmpty &&
-          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/packages/pool/.gitignore b/packages/pool/.gitignore
deleted file mode 100644
index 7dbf035..0000000
--- a/packages/pool/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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/packages/pool/.idea/compiler.xml b/packages/pool/.idea/compiler.xml
deleted file mode 100644
index 40ed937..0000000
--- a/packages/pool/.idea/compiler.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <wildcardResourcePatterns>
-      <entry name="!?*.java" />
-      <entry name="!?*.form" />
-      <entry name="!?*.class" />
-      <entry name="!?*.groovy" />
-      <entry name="!?*.scala" />
-      <entry name="!?*.flex" />
-      <entry name="!?*.kt" />
-      <entry name="!?*.clj" />
-    </wildcardResourcePatterns>
-  </component>
-</project>
\ No newline at end of file
diff --git a/packages/pool/.idea/encodings.xml b/packages/pool/.idea/encodings.xml
deleted file mode 100644
index 97626ba..0000000
--- a/packages/pool/.idea/encodings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Encoding">
-    <file url="PROJECT" charset="UTF-8" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/packages/pool/.idea/libraries/Dart_Packages.xml b/packages/pool/.idea/libraries/Dart_Packages.xml
deleted file mode 100644
index e583893..0000000
--- a/packages/pool/.idea/libraries/Dart_Packages.xml
+++ /dev/null
@@ -1,420 +0,0 @@
-<component name="libraryTable">
-  <library name="Dart Packages" type="DartPackagesLibraryType">
-    <properties>
-      <option name="packageNameToDirsMap">
-        <entry key="analyzer">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.30.0+4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="args">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.2.0/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="async">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.0.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="barback">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/barback-0.15.2+13/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="boolean_selector">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="charcode">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="cli_util">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/cli_util-0.1.2+1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="clock">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/clock-0.1.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="collection">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.5/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="convert">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="crypto">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.2+1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="csslib">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="fake_async">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fake_async-0.1.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="front_end">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="glob">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.5/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="html">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.2+1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="http">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.11.3+16/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="http_multi_server">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="http_parser">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="io">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/io-0.3.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="isolate">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/isolate-1.1.0/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="js">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="kernel">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="logging">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="matcher">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.1+4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="meta">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="mime">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.5/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="multi_server_socket">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/multi_server_socket-1.0.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="node_preamble">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="package_config">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.3/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="package_resolver">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="path">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.5.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="plugin">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="pub_semver">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="shelf">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="shelf_packages_handler">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.3/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="shelf_static">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.6/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="shelf_web_socket">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="source_map_stack_trace">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="source_maps">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="source_span">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="stack_trace">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="stream_channel">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.3/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="string_scanner">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="term_glyph">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="test">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-0.12.29+1/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="typed_data">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.5/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="utf">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="watcher">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+4/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="web_socket_channel">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.6/lib" />
-            </list>
-          </value>
-        </entry>
-        <entry key="yaml">
-          <value>
-            <list>
-              <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.13/lib" />
-            </list>
-          </value>
-        </entry>
-      </option>
-    </properties>
-    <CLASSES>
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.30.0+4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.2.0/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.0.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/barback-0.15.2+13/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/cli_util-0.1.2+1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/clock-0.1.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.5/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.2+1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fake_async-0.1.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.5/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.2+1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.11.3+16/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/io-0.3.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/isolate-1.1.0/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.1+4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.5/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/multi_server_socket-1.0.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.3/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.5.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.3/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.6/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.3/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-0.12.29+1/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.5/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+4/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.6/lib" />
-      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.13/lib" />
-    </CLASSES>
-    <JAVADOC />
-    <SOURCES />
-  </library>
-</component>
\ No newline at end of file
diff --git a/packages/pool/.idea/libraries/Dart_SDK.xml b/packages/pool/.idea/libraries/Dart_SDK.xml
deleted file mode 100644
index fb47661..0000000
--- a/packages/pool/.idea/libraries/Dart_SDK.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<component name="libraryTable">
-  <library name="Dart SDK">
-    <CLASSES>
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/async" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/collection" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/convert" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/core" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/developer" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/html" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/indexed_db" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/io" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/isolate" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/js" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/js_util" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/math" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/mirrors" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/svg" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/typed_data" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/web_audio" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/web_gl" />
-      <root url="file://$USER_HOME$/ide/dart-sdk/lib/web_sql" />
-    </CLASSES>
-    <JAVADOC />
-    <SOURCES />
-  </library>
-</component>
\ No newline at end of file
diff --git a/packages/pool/.idea/misc.xml b/packages/pool/.idea/misc.xml
deleted file mode 100644
index d557a56..0000000
--- a/packages/pool/.idea/misc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" />
-</project>
\ No newline at end of file
diff --git a/packages/pool/.idea/modules.xml b/packages/pool/.idea/modules.xml
deleted file mode 100644
index ab42762..0000000
--- a/packages/pool/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/pool.iml" filepath="$PROJECT_DIR$/.idea/pool.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/packages/pool/.idea/pool.iml b/packages/pool/.idea/pool.iml
deleted file mode 100644
index 0fd729f..0000000
--- a/packages/pool/.idea/pool.iml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/.pub" />
-      <excludeFolder url="file://$MODULE_DIR$/build" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Dart SDK" level="project" />
-    <orderEntry type="library" name="Dart Packages" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/packages/pool/.idea/vcs.xml b/packages/pool/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/packages/pool/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="" vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/packages/pool/.idea/workspace.xml b/packages/pool/.idea/workspace.xml
deleted file mode 100644
index d556761..0000000
--- a/packages/pool/.idea/workspace.xml
+++ /dev/null
@@ -1,526 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="27c232e1-e91e-41a0-9a37-e9c9d9e39f27" name="Default" comment="">
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/CHANGELOG.md" afterPath="$PROJECT_DIR$/CHANGELOG.md" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pubspec.yaml" afterPath="$PROJECT_DIR$/pubspec.yaml" />
-    </list>
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
-    <option name="TRACKING_ENABLED" value="true" />
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="FileEditorManager">
-    <leaf>
-      <file leaf-file-name="pool.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lib/pool.dart">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="290">
-              <caret line="132" column="5" lean-forward="true" selection-start-line="132" selection-start-column="5" selection-end-line="132" selection-end-column="5" />
-              <folding>
-                <element signature="e#0#10129#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
-          <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
-            <state split_layout="SPLIT">
-              <first_editor relative-caret-position="30">
-                <caret line="2" column="41" lean-forward="false" selection-start-line="2" selection-start-column="41" selection-end-line="2" selection-end-column="41" />
-                <folding />
-              </first_editor>
-              <second_editor />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/pubspec.yaml">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="15">
-              <caret line="1" column="14" lean-forward="false" selection-start-line="1" selection-start-column="14" selection-end-line="1" selection-end-column="14" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
-  </component>
-  <component name="GradleLocalSettings">
-    <option name="externalProjectsViewState">
-      <projects_view />
-    </option>
-  </component>
-  <component name="IdeDocumentHistory">
-    <option name="CHANGED_PATHS">
-      <list>
-        <option value="$PROJECT_DIR$/lib/pool.dart" />
-        <option value="$PROJECT_DIR$/pubspec.yaml" />
-        <option value="$PROJECT_DIR$/CHANGELOG.md" />
-      </list>
-    </option>
-  </component>
-  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsGulpfileManager">
-    <detection-done>true</detection-done>
-    <sorting>DEFINITION_ORDER</sorting>
-  </component>
-  <component name="MavenImportPreferences">
-    <option name="generalSettings">
-      <MavenGeneralSettings>
-        <option name="mavenHome" value="Bundled (Maven 3)" />
-      </MavenGeneralSettings>
-    </option>
-  </component>
-  <component name="ProjectFrameBounds">
-    <option name="x" value="727" />
-    <option name="y" value="591" />
-    <option name="width" value="1436" />
-    <option name="height" value="877" />
-  </component>
-  <component name="ProjectInspectionProfilesVisibleTreeState">
-    <entry key="Project Default">
-      <profile-state>
-        <expanded-state>
-          <State>
-            <id />
-          </State>
-          <State>
-            <id>Android Lint</id>
-          </State>
-          <State>
-            <id>Annotations verifyingGroovy</id>
-          </State>
-          <State>
-            <id>Assignment issuesGroovy</id>
-          </State>
-          <State>
-            <id>Code maturity issuesJava</id>
-          </State>
-          <State>
-            <id>Control FlowGroovy</id>
-          </State>
-          <State>
-            <id>Cucumber</id>
-          </State>
-          <State>
-            <id>Data flow issuesGroovy</id>
-          </State>
-          <State>
-            <id>Declaration redundancyGroovy</id>
-          </State>
-          <State>
-            <id>DeclarationGroovy</id>
-          </State>
-          <State>
-            <id>Error handlingGroovy</id>
-          </State>
-          <State>
-            <id>GPath inspectionsGroovy</id>
-          </State>
-          <State>
-            <id>GSPGrailsGroovy</id>
-          </State>
-          <State>
-            <id>GeneralJavaScript</id>
-          </State>
-          <State>
-            <id>Gradle</id>
-          </State>
-          <State>
-            <id>GrailsGroovy</id>
-          </State>
-          <State>
-            <id>Grammar Inspections</id>
-          </State>
-          <State>
-            <id>Groovy</id>
-          </State>
-          <State>
-            <id>J2ME issuesJava</id>
-          </State>
-          <State>
-            <id>Java</id>
-          </State>
-          <State>
-            <id>Java language level migration aidsJava</id>
-          </State>
-          <State>
-            <id>JavaScript</id>
-          </State>
-          <State>
-            <id>Maven</id>
-          </State>
-          <State>
-            <id>Memory issuesJava</id>
-          </State>
-          <State>
-            <id>Method MetricsGroovy</id>
-          </State>
-          <State>
-            <id>Naming ConventionsGroovy</id>
-          </State>
-          <State>
-            <id>Numeric issuesJava</id>
-          </State>
-          <State>
-            <id>OtherGroovy</id>
-          </State>
-          <State>
-            <id>Packaging issuesJava</id>
-          </State>
-          <State>
-            <id>Performance issuesJava</id>
-          </State>
-          <State>
-            <id>Plugin DevKit</id>
-          </State>
-          <State>
-            <id>Potentially confusing code constructsGroovy</id>
-          </State>
-          <State>
-            <id>Probable bugsGradle</id>
-          </State>
-          <State>
-            <id>Probable bugsGroovy</id>
-          </State>
-          <State>
-            <id>Probable bugsJava</id>
-          </State>
-          <State>
-            <id>SQL</id>
-          </State>
-          <State>
-            <id>Serialization issuesJava</id>
-          </State>
-          <State>
-            <id>SetupSpring CoreSpring</id>
-          </State>
-          <State>
-            <id>Spring</id>
-          </State>
-          <State>
-            <id>Spring CoreSpring</id>
-          </State>
-          <State>
-            <id>Spring IntegrationSpring</id>
-          </State>
-          <State>
-            <id>StyleGroovy</id>
-          </State>
-          <State>
-            <id>TestNGJava</id>
-          </State>
-          <State>
-            <id>Threading issuesGroovy</id>
-          </State>
-          <State>
-            <id>UI Form Problems</id>
-          </State>
-          <State>
-            <id>Validity issuesGroovy</id>
-          </State>
-        </expanded-state>
-      </profile-state>
-    </entry>
-  </component>
-  <component name="ProjectLevelVcsManager">
-    <ConfirmationsSetting value="1" id="Add" />
-  </component>
-  <component name="ProjectView">
-    <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
-      <showMembers />
-      <showModules />
-      <showLibraryContents />
-      <hideEmptyPackages />
-      <abbreviatePackageNames />
-      <autoscrollToSource />
-      <autoscrollFromSource />
-      <sortByType />
-      <manualOrder />
-      <foldersAlwaysOnTop value="true" />
-    </navigator>
-    <panes>
-      <pane id="Scope" />
-      <pane id="AndroidView" />
-      <pane id="PackagesPane" />
-      <pane id="ProjectPane">
-        <subPane>
-          <expand>
-            <path>
-              <item name="pool" type="b2602c69:ProjectViewProjectNode" />
-              <item name="pool" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="pool" type="b2602c69:ProjectViewProjectNode" />
-              <item name="pool" type="462c0819:PsiDirectoryNode" />
-              <item name="lib" type="462c0819:PsiDirectoryNode" />
-            </path>
-          </expand>
-          <select />
-        </subPane>
-      </pane>
-      <pane id="Scratches" />
-    </panes>
-  </component>
-  <component name="PropertiesComponent">
-    <property name="GoToClass.includeLibraries" value="false" />
-    <property name="GoToClass.toSaveIncludeLibraries" value="false" />
-    <property name="GoToFile.includeJavaFiles" value="false" />
-    <property name="MemberChooser.sorted" value="false" />
-    <property name="MemberChooser.showClasses" value="true" />
-    <property name="MemberChooser.copyJavadoc" value="false" />
-    <property name="options.lastSelected" value="Errors" />
-    <property name="options.splitter.main.proportions" value="0.3" />
-    <property name="options.splitter.details.proportions" value="0.2" />
-    <property name="project.structure.last.edited" value="SDKs" />
-    <property name="project.structure.proportion" value="0.0" />
-    <property name="project.structure.side.proportion" value="0.0" />
-    <property name="settings.editor.selected.configurable" value="configurable.group.build" />
-    <property name="settings.editor.splitter.proportion" value="0.2" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="dart.analysis.tool.window.force.activate" value="false" />
-  </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
-  <component name="RunManager">
-    <configuration default="true" type="Applet" factoryName="Applet">
-      <option name="WIDTH" value="400" />
-      <option name="HEIGHT" value="300" />
-      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
-      <module />
-    </configuration>
-    <configuration default="true" type="Application" factoryName="Application">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-    </configuration>
-    <configuration default="true" type="JUnit" factoryName="JUnit">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <module name="" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="METHOD_NAME" />
-      <option name="TEST_OBJECT" value="class" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="moduleWithDependencies" />
-      </option>
-      <envs />
-      <patterns />
-    </configuration>
-    <configuration default="true" type="Remote" factoryName="Remote">
-      <option name="USE_SOCKET_TRANSPORT" value="true" />
-      <option name="SERVER_MODE" value="false" />
-      <option name="SHMEM_ADDRESS" value="javadebug" />
-      <option name="HOST" value="localhost" />
-      <option name="PORT" value="5005" />
-    </configuration>
-    <configuration default="true" type="TestNG" factoryName="TestNG">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <module name="" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="SUITE_NAME" />
-      <option name="PACKAGE_NAME" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="METHOD_NAME" />
-      <option name="GROUP_NAME" />
-      <option name="TEST_OBJECT" value="CLASS" />
-      <option name="VM_PARAMETERS" value="-ea" />
-      <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="OUTPUT_DIRECTORY" />
-      <option name="ANNOTATION_TYPE" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="TEST_SEARCH_SCOPE">
-        <value defaultName="moduleWithDependencies" />
-      </option>
-      <option name="USE_DEFAULT_REPORTERS" value="false" />
-      <option name="PROPERTIES_FILE" />
-      <envs />
-      <properties />
-      <listeners />
-    </configuration>
-  </component>
-  <component name="ShelveChangesManager" show_recycled="false">
-    <option name="remove_strategy" value="false" />
-  </component>
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="27c232e1-e91e-41a0-9a37-e9c9d9e39f27" name="Default" comment="" />
-      <created>1515014274992</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1515014274992</updated>
-      <workItem from="1515014276160" duration="736000" />
-    </task>
-    <servers />
-  </component>
-  <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="736000" />
-  </component>
-  <component name="ToolWindowManager">
-    <frame x="727" y="591" width="1436" height="877" extended-state="0" />
-    <editor active="true" />
-    <layout>
-      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32992327" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24964131" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
-      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
-    </layout>
-  </component>
-  <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="1" />
-  </component>
-  <component name="VcsContentAnnotationSettings">
-    <option name="myLimit" value="2678400000" />
-  </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager />
-    <watches-manager />
-  </component>
-  <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/lib/pool.dart">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="290">
-          <caret line="132" column="5" lean-forward="true" selection-start-line="132" selection-start-column="5" selection-end-line="132" selection-end-column="5" />
-          <folding>
-            <element signature="e#0#10129#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
-      <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
-        <state split_layout="SPLIT">
-          <first_editor relative-caret-position="30">
-            <caret line="2" column="41" lean-forward="false" selection-start-line="2" selection-start-column="41" selection-end-line="2" selection-end-column="41" />
-            <folding />
-          </first_editor>
-          <second_editor />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="15">
-          <caret line="1" column="14" lean-forward="false" selection-start-line="1" selection-start-column="14" selection-end-line="1" selection-end-column="14" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-  </component>
-  <component name="masterDetails">
-    <states>
-      <state key="GlobalLibrariesConfigurable.UI">
-        <settings>
-          <last-edited>Dart SDK</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="JdkListConfigurable.UI">
-        <settings>
-          <last-edited>IDEA jdk</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="ProjectJDKs.UI">
-        <settings>
-          <last-edited>IDEA jdk</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-      <state key="ProjectLibrariesConfigurable.UI">
-        <settings>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-    </states>
-  </component>
-</project>
\ No newline at end of file
diff --git a/packages/pool/.test_config b/packages/pool/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/pool/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/pool/.travis.yml b/packages/pool/.travis.yml
deleted file mode 100644
index bf601a1..0000000
--- a/packages/pool/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: dart
-sudo: false
-dart:
-  - dev
-  - stable
-  - 1.23.0
-
-dart_task:
-  - test: --platform vm
-  - test: --platform firefox
-  - test: --platform dartium
-    install_dartium: true
-  - dartfmt
-  - dartanalyzer
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-cache:
- directories:
-   - $HOME/.pub-cache
diff --git a/packages/pool/CHANGELOG.md b/packages/pool/CHANGELOG.md
deleted file mode 100644
index 84b72c0..0000000
--- a/packages/pool/CHANGELOG.md
+++ /dev/null
@@ -1,58 +0,0 @@
-## 1.3.4
-
-* Modify code to eliminate Future flattening.
-
-## 1.3.3
-
-* Declare support for `async` 2.0.0.
-
-## 1.3.2
-
-* Update to make the code work with strong-mode clean Zone API.
-
-* Required minimum SDK of 1.23.0.
-
-## 1.3.1
-
-* Fix the type annotation of `Pool.withResource()` to indicate that it takes
-  `() -> FutureOr<T>`.
-
-## 1.3.0
-
-* Add a `Pool.done` getter that returns the same future returned by
-  `Pool.close()`.
-
-## 1.2.4
-
-* Fix a strong-mode error.
-
-## 1.2.3
-
-* Fix a bug in which `Pool.withResource()` could throw a `StateError` when
-  called immediately before closing the pool.
-
-## 1.2.2
-
-* Fix strong mode warnings and add generic method annotations.
-
-## 1.2.1
-
-* Internal changes only.
-
-## 1.2.0
-
-* Add `Pool.close()`, which forbids new resource requests and releases all
-  releasable resources.
-
-## 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/packages/pool/LICENSE b/packages/pool/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/packages/pool/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/pool/README.md b/packages/pool/README.md
deleted file mode 100644
index 641e772..0000000
--- a/packages/pool/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-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(() => 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/packages/pool/analysis_options.yaml b/packages/pool/analysis_options.yaml
deleted file mode 100644
index a10d4c5..0000000
--- a/packages/pool/analysis_options.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/packages/pool/codereview.settings b/packages/pool/codereview.settings
deleted file mode 100644
index b474c08..0000000
--- a/packages/pool/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-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/packages/pool/lib/pool.dart b/packages/pool/lib/pool.dart
deleted file mode 100644
index ea3d2f0..0000000
--- a/packages/pool/lib/pool.dart
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/async.dart';
-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.
-  ///
-  /// This timer is canceled as long as the pool is below the resource limit.
-  /// It's reset once the resource limit is reached and again 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.
-  ///
-  /// This is `null` if this pool shouldn't time out.
-  RestartableTimer _timer;
-
-  /// The amount of time to wait before timing out the pending resources.
-  final Duration _timeout;
-
-  /// A [FutureGroup] that tracks all the `onRelease` callbacks for resources
-  /// that have been marked releasable.
-  ///
-  /// This is `null` until [close] is called.
-  FutureGroup _closeGroup;
-
-  /// Whether [close] has been called.
-  bool get isClosed => _closeMemo.hasRun;
-
-  /// A future that completes once the pool is closed and all its outstanding
-  /// resources have been released.
-  ///
-  /// If any [PoolResource.allowRelease] callback throws an exception after the
-  /// pool is closed, this completes with that exception.
-  Future get done => _closeMemo.future;
-
-  /// 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 {
-    if (timeout != null) {
-      // Start the timer canceled since we only want to start counting down once
-      // we've run out of available resources.
-      _timer = new RestartableTimer(timeout, _onTimeout)..cancel();
-    }
-  }
-
-  /// 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 (isClosed) {
-      throw new StateError("request() may not be called on a closed Pool.");
-    }
-
-    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<T> withResource<T>(FutureOr<T> callback()) {
-    if (isClosed) {
-      throw new StateError(
-          "withResource() may not be called on a closed Pool.");
-    }
-
-    // We can't use async/await here because we need to start the request
-    // synchronously in case the pool is closed immediately afterwards. Async
-    // functions have an asynchronous gap between calling and running the body,
-    // and [close] could be called during that gap. See #3.
-    return request().then((resource) {
-      return new Future<T>.sync(callback).whenComplete(resource.release);
-    });
-  }
-
-  /// Closes the pool so that no more resources are requested.
-  ///
-  /// Existing resource requests remain unchanged.
-  ///
-  /// Any resources that are marked as releasable using
-  /// [PoolResource.allowRelease] are released immediately. Once all resources
-  /// have been released and any `onRelease` callbacks have completed, the
-  /// returned future completes successfully. If any `onRelease` callback throws
-  /// an error, the returned future completes with that error.
-  ///
-  /// This may be called more than once; it returns the same [Future] each time.
-  Future close() => _closeMemo.runOnce(() {
-        if (_closeGroup != null) return _closeGroup.future;
-
-        _resetTimer();
-
-        _closeGroup = new FutureGroup();
-        for (var callback in _onReleaseCallbacks) {
-          _closeGroup.add(new Future.sync(callback));
-        }
-
-        _allocatedResources -= _onReleaseCallbacks.length;
-        _onReleaseCallbacks.clear();
-
-        if (_allocatedResources == 0) _closeGroup.close();
-        return _closeGroup.future;
-      });
-  final _closeMemo = new AsyncMemoizer();
-
-  /// If there are any pending requests, this will fire the oldest one.
-  void _onResourceReleased() {
-    _resetTimer();
-
-    if (_requestedResources.isNotEmpty) {
-      var pending = _requestedResources.removeFirst();
-      pending.complete(new PoolResource._(this));
-    } else {
-      _allocatedResources--;
-      if (isClosed && _allocatedResources == 0) _closeGroup.close();
-    }
-  }
-
-  /// If there are any pending requests, this will fire the oldest one after
-  /// running [onRelease].
-  void _onResourceReleaseAllowed(onRelease()) {
-    _resetTimer();
-
-    if (_requestedResources.isNotEmpty) {
-      var pending = _requestedResources.removeFirst();
-      pending.complete(_runOnRelease(onRelease));
-    } else if (isClosed) {
-      _closeGroup.add(new Future.sync(onRelease));
-      _allocatedResources--;
-      if (_allocatedResources == 0) _closeGroup.close();
-    } else {
-      var zone = Zone.current;
-      var registered = zone.registerCallback(onRelease);
-      _onReleaseCallbacks.add(() => zone.run(registered));
-    }
-  }
-
-  /// 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<PoolResource>.sync();
-    _onReleaseCompleters.add(completer);
-    return completer.future;
-  }
-
-  /// A resource has been requested, allocated, or released.
-  void _resetTimer() {
-    if (_timer == null) return;
-
-    if (_requestedResources.isEmpty) {
-      _timer.cancel();
-    } else {
-      _timer.reset();
-    }
-  }
-
-  /// 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/packages/pool/pubspec.yaml b/packages/pool/pubspec.yaml
deleted file mode 100644
index a5f0434..0000000
--- a/packages/pool/pubspec.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: pool
-version: 1.3.4
-author: Dart Team <misc@dartlang.org>
-description: A class for managing a finite pool of resources.
-homepage: https://github.com/dart-lang/pool
-dependencies:
-  async: ">=1.4.0 <3.0.0"
-  stack_trace: ">=0.9.2 <2.0.0"
-environment:
-  sdk: ">=1.23.0 <2.0.0"
-dev_dependencies:
-  fake_async: ">=0.1.0 <0.2.0"
-  test: ">=0.12.0 <0.13.0"
diff --git a/packages/pool/test/pool_test.dart b/packages/pool/test/pool_test.dart
deleted file mode 100644
index 6feba75..0000000
--- a/packages/pool/test/pool_test.dart
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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));
-      });
-    });
-
-    // Regression test for #3.
-    test("can be called immediately before close()", () async {
-      var pool = new Pool(1);
-      pool.withResource(expectAsync(() {}));
-      await pool.close();
-    });
-  });
-
-  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);
-      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();
-    });
-  });
-
-  test("done doesn't complete without close", () async {
-    var pool = new Pool(1);
-    pool.done.then(expectAsync1((_) {}, count: 0));
-
-    var resource = await pool.request();
-    resource.release();
-
-    await new Future.delayed(Duration.ZERO);
-  });
-
-  group("close()", () {
-    test("disallows request() and withResource()", () {
-      var pool = new Pool(1)..close();
-      expect(pool.request, throwsStateError);
-      expect(() => pool.withResource(() {}), throwsStateError);
-    });
-
-    test("pending requests are fulfilled", () async {
-      var pool = new Pool(1);
-      var resource1 = await pool.request();
-      expect(
-          pool.request().then((resource2) {
-            resource2.release();
-          }),
-          completes);
-      expect(pool.done, completes);
-      expect(pool.close(), completes);
-      resource1.release();
-    });
-
-    test("pending requests are fulfilled with allowRelease", () async {
-      var pool = new Pool(1);
-      var resource1 = await pool.request();
-
-      var completer = new Completer();
-      expect(
-          pool.request().then((resource2) {
-            expect(completer.isCompleted, isTrue);
-            resource2.release();
-          }),
-          completes);
-      expect(pool.close(), completes);
-
-      resource1.allowRelease(() => completer.future);
-      await new Future.delayed(Duration.ZERO);
-
-      completer.complete();
-    });
-
-    test("doesn't complete until all resources are released", () async {
-      var pool = new Pool(2);
-      var resource1 = await pool.request();
-      var resource2 = await pool.request();
-      var resource3Future = pool.request();
-
-      var resource1Released = false;
-      var resource2Released = false;
-      var resource3Released = false;
-      expect(
-          pool.close().then((_) {
-            expect(resource1Released, isTrue);
-            expect(resource2Released, isTrue);
-            expect(resource3Released, isTrue);
-          }),
-          completes);
-
-      resource1Released = true;
-      resource1.release();
-      await new Future.delayed(Duration.ZERO);
-
-      resource2Released = true;
-      resource2.release();
-      await new Future.delayed(Duration.ZERO);
-
-      var resource3 = await resource3Future;
-      resource3Released = true;
-      resource3.release();
-    });
-
-    test("active onReleases complete as usual", () async {
-      var pool = new Pool(1);
-      var resource = await pool.request();
-
-      // Set up an onRelease callback whose completion is controlled by
-      // [completer].
-      var completer = new Completer();
-      resource.allowRelease(() => completer.future);
-      expect(
-          pool.request().then((_) {
-            expect(completer.isCompleted, isTrue);
-          }),
-          completes);
-
-      await new Future.delayed(Duration.ZERO);
-      pool.close();
-
-      await new Future.delayed(Duration.ZERO);
-      completer.complete();
-    });
-
-    test("inactive onReleases fire", () async {
-      var pool = new Pool(2);
-      var resource1 = await pool.request();
-      var resource2 = await pool.request();
-
-      var completer1 = new Completer();
-      resource1.allowRelease(() => completer1.future);
-      var completer2 = new Completer();
-      resource2.allowRelease(() => completer2.future);
-
-      expect(
-          pool.close().then((_) {
-            expect(completer1.isCompleted, isTrue);
-            expect(completer2.isCompleted, isTrue);
-          }),
-          completes);
-
-      await new Future.delayed(Duration.ZERO);
-      completer1.complete();
-
-      await new Future.delayed(Duration.ZERO);
-      completer2.complete();
-    });
-
-    test("new allowReleases fire immediately", () async {
-      var pool = new Pool(1);
-      var resource = await pool.request();
-
-      var completer = new Completer();
-      expect(
-          pool.close().then((_) {
-            expect(completer.isCompleted, isTrue);
-          }),
-          completes);
-
-      await new Future.delayed(Duration.ZERO);
-      resource.allowRelease(() => completer.future);
-
-      await new Future.delayed(Duration.ZERO);
-      completer.complete();
-    });
-
-    test("an onRelease error is piped to the return value", () async {
-      var pool = new Pool(1);
-      var resource = await pool.request();
-
-      var completer = new Completer();
-      resource.allowRelease(() => completer.future);
-
-      expect(pool.done, throwsA("oh no!"));
-      expect(pool.close(), throwsA("oh no!"));
-
-      await new Future.delayed(Duration.ZERO);
-      completer.completeError("oh no!");
-    });
-  });
-}
-
-/// 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/packages/source_span/.analysis_options b/packages/source_span/.analysis_options
deleted file mode 100644
index a10d4c5..0000000
--- a/packages/source_span/.analysis_options
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/packages/source_span/.gitignore b/packages/source_span/.gitignore
deleted file mode 100644
index 7dbf035..0000000
--- a/packages/source_span/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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/packages/source_span/.test_config b/packages/source_span/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/packages/source_span/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/packages/source_span/CHANGELOG.md b/packages/source_span/CHANGELOG.md
deleted file mode 100644
index 68eafaa..0000000
--- a/packages/source_span/CHANGELOG.md
+++ /dev/null
@@ -1,134 +0,0 @@
-# 1.4.0
-
-* The `new SourceFile()` constructor is deprecated. This constructed a source
-  file from a string's runes, rather than its code units, which runs counter to
-  the way Dart handles strings otherwise. The `new StringFile.fromString()`
-  constructor (see below) should be used instead.
-
-* The `new SourceFile.fromString()` constructor was added. This works like `new
-  SourceFile()`, except it uses code units rather than runes.
-
-* The current behavior when characters larger than `0xFFFF` are passed to `new
-  SourceFile.decoded()` is now considered deprecated.
-
-# 1.3.1
-
-* Properly highlight spans for lines that include tabs with
-  `SourceSpan.highlight()` and `SourceSpan.message()`.
-
-# 1.3.0
-
-* Add `SourceSpan.highlight()`, which returns just the highlighted text that
-  would be included in `SourceSpan.message()`.
-
-# 1.2.4
-
-* Fix a new strong mode error.
-
-# 1.2.3
-
-* Fix a bug where a point span at the end of a file without a trailing newline
-  would be printed incorrectly.
-
-# 1.2.2
-
-* Allow `SourceSpanException.message`, `SourceSpanFormatException.source`, and
-  `SourceSpanWithContext.context` to be overridden in strong mode.
-
-# 1.2.1
-
-* Fix the declared type of `FileSpan.start` and `FileSpan.end`. In 1.2.0 these
-  were mistakenly changed from `FileLocation` to `SourceLocation`.
-
-# 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/packages/source_span/LICENSE b/packages/source_span/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/packages/source_span/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/source_span/README.md b/packages/source_span/README.md
deleted file mode 100644
index 4e2547e..0000000
--- a/packages/source_span/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-`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/packages/source_span/codereview.settings b/packages/source_span/codereview.settings
deleted file mode 100644
index 6cae815..0000000
--- a/packages/source_span/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-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/packages/source_span/lib/source_span.dart b/packages/source_span/lib/source_span.dart
deleted file mode 100644
index 6ed10a0..0000000
--- a/packages/source_span/lib/source_span.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 "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/packages/source_span/lib/src/colors.dart b/packages/source_span/lib/src/colors.dart
deleted file mode 100644
index e934cde..0000000
--- a/packages/source_span/lib/src/colors.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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.
-const String RED = '\u001b[31m';
-
-const String YELLOW = '\u001b[33m';
-
-const String NONE = '\u001b[0m';
-
diff --git a/packages/source_span/lib/src/file.dart b/packages/source_span/lib/src/file.dart
deleted file mode 100644
index 0217c2d..0000000
--- a/packages/source_span/lib/src/file.dart
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 '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;
-
-  /// This constructor is deprecated.
-  ///
-  /// Use [new SourceFile.fromString] instead.
-  @Deprecated("Will be removed in 2.0.0")
-  SourceFile(String text, {url})
-      : this.decoded(text.runes, url: url);
-
-  /// Creates a new source file from [text].
-  ///
-  /// [url] may be either a [String], a [Uri], or `null`.
-  SourceFile.fromString(String text, {url})
-      : this.decoded(text.codeUnits, url: url);
-
-  /// Creates a new source file from a list of decoded code units.
-  ///
-  /// [url] may be either a [String], a [Uri], or `null`.
-  ///
-  /// Currently, if [decodedChars] contains characters larger than `0xFFFF`,
-  /// they'll be treated as single characters rather than being split into
-  /// surrogate pairs. **This behavior is deprecated**. For
-  /// forwards-compatibility, callers should only pass in characters less than
-  /// or equal to `0xFFFF`.
-  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;
-
-  FileLocation get start;
-  FileLocation get end;
-
-  /// 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/packages/source_span/lib/src/location.dart b/packages/source_span/lib/src/location.dart
deleted file mode 100644
index 2d23db1..0000000
--- a/packages/source_span/lib/src/location.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 '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/packages/source_span/lib/src/location_mixin.dart b/packages/source_span/lib/src/location_mixin.dart
deleted file mode 100644
index 653c2c4..0000000
--- a/packages/source_span/lib/src/location_mixin.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 '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/packages/source_span/lib/src/span.dart b/packages/source_span/lib/src/span.dart
deleted file mode 100644
index 599d668..0000000
--- a/packages/source_span/lib/src/span.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 '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});
-
-  /// Prints the text associated with this span in a user-friendly way.
-  ///
-  /// This is identical to [message], except that it doesn't print the file
-  /// name, line number, column number, or message. If [length] is 0 and this
-  /// isn't a [SourceSpanWithContext], returns an empty string.
-  ///
-  /// [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 highlight({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/packages/source_span/lib/src/span_exception.dart b/packages/source_span/lib/src/span_exception.dart
deleted file mode 100644
index 6d3448b..0000000
--- a/packages/source_span/lib/src/span_exception.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 'span.dart';
-
-/// A class for exceptions that have source span information attached.
-class SourceSpanException implements Exception {
-  // This is a getter so that subclasses can override it.
-  /// A message describing the exception.
-  String get message => _message;
-  final String _message;
-
-  // This is a getter so that subclasses can override it.
-  /// The span associated with this exception.
-  ///
-  /// This may be `null` if the source location can't be determined.
-  SourceSpan get span => _span;
-  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 {
-  // This is a getter so that subclasses can override it.
-  dynamic get source => _source;
-  final _source;
-
-  int get offset => span == null ? null : span.start.offset;
-
-  SourceSpanFormatException(String message, SourceSpan span, [this._source])
-      : super(message, span);
-}
diff --git a/packages/source_span/lib/src/span_mixin.dart b/packages/source_span/lib/src/span_mixin.dart
deleted file mode 100644
index 06e2024..0000000
--- a/packages/source_span/lib/src/span_mixin.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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:charcode/charcode.dart';
-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}) {
-    var buffer = new StringBuffer();
-    buffer.write('line ${start.line + 1}, column ${start.column + 1}');
-    if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
-    buffer.write(': $message');
-
-    var highlight = this.highlight(color: color);
-    if (!highlight.isEmpty) {
-      buffer.writeln();
-      buffer.write(highlight);
-    }
-
-    return buffer.toString();
-  }
-
-  String highlight({color}) {
-    if (color == true) color = colors.RED;
-    if (color == false) color = null;
-
-    var column = start.column;
-    var buffer = new StringBuffer();
-    String 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);
-    } else if (length == 0) {
-      return "";
-    } 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');
-
-    for (var i = 0; i < column; i++) {
-      if (textLine.codeUnitAt(i) == $tab) {
-        buffer.writeCharCode($tab);
-      } else {
-        buffer.writeCharCode($space);
-      }
-    }
-
-    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/packages/source_span/lib/src/span_with_context.dart b/packages/source_span/lib/src/span_with_context.dart
deleted file mode 100644
index a02d780..0000000
--- a/packages/source_span/lib/src/span_with_context.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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 'location.dart';
-import 'span.dart';
-import 'utils.dart';
-
-/// A class that describes a segment of source text with additional context.
-class SourceSpanWithContext extends SourceSpanBase {
-  // This is a getter so that subclasses can override it.
-  /// Text around the span, which includes the line containing this span.
-  String get context => _context;
-  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/packages/source_span/lib/src/utils.dart b/packages/source_span/lib/src/utils.dart
deleted file mode 100644
index 6938547..0000000
--- a/packages/source_span/lib/src/utils.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// 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/packages/source_span/pubspec.yaml b/packages/source_span/pubspec.yaml
deleted file mode 100644
index 46e3d52..0000000
--- a/packages/source_span/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: source_span
-version: 1.4.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:
-  charcode: '^1.0.0'
-  path: '>=1.2.0 <2.0.0'
-environment:
-  sdk: '>=1.8.0 <2.0.0'
-dev_dependencies:
-  test: '>=0.12.0 <0.13.0'
diff --git a/packages/source_span/test/file_test.dart b/packages/source_span/test/file_test.dart
deleted file mode 100644
index 54bc3d3..0000000
--- a/packages/source_span/test/file_test.dart
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/source_span/test/highlight_test.dart b/packages/source_span/test/highlight_test.dart
deleted file mode 100644
index 74faed5..0000000
--- a/packages/source_span/test/highlight_test.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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
-""");
-  });
-
-  test("points to the span in the source", () {
-    expect(file.span(4, 7).highlight(), equals("""
-foo bar baz
-    ^^^"""));
-  });
-
-  test("gracefully handles a missing source URL", () {
-    var span = new SourceFile("foo bar baz").span(4, 7);
-    expect(span.highlight(), equals("""
-foo bar baz
-    ^^^"""));
-  });
-
-  test("highlights the first line of a multiline span", () {
-    expect(file.span(4, 20).highlight(), equals("""
-foo bar baz
-    ^^^^^^^^"""));
-  });
-
-  test("works for a point span", () {
-    expect(file.location(4).pointSpan().highlight(), equals("""
-foo bar baz
-    ^"""));
-  });
-
-  test("works for a point span at the end of a line", () {
-    expect(file.location(11).pointSpan().highlight(), equals("""
-foo bar baz
-           ^"""));
-  });
-
-  test("works for a point span at the end of the file", () {
-    expect(file.location(38).pointSpan().highlight(), equals("""
-zip zap zop
-           ^"""));
-  });
-
-  test("works for a point span at the end of the file with no trailing newline",
-      () {
-    file = new SourceFile("zip zap zop");
-    expect(file.location(11).pointSpan().highlight(), equals("""
-zip zap zop
-           ^"""));
-  });
-
-  test("works for a point span in an empty file", () {
-    expect(new SourceFile("").location(0).pointSpan().highlight(),
-        equals("""
-
-^"""));
-  });
-
-  test("works for a single-line file without a newline", () {
-    expect(new SourceFile("foo bar").span(0, 7).highlight(),
-        equals("""
-foo bar
-^^^^^^^"""));
-  });
-
-  test("emits tabs for tabs", () {
-    expect(new SourceFile(" \t \t\tfoo bar").span(5, 8).highlight(),
-        equals("""
- \t \t\tfoo bar
- \t \t\t^^^"""));
-  });
-
-  test("supports lines of preceding 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.highlight(color: colors.YELLOW), equals("""
-previous
-lines
------${colors.YELLOW}foo bar${colors.NONE}-----
-     ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
-  });
-
-  group("colors", () {
-    test("doesn't colorize if color is false", () {
-      expect(file.span(4, 7).highlight(color: false), equals("""
-foo bar baz
-    ^^^"""));
-    });
-
-    test("colorizes if color is true", () {
-      expect(file.span(4, 7).highlight(color: true), equals("""
-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).highlight(color: colors.YELLOW), equals("""
-foo ${colors.YELLOW}bar${colors.NONE} baz
-    ${colors.YELLOW}^^^${colors.NONE}"""));
-    });
-  });
-}
diff --git a/packages/source_span/test/location_test.dart b/packages/source_span/test/location_test.dart
deleted file mode 100644
index dcd497a..0000000
--- a/packages/source_span/test/location_test.dart
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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/packages/source_span/test/span_test.dart b/packages/source_span/test/span_test.dart
deleted file mode 100644
index f980f30..0000000
--- a/packages/source_span/test/span_test.dart
+++ /dev/null
@@ -1,315 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for 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}"""));
-    });
-
-    test("with context, underlines the right column", () {
-      var spanWithContext = new SourceSpanWithContext(
-          new SourceLocation(5, sourceUrl: "foo.dart"),
-          new SourceLocation(12, sourceUrl: "foo.dart"),
-          "foo bar",
-          "-----foo bar-----");
-
-      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}"""));
-    });
-  });
-
-  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/packages/source_span/test/utils_test.dart b/packages/source_span/test/utils_test.dart
deleted file mode 100644
index 2a86cc0..0000000
--- a/packages/source_span/test/utils_test.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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);
-    });
-  });
-}
diff --git a/packages/utf/.gitignore b/packages/utf/.gitignore
deleted file mode 100644
index 52f0c5b..0000000
--- a/packages/utf/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.packages
-.pub/
-pubspec.lock
diff --git a/packages/utf/.test_config b/packages/utf/.test_config
deleted file mode 100644
index 20d6a22..0000000
--- a/packages/utf/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  test_package: true
-}
diff --git a/packages/utf/.travis.yml b/packages/utf/.travis.yml
deleted file mode 100644
index 16cd8fd..0000000
--- a/packages/utf/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-language: dart
-
-dart:
-  - dev
-
-dart_task:
-  - test
-  - test: --platform firefox -j 1
-  - dartanalyzer: --fatal-infos --fatal-warnings .
-  - dartfmt
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
-  only: [master]
-
-cache:
- directories:
-   - $HOME/.pub-cache
diff --git a/packages/utf/AUTHORS b/packages/utf/AUTHORS
deleted file mode 100644
index e8063a8..0000000
--- a/packages/utf/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-# 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/packages/utf/CHANGELOG.md b/packages/utf/CHANGELOG.md
deleted file mode 100644
index ea482a6..0000000
--- a/packages/utf/CHANGELOG.md
+++ /dev/null
@@ -1,15 +0,0 @@
-## 0.9.0+4
-
-* Updates to support Dart 2.0 core library changes (wave
-  2.2). Package now requires Dart `2.0.0-dev.20.0`.
-  See [issue 31847][sdk#31847] for details.
-
-  [sdk#31847]: https://github.com/dart-lang/sdk/issues/31847
-
-## 0.9.0+3
-
-* Code cleanup.
-
-## 0.9.0+2
-
-* ChangeLog starts here.
diff --git a/packages/utf/CONTRIBUTING.md b/packages/utf/CONTRIBUTING.md
deleted file mode 100644
index 6f5e0ea..0000000
--- a/packages/utf/CONTRIBUTING.md
+++ /dev/null
@@ -1,33 +0,0 @@
-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/packages/utf/LICENSE b/packages/utf/LICENSE
deleted file mode 100644
index de31e1a..0000000
--- a/packages/utf/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/packages/utf/README.md b/packages/utf/README.md
deleted file mode 100644
index 06165e4..0000000
--- a/packages/utf/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Provides common operations for manipulating Unicode sequences.
-
-## Features and bugs
-
-Please file feature requests and bugs at the [issue tracker][tracker].
-
-[tracker]: https://github.com/dart-lang/utf/issues
diff --git a/packages/utf/analysis_options.yaml b/packages/utf/analysis_options.yaml
deleted file mode 100644
index 0c32448..0000000
--- a/packages/utf/analysis_options.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-analyzer:
-  strong-mode:
-    implicit-casts: false
-  errors:
-    dead_code: error
-    override_on_non_overriding_method: error
-    unused_element: error
-    unused_import: error
-    unused_local_variable: error
-linter:
-  rules:
-    #- annotate_overrides
-    - avoid_empty_else
-    - avoid_init_to_null
-    - avoid_return_types_on_setters
-    - await_only_futures
-    - camel_case_types
-    - comment_references
-    - control_flow_in_finally
-    - directives_ordering
-    - empty_catches
-    - empty_constructor_bodies
-    - empty_statements
-    - hash_and_equals
-    - implementation_imports
-    - library_names
-    - library_prefixes
-    - non_constant_identifier_names
-    #- omit_local_variable_types
-    - only_throw_errors
-    - prefer_final_fields
-    - prefer_is_not_empty
-    #- prefer_single_quotes
-    #- slash_for_doc_comments
-    - test_types_in_equals
-    - test_types_in_equals
-    - throw_in_finally
-    - type_init_formals
-    - unrelated_type_equality_checks
-    - valid_regexps
diff --git a/packages/utf/lib/src/constants.dart b/packages/utf/lib/src/constants.dart
deleted file mode 100644
index 3dfea39..0000000
--- a/packages/utf/lib/src/constants.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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/packages/utf/lib/src/list_range.dart b/packages/utf/lib/src/list_range.dart
deleted file mode 100644
index 3f211d8..0000000
--- a/packages/utf/lib/src/list_range.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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<int> {
-  final List<int> _source;
-  final int _offset;
-  final int _length;
-
-  ListRange(List<int> source, [int offset = 0, int 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/packages/utf/lib/src/shared.dart b/packages/utf/lib/src/shared.dart
deleted file mode 100644
index 257def3..0000000
--- a/packages/utf/lib/src/shared.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for 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 'util.dart';
-
-// 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);
-}
diff --git a/packages/utf/lib/src/utf16.dart b/packages/utf/lib/src/utf16.dart
deleted file mode 100644
index 9d63fb0..0000000
--- a/packages/utf/lib/src/utf16.dart
+++ /dev/null
@@ -1,379 +0,0 @@
-// 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;
-
-import "dart:collection";
-
-import 'constants.dart';
-import 'list_range.dart';
-import 'utf_16_code_unit_decoder.dart';
-import 'util.dart';
-
-/**
- * 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;
-
-  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/packages/utf/lib/src/utf32.dart b/packages/utf/lib/src/utf32.dart
deleted file mode 100644
index bf7d341..0000000
--- a/packages/utf/lib/src/utf32.dart
+++ /dev/null
@@ -1,367 +0,0 @@
-// 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;
-
-import "dart:collection";
-
-import 'constants.dart';
-import 'list_range.dart';
-import 'shared.dart';
-
-/**
- * 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;
-
-  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/packages/utf/lib/src/utf8.dart b/packages/utf/lib/src/utf8.dart
deleted file mode 100644
index 970c166..0000000
--- a/packages/utf/lib/src/utf8.dart
+++ /dev/null
@@ -1,284 +0,0 @@
-// 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;
-
-import "dart:collection";
-
-import 'constants.dart';
-import 'list_range.dart';
-import 'shared.dart';
-
-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,
-      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;
-
-  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/packages/utf/lib/src/utf_16_code_unit_decoder.dart b/packages/utf/lib/src/utf_16_code_unit_decoder.dart
deleted file mode 100644
index 28c150e..0000000
--- a/packages/utf/lib/src/utf_16_code_unit_decoder.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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;
-
-  Utf16CodeUnitDecoder(List<int> utf16CodeUnits,
-      [int offset = 0,
-      int length,
-      this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
-      : utf16CodeUnitIterator =
-            (new ListRange(utf16CodeUnits, offset, length)).iterator;
-
-  Utf16CodeUnitDecoder.fromListRangeIterator(
-      this.utf16CodeUnitIterator, 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/packages/utf/lib/src/utf_stream.dart b/packages/utf/lib/src/utf_stream.dart
deleted file mode 100644
index e39a088..0000000
--- a/packages/utf/lib/src/utf_stream.dart
+++ /dev/null
@@ -1,245 +0,0 @@
-// 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 utf.utf_stream;
-
-import 'dart:async';
-
-import 'constants.dart';
-import 'util.dart';
-
-// TODO(floitsch): make this transformer reusable.
-abstract class _StringDecoder extends StreamTransformerBase<List<int>, String>
-    implements EventSink<List<int>> {
-  List<int> _carry;
-  List<int> _buffer;
-  int _replacementChar;
-
-  EventSink<String> _outSink;
-
-  _StringDecoder(this._replacementChar);
-
-  Stream<String> bind(Stream<List<int>> stream) {
-    return new Stream<String>.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 extends StreamTransformerBase<String, List<int>>
-    implements EventSink<String> {
-  EventSink<List<int>> _outSink;
-
-  Stream<List<int>> bind(Stream<String> stream) {
-    return new Stream<List<int>>.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>[];
-    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);
-      }
-    }
-    return bytes;
-  }
-}
diff --git a/packages/utf/lib/src/util.dart b/packages/utf/lib/src/util.dart
deleted file mode 100644
index f94f576..0000000
--- a/packages/utf/lib/src/util.dart
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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/packages/utf/lib/utf.dart b/packages/utf/lib/utf.dart
deleted file mode 100644
index 671e17c..0000000
--- a/packages/utf/lib/utf.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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;
-
-export 'src/constants.dart';
-export 'src/shared.dart';
-export 'src/utf16.dart';
-export 'src/utf32.dart';
-export 'src/utf8.dart';
-export 'src/utf_16_code_unit_decoder.dart';
-export 'src/utf_stream.dart';
diff --git a/packages/utf/pubspec.yaml b/packages/utf/pubspec.yaml
deleted file mode 100644
index 042fb49..0000000
--- a/packages/utf/pubspec.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: utf
-version: 0.9.0+4
-author: Dart Team <misc@dartlang.org>
-description: >
- Provides common operations for manipulating Unicode sequences
-homepage: https://www.github.com/dart-lang/utf
-environment:
-  sdk: '>=2.0.0-dev.20.0 <2.0.0'
-dev_dependencies:
-  test: ^0.12.0
diff --git a/packages/utf/test/expect.dart b/packages/utf/test/expect.dart
deleted file mode 100644
index 236547a..0000000
--- a/packages/utf/test/expect.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-import 'package:test/test.dart' as ut;
-
-void listEquals(Iterable a, b, [String message]) {
-  ut.expect(b, ut.orderedEquals(a), reason: message);
-}
-
-void equals(a, b) {
-  ut.expect(b, ut.equals(a));
-}
-
-void stringEquals(String a, String b, [String message]) {
-  ut.expect(b, ut.equals(a), reason: message);
-}
-
-void isFalse(value) {
-  ut.expect(value, ut.isFalse);
-}
diff --git a/packages/utf/test/unicode_core_test.dart b/packages/utf/test/unicode_core_test.dart
deleted file mode 100755
index c23665f..0000000
--- a/packages/utf/test/unicode_core_test.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// 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:test/test.dart';
-import 'package:utf/utf.dart';
-import 'package:utf/src/util.dart';
-
-import 'expect.dart' as expect;
-
-void main() {
-  test('codepoints to utf16 codepoints', testCodepointsToUtf16CodeUnits);
-  test('utf16 bytes to codepoints', 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/packages/utf/test/utf16_test.dart b/packages/utf/test/utf16_test.dart
deleted file mode 100755
index 3fe3310..0000000
--- a/packages/utf/test/utf16_test.dart
+++ /dev/null
@@ -1,134 +0,0 @@
-// 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:test/test.dart';
-import 'package:utf/utf.dart';
-
-import 'expect.dart' as expect;
-
-const String testKoreanCharSubset = """
-가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
-개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
-갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
-
-const String testHanWater = "水";
-
-const List<int> testKoreanCharSubsetUtf16beBom = const <int>[
-  0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02, // 8
-  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, // 8
-  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() {
-  test('encode to utf16', testEncodeToUtf16);
-  test('utf16 bytes to string', testUtf16BytesToString);
-  test('iterable methods', 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/packages/utf/test/utf32_test.dart b/packages/utf/test/utf32_test.dart
deleted file mode 100755
index e277421..0000000
--- a/packages/utf/test/utf32_test.dart
+++ /dev/null
@@ -1,183 +0,0 @@
-// 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:test/test.dart';
-import 'package:utf/utf.dart';
-
-import 'expect.dart' as expect;
-
-const String testKoreanCharSubset = """
-가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
-개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
-갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
-
-const String testHanTwice = "二";
-
-const List<int> testKoreanCharSubsetUtf32beBom = const <int>[
-  0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00, // 8
-  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, // 8
-  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() {
-  test('utf32 bytes to string', testUtf32BytesToString);
-  test('encode to utf32', testEncodeToUtf32);
-  test('iterable methods', 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/packages/utf/test/utf82_test.dart b/packages/utf/test/utf82_test.dart
deleted file mode 100755
index 9311e45..0000000
--- a/packages/utf/test/utf82_test.dart
+++ /dev/null
@@ -1,466 +0,0 @@
-// 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:test/test.dart';
-import 'package:utf/utf.dart';
-
-import 'expect.dart' as expect;
-
-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, // 8
-  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, // 8
-  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, // 8
-  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, // 8
-  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, // 8
-  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, // 8
-  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() {
-  test('utf8 bytes to codepoints', testUtf8bytesToCodepoints);
-  test('utf8 bytes to string', testUtf8BytesToString);
-  test('encode to utf8', testEncodeToUtf8);
-  test('iterable methods', 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, // 1
-        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/packages/utf/test/utf8_test.dart b/packages/utf/test/utf8_test.dart
deleted file mode 100644
index c1192bc..0000000
--- a/packages/utf/test/utf8_test.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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:test/test.dart';
-import "package:utf/utf.dart";
-
-import 'expect.dart' as expect;
-
-String decode(List<int> bytes) => decodeUtf8(bytes);
-
-void main() {
-  test('Google favorite: "Îñţérñåţîöñåļîžåţîờñ"', () {
-    String string = decode([
-      0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72, // 8
-      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);
-  });
-
-  test('Blueberry porridge in Danish: "blåbærgrød"', () {
-    var string = decode([
-      0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6, 0x72, 0x67, 0x72, // 8
-      0xc3, 0xb8, 0x64
-    ]);
-    expect.stringEquals("blåbærgrød", string);
-  });
-
-  test('"சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.', () {
-    var string = decode([
-      0xe0, 0xae, 0x9a, 0xe0, 0xae, 0xbf, 0xe0, 0xae, 0xb5, 0xe0, // 8
-      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);
-  });
-
-  test('"िसवा अणामालै", that is "Siva Annamalai" in Devanagari', () {
-    var string = decode([
-      0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0, // 8
-      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);
-  });
-
-  test('DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12', () {
-    // UTF-8: F0 90 90 92
-    var 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/packages/utf/test/utf_test.dart b/packages/utf/test/utf_test.dart
deleted file mode 100644
index d86a383..0000000
--- a/packages/utf/test/utf_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// 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:test/test.dart';
-import "package:utf/utf.dart";
-
-import "expect.dart" as expect;
-
-main() {
-  test('utf', () {
-    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/pubspec.yaml b/pubspec.yaml
index 71d17d9..f47445c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -9,4 +9,3 @@
   charted: ^0.4.8
   unittest: < 0.12.0
   usage: ^1.2.0
-  dart_to_js_script_rewriter: 1.0.3