Version 1.3.0-dev.4.0

svn merge -r 33322:33684 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@33685 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/AUTHORS b/AUTHORS
index 49c312f..f89a112 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -27,3 +27,4 @@
 Nikolaus Graf <nik@blossom.io>
 Alexandre Ardhuin <alexandre.ardhuin@gmail.com>
 Victor Berchet <victor.berchet@gmail.com>
+Roel Spilker <r.spilker@gmail.com>
\ No newline at end of file
diff --git a/WATCHLISTS b/WATCHLISTS
index 16951ab..12432f9 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -13,11 +13,15 @@
     'tools': {
       'filepath': 'tools/',
     },
+    'observatory': {
+      'filepath': 'runtime/bin/vmservice/',
+    },
   },
 
   'WATCHLISTS': {
     'runtime': ['vm-dev@dartlang.org'],
     'tools': ['ricow@google.com'],
+    'observatory': ['johnmccutchan@google.com', 'turnidge@google.com'],
   },
 }
 
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 094a9e3..aab4b20 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -24,13 +24,13 @@
 \label{licensing}
 
 
-Except as otherwise noted at http://code.google.com/policies.html\#restrictions, the content of this document is licensed under the Creative Commons Attribution 3.0 License available at:
+Except as otherwise noted at https://developers.google.com/site-policies, the content of this document is licensed under the Creative Commons Attribution 3.0 License available at:
 
   http://creativecommons.org/licenses/by/3.0/
   
-  and code samples are licensed under the BSD license available at
+  and code samples are licensed under the license available at
   
-  http://code.google.com/google\_bsd\_license.html.
+  https://code.google.com/p/dart/source/browse/trunk/dart/LICENSE.
   
 \section{Notation}
 \label{notation}
@@ -920,7 +920,7 @@
 \subsection{Abstract Instance Members}
 \label{abstractInstanceMembers}
 
-An {\em abstract method} (respectively, {\em abstract getter} or {\em abstract setter)} is an instance method, getter or setter that is not declared \EXTERNAL{} and does not  provide an implementation. An {\em concrete method} (respectively, {\em concrete getter} or {\em concrete setter)} is an instance method, getter or setter that is not abstract.
+An {\em abstract method} (respectively, {\em abstract getter} or {\em abstract setter)} is an instance method, getter or setter that is not declared \EXTERNAL{} and does not  provide an implementation. A {\em concrete method} (respectively, {\em concrete getter} or {\em concrete setter)} is an instance method, getter or setter that is not abstract.
 %The declaration of an abstract method is prefixed by the built-in identifier (\ref{identifierReference}) \ABSTRACT{}.
 
 \rationale{
@@ -1595,7 +1595,7 @@
 It is a compile-time error if the interface of a class $C$ is a superinterface of itself.
 
 Let $C$ be a concrete class that does not declare its own \code{noSuchMethod()} method.
-It is a static warning if the implicit interface of  $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding instance member $m$ of type $F'$ such that $F' <: F$. 
+It is a static warning if the implicit interface of  $C$ includes an instance member $m$ of type $F$ and $C$ does not declare or inherit a corresponding non-abstract instance member $m$ of type $F'$ such that $F' <: F$. 
 
 \commentary{A class does not inherit members from its superinterfaces. However, its implicit interface does.
 }
@@ -3180,8 +3180,8 @@
 \commentary{Notice that the wording carefully avoids re-evaluating the receiver $o$ and the arguments $a_i$. }
 
 Let $T$ be the  static type of $o$. It is a static type warning if $T$ does not have an accessible  (\ref{privacy}) instance member named $m$ unless $T$ or a superinterface of $T$ is annotated with an annotation denoting a constant identical to the constant \code{@proxy} defined in \code{dart:core}.   If $T.m$ exists, it  is a static type warning if the type $F$ of $T.m$ may not be assigned to a function type. If $T.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}; otherwise the static type of $i$ is the declared return type of  $F$.  
-%\item Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \to \bot$.
-%\end{itemize}
+% The following is not needed because it is specified in 'Binding Actuals to Formals" Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \to \bot$.
+
 
 
 %\subsubsection{This Invocation}
@@ -3240,8 +3240,8 @@
 
 It is a static type warning if the type $F$ of $C.m$ may not be assigned to a function type.  If $F$ is not a function type, or if $C.m$ does not exist, the static type of $i$ is \DYNAMIC{}. Otherwise 
 the static type of $i$ is the declared return type of  $F$.  
-%\item Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, T_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \to \bot$.
-%\end{itemize}
+% The following is not needed because it is specified in 'Binding Actuals to Formals"Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, T_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \to \bot$.
+
  
 
 
@@ -3276,8 +3276,9 @@
 It is a compile-time error if a super method invocation occurs in a top-level function or variable initializer, in an instance variable initializer or initializer list, in class \code{Object}, in a factory constructor or in a static method or variable initializer.
 
 It is a static type warning if $S$ does not have an accessible (\ref{privacy}) instance member named $m$ unless $S$ or a superinterface of $S$ is annotated with an annotation denoting a constant identical to the constant \code{@proxy} defined in \code{dart:core}. If $S.m$ exists, it  is a static type warning if the type $F$ of $S.m$ may not be assigned to a function type. If $S.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}; otherwise the static type of $i$ is the declared return type of  $F$.  
-%\item Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, t_n, [T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}]) \to \bot$.
-%\end{itemize}
+% The following is not needed because it is specified in 'Binding Actuals to Formals"
+%Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning if $F$ is not a supertype of  $(T_1, \ldots, t_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_{n+k}$ $x_{n+k}\}) \to \bot$.
+
 
 
 
@@ -3951,7 +3952,7 @@
 \item If $d$ is a static method, top-level function or local function then $e$ evaluates to the function defined by $d$.
 \item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, then $e$ is equivalent to the getter invocation (\ref{getterInvocation}) $C.id$. 
 \item If $d$ is the declaration of a library variable, top-level getter or top-level setter, then $e$ is equivalent to the getter invocation $id$. 
-\item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter,  or setter) or variable initializer, evaluation of $e$ causes a\code{NoSuchMethod} to be thrown.
+\item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter,  or setter) or variable initializer, evaluation of $e$ causes a \code{NoSuchMethod} to be thrown.
 \item Otherwise, $e$ is equivalent to the property extraction (\ref{propertyExtraction}) \THIS{}.$id$.
 % This implies that referring to an undefined static getter by simple name is an error, whereas doing so by qualified name is only a warning. Same with assignments.  Revise?
 \end{itemize}
@@ -3961,9 +3962,9 @@
 \begin{itemize}
 \item If $d$ is a class, type alias or type parameter the static type of $e$ is \code{Type}.
 \item If $d$ is a local variable or formal parameter the static type of $e$ is the type of the variable $id$, unless $id$ is known to have some type $T$, in which case the static type of $e$ is $T$, provided that $T$ is more specific than any other type $S$ such that $v$ is known to have type $S$. 
-\item If $d$ is a static method, top-level function or local function the static type of $e$ the function type defined by $d$.
-\item If $d$ is the declaration of a static variable or static getter declared in class $C$, the static type of $e$ the static type of the getter invocation (\ref{getterInvocation}) $C.id$.
-\item If $d$ is the declaration of a library variable or top-level getter, the static type of $e$  is the static type of the getter invocation $id$. 
+\item If $d$ is a static method, top-level function or local function the static type of $e$ is the function type defined by $d$.
+\item If $d$ is the declaration of a static variable, static getter or static setter declared in class $C$, the static type of $e$ is the static type of the getter invocation (\ref{getterInvocation}) $C.id$.
+\item If $d$ is the declaration of a library variable, top-level getter or top-level setter, the static type of $e$  is the static type of the getter invocation $id$. 
 \item Otherwise, if $e$ occurs inside a top level or static function (be it function, method, getter,  or setter) or variable initializer, the static type of $e$ is \DYNAMIC{}.
 \item Otherwise, the static type of $e$ is the type of the property extraction (\ref{propertyExtraction}) \THIS{}.$id$.
 \end{itemize}
diff --git a/pkg/analysis_server/bin/dartdeps.dart b/pkg/analysis_server/bin/dartdeps.dart
index 15ea8c1..9282844 100644
--- a/pkg/analysis_server/bin/dartdeps.dart
+++ b/pkg/analysis_server/bin/dartdeps.dart
@@ -33,6 +33,11 @@
   static const BINARY_NAME = 'dartdeps';
 
   /**
+   * The name of the option used to specify the Dart SDK.
+   */
+  static const String DART_SDK_OPTION = 'dart-sdk';
+
+  /**
    * The name of the option used to print usage information.
    */
   static const String HELP_OPTION = 'help';
@@ -48,6 +53,11 @@
   final List<String> args;
 
   /**
+   * The path to the Dart SDK used during analysis.
+   */
+  String sdkPath;
+
+  /**
    * The manager for the analysis server.
    */
   AnalysisManager manager;
@@ -69,6 +79,9 @@
    */
   Future<AnalysisManager> start() {
     var parser = new ArgParser();
+    parser.addOption(
+        DART_SDK_OPTION,
+        help: '[sdkPath] path to Dart SDK');
     parser.addFlag(HELP_OPTION,
         help: 'print this help message without starting analysis',
         defaultsTo: false,
@@ -92,6 +105,18 @@
       printUsage(parser);
       return null;
     }
+    sdkPath = results[DART_SDK_OPTION];
+    if (sdkPath is! String) {
+      print('Missing path to Dart SDK');
+      printUsage(parser);
+      return null;
+    }
+    Directory sdkDir = new Directory(sdkPath);
+    if (!sdkDir.existsSync()) {
+      print('Specified Dart SDK does not exist: $sdkPath');
+      printUsage(parser);
+      return null;
+    }
     if (results.rest.length == 0) {
       printUsage(parser);
       exitCode = 1;
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ff2dad6..afd6aff 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -136,8 +136,8 @@
     if (contextWorkQueue.isEmpty) {
       running = false;
     } else {
-      new Future(performTask).catchError((exception, stackTrace) {
-        AnalysisEngine.instance.logger.logError3(exception);
+      new Future(performTask).catchError((ex, st) {
+        AnalysisEngine.instance.logger.logError("${ex}\n${st}");
       });
     }
   }
@@ -162,8 +162,8 @@
   void run() {
     if (!running) {
       running = true;
-      Timer.run(() {
-        performTask();
+      new Future(performTask).catchError((exception, stackTrace) {
+        AnalysisEngine.instance.logger.logError(exception);
       });
     }
   }
diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart
index 6e7c6fc..acadd6f 100644
--- a/pkg/analysis_server/lib/src/domain_context.dart
+++ b/pkg/analysis_server/lib/src/domain_context.dart
@@ -126,7 +126,7 @@
    */
   ChangeSet createChangeSet(Map<String, Object> jsonData) {
     // TODO(brianwilkerson) Implement this.
-    return null;
+    return new ChangeSet();
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 3924d1a..40b0205 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -117,7 +117,7 @@
       return new Response(request.id, new RequestError(
           RequestError.CODE_SDK_ERROR, 'Failed to access sdk: $e'));
     }
-    context.sourceFactory = new SourceFactory.con2([
+    context.sourceFactory = new SourceFactory([
       new DartUriResolver(sdk),
       new FileUriResolver(),
       // new PackageUriResolver(),
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 889f1f5..e08a525 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -4,9 +4,9 @@
 description: An HTTP server that performs analysis of Dart code via web sockets.
 homepage: http://www.dartlang.org
 environment:
-  sdk: ">=1.0.0 <2.0.0"
+  sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: any
+  analyzer: 0.13.0-dev.6
   args: any
   logging: any
 dev_dependencies:
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
new file mode 100644
index 0000000..d0ebe75
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.analysis_server;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/matcher.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main(List<String> args) {
+  group('AnalysisServer', () {
+    setUp(AnalysisServerTest.setUp);
+//    test('createContext', AnalysisServerTest.createContext);
+    test('echo', AnalysisServerTest.echo);
+    test('shutdown', AnalysisServerTest.shutdown);
+    test('unknownRequest', AnalysisServerTest.unknownRequest);
+  });
+}
+
+class AnalysisServerTest {
+  static MockServerChannel channel;
+  static AnalysisServer server;
+
+  static void setUp() {
+    channel = new MockServerChannel();
+    server = new AnalysisServer(channel);
+  }
+
+  static Future createContext() {
+    server.handlers = [new ServerDomainHandler(server)];
+    var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
+    return channel.sendRequest(request)
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('my27'));
+          expect(response.error, isNull);
+          var contextId = response.result[ServerDomainHandler.CONTEXT_ID_RESULT];
+          expect(contextId is String, isTrue);
+        });
+  }
+
+  static Future echo() {
+    server.handlers = [new EchoHandler()];
+    var request = new Request('my22', 'echo');
+    return channel.sendRequest(request)
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('my22'));
+          expect(response.error, isNull);
+        });
+  }
+
+  static Future shutdown() {
+    server.handlers = [new ServerDomainHandler(server)];
+    var request = new Request('my28', ServerDomainHandler.SHUTDOWN_METHOD);
+    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, '');
+    return channel.sendRequest(request)
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('my28'));
+          expect(response.error, isNull);
+        });
+  }
+
+  static Future unknownRequest() {
+    server.handlers = [new EchoHandler()];
+    var request = new Request('my22', 'randomRequest');
+    return channel.sendRequest(request)
+        .timeout(new Duration(seconds: 1))
+        .then((Response response) {
+          expect(response.id, equals('my22'));
+          expect(response.error, isNotNull);
+        });
+  }
+}
+
+
+class EchoHandler implements RequestHandler {
+  @override
+  Response handleRequest(Request request) {
+    if (request.method == 'echo') {
+      var response = new Response(request.id);
+      response.setResult('echo', true);
+      return response;
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/test/channel_test.dart b/pkg/analysis_server/test/channel_test.dart
index 9658269..95a34b7 100644
--- a/pkg/analysis_server/test/channel_test.dart
+++ b/pkg/analysis_server/test/channel_test.dart
@@ -61,20 +61,20 @@
   }
 
   static Future invalidJsonToClient() {
-    socket.twin.add('{"foo":"bar"}');
-    server.sendResponse(new Response('myId'));
-    return client.responseStream
+    var result = client.responseStream
         .first
         .timeout(new Duration(seconds: 1))
         .then((Response response) {
           expect(response.id, equals('myId'));
           expectMsgCount(responseCount: 1);
         });
+    socket.twin.add('{"foo":"bar"}');
+    server.sendResponse(new Response('myId'));
+    return result;
   }
 
   static Future invalidJsonToServer() {
-    socket.add('"blat"');
-    return client.responseStream
+    var result = client.responseStream
         .first
         .timeout(new Duration(seconds: 1))
         .then((Response response) {
@@ -82,31 +82,34 @@
           expect(response.error, isNotNull);
           expectMsgCount(responseCount: 1);
         });
+    socket.add('"blat"');
+    return result;
   }
 
   static Future notification() {
-    server.sendNotification(new Notification('myEvent'));
-    return client.notificationStream
+    var result = client.notificationStream
         .first
         .timeout(new Duration(seconds: 1))
         .then((Notification notification) {
           expect(notification.event, equals('myEvent'));
           expectMsgCount(notificationCount: 1);
-
           expect(notificationsReceived.first, equals(notification));
         });
+    server.sendNotification(new Notification('myEvent'));
+    return result;
   }
 
   static Future notificationAndResponse() {
-    server
-        ..sendNotification(new Notification('myEvent'))
-        ..sendResponse(new Response('myId'));
-    return Future
+    var result = Future
         .wait([
           client.notificationStream.first,
           client.responseStream.first])
         .timeout(new Duration(seconds: 1))
         .then((_) => expectMsgCount(responseCount: 1, notificationCount: 1));
+    server
+        ..sendNotification(new Notification('myEvent'))
+        ..sendResponse(new Response('myId'));
+    return result;
   }
 
   static void request() {
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
new file mode 100644
index 0000000..953f8eb
--- /dev/null
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.context;
+
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_context.dart';
+import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/matcher.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('ContextDomainHandlerTest', () {
+    test('applyChanges', ContextDomainHandlerTest.applyChanges);
+    test('setOptions', ContextDomainHandlerTest.setOptions);
+    test('setPrioritySources_empty', ContextDomainHandlerTest.setPrioritySources_empty);
+    test('setPrioritySources_nonEmpty', ContextDomainHandlerTest.setPrioritySources_nonEmpty);
+  });
+}
+
+class ContextDomainHandlerTest {
+  static void applyChanges() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    String contextId = _createContext(server);
+    ChangeSet changeSet = new ChangeSet();
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+
+    Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
+    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+    // TODO (danrubel) convert ChangeSet to Map
+//    request.setParameter(ContextDomainHandler.CHANGES_PARAM, changeSet);
+    request.setParameter(ContextDomainHandler.CHANGES_PARAM, new Map());
+    Response response = handler.handleRequest(request);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+  }
+
+  static void setOptions() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    String contextId = _createContext(server);
+    Map<String, Object> options = new Map<String, Object>();
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+
+    Request request = new Request('0', ContextDomainHandler.SET_OPTIONS_NAME);
+    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+    request.setParameter(ContextDomainHandler.OPTIONS_PARAM, options);
+    Response response = handler.handleRequest(request);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+  }
+
+  static void setPrioritySources_empty() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    String contextId = _createContext(server);
+    List<String> sources = new List<String>();
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+
+    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
+    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
+    Response response = handler.handleRequest(request);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+  }
+
+  static void setPrioritySources_nonEmpty() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    String contextId = _createContext(server);
+    List<String> sources = new List<String>();
+    sources.add("foo.dart");
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+
+    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
+    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
+    Response response = handler.handleRequest(request);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+  }
+
+  static String _createContext(AnalysisServer server) {
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+    Request request = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
+    Response response = handler.handleRequest(request);
+    if (response.error != null) {
+      fail('Unexpected error: ${response.error.toJson()}');
+    }
+    expect(response.error, isNull);
+    return response.getResult(ServerDomainHandler.CONTEXT_ID_RESULT);
+  }
+}
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
new file mode 100644
index 0000000..b1e3d23
--- /dev/null
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.server;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/matcher.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('ServerDomainHandler', () {
+//    test('createContext', ServerDomainHandlerTest.createContext);
+//    test('deleteContext_alreadyDeleted', ServerDomainHandlerTest.deleteContext_alreadyDeleted);
+    test('deleteContext_doesNotExist', ServerDomainHandlerTest.deleteContext_doesNotExist);
+//    test('deleteContext_existing', ServerDomainHandlerTest.deleteContext_existing);
+    test('shutdown', ServerDomainHandlerTest.shutdown);
+    test('version', ServerDomainHandlerTest.version);
+  });
+}
+
+class ServerDomainHandlerTest {
+  static void createContext() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
+    Response response = handler.handleRequest(createRequest);
+    String contextId = response.getResult(ServerDomainHandler.CONTEXT_ID_RESULT);
+    expect(contextId, isNotNull);
+  }
+
+  static void deleteContext_alreadyDeleted() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, '');
+    Response response = handler.handleRequest(createRequest);
+    String contextId = response.getResult(ServerDomainHandler.CONTEXT_ID_RESULT);
+
+    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
+    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    response = handler.handleRequest(deleteRequest);
+    response = handler.handleRequest(deleteRequest);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: 'Context does not exist'
+    }));
+  }
+
+  static void deleteContext_doesNotExist() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
+    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, 'xyzzy');
+    Response response = handler.handleRequest(deleteRequest);
+    expect(response.id, equals('0'));
+    expect(response.error, isNotNull);
+  }
+
+  static void deleteContext_existing() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, '');
+    Response response = handler.createContext(createRequest);
+    String contextId = response.getResult(ServerDomainHandler.CONTEXT_ID_RESULT);
+
+    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
+    deleteRequest.setParameter(ServerDomainHandler.CONTEXT_ID_PARAM, contextId);
+    response = handler.handleRequest(deleteRequest);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+  }
+
+  static void shutdown() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    expect(server.running, isTrue);
+    Request shutdownRequest = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
+    Response response = handler.handleRequest(shutdownRequest);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null
+    }));
+    expect(server.running, isFalse);
+  }
+
+  static void version() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    ServerDomainHandler handler = new ServerDomainHandler(server);
+
+    Request versionRequest = new Request('0', ServerDomainHandler.VERSION_METHOD);
+    Response response = handler.handleRequest(versionRequest);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: null,
+      Response.RESULT: {
+        ServerDomainHandler.VERSION_RESULT: '0.0.1'
+      }
+    }));
+  }
+}
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 7b898cb..d9cfbcc 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -7,11 +7,31 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/channel.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/matcher.dart';
+
+/**
+ * Answer the absolute path the the SDK relative to the currently running
+ * script or throw an exception if it cannot be found.
+ */
+String get sdkPath {
+  Uri sdkUri = Platform.script.resolve('../../../sdk/');
+
+  // Verify the directory exists
+  Directory sdkDir = new Directory.fromUri(sdkUri);
+  if (!sdkDir.existsSync()) {
+    throw 'Specified Dart SDK does not exist: $sdkDir';
+  }
+
+  return sdkDir.path;
+}
+
 /**
  * A mock [WebSocket] for testing.
  */
 class MockSocket<T> implements WebSocket {
-
   StreamController controller = new StreamController();
   MockSocket twin;
   Stream stream;
@@ -46,3 +66,50 @@
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+/**
+ * A mock [ServerCommunicationChannel] for testing [AnalysisServer].
+ */
+class MockServerChannel implements ServerCommunicationChannel {
+  StreamController<Request> requestController = new StreamController<Request>();
+  StreamController<Response> responseController = new StreamController<Response>();
+  StreamController<Notification> notificationController = new StreamController<Notification>();
+
+  List<Response> responsesReceived = [];
+  List<Notification> notificationsReceived = [];
+
+  MockServerChannel() {
+  }
+
+  @override
+  void listen(void onRequest(Request request), {void onError(), void onDone()}) {
+    requestController.stream.listen(onRequest, onError: onError, onDone: onDone);
+  }
+
+  @override
+  void sendNotification(Notification notification) {
+    notificationsReceived.add(notification);
+    // Wrap send notification in future to simulate websocket
+    new Future(() => notificationController.add(notification));
+  }
+
+  /// Simulate request/response pair
+  Future<Response> sendRequest(Request request) {
+    var id = request.id;
+    // Wrap send request in future to simulate websocket
+    new Future(() => requestController.add(request));
+    return responseController.stream.firstWhere((response) => response.id == id);
+  }
+
+  @override
+  void sendResponse(Response response) {
+    responsesReceived.add(response);
+    // Wrap send response in future to simulate websocket
+    new Future(() => responseController.add(response));
+  }
+
+  void expectMsgCount({responseCount: 0, notificationCount: 0}) {
+    expect(responsesReceived, hasLength(responseCount));
+    expect(notificationsReceived, hasLength(notificationCount));
+  }
+}
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index 3908fb5..9079b82 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -11,52 +11,26 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analyzer/src/analyzer_impl.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/java_core.dart' show JavaSystem, instanceOfTimer;
+import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
 import 'package:analyzer/options.dart';
 
-import 'package:analyzer/src/analyzer_impl.dart';
-import 'package:analyzer/src/error_formatter.dart';
-
 void main(args) {
-  var options = CommandLineOptions.parse(args);
+  CommandLineOptions options = CommandLineOptions.parse(args);
   if (options.shouldBatch) {
     BatchRunner.runAsBatch(args, (List<String> args) {
-      var options = CommandLineOptions.parse(args);
-      return _runAnalyzer(options);
+      CommandLineOptions options = CommandLineOptions.parse(args);
+      _runAnalyzer(options);
     });
   } else {
-    int startTime = JavaSystem.currentTimeMillis();
-
-    ErrorSeverity result = _runAnalyzer(options);
-
-    if (options.perf) {
-      int totalTime = JavaSystem.currentTimeMillis() - startTime;
-      int ioTime = PerformanceStatistics.io.result;
-      int scanTime = PerformanceStatistics.scan.result;
-      int parseTime = PerformanceStatistics.parse.result;
-      int resolveTime = PerformanceStatistics.resolve.result;
-      int errorsTime = PerformanceStatistics.errors.result;
-      int hintsTime = PerformanceStatistics.hints.result;
-      int angularTime = PerformanceStatistics.angular.result;
-      print("io:$ioTime");
-      print("scan:$scanTime");
-      print("parse:$parseTime");
-      print("resolve:$resolveTime");
-      print("errors:$errorsTime");
-      print("hints:$hintsTime");
-      print("angular:$angularTime");
-      print("other:${totalTime
-        - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
-           + angularTime)}");
-      print("total:$totalTime");
-    }
-    exitCode = result.ordinal;
+    _runAnalyzer(options);
   }
 }
 
-ErrorSeverity _runAnalyzer(CommandLineOptions options) {
+void _runAnalyzer(CommandLineOptions options) {
+  int startTime = JavaSystem.currentTimeMillis();
   if (!options.machineFormat) {
     stdout.writeln("Analyzing ${options.sourceFiles}...");
   }
@@ -66,25 +40,18 @@
   // check that file exists
   if (!new File(sourcePath).existsSync()) {
     print('File not found: $sourcePath');
-    return ErrorSeverity.ERROR;
+    exitCode = ErrorSeverity.ERROR.ordinal;
+    return;
   }
   // check that file is Dart file
   if (!AnalysisEngine.isDartFileName(sourcePath)) {
     print('$sourcePath is not a Dart file');
-    return ErrorSeverity.ERROR;
+    exitCode = ErrorSeverity.ERROR.ordinal;
+    return;
   }
   // do analyze
-  ErrorFormatter formatter = new ErrorFormatter(options.machineFormat ? stderr : stdout, options);
-  AnalyzerImpl analyzer = new AnalyzerImpl(options);
-  analyzer.analyze(sourcePath);
-  // print errors
-  formatter.formatErrors(analyzer.errorInfos);
-  // prepare status
-  ErrorSeverity status = analyzer.maxErrorSeverity;
-  if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
-    status = ErrorSeverity.ERROR;
-  }
-  return status;
+  AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
+  analyzer.analyze();
 }
 
 typedef ErrorSeverity BatchRunnerHandler(List<String> args);
diff --git a/pkg/analyzer/bin/formatter.dart b/pkg/analyzer/bin/formatter.dart
index 400b309..c4c689e 100755
--- a/pkg/analyzer/bin/formatter.dart
+++ b/pkg/analyzer/bin/formatter.dart
@@ -34,6 +34,7 @@
 const SELECTION_FLAG = 'selection';
 const TRANSFORM_FLAG = 'transform';
 const MAX_LINE_FLAG = 'max_line_length';
+const INDENT_FLAG = 'indent';
 
 
 const FOLLOW_LINKS = false;
@@ -61,11 +62,29 @@
   machineFormat = options[MACHINE_FLAG];
   overwriteFileContents = options[WRITE_FLAG];
   selection = _parseSelection(options[SELECTION_FLAG]);
-  formatterSettings =
-      new FormatterOptions(codeTransforms: options[TRANSFORM_FLAG],
-          pageWidth: _parseLineLength(options[MAX_LINE_FLAG]));
+  formatterSettings = new FormatterOptions(
+      codeTransforms: options[TRANSFORM_FLAG],
+      tabsForIndent: _parseTabsForIndent(options[INDENT_FLAG]),
+      spacesPerIndent: _parseSpacesPerIndent(options[INDENT_FLAG]),
+      pageWidth: _parseLineLength(options[MAX_LINE_FLAG]));
 }
 
+/// Translate the indent option into spaces per indent.
+int _parseSpacesPerIndent(String indentOption) {
+  if (indentOption == 'tab') {
+    return 1;
+  }
+  int spacesPerIndent = _toInt(indentOption);
+  if (spacesPerIndent == null) {
+    throw new FormatterException('Indentation is specified as an Integer or '
+        'the value "tab".');
+  }
+  return spacesPerIndent;
+}
+
+/// Translate the indent option into tabs for indent.
+bool _parseTabsForIndent(String indentOption) => indentOption == 'tab';
+
 CodeKind _parseKind(kindOption) {
   switch(kindOption) {
     case 'stmt' :
@@ -176,6 +195,10 @@
   parser.addOption(MAX_LINE_FLAG, abbr: 'l', defaultsTo: '80',
       help: 'Wrap lines longer than this length. '
             'To never wrap, specify "Infinity" or "Inf" for short.');
+  parser.addOption(INDENT_FLAG, abbr: 'i', defaultsTo: '2',
+      help: 'Specify number of spaces per indentation. '
+            'To indent using tabs, specify "--$INDENT_FLAG tab".'
+            '--- [PROVISIONAL API].', hide: true);
   parser.addOption(KIND_FLAG, abbr: 'k', defaultsTo: 'cu',
       help: 'Specify source snippet kind ("stmt" or "cu") '
             '--- [PROVISIONAL API].', hide: true);
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index bdb58f0..3aa4dd3 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -51,6 +51,9 @@
   /** The source files to analyze */
   final List<String> sourceFiles;
 
+  /** Whether to log additional analysis messages and exceptions */
+  final bool log;
+
   /**
    * Initialize options from the given parsed [args].
    */
@@ -66,6 +69,7 @@
       warningsAreFatal = args['fatal-warnings'],
       dartSdkPath = args['dart-sdk'],
       packageRootPath = args['package-root'],
+      log = args['log'],
       sourceFiles = args.rest;
 
   /**
@@ -128,7 +132,9 @@
       ..addFlag('show-sdk-warnings', help: 'Show warnings from SDK imports (deprecated)',
           defaultsTo: false, negatable: false)
       ..addFlag('help', abbr: 'h', help: 'Display this help message',
-          defaultsTo: false, negatable: false);
+          defaultsTo: false, negatable: false)
+      ..addFlag('log', help: 'Log additional messages and exceptions',
+        defaultsTo: false, negatable: false, hide: true);
 
     try {
       // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
@@ -206,10 +212,10 @@
    * See [ArgParser.addFlag()].
    */
   void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
-      bool negatable: true, void callback(bool value)}) {
+      bool negatable: true, void callback(bool value), bool hide: false}) {
     _knownFlags.add(name);
     _parser.addFlag(name, abbr: abbr, help: help, defaultsTo: defaultsTo,
-        negatable: negatable, callback: callback);
+        negatable: negatable, callback: callback, hide: hide);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index a2b1151..69685d2 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -4,6 +4,8 @@
 
 library analyzer_impl;
 
+import 'dart:async';
+
 import 'dart:io';
 
 import 'package:path/path.dart' as pathos;
@@ -14,16 +16,24 @@
 import 'generated/source_io.dart';
 import 'generated/sdk.dart';
 import 'generated/sdk_io.dart';
-import 'generated/ast.dart';
 import 'generated/element.dart';
 import '../options.dart';
 
+import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
+import 'package:analyzer/src/error_formatter.dart';
+
+/**
+ * The maximum number of sources for which AST structures should be kept in the cache.
+ */
+const int _MAX_CACHE_SIZE = 512;
 
 DartSdk sdk;
 
 /// Analyzes single library [File].
 class AnalyzerImpl {
+  final String sourcePath;
   final CommandLineOptions options;
+  final int startTime;
 
   ContentCache contentCache = new ContentCache();
   SourceFactory sourceFactory;
@@ -35,7 +45,7 @@
   /// All [AnalysisErrorInfo]s in the analyzed library.
   final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
 
-  AnalyzerImpl(CommandLineOptions this.options) {
+  AnalyzerImpl(this.sourcePath, this.options, this.startTime) {
     if (sdk == null) {
       sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
     }
@@ -44,35 +54,79 @@
   /**
    * Treats the [sourcePath] as the top level library and analyzes it.
    */
-  void analyze(String sourcePath) {
+  void analyze() {
     sources.clear();
     errorInfos.clear();
     if (sourcePath == null) {
       throw new ArgumentError("sourcePath cannot be null");
     }
-    var sourceFile = new JavaFile(sourcePath);
-    var uriKind = getUriKind(sourceFile);
-    var librarySource = new FileBasedSource.con2(sourceFile, uriKind);
+    JavaFile sourceFile = new JavaFile(sourcePath);
+    UriKind uriKind = getUriKind(sourceFile);
+    Source librarySource = new FileBasedSource.con2(sourceFile, uriKind);
+
     // prepare context
-    prepareAnalysisContext(sourceFile);
-    // don't try to analyzer parts
-    var unit = context.parseCompilationUnit(librarySource);
-    var hasLibraryDirective = false;
-    var hasPartOfDirective = false;
-    for (var directive in unit.directives) {
-      if (directive is LibraryDirective) hasLibraryDirective = true;
-      if (directive is PartOfDirective) hasPartOfDirective = true;
-    }
-    if (hasPartOfDirective && !hasLibraryDirective) {
-      print("Only libraries can be analyzed.");
-      print("$sourceFile is a part and can not be analyzed.");
-      return;
-    }
-    // resolve library
-    var libraryElement = context.computeLibraryElement(librarySource);
-    // prepare source and errors
-    prepareSources(libraryElement);
-    prepareErrors();
+    prepareAnalysisContext(sourceFile, librarySource);
+
+    // async perform all tasks in context
+   _analyze();
+  }
+
+  void _analyze() {
+    new Future(context.performAnalysisTask).then((AnalysisResult result) {
+      List<ChangeNotice> notices = result.changeNotices;
+      // TODO(jwren) change 'notices != null' to 'result.hasMoreWork()' after
+      // next dart translation is landed for the analyzer
+      if (notices != null) {
+        // There is more work, record the set of sources, and then call self
+        // again to perform next task
+        for (ChangeNotice notice in notices) {
+          sources.add(notice.source);
+        }
+        return _analyze();
+      }
+      //
+      // There are not any more tasks, set error code and print performance
+      // numbers.
+      //
+      // prepare errors
+      prepareErrors();
+
+      // compute max severity and set exitCode
+      ErrorSeverity status = maxErrorSeverity;
+      if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
+        status = ErrorSeverity.ERROR;
+      }
+      exitCode = status.ordinal;
+
+      // print errors
+      ErrorFormatter formatter = new ErrorFormatter(stdout, options);
+      formatter.formatErrors(errorInfos);
+
+      // print performance numbers
+      if (options.perf) {
+        int totalTime = JavaSystem.currentTimeMillis() - startTime;
+        int ioTime = PerformanceStatistics.io.result;
+        int scanTime = PerformanceStatistics.scan.result;
+        int parseTime = PerformanceStatistics.parse.result;
+        int resolveTime = PerformanceStatistics.resolve.result;
+        int errorsTime = PerformanceStatistics.errors.result;
+        int hintsTime = PerformanceStatistics.hints.result;
+        int angularTime = PerformanceStatistics.angular.result;
+        stdout.writeln("io:$ioTime");
+        stdout.writeln("scan:$scanTime");
+        stdout.writeln("parse:$parseTime");
+        stdout.writeln("resolve:$resolveTime");
+        stdout.writeln("errors:$errorsTime");
+        stdout.writeln("hints:$hintsTime");
+        stdout.writeln("angular:$angularTime");
+        stdout.writeln("other:${totalTime
+             - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
+             + angularTime)}");
+        stdout.writeln("total:$totalTime");
+      }
+    }).catchError((ex, st) {
+      AnalysisEngine.instance.logger.logError("${ex}\n${st}");
+    });
   }
 
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
@@ -87,7 +141,7 @@
     return status;
   }
 
-  void prepareAnalysisContext(JavaFile sourceFile) {
+  void prepareAnalysisContext(JavaFile sourceFile, Source source) {
     List<UriResolver> resolvers = [new DartUriResolver(sdk), new FileUriResolver()];
     // may be add package resolver
     {
@@ -104,19 +158,19 @@
     sourceFactory = new SourceFactory(resolvers);
     context = AnalysisEngine.instance.createAnalysisContext();
     context.sourceFactory = sourceFactory;
+    // Uncomment the following to have errors reported on stdout and stderr
+    AnalysisEngine.instance.logger = new StdLogger(options.log);
 
     // set options for context
     AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
-    contextOptions.cacheSize = 256;
+    contextOptions.cacheSize = _MAX_CACHE_SIZE;
     contextOptions.hint = !options.disableHints;
     context.analysisOptions = contextOptions;
-  }
 
-  /// Fills [sources].
-  void prepareSources(LibraryElement library) {
-    var units = new Set<CompilationUnitElement>();
-    var libraries = new Set<LibraryElement>();
-    addLibrarySources(library, libraries, units);
+    // Create and add a ChangeSet
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
   }
 
   void addCompilationUnitSource(CompilationUnitElement unit, Set<LibraryElement> libraries,
@@ -159,7 +213,7 @@
     }
   }
 
-  /// Fills [errorInfos].
+  /// Fills [errorInfos] using [sources].
   void prepareErrors() {
     for (Source source in sources) {
       context.computeErrors(source);
@@ -207,3 +261,37 @@
     return UriKind.FILE_URI;
   }
 }
+
+/**
+ * This [Logger] prints out information comments to [stdout] and error messages
+ * to [stderr].
+ */
+class StdLogger extends Logger {
+  final bool log;
+
+  StdLogger(this.log);
+
+  @override
+  void logError(String message) {
+    stderr.writeln(message);
+  }
+
+  @override
+  void logError2(String message, Exception exception) {
+    stderr.writeln(message);
+  }
+
+  @override
+  void logInformation(String message) {
+    if (log) {
+      stdout.writeln(message);
+    }
+  }
+
+  @override
+  void logInformation2(String message, Exception exception) {
+    if (log) {
+      stdout.writeln(message);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/error.dart b/pkg/analyzer/lib/src/error.dart
index 483c433..b138e41 100644
--- a/pkg/analyzer/lib/src/error.dart
+++ b/pkg/analyzer/lib/src/error.dart
@@ -4,7 +4,6 @@
 library error;
 
 import 'dart:collection';
-import 'dart:math' as math;
 
 import 'generated/error.dart';
 import 'generated/source.dart';
@@ -44,45 +43,50 @@
 
   String toString() {
     var builder = new StringBuffer();
-    var content = error.source.contents.data;
-    var beforeError = content.substring(0, error.offset);
-    var lineNumber = "\n".allMatches(beforeError).length + 1;
-    builder.writeln("Error on line $lineNumber of ${error.source.fullName}: "
-        "${error.message}");
 
-    var errorLineIndex = beforeError.lastIndexOf("\n") + 1;
-    var errorEndOfLineIndex = content.indexOf("\n", error.offset);
-    if (errorEndOfLineIndex == -1) errorEndOfLineIndex = content.length;
-    var errorLine = content.substring(
-        errorLineIndex, errorEndOfLineIndex);
-    var errorColumn = error.offset - errorLineIndex;
-    var errorLength = error.length;
+    // Print a less friendly string representation to ensure that
+    // error.source.contents is not executed, as .contents it isn't async
+    builder.write("Error in ${error.source.shortName}: ${error.message}");
 
-    // Ensure that the error line we display isn't too long.
-    if (errorLine.length > _MAX_ERROR_LINE_LENGTH) {
-      var leftLength = errorColumn;
-      var rightLength = errorLine.length - leftLength;
-      if (leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2 &&
-          rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
-        errorLine = "..." + errorLine.substring(
-            errorColumn - _MAX_ERROR_LINE_LENGTH ~/ 2 + 3,
-            errorColumn + _MAX_ERROR_LINE_LENGTH ~/ 2 - 3)
-            + "...";
-        errorColumn = _MAX_ERROR_LINE_LENGTH ~/ 2;
-      } else if (rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
-        errorLine = errorLine.substring(0, _MAX_ERROR_LINE_LENGTH - 3) + "...";
-      } else {
-        assert(leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2);
-        errorColumn -= errorLine.length - _MAX_ERROR_LINE_LENGTH;
-        errorLine = "..." + errorLine.substring(
-            errorLine.length - _MAX_ERROR_LINE_LENGTH + 3, errorLine.length);
-      }
-      errorLength = math.min(errorLength, _MAX_ERROR_LINE_LENGTH - errorColumn);
-    }
-    builder.writeln(errorLine);
+//    var content = error.source.contents.data;
+//    var beforeError = content.substring(0, error.offset);
+//    var lineNumber = "\n".allMatches(beforeError).length + 1;
+//    builder.writeln("Error on line $lineNumber of ${error.source.fullName}: "
+//        "${error.message}");
 
-    for (var i = 0; i < errorColumn; i++) builder.write(" ");
-    for (var i = 0; i < errorLength; i++) builder.write("^");
+//    var errorLineIndex = beforeError.lastIndexOf("\n") + 1;
+//    var errorEndOfLineIndex = content.indexOf("\n", error.offset);
+//    if (errorEndOfLineIndex == -1) errorEndOfLineIndex = content.length;
+//    var errorLine = content.substring(
+//        errorLineIndex, errorEndOfLineIndex);
+//    var errorColumn = error.offset - errorLineIndex;
+//    var errorLength = error.length;
+//
+//    // Ensure that the error line we display isn't too long.
+//    if (errorLine.length > _MAX_ERROR_LINE_LENGTH) {
+//      var leftLength = errorColumn;
+//      var rightLength = errorLine.length - leftLength;
+//      if (leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2 &&
+//          rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
+//        errorLine = "..." + errorLine.substring(
+//            errorColumn - _MAX_ERROR_LINE_LENGTH ~/ 2 + 3,
+//            errorColumn + _MAX_ERROR_LINE_LENGTH ~/ 2 - 3)
+//            + "...";
+//        errorColumn = _MAX_ERROR_LINE_LENGTH ~/ 2;
+//      } else if (rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
+//        errorLine = errorLine.substring(0, _MAX_ERROR_LINE_LENGTH - 3) + "...";
+//      } else {
+//        assert(leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2);
+//        errorColumn -= errorLine.length - _MAX_ERROR_LINE_LENGTH;
+//        errorLine = "..." + errorLine.substring(
+//            errorLine.length - _MAX_ERROR_LINE_LENGTH + 3, errorLine.length);
+//      }
+//      errorLength = math.min(errorLength, _MAX_ERROR_LINE_LENGTH - errorColumn);
+//    }
+//    builder.writeln(errorLine);
+//
+//    for (var i = 0; i < errorColumn; i++) builder.write(" ");
+//    for (var i = 0; i < errorLength; i++) builder.write("^");
     builder.writeln();
 
     return builder.toString();
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index bf07ccc..58ce80b 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -10,7 +10,7 @@
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
-import 'source.dart' show LineInfo;
+import 'source.dart' show LineInfo, Source;
 import 'scanner.dart';
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_dart.dart';
@@ -45,10 +45,13 @@
     this._strings.addAll(strings);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitAdjacentStrings(this);
 
+  @override
   Token get beginToken => _strings.beginToken;
 
+  @override
   Token get endToken => _strings.endToken;
 
   /**
@@ -58,10 +61,12 @@
    */
   NodeList<StringLiteral> get strings => _strings;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _strings.accept(visitor);
   }
 
+  @override
   void appendStringValue(JavaStringBuilder builder) {
     for (StringLiteral stringLiteral in strings) {
       stringLiteral.appendStringValue(builder);
@@ -97,6 +102,7 @@
     this._metadata.addAll(metadata);
   }
 
+  @override
   Token get beginToken {
     if (_comment == null) {
       if (_metadata.isEmpty) {
@@ -149,8 +155,9 @@
     this._metadata.addAll(metadata);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
-    if (commentIsBeforeAnnotations()) {
+    if (_commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
       _metadata.accept(visitor);
     } else {
@@ -172,7 +179,7 @@
    *
    * @return `true` if the comment is lexically before any annotations
    */
-  bool commentIsBeforeAnnotations() {
+  bool _commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
       return true;
     }
@@ -246,6 +253,11 @@
   Element _element;
 
   /**
+   * The element annotation representing this annotation in the element model.
+   */
+  ElementAnnotation elementAnnotation;
+
+  /**
    * Initialize a newly created annotation.
    *
    * @param atSign the at sign that introduced the annotation
@@ -264,6 +276,7 @@
     this._arguments = becomeParentOf(arguments);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitAnnotation(this);
 
   /**
@@ -274,6 +287,7 @@
    */
   ArgumentList get arguments => _arguments;
 
+  @override
   Token get beginToken => atSign;
 
   /**
@@ -300,6 +314,7 @@
     return null;
   }
 
+  @override
   Token get endToken {
     if (_arguments != null) {
       return _arguments.endToken;
@@ -354,6 +369,7 @@
     this._name = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_constructorName, visitor);
@@ -390,10 +406,13 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitArgumentDefinitionTest(this);
 
+  @override
   Token get beginToken => question;
 
+  @override
   Token get endToken => _identifier.endToken;
 
   /**
@@ -403,6 +422,7 @@
    */
   SimpleIdentifier get identifier => _identifier;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -414,6 +434,7 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_identifier, visitor);
   }
@@ -480,6 +501,7 @@
     this._rightParenthesis = rightParenthesis;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitArgumentList(this);
 
   /**
@@ -491,8 +513,10 @@
    */
   NodeList<Expression> get arguments => _arguments;
 
+  @override
   Token get beginToken => _leftParenthesis;
 
+  @override
   Token get endToken => _rightParenthesis;
 
   /**
@@ -557,6 +581,7 @@
     _rightParenthesis = parenthesis;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _arguments.accept(visitor);
   }
@@ -653,10 +678,13 @@
     this._type = becomeParentOf(type);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitAsExpression(this);
 
+  @override
   Token get beginToken => _expression.beginToken;
 
+  @override
   Token get endToken => _type.endToken;
 
   /**
@@ -666,6 +694,7 @@
    */
   Expression get expression => _expression;
 
+  @override
   int get precedence => 7;
 
   /**
@@ -693,6 +722,7 @@
     this._type = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
@@ -746,8 +776,10 @@
     this._condition = becomeParentOf(condition);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitAssertStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
   /**
@@ -757,6 +789,7 @@
    */
   Expression get condition => _condition;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -768,6 +801,7 @@
     this._condition = becomeParentOf(condition);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_condition, visitor);
   }
@@ -823,8 +857,10 @@
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitAssignmentExpression(this);
 
+  @override
   Token get beginToken => _leftHandSide.beginToken;
 
   /**
@@ -843,6 +879,7 @@
     return element;
   }
 
+  @override
   Token get endToken => _rightHandSide.endToken;
 
   /**
@@ -852,6 +889,7 @@
    */
   Expression get leftHandSide => _leftHandSide;
 
+  @override
   int get precedence => 1;
 
   /**
@@ -919,6 +957,7 @@
     _staticElement = element;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_leftHandSide, visitor);
     safelyVisitChild(_rightHandSide, visitor);
@@ -1155,6 +1194,7 @@
     return writer.toString();
   }
 
+  @override
   String toString() => toSource();
 
   /**
@@ -1463,8 +1503,10 @@
     this._rightOperand = becomeParentOf(rightOperand);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitBinaryExpression(this);
 
+  @override
   Token get beginToken => _leftOperand.beginToken;
 
   /**
@@ -1483,6 +1525,7 @@
     return element;
   }
 
+  @override
   Token get endToken => _rightOperand.endToken;
 
   /**
@@ -1492,6 +1535,7 @@
    */
   Expression get leftOperand => _leftOperand;
 
+  @override
   int get precedence => operator.type.precedence;
 
   /**
@@ -1559,6 +1603,7 @@
     _staticElement = element;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_leftOperand, visitor);
     safelyVisitChild(_rightOperand, visitor);
@@ -1643,10 +1688,13 @@
     this._statements.addAll(statements);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitBlock(this);
 
+  @override
   Token get beginToken => leftBracket;
 
+  @override
   Token get endToken => rightBracket;
 
   /**
@@ -1656,6 +1704,7 @@
    */
   NodeList<Statement> get statements => _statements;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _statements.accept(visitor);
   }
@@ -1685,8 +1734,10 @@
     this._block = becomeParentOf(block);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitBlockFunctionBody(this);
 
+  @override
   Token get beginToken => _block.beginToken;
 
   /**
@@ -1696,6 +1747,7 @@
    */
   Block get block => _block;
 
+  @override
   Token get endToken => _block.endToken;
 
   /**
@@ -1707,6 +1759,7 @@
     this._block = becomeParentOf(block);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_block, visitor);
   }
@@ -1739,14 +1792,19 @@
    */
   BooleanLiteral(this.literal, this.value);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
 
+  @override
   Token get beginToken => literal;
 
+  @override
   Token get endToken => literal;
 
+  @override
   bool get isSynthetic => literal.isSynthetic;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -1786,10 +1844,13 @@
     this._label = becomeParentOf(label);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitBreakStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -1808,6 +1869,7 @@
     _label = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
@@ -1854,8 +1916,10 @@
     this._cascadeSections.addAll(cascadeSections);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitCascadeExpression(this);
 
+  @override
   Token get beginToken => _target.beginToken;
 
   /**
@@ -1865,8 +1929,10 @@
    */
   NodeList<Expression> get cascadeSections => _cascadeSections;
 
+  @override
   Token get endToken => _cascadeSections.endToken;
 
+  @override
   int get precedence => 2;
 
   /**
@@ -1885,6 +1951,7 @@
     this._target = becomeParentOf(target);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_target, visitor);
     _cascadeSections.accept(visitor);
@@ -1974,8 +2041,10 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitCatchClause(this);
 
+  @override
   Token get beginToken {
     if (onKeyword != null) {
       return onKeyword;
@@ -1990,6 +2059,7 @@
    */
   Block get body => _body;
 
+  @override
   Token get endToken => _body.endToken;
 
   /**
@@ -2068,6 +2138,7 @@
     _stackTraceParameter = becomeParentOf(parameter);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(exceptionType, visitor);
     safelyVisitChild(_exceptionParameter, visitor);
@@ -2171,6 +2242,7 @@
     this._members.addAll(members);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitClassDeclaration(this);
 
   /**
@@ -2195,8 +2267,10 @@
     return null;
   }
 
+  @override
   ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
 
+  @override
   Token get endToken => rightBracket;
 
   /**
@@ -2313,6 +2387,7 @@
     this._withClause = becomeParentOf(withClause);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
@@ -2324,6 +2399,7 @@
     members.accept(visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (abstractKeyword != null) {
       return abstractKeyword;
@@ -2418,8 +2494,10 @@
     this._implementsClause = becomeParentOf(implementsClause);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitClassTypeAlias(this);
 
+  @override
   ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
 
   /**
@@ -2503,6 +2581,7 @@
     this._withClause = becomeParentOf(withClause);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
@@ -2537,6 +2616,7 @@
    */
   Combinator(this.keyword);
 
+  @override
   Token get beginToken => keyword;
 }
 
@@ -2623,10 +2703,13 @@
     this._references.addAll(references);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitComment(this);
 
+  @override
   Token get beginToken => tokens[0];
 
+  @override
   Token get endToken => tokens[tokens.length - 1];
 
   /**
@@ -2657,6 +2740,7 @@
    */
   bool get isEndOfLine => identical(_type, CommentType.END_OF_LINE);
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _references.accept(visitor);
   }
@@ -2717,10 +2801,13 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitCommentReference(this);
 
+  @override
   Token get beginToken => _identifier.beginToken;
 
+  @override
   Token get endToken => _identifier.endToken;
 
   /**
@@ -2739,6 +2826,7 @@
     identifier = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_identifier, visitor);
   }
@@ -2824,6 +2912,7 @@
     this._declarations.addAll(declarations);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitCompilationUnit(this);
 
   /**
@@ -2840,6 +2929,7 @@
    */
   NodeList<Directive> get directives => _directives;
 
+  @override
   int get length {
     Token endToken = this.endToken;
     if (endToken == null) {
@@ -2848,6 +2938,7 @@
     return endToken.offset + endToken.length;
   }
 
+  @override
   int get offset => 0;
 
   /**
@@ -2867,9 +2958,10 @@
     this._scriptTag = becomeParentOf(scriptTag);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_scriptTag, visitor);
-    if (directivesAreBeforeDeclarations()) {
+    if (_directivesAreBeforeDeclarations()) {
       _directives.accept(visitor);
       _declarations.accept(visitor);
     } else {
@@ -2884,7 +2976,7 @@
    *
    * @return `true` if all of the directives are lexically before any declarations
    */
-  bool directivesAreBeforeDeclarations() {
+  bool _directivesAreBeforeDeclarations() {
     if (_directives.isEmpty || _declarations.isEmpty) {
       return true;
     }
@@ -2985,8 +3077,10 @@
     this._elseExpression = becomeParentOf(elseExpression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitConditionalExpression(this);
 
+  @override
   Token get beginToken => _condition.beginToken;
 
   /**
@@ -3003,8 +3097,10 @@
    */
   Expression get elseExpression => _elseExpression;
 
+  @override
   Token get endToken => _elseExpression.endToken;
 
+  @override
   int get precedence => 3;
 
   /**
@@ -3044,6 +3140,7 @@
     _thenExpression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenExpression, visitor);
@@ -3170,6 +3267,7 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitConstructorDeclaration(this);
 
   /**
@@ -3179,6 +3277,7 @@
    */
   FunctionBody get body => _body;
 
+  @override
   Token get endToken {
     if (_body != null) {
       return _body.endToken;
@@ -3274,6 +3373,7 @@
     _returnType = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -3284,8 +3384,9 @@
     safelyVisitChild(_body, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
-    Token leftMost = this.leftMost([externalKeyword, constKeyword, factoryKeyword]);
+    Token leftMost = _leftMost([externalKeyword, constKeyword, factoryKeyword]);
     if (leftMost != null) {
       return leftMost;
     }
@@ -3299,7 +3400,7 @@
    * @param tokens the tokens being compared to find the left-most token
    * @return the left-most of the given tokens
    */
-  Token leftMost(List<Token> tokens) {
+  Token _leftMost(List<Token> tokens) {
     Token leftMost = null;
     int offset = 2147483647;
     for (Token token in tokens) {
@@ -3362,8 +3463,10 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitConstructorFieldInitializer(this);
 
+  @override
   Token get beginToken {
     if (keyword != null) {
       return keyword;
@@ -3371,6 +3474,7 @@
     return _fieldName.beginToken;
   }
 
+  @override
   Token get endToken => _expression.endToken;
 
   /**
@@ -3406,6 +3510,7 @@
     _fieldName = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_fieldName, visitor);
     safelyVisitChild(_expression, visitor);
@@ -3470,10 +3575,13 @@
     this._name = becomeParentOf(name);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitConstructorName(this);
 
+  @override
   Token get beginToken => _type.beginToken;
 
+  @override
   Token get endToken {
     if (_name != null) {
       return _name.endToken;
@@ -3533,6 +3641,7 @@
     this._type = becomeParentOf(type);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_type, visitor);
     safelyVisitChild(_name, visitor);
@@ -3574,10 +3683,13 @@
     this._label = becomeParentOf(label);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitContinueStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -3596,6 +3708,7 @@
     _label = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
@@ -3664,8 +3777,10 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitDeclaredIdentifier(this);
 
+  @override
   LocalVariableElement get element {
     SimpleIdentifier identifier = this.identifier;
     if (identifier == null) {
@@ -3674,6 +3789,7 @@
     return identifier.staticElement as LocalVariableElement;
   }
 
+  @override
   Token get endToken => _identifier.endToken;
 
   /**
@@ -3716,12 +3832,14 @@
     _type = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(_identifier, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (keyword != null) {
       return keyword;
@@ -3781,8 +3899,10 @@
     this._defaultValue = becomeParentOf(defaultValue);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitDefaultFormalParameter(this);
 
+  @override
   Token get beginToken => _parameter.beginToken;
 
   /**
@@ -3793,6 +3913,7 @@
    */
   Expression get defaultValue => _defaultValue;
 
+  @override
   Token get endToken {
     if (_defaultValue != null) {
       return _defaultValue.endToken;
@@ -3800,6 +3921,7 @@
     return _parameter.endToken;
   }
 
+  @override
   SimpleIdentifier get identifier => _parameter.identifier;
 
   /**
@@ -3809,8 +3931,10 @@
    */
   NormalFormalParameter get parameter => _parameter;
 
+  @override
   bool get isConst => _parameter != null && _parameter.isConst;
 
+  @override
   bool get isFinal => _parameter != null && _parameter.isFinal;
 
   /**
@@ -3831,6 +3955,7 @@
     _parameter = becomeParentOf(formalParameter);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_parameter, visitor);
     safelyVisitChild(_defaultValue, visitor);
@@ -3954,8 +4079,10 @@
     this._rightParenthesis = rightParenthesis;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitDoStatement(this);
 
+  @override
   Token get beginToken => doKeyword;
 
   /**
@@ -3972,6 +4099,7 @@
    */
   Expression get condition => _condition;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -4024,6 +4152,7 @@
     _rightParenthesis = parenthesis;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_body, visitor);
     safelyVisitChild(_condition, visitor);
@@ -4061,12 +4190,16 @@
    */
   DoubleLiteral(this.literal, this.value);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
 
+  @override
   Token get beginToken => literal;
 
+  @override
   Token get endToken => literal;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -4093,12 +4226,16 @@
    */
   EmptyFunctionBody(this.semicolon);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
 
+  @override
   Token get beginToken => semicolon;
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -4124,12 +4261,16 @@
    */
   EmptyStatement(this.semicolon);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
 
+  @override
   Token get beginToken => semicolon;
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -4164,10 +4305,13 @@
    */
   ExportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitExportDirective(this);
 
+  @override
   ExportElement get element => super.element as ExportElement;
 
+  @override
   LibraryElement get uriElement {
     ExportElement exportElement = element;
     if (exportElement != null) {
@@ -4176,6 +4320,7 @@
     return null;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     combinators.accept(visitor);
@@ -4202,13 +4347,13 @@
   /**
    * The static type of this expression, or `null` if the AST structure has not been resolved.
    */
-  Type2 staticType;
+  DartType staticType;
 
   /**
    * The propagated type of this expression, or `null` if type propagation has not been
    * performed on the AST structure.
    */
-  Type2 propagatedType;
+  DartType propagatedType;
 
   /**
    * Return the best parameter element information available for this expression. If type
@@ -4234,7 +4379,7 @@
    *
    * @return the best type information available for this expression
    */
-  Type2 get bestType {
+  DartType get bestType {
     if (propagatedType != null) {
       return propagatedType;
     } else if (staticType != null) {
@@ -4376,10 +4521,13 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitExpressionFunctionBody(this);
 
+  @override
   Token get beginToken => functionDefinition;
 
+  @override
   Token get endToken {
     if (semicolon != null) {
       return semicolon;
@@ -4403,6 +4551,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -4438,10 +4587,13 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitExpressionStatement(this);
 
+  @override
   Token get beginToken => _expression.beginToken;
 
+  @override
   Token get endToken {
     if (semicolon != null) {
       return semicolon;
@@ -4456,6 +4608,7 @@
    */
   Expression get expression => _expression;
 
+  @override
   bool get isSynthetic => _expression.isSynthetic && semicolon.isSynthetic;
 
   /**
@@ -4467,6 +4620,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -4502,10 +4656,13 @@
     this._superclass = becomeParentOf(superclass);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitExtendsClause(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => _superclass.endToken;
 
   /**
@@ -4524,6 +4681,7 @@
     _superclass = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_superclass, visitor);
   }
@@ -4567,10 +4725,13 @@
     this._fieldList = becomeParentOf(fieldList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFieldDeclaration(this);
 
+  @override
   Element get element => null;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -4596,11 +4757,13 @@
     fieldList = becomeParentOf(fieldList);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_fieldList, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (staticKeyword != null) {
       return staticKeyword;
@@ -4664,8 +4827,10 @@
     this._parameters = becomeParentOf(parameters);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFieldFormalParameter(this);
 
+  @override
   Token get beginToken {
     if (keyword != null) {
       return keyword;
@@ -4675,6 +4840,7 @@
     return thisToken;
   }
 
+  @override
   Token get endToken => identifier.endToken;
 
   /**
@@ -4694,8 +4860,10 @@
    */
   TypeName get type => _type;
 
+  @override
   bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
 
+  @override
   bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
@@ -4716,6 +4884,7 @@
     _type = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
@@ -4807,8 +4976,10 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitForEachStatement(this);
 
+  @override
   Token get beginToken => forKeyword;
 
   /**
@@ -4818,6 +4989,7 @@
    */
   Statement get body => _body;
 
+  @override
   Token get endToken => _body.endToken;
 
   /**
@@ -4878,6 +5050,7 @@
     _loopVariable = becomeParentOf(variable);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_loopVariable, visitor);
     safelyVisitChild(_identifier, visitor);
@@ -4980,8 +5153,10 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitForStatement(this);
 
+  @override
   Token get beginToken => forKeyword;
 
   /**
@@ -4999,6 +5174,7 @@
    */
   Expression get condition => _condition;
 
+  @override
   Token get endToken => _body.endToken;
 
   /**
@@ -5058,6 +5234,7 @@
     variableList = becomeParentOf(variableList);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
     safelyVisitChild(_initialization, visitor);
@@ -5199,10 +5376,13 @@
     this._rightParenthesis = rightParenthesis;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFormalParameterList(this);
 
+  @override
   Token get beginToken => _leftParenthesis;
 
+  @override
   Token get endToken => _rightParenthesis;
 
   /**
@@ -5297,6 +5477,7 @@
     _rightParenthesis = parenthesis;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _parameters.accept(visitor);
   }
@@ -5373,10 +5554,13 @@
     this._functionExpression = becomeParentOf(functionExpression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionDeclaration(this);
 
+  @override
   ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
 
+  @override
   Token get endToken => _functionExpression.endToken;
 
   /**
@@ -5441,6 +5625,7 @@
     _returnType = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -5448,6 +5633,7 @@
     safelyVisitChild(_functionExpression, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (externalKeyword != null) {
       return externalKeyword;
@@ -5482,10 +5668,13 @@
     this._functionDeclaration = becomeParentOf(functionDeclaration);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionDeclarationStatement(this);
 
+  @override
   Token get beginToken => _functionDeclaration.beginToken;
 
+  @override
   Token get endToken => _functionDeclaration.endToken;
 
   /**
@@ -5504,6 +5693,7 @@
     this._functionDeclaration = becomeParentOf(functionDeclaration);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_functionDeclaration, visitor);
   }
@@ -5545,8 +5735,10 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionExpression(this);
 
+  @override
   Token get beginToken {
     if (_parameters != null) {
       return _parameters.beginToken;
@@ -5565,6 +5757,7 @@
    */
   FunctionBody get body => _body;
 
+  @override
   Token get endToken {
     if (_body != null) {
       return _body.endToken;
@@ -5583,6 +5776,7 @@
    */
   FormalParameterList get parameters => _parameters;
 
+  @override
   int get precedence => 16;
 
   /**
@@ -5603,6 +5797,7 @@
     this._parameters = becomeParentOf(parameters);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_parameters, visitor);
     safelyVisitChild(_body, visitor);
@@ -5655,6 +5850,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionExpressionInvocation(this);
 
   /**
@@ -5664,6 +5860,7 @@
    */
   ArgumentList get argumentList => _argumentList;
 
+  @override
   Token get beginToken => _function.beginToken;
 
   /**
@@ -5682,6 +5879,7 @@
     return element;
   }
 
+  @override
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -5691,6 +5889,7 @@
    */
   Expression get function => _function;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -5731,6 +5930,7 @@
     _propagatedElement = element;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_function, visitor);
     safelyVisitChild(_argumentList, visitor);
@@ -5790,8 +5990,10 @@
     this._parameters = becomeParentOf(parameters);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionTypeAlias(this);
 
+  @override
   FunctionTypeAliasElement get element => _name != null ? (_name.staticElement as FunctionTypeAliasElement) : null;
 
   /**
@@ -5860,6 +6062,7 @@
     this._typeParameters = becomeParentOf(typeParameters);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -5904,8 +6107,10 @@
     this._parameters = becomeParentOf(parameters);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitFunctionTypedFormalParameter(this);
 
+  @override
   Token get beginToken {
     if (_returnType != null) {
       return _returnType.beginToken;
@@ -5913,6 +6118,7 @@
     return identifier.beginToken;
   }
 
+  @override
   Token get endToken => _parameters.endToken;
 
   /**
@@ -5930,8 +6136,10 @@
    */
   TypeName get returnType => _returnType;
 
+  @override
   bool get isConst => false;
 
+  @override
   bool get isFinal => false;
 
   /**
@@ -5952,6 +6160,7 @@
     this._returnType = becomeParentOf(returnType);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -5986,8 +6195,10 @@
     this._hiddenNames.addAll(hiddenNames);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitHideCombinator(this);
 
+  @override
   Token get endToken => _hiddenNames.endToken;
 
   /**
@@ -5997,6 +6208,7 @@
    */
   NodeList<SimpleIdentifier> get hiddenNames => _hiddenNames;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _hiddenNames.accept(visitor);
   }
@@ -6059,6 +6271,7 @@
    */
   Element get staticElement;
 
+  @override
   bool get isAssignable => true;
 }
 
@@ -6124,8 +6337,10 @@
     this._elseStatement = becomeParentOf(elseStatement);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitIfStatement(this);
 
+  @override
   Token get beginToken => ifKeyword;
 
   /**
@@ -6143,6 +6358,7 @@
    */
   Statement get elseStatement => _elseStatement;
 
+  @override
   Token get endToken {
     if (_elseStatement != null) {
       return _elseStatement.endToken;
@@ -6187,6 +6403,7 @@
     _thenStatement = becomeParentOf(statement);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenStatement, visitor);
@@ -6225,10 +6442,13 @@
     this._interfaces.addAll(interfaces);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitImplementsClause(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => _interfaces.endToken;
 
   /**
@@ -6238,6 +6458,7 @@
    */
   NodeList<TypeName> get interfaces => _interfaces;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _interfaces.accept(visitor);
   }
@@ -6370,8 +6591,10 @@
     this._prefix = becomeParentOf(prefix);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitImportDirective(this);
 
+  @override
   ImportElement get element => super.element as ImportElement;
 
   /**
@@ -6382,6 +6605,7 @@
    */
   SimpleIdentifier get prefix => _prefix;
 
+  @override
   LibraryElement get uriElement {
     ImportElement element = this.element;
     if (element == null) {
@@ -6399,6 +6623,7 @@
     this._prefix = becomeParentOf(prefix);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
@@ -6492,8 +6717,10 @@
     this._rightBracket = rightBracket;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitIndexExpression(this);
 
+  @override
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -6517,6 +6744,7 @@
     return element;
   }
 
+  @override
   Token get endToken => _rightBracket;
 
   /**
@@ -6533,6 +6761,7 @@
    */
   Token get leftBracket => _leftBracket;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -6636,6 +6865,7 @@
     return false;
   }
 
+  @override
   bool get isAssignable => true;
 
   /**
@@ -6703,6 +6933,7 @@
     _target = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_index, visitor);
@@ -6794,6 +7025,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitInstanceCreationExpression(this);
 
   /**
@@ -6803,10 +7035,13 @@
    */
   ArgumentList get argumentList => _argumentList;
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => _argumentList.endToken;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -6825,6 +7060,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
@@ -6866,12 +7102,16 @@
    */
   IntegerLiteral(this.literal, this.value);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
 
+  @override
   Token get beginToken => literal;
 
+  @override
   Token get endToken => literal;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -6927,10 +7167,13 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitInterpolationExpression(this);
 
+  @override
   Token get beginToken => leftBracket;
 
+  @override
   Token get endToken {
     if (rightBracket != null) {
       return rightBracket;
@@ -6955,6 +7198,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -6991,8 +7235,10 @@
     this._value = value;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitInterpolationString(this);
 
+  @override
   Token get beginToken => _contents;
 
   /**
@@ -7002,6 +7248,7 @@
    */
   Token get contents => _contents;
 
+  @override
   Token get endToken => _contents;
 
   /**
@@ -7029,6 +7276,7 @@
     _value = string;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -7075,10 +7323,13 @@
     this._type = becomeParentOf(type);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitIsExpression(this);
 
+  @override
   Token get beginToken => _expression.beginToken;
 
+  @override
   Token get endToken => _type.endToken;
 
   /**
@@ -7088,6 +7339,7 @@
    */
   Expression get expression => _expression;
 
+  @override
   int get precedence => 7;
 
   /**
@@ -7116,6 +7368,7 @@
     this._type = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
@@ -7151,10 +7404,13 @@
     this._label = becomeParentOf(label);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitLabel(this);
 
+  @override
   Token get beginToken => _label.beginToken;
 
+  @override
   Token get endToken => colon;
 
   /**
@@ -7173,6 +7429,7 @@
     this._label = becomeParentOf(label);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
@@ -7210,8 +7467,10 @@
     this._statement = becomeParentOf(statement);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitLabeledStatement(this);
 
+  @override
   Token get beginToken {
     if (!_labels.isEmpty) {
       return _labels.beginToken;
@@ -7219,6 +7478,7 @@
     return _statement.beginToken;
   }
 
+  @override
   Token get endToken => _statement.endToken;
 
   /**
@@ -7244,6 +7504,7 @@
     this._statement = becomeParentOf(statement);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _labels.accept(visitor);
     safelyVisitChild(_statement, visitor);
@@ -7287,10 +7548,13 @@
     this._name = becomeParentOf(name);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitLibraryDirective(this);
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   Token get keyword => libraryToken;
 
   /**
@@ -7309,11 +7573,13 @@
     this._name = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => libraryToken;
 }
 
@@ -7341,10 +7607,13 @@
     this._components.addAll(components);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitLibraryIdentifier(this);
 
+  @override
   Token get beginToken => _components.beginToken;
 
+  @override
   Element get bestElement => staticElement;
 
   /**
@@ -7354,8 +7623,10 @@
    */
   NodeList<SimpleIdentifier> get components => _components;
 
+  @override
   Token get endToken => _components.endToken;
 
+  @override
   String get name {
     JavaStringBuilder builder = new JavaStringBuilder();
     bool needsPeriod = false;
@@ -7370,12 +7641,16 @@
     return builder.toString();
   }
 
+  @override
   int get precedence => 15;
 
+  @override
   Element get propagatedElement => null;
 
+  @override
   Element get staticElement => null;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _components.accept(visitor);
   }
@@ -7422,8 +7697,10 @@
     this._rightBracket = rightBracket;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitListLiteral(this);
 
+  @override
   Token get beginToken {
     Token token = constKeyword;
     if (token != null) {
@@ -7443,6 +7720,7 @@
    */
   NodeList<Expression> get elements => _elements;
 
+  @override
   Token get endToken => _rightBracket;
 
   /**
@@ -7477,6 +7755,7 @@
     _rightBracket = bracket;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _elements.accept(visitor);
@@ -7499,6 +7778,7 @@
  * </pre>
  */
 abstract class Literal extends Expression {
+  @override
   int get precedence => 16;
 }
 
@@ -7543,8 +7823,10 @@
     this._rightBracket = rightBracket;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitMapLiteral(this);
 
+  @override
   Token get beginToken {
     Token token = constKeyword;
     if (token != null) {
@@ -7557,6 +7839,7 @@
     return _leftBracket;
   }
 
+  @override
   Token get endToken => _rightBracket;
 
   /**
@@ -7598,6 +7881,7 @@
     _rightBracket = bracket;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _entries.accept(visitor);
@@ -7641,10 +7925,13 @@
     this._value = becomeParentOf(value);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitMapLiteralEntry(this);
 
+  @override
   Token get beginToken => _key.beginToken;
 
+  @override
   Token get endToken => _value.endToken;
 
   /**
@@ -7681,6 +7968,7 @@
     _value = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_key, visitor);
     safelyVisitChild(_value, visitor);
@@ -7769,6 +8057,7 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitMethodDeclaration(this);
 
   /**
@@ -7786,8 +8075,10 @@
    *
    * @return the element associated with this method
    */
+  @override
   ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
 
+  @override
   Token get endToken => _body.endToken;
 
   /**
@@ -7883,6 +8174,7 @@
     _returnType = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
@@ -7891,6 +8183,7 @@
     safelyVisitChild(_body, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (modifierKeyword != null) {
       return modifierKeyword;
@@ -7954,6 +8247,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitMethodInvocation(this);
 
   /**
@@ -7963,6 +8257,7 @@
    */
   ArgumentList get argumentList => _argumentList;
 
+  @override
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -7972,6 +8267,7 @@
     return _methodName.beginToken;
   }
 
+  @override
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -7981,6 +8277,7 @@
    */
   SimpleIdentifier get methodName => _methodName;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -8052,6 +8349,7 @@
     _target = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_methodName, visitor);
@@ -8090,8 +8388,10 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitNamedExpression(this);
 
+  @override
   Token get beginToken => _name.beginToken;
 
   /**
@@ -8109,6 +8409,7 @@
     return null;
   }
 
+  @override
   Token get endToken => _expression.endToken;
 
   /**
@@ -8125,6 +8426,7 @@
    */
   Label get name => _name;
 
+  @override
   int get precedence => 0;
 
   /**
@@ -8145,6 +8447,7 @@
     _name = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_expression, visitor);
@@ -8199,10 +8502,13 @@
    */
   NodeList<Combinator> get combinators => _combinators;
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   LibraryElement get uriElement;
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => keyword;
 }
 
@@ -8234,12 +8540,16 @@
    */
   NativeClause(this.keyword, this.name);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitNativeClause(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => name.endToken;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(name, visitor);
   }
@@ -8282,10 +8592,13 @@
     this._stringLiteral = becomeParentOf(stringLiteral);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitNativeFunctionBody(this);
 
+  @override
   Token get beginToken => nativeToken;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -8295,6 +8608,7 @@
    */
   StringLiteral get stringLiteral => _stringLiteral;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_stringLiteral, visitor);
   }
@@ -8350,8 +8664,10 @@
    */
   Comment get documentationComment => _comment;
 
+  @override
   SimpleIdentifier get identifier => _identifier;
 
+  @override
   ParameterKind get kind {
     AstNode parent = this.parent;
     if (parent is DefaultFormalParameter) {
@@ -8385,12 +8701,13 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     //
     // Note that subclasses are responsible for visiting the identifier because they often need to
     // visit other nodes before visiting the identifier.
     //
-    if (commentIsBeforeAnnotations()) {
+    if (_commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
       _metadata.accept(visitor);
     } else {
@@ -8405,7 +8722,7 @@
    *
    * @return `true` if the comment is lexically before any annotations
    */
-  bool commentIsBeforeAnnotations() {
+  bool _commentIsBeforeAnnotations() {
     if (_comment == null || _metadata.isEmpty) {
       return true;
     }
@@ -8453,12 +8770,16 @@
     this.literal = token;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitNullLiteral(this);
 
+  @override
   Token get beginToken => literal;
 
+  @override
   Token get endToken => literal;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -8500,10 +8821,13 @@
     this._rightParenthesis = rightParenthesis;
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitParenthesizedExpression(this);
 
+  @override
   Token get beginToken => _leftParenthesis;
 
+  @override
   Token get endToken => _rightParenthesis;
 
   /**
@@ -8520,6 +8844,7 @@
    */
   Token get leftParenthesis => _leftParenthesis;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -8556,6 +8881,7 @@
     _rightParenthesis = parenthesis;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -8591,14 +8917,19 @@
    */
   PartDirective(Comment comment, List<Annotation> metadata, this.partToken, StringLiteral partUri, this.semicolon) : super(comment, metadata, partUri);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPartDirective(this);
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   Token get keyword => partToken;
 
+  @override
   CompilationUnitElement get uriElement => element as CompilationUnitElement;
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => partToken;
 }
 
@@ -8645,10 +8976,13 @@
     this._libraryName = becomeParentOf(libraryName);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPartOfDirective(this);
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   Token get keyword => partToken;
 
   /**
@@ -8667,11 +9001,13 @@
     this._libraryName = becomeParentOf(libraryName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_libraryName, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => partToken;
 }
 
@@ -8718,8 +9054,10 @@
     this._operand = becomeParentOf(operand);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPostfixExpression(this);
 
+  @override
   Token get beginToken => _operand.beginToken;
 
   /**
@@ -8738,6 +9076,7 @@
     return element;
   }
 
+  @override
   Token get endToken => operator;
 
   /**
@@ -8747,6 +9086,7 @@
    */
   Expression get operand => _operand;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -8798,6 +9138,7 @@
     _staticElement = element;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
@@ -8888,8 +9229,10 @@
     this._operand = becomeParentOf(operand);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPrefixExpression(this);
 
+  @override
   Token get beginToken => operator;
 
   /**
@@ -8908,6 +9251,7 @@
     return element;
   }
 
+  @override
   Token get endToken => _operand.endToken;
 
   /**
@@ -8917,6 +9261,7 @@
    */
   Expression get operand => _operand;
 
+  @override
   int get precedence => 14;
 
   /**
@@ -8968,6 +9313,7 @@
     _staticElement = element;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
@@ -9053,10 +9399,13 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPrefixedIdentifier(this);
 
+  @override
   Token get beginToken => _prefix.beginToken;
 
+  @override
   Element get bestElement {
     if (_identifier == null) {
       return null;
@@ -9064,6 +9413,7 @@
     return _identifier.bestElement;
   }
 
+  @override
   Token get endToken => _identifier.endToken;
 
   /**
@@ -9073,8 +9423,10 @@
    */
   SimpleIdentifier get identifier => _identifier;
 
+  @override
   String get name => "${_prefix.name}.${_identifier.name}";
 
+  @override
   int get precedence => 15;
 
   /**
@@ -9084,6 +9436,7 @@
    */
   SimpleIdentifier get prefix => _prefix;
 
+  @override
   Element get propagatedElement {
     if (_identifier == null) {
       return null;
@@ -9091,6 +9444,7 @@
     return _identifier.propagatedElement;
   }
 
+  @override
   Element get staticElement {
     if (_identifier == null) {
       return null;
@@ -9117,6 +9471,7 @@
     _prefix = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_prefix, visitor);
     safelyVisitChild(_identifier, visitor);
@@ -9163,8 +9518,10 @@
     this._propertyName = becomeParentOf(propertyName);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitPropertyAccess(this);
 
+  @override
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -9172,8 +9529,10 @@
     return operator;
   }
 
+  @override
   Token get endToken => _propertyName.endToken;
 
+  @override
   int get precedence => 15;
 
   /**
@@ -9215,6 +9574,7 @@
    */
   Expression get target => _target;
 
+  @override
   bool get isAssignable => true;
 
   /**
@@ -9245,6 +9605,7 @@
     _target = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_propertyName, visitor);
@@ -9303,6 +9664,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitRedirectingConstructorInvocation(this);
 
   /**
@@ -9312,6 +9674,7 @@
    */
   ArgumentList get argumentList => _argumentList;
 
+  @override
   Token get beginToken => keyword;
 
   /**
@@ -9322,6 +9685,7 @@
    */
   SimpleIdentifier get constructorName => _constructorName;
 
+  @override
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -9342,6 +9706,7 @@
     _constructorName = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
@@ -9369,14 +9734,19 @@
    */
   RethrowExpression(this.keyword);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => keyword;
 
+  @override
   int get precedence => 0;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -9417,10 +9787,13 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitReturnStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -9440,6 +9813,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -9467,12 +9841,16 @@
    */
   ScriptTag(this.scriptTag);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitScriptTag(this);
 
+  @override
   Token get beginToken => scriptTag;
 
+  @override
   Token get endToken => scriptTag;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -9503,8 +9881,10 @@
     this._shownNames.addAll(shownNames);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitShowCombinator(this);
 
+  @override
   Token get endToken => _shownNames.endToken;
 
   /**
@@ -9514,6 +9894,7 @@
    */
   NodeList<SimpleIdentifier> get shownNames => _shownNames;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _shownNames.accept(visitor);
   }
@@ -9553,8 +9934,10 @@
     this._type = becomeParentOf(type);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSimpleFormalParameter(this);
 
+  @override
   Token get beginToken {
     if (keyword != null) {
       return keyword;
@@ -9564,6 +9947,7 @@
     return identifier.beginToken;
   }
 
+  @override
   Token get endToken => identifier.endToken;
 
   /**
@@ -9574,8 +9958,10 @@
    */
   TypeName get type => _type;
 
+  @override
   bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
 
+  @override
   bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
 
   /**
@@ -9587,6 +9973,7 @@
     _type = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
@@ -9639,10 +10026,13 @@
    */
   SimpleIdentifier(this.token);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
 
+  @override
   Token get beginToken => token;
 
+  @override
   Element get bestElement {
     if (_propagatedElement == null) {
       return _staticElement;
@@ -9650,14 +10040,19 @@
     return _propagatedElement;
   }
 
+  @override
   Token get endToken => token;
 
+  @override
   String get name => token.lexeme;
 
+  @override
   int get precedence => 16;
 
+  @override
   Element get propagatedElement => _propagatedElement;
 
+  @override
   Element get staticElement => _staticElement;
 
   /**
@@ -9778,6 +10173,7 @@
     return false;
   }
 
+  @override
   bool get isSynthetic => token.isSynthetic;
 
   /**
@@ -9787,7 +10183,7 @@
    * @param element the element to be associated with this identifier
    */
   void set propagatedElement(Element element) {
-    _propagatedElement = validateElement(element);
+    _propagatedElement = _validateElement(element);
   }
 
   /**
@@ -9797,9 +10193,10 @@
    * @param element the element to be associated with this identifier
    */
   void set staticElement(Element element) {
-    _staticElement = validateElement(element);
+    _staticElement = _validateElement(element);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 
@@ -9812,9 +10209,9 @@
    * @param element the element to be associated with this identifier
    * @return the element to be associated with this identifier
    */
-  Element returnOrReportElement(AstNode parent, bool isValid, Element element) {
+  Element _returnOrReportElement(AstNode parent, bool isValid, Element element) {
     if (!isValid) {
-      AnalysisEngine.instance.logger.logInformation3("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
       return null;
     }
     return element;
@@ -9827,29 +10224,29 @@
    * @param element the element to be associated with this identifier
    * @return the element to be associated with this identifier
    */
-  Element validateElement(Element element) {
+  Element _validateElement(Element element) {
     if (element == null) {
       return null;
     }
     AstNode parent = this.parent;
     if (parent is ClassDeclaration && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is ClassElement, element);
+      return _returnOrReportElement(parent, element is ClassElement, element);
     } else if (parent is ClassTypeAlias && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is ClassElement, element);
+      return _returnOrReportElement(parent, element is ClassElement, element);
     } else if (parent is DeclaredIdentifier && identical(parent.identifier, this)) {
-      return returnOrReportElement(parent, element is LocalVariableElement, element);
+      return _returnOrReportElement(parent, element is LocalVariableElement, element);
     } else if (parent is FormalParameter && identical(parent.identifier, this)) {
-      return returnOrReportElement(parent, element is ParameterElement, element);
+      return _returnOrReportElement(parent, element is ParameterElement, element);
     } else if (parent is FunctionDeclaration && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is ExecutableElement, element);
+      return _returnOrReportElement(parent, element is ExecutableElement, element);
     } else if (parent is FunctionTypeAlias && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is FunctionTypeAliasElement, element);
+      return _returnOrReportElement(parent, element is FunctionTypeAliasElement, element);
     } else if (parent is MethodDeclaration && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is ExecutableElement, element);
+      return _returnOrReportElement(parent, element is ExecutableElement, element);
     } else if (parent is TypeParameter && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is TypeParameterElement, element);
+      return _returnOrReportElement(parent, element is TypeParameterElement, element);
     } else if (parent is VariableDeclaration && identical(parent.name, this)) {
-      return returnOrReportElement(parent, element is VariableElement, element);
+      return _returnOrReportElement(parent, element is VariableElement, element);
     }
     return element;
   }
@@ -9906,10 +10303,13 @@
     this._value = StringUtilities.intern(value);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSimpleStringLiteral(this);
 
+  @override
   Token get beginToken => literal;
 
+  @override
   Token get endToken => literal;
 
   /**
@@ -9964,6 +10364,7 @@
    */
   bool get isRaw => literal.lexeme.codeUnitAt(0) == 0x72;
 
+  @override
   bool get isSynthetic => literal.isSynthetic;
 
   /**
@@ -9984,9 +10385,11 @@
     _value = StringUtilities.intern(_value);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 
+  @override
   void appendStringValue(JavaStringBuilder builder) {
     builder.append(value);
   }
@@ -10042,8 +10445,10 @@
     this._elements.addAll(elements);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitStringInterpolation(this);
 
+  @override
   Token get beginToken => _elements.beginToken;
 
   /**
@@ -10053,12 +10458,15 @@
    */
   NodeList<InterpolationElement> get elements => _elements;
 
+  @override
   Token get endToken => _elements.endToken;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _elements.accept(visitor);
   }
 
+  @override
   void appendStringValue(JavaStringBuilder builder) {
     throw new IllegalArgumentException();
   }
@@ -10153,6 +10561,7 @@
     this._argumentList = becomeParentOf(argumentList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSuperConstructorInvocation(this);
 
   /**
@@ -10162,6 +10571,7 @@
    */
   ArgumentList get argumentList => _argumentList;
 
+  @override
   Token get beginToken => keyword;
 
   /**
@@ -10172,6 +10582,7 @@
    */
   SimpleIdentifier get constructorName => _constructorName;
 
+  @override
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -10192,6 +10603,7 @@
     _constructorName = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
@@ -10219,14 +10631,19 @@
    */
   SuperExpression(this.keyword);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => keyword;
 
+  @override
   int get precedence => 16;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -10258,6 +10675,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSwitchCase(this);
 
   /**
@@ -10276,6 +10694,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     labels.accept(visitor);
     safelyVisitChild(_expression, visitor);
@@ -10302,8 +10721,10 @@
    */
   SwitchDefault(List<Label> labels, Token keyword, Token colon, List<Statement> statements) : super(labels, keyword, colon, statements);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSwitchDefault(this);
 
+  @override
   void visitChildren(AstVisitor visitor) {
     labels.accept(visitor);
     statements.accept(visitor);
@@ -10356,6 +10777,7 @@
     this._statements.addAll(statements);
   }
 
+  @override
   Token get beginToken {
     if (!_labels.isEmpty) {
       return _labels.beginToken;
@@ -10363,6 +10785,7 @@
     return keyword;
   }
 
+  @override
   Token get endToken {
     if (!_statements.isEmpty) {
       return _statements.endToken;
@@ -10446,10 +10869,13 @@
     this._members.addAll(members);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSwitchStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => rightBracket;
 
   /**
@@ -10476,6 +10902,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     _members.accept(visitor);
@@ -10509,12 +10936,16 @@
    */
   SymbolLiteral(this.poundSign, this.components);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
 
+  @override
   Token get beginToken => poundSign;
 
+  @override
   Token get endToken => components[components.length - 1];
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -10540,14 +10971,19 @@
    */
   ThisExpression(this.keyword);
 
+  @override
   accept(AstVisitor visitor) => visitor.visitThisExpression(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken => keyword;
 
+  @override
   int get precedence => 16;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -10581,10 +11017,13 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitThrowExpression(this);
 
+  @override
   Token get beginToken => keyword;
 
+  @override
   Token get endToken {
     if (_expression != null) {
       return _expression.endToken;
@@ -10599,6 +11038,7 @@
    */
   Expression get expression => _expression;
 
+  @override
   int get precedence => 0;
 
   /**
@@ -10610,6 +11050,7 @@
     this._expression = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
@@ -10648,10 +11089,13 @@
     this._variableList = becomeParentOf(variableList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
 
+  @override
   Element get element => null;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -10670,11 +11114,13 @@
     variableList = becomeParentOf(variableList);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_variableList, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
 }
 
@@ -10733,8 +11179,10 @@
     this._finallyBlock = becomeParentOf(finallyBlock);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTryStatement(this);
 
+  @override
   Token get beginToken => tryKeyword;
 
   /**
@@ -10751,6 +11199,7 @@
    */
   NodeList<CatchClause> get catchClauses => _catchClauses;
 
+  @override
   Token get endToken {
     if (_finallyBlock != null) {
       return _finallyBlock.endToken;
@@ -10788,6 +11237,7 @@
     _finallyBlock = becomeParentOf(block);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_body, visitor);
     _catchClauses.accept(visitor);
@@ -10828,8 +11278,10 @@
    */
   TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
 
+  @override
   Token get endToken => semicolon;
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => keyword;
 }
 
@@ -10869,6 +11321,7 @@
     this._arguments.addAll(arguments);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTypeArgumentList(this);
 
   /**
@@ -10878,10 +11331,13 @@
    */
   NodeList<TypeName> get arguments => _arguments;
 
+  @override
   Token get beginToken => leftBracket;
 
+  @override
   Token get endToken => rightBracket;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _arguments.accept(visitor);
   }
@@ -10910,7 +11366,7 @@
   /**
    * The type being named, or `null` if the AST structure has not been resolved.
    */
-  Type2 type;
+  DartType type;
 
   /**
    * Initialize a newly created type name.
@@ -10924,10 +11380,13 @@
     this._typeArguments = becomeParentOf(typeArguments);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTypeName(this);
 
+  @override
   Token get beginToken => _name.beginToken;
 
+  @override
   Token get endToken {
     if (_typeArguments != null) {
       return _typeArguments.endToken;
@@ -10950,6 +11409,7 @@
    */
   TypeArgumentList get typeArguments => _typeArguments;
 
+  @override
   bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
 
   /**
@@ -10970,6 +11430,7 @@
     this._typeArguments = becomeParentOf(typeArguments);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_typeArguments, visitor);
@@ -11016,6 +11477,7 @@
     this._bound = becomeParentOf(bound);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTypeParameter(this);
 
   /**
@@ -11026,8 +11488,10 @@
    */
   TypeName get bound => _bound;
 
+  @override
   TypeParameterElement get element => _name != null ? (_name.staticElement as TypeParameterElement) : null;
 
+  @override
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
@@ -11060,12 +11524,14 @@
     _name = becomeParentOf(identifier);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_bound, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
 
@@ -11105,10 +11571,13 @@
     this._typeParameters.addAll(typeParameters);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitTypeParameterList(this);
 
+  @override
   Token get beginToken => leftBracket;
 
+  @override
   Token get endToken => rightBracket;
 
   /**
@@ -11118,6 +11587,7 @@
    */
   NodeList<TypeParameter> get typeParameters => _typeParameters;
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _typeParameters.accept(visitor);
   }
@@ -11156,6 +11626,7 @@
     this.typeArguments = becomeParentOf(typeArguments);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(typeArguments, visitor);
   }
@@ -11179,6 +11650,16 @@
   StringLiteral _uri;
 
   /**
+   * The content of the URI.
+   */
+  String uriContent;
+
+  /**
+   * The source to which the URI was resolved.
+   */
+  Source source;
+
+  /**
    * Initialize a newly create URI-based directive.
    *
    * @param comment the documentation comment associated with this directive
@@ -11198,7 +11679,7 @@
 
   /**
    * Return the element associated with the URI of this directive, or `null` if the AST
-   * structure has not been resolved or if this URI could not be resolved. Examples of the latter
+   * structure has not been resolved or if the URI could not be resolved. Examples of the latter
    * case include a directive that contains an invalid URL or a URL that does not exist.
    *
    * @return the element associated with this directive
@@ -11214,6 +11695,7 @@
     this._uri = becomeParentOf(uri);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_uri, visitor);
@@ -11262,12 +11744,14 @@
     this._initializer = becomeParentOf(initializer);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitVariableDeclaration(this);
 
   /**
    * This overridden implementation of getDocumentationComment() looks in the grandparent node for
    * dartdoc comments if no documentation is specifically available on the node.
    */
+  @override
   Comment get documentationComment {
     Comment comment = super.documentationComment;
     if (comment == null) {
@@ -11281,8 +11765,10 @@
     return comment;
   }
 
+  @override
   VariableElement get element => _name != null ? (_name.staticElement as VariableElement) : null;
 
+  @override
   Token get endToken {
     if (_initializer != null) {
       return _initializer.endToken;
@@ -11345,12 +11831,14 @@
     this._name = becomeParentOf(name);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_initializer, visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
 }
 
@@ -11401,8 +11889,10 @@
     this._variables.addAll(variables);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitVariableDeclarationList(this);
 
+  @override
   Token get endToken => _variables.endToken;
 
   /**
@@ -11444,11 +11934,13 @@
     _type = becomeParentOf(typeName);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_type, visitor);
     _variables.accept(visitor);
   }
 
+  @override
   Token get firstTokenAfterCommentAndMetadata {
     if (keyword != null) {
       return keyword;
@@ -11489,10 +11981,13 @@
     this._variableList = becomeParentOf(variableList);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
 
+  @override
   Token get beginToken => _variableList.beginToken;
 
+  @override
   Token get endToken => semicolon;
 
   /**
@@ -11511,6 +12006,7 @@
     this._variableList = becomeParentOf(variableList);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
   }
@@ -11564,8 +12060,10 @@
     this._body = becomeParentOf(body);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitWhileStatement(this);
 
+  @override
   Token get beginToken => keyword;
 
   /**
@@ -11582,6 +12080,7 @@
    */
   Expression get condition => _condition;
 
+  @override
   Token get endToken => _body.endToken;
 
   /**
@@ -11603,6 +12102,7 @@
     _condition = becomeParentOf(expression);
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_body, visitor);
@@ -11640,10 +12140,13 @@
     this._mixinTypes.addAll(mixinTypes);
   }
 
+  @override
   accept(AstVisitor visitor) => visitor.visitWithClause(this);
 
+  @override
   Token get beginToken => _withKeyword;
 
+  @override
   Token get endToken => _mixinTypes.endToken;
 
   /**
@@ -11669,6 +12172,7 @@
     this._withKeyword = withKeyword;
   }
 
+  @override
   void visitChildren(AstVisitor visitor) {
     _mixinTypes.accept(visitor);
   }
@@ -11715,6 +12219,7 @@
     }
   }
 
+  @override
   R visitNode(AstNode node) {
     node.visitChildren(_childVisitor);
     return null;
@@ -11730,6 +12235,7 @@
 
   GeneralizingAstVisitor_BreadthFirstVisitor(this.BreadthFirstVisitor_this) : super();
 
+  @override
   Object visitNode(AstNode node) {
     BreadthFirstVisitor_this._queue.add(node);
     return null;
@@ -11780,6 +12286,7 @@
    */
   static Object NOT_A_CONSTANT = new Object();
 
+  @override
   Object visitAdjacentStrings(AdjacentStrings node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (StringLiteral string in node.strings) {
@@ -11792,6 +12299,7 @@
     return builder.toString();
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     Object leftOperand = node.leftOperand.accept(this);
     if (identical(leftOperand, NOT_A_CONSTANT)) {
@@ -11945,12 +12453,16 @@
     return visitExpression(node);
   }
 
+  @override
   Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
 
+  @override
   Object visitDoubleLiteral(DoubleLiteral node) => node.value;
 
+  @override
   Object visitIntegerLiteral(IntegerLiteral node) => node.value;
 
+  @override
   Object visitInterpolationExpression(InterpolationExpression node) {
     Object value = node.expression.accept(this);
     if (value == null || value is bool || value is String || value is int || value is double) {
@@ -11959,8 +12471,10 @@
     return NOT_A_CONSTANT;
   }
 
+  @override
   Object visitInterpolationString(InterpolationString node) => node.value;
 
+  @override
   Object visitListLiteral(ListLiteral node) {
     List<Object> list = new List<Object>();
     for (Expression element in node.elements) {
@@ -11973,6 +12487,7 @@
     return list;
   }
 
+  @override
   Object visitMapLiteral(MapLiteral node) {
     Map<String, Object> map = new Map<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
@@ -11986,16 +12501,22 @@
     return map;
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
 
+  @override
   Object visitNode(AstNode node) => NOT_A_CONSTANT;
 
+  @override
   Object visitNullLiteral(NullLiteral node) => null;
 
+  @override
   Object visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
 
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) => getConstantValue(null);
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) => _getConstantValue(null);
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     Object operand = node.operand.accept(this);
     if (identical(operand, NOT_A_CONSTANT)) {
@@ -12027,12 +12548,16 @@
     return NOT_A_CONSTANT;
   }
 
-  Object visitPropertyAccess(PropertyAccess node) => getConstantValue(null);
+  @override
+  Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
 
-  Object visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(null);
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) => _getConstantValue(null);
 
+  @override
   Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
 
+  @override
   Object visitStringInterpolation(StringInterpolation node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     for (InterpolationElement element in node.elements) {
@@ -12045,6 +12570,7 @@
     return builder.toString();
   }
 
+  @override
   Object visitSymbolLiteral(SymbolLiteral node) {
     // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
     JavaStringBuilder builder = new JavaStringBuilder();
@@ -12063,7 +12589,7 @@
    * @param element the element whose value is to be returned
    * @return the constant value of the static constant
    */
-  Object getConstantValue(Element element) {
+  Object _getConstantValue(Element element) {
     // TODO(brianwilkerson) Implement this
     if (element is FieldElement) {
       FieldElement field = element;
@@ -12121,18 +12647,25 @@
  * Visitor that maps nodes to elements.
  */
 class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
+  @override
   Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
 
+  @override
   Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
 
+  @override
   Element visitClassDeclaration(ClassDeclaration node) => node.element;
 
+  @override
   Element visitCompilationUnit(CompilationUnit node) => node.element;
 
+  @override
   Element visitConstructorDeclaration(ConstructorDeclaration node) => node.element;
 
+  @override
   Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
 
+  @override
   Element visitIdentifier(Identifier node) {
     AstNode parent = node.parent;
     // Type name in InstanceCreationExpression
@@ -12185,24 +12718,34 @@
     return element;
   }
 
+  @override
   Element visitImportDirective(ImportDirective node) => node.element;
 
+  @override
   Element visitIndexExpression(IndexExpression node) => node.bestElement;
 
+  @override
   Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.staticElement;
 
+  @override
   Element visitLibraryDirective(LibraryDirective node) => node.element;
 
+  @override
   Element visitMethodDeclaration(MethodDeclaration node) => node.element;
 
+  @override
   Element visitMethodInvocation(MethodInvocation node) => node.methodName.bestElement;
 
+  @override
   Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
 
+  @override
   Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
 
+  @override
   Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
 
+  @override
   Element visitStringLiteral(StringLiteral node) {
     AstNode parent = node.parent;
     if (parent is UriBasedDirective) {
@@ -12211,6 +12754,7 @@
     return null;
   }
 
+  @override
   Element visitVariableDeclaration(VariableDeclaration node) => node.element;
 }
 
@@ -12231,166 +12775,233 @@
  * not be visited.
  */
 class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+  @override
   R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
 
   R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
 
+  @override
   R visitAnnotation(Annotation node) => visitNode(node);
 
+  @override
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitExpression(node);
 
+  @override
   R visitArgumentList(ArgumentList node) => visitNode(node);
 
+  @override
   R visitAsExpression(AsExpression node) => visitExpression(node);
 
+  @override
   R visitAssertStatement(AssertStatement node) => visitStatement(node);
 
+  @override
   R visitAssignmentExpression(AssignmentExpression node) => visitExpression(node);
 
+  @override
   R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
 
+  @override
   R visitBlock(Block node) => visitStatement(node);
 
+  @override
   R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
 
+  @override
   R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
 
+  @override
   R visitBreakStatement(BreakStatement node) => visitStatement(node);
 
+  @override
   R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
 
+  @override
   R visitCatchClause(CatchClause node) => visitNode(node);
 
+  @override
   R visitClassDeclaration(ClassDeclaration node) => visitCompilationUnitMember(node);
 
   R visitClassMember(ClassMember node) => visitDeclaration(node);
 
+  @override
   R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
 
   R visitCombinator(Combinator node) => visitNode(node);
 
+  @override
   R visitComment(Comment node) => visitNode(node);
 
+  @override
   R visitCommentReference(CommentReference node) => visitNode(node);
 
+  @override
   R visitCompilationUnit(CompilationUnit node) => visitNode(node);
 
   R visitCompilationUnitMember(CompilationUnitMember node) => visitDeclaration(node);
 
+  @override
   R visitConditionalExpression(ConditionalExpression node) => visitExpression(node);
 
+  @override
   R visitConstructorDeclaration(ConstructorDeclaration node) => visitClassMember(node);
 
+  @override
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitConstructorInitializer(node);
 
   R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
 
+  @override
   R visitConstructorName(ConstructorName node) => visitNode(node);
 
+  @override
   R visitContinueStatement(ContinueStatement node) => visitStatement(node);
 
   R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
 
+  @override
   R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
 
+  @override
   R visitDefaultFormalParameter(DefaultFormalParameter node) => visitFormalParameter(node);
 
   R visitDirective(Directive node) => visitAnnotatedNode(node);
 
+  @override
   R visitDoStatement(DoStatement node) => visitStatement(node);
 
+  @override
   R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
 
+  @override
   R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
 
+  @override
   R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
 
+  @override
   R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
 
   R visitExpression(Expression node) => visitNode(node);
 
+  @override
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitFunctionBody(node);
 
+  @override
   R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
 
+  @override
   R visitExtendsClause(ExtendsClause node) => visitNode(node);
 
+  @override
   R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
 
+  @override
   R visitFieldFormalParameter(FieldFormalParameter node) => visitNormalFormalParameter(node);
 
+  @override
   R visitForEachStatement(ForEachStatement node) => visitStatement(node);
 
   R visitFormalParameter(FormalParameter node) => visitNode(node);
 
+  @override
   R visitFormalParameterList(FormalParameterList node) => visitNode(node);
 
+  @override
   R visitForStatement(ForStatement node) => visitStatement(node);
 
   R visitFunctionBody(FunctionBody node) => visitNode(node);
 
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node) => visitCompilationUnitMember(node);
 
+  @override
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitStatement(node);
 
+  @override
   R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
 
+  @override
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitExpression(node);
 
+  @override
   R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
 
+  @override
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNormalFormalParameter(node);
 
+  @override
   R visitHideCombinator(HideCombinator node) => visitCombinator(node);
 
   R visitIdentifier(Identifier node) => visitExpression(node);
 
+  @override
   R visitIfStatement(IfStatement node) => visitStatement(node);
 
+  @override
   R visitImplementsClause(ImplementsClause node) => visitNode(node);
 
+  @override
   R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
 
+  @override
   R visitIndexExpression(IndexExpression node) => visitExpression(node);
 
+  @override
   R visitInstanceCreationExpression(InstanceCreationExpression node) => visitExpression(node);
 
+  @override
   R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
 
   R visitInterpolationElement(InterpolationElement node) => visitNode(node);
 
+  @override
   R visitInterpolationExpression(InterpolationExpression node) => visitInterpolationElement(node);
 
+  @override
   R visitInterpolationString(InterpolationString node) => visitInterpolationElement(node);
 
+  @override
   R visitIsExpression(IsExpression node) => visitExpression(node);
 
+  @override
   R visitLabel(Label node) => visitNode(node);
 
+  @override
   R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
 
+  @override
   R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
 
+  @override
   R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
 
+  @override
   R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
 
   R visitLiteral(Literal node) => visitExpression(node);
 
+  @override
   R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
 
+  @override
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
 
+  @override
   R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
 
+  @override
   R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
 
+  @override
   R visitNamedExpression(NamedExpression node) => visitExpression(node);
 
   R visitNamespaceDirective(NamespaceDirective node) => visitUriBasedDirective(node);
 
+  @override
   R visitNativeClause(NativeClause node) => visitNode(node);
 
+  @override
   R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
 
   R visitNode(AstNode node) {
@@ -12400,88 +13011,124 @@
 
   R visitNormalFormalParameter(NormalFormalParameter node) => visitFormalParameter(node);
 
+  @override
   R visitNullLiteral(NullLiteral node) => visitLiteral(node);
 
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) => visitExpression(node);
 
+  @override
   R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
 
+  @override
   R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
 
+  @override
   R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
 
+  @override
   R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
 
+  @override
   R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
 
+  @override
   R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
 
+  @override
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitConstructorInitializer(node);
 
+  @override
   R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
 
+  @override
   R visitReturnStatement(ReturnStatement node) => visitStatement(node);
 
+  @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
+  @override
   R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
 
+  @override
   R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNormalFormalParameter(node);
 
+  @override
   R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
 
+  @override
   R visitSimpleStringLiteral(SimpleStringLiteral node) => visitStringLiteral(node);
 
   R visitStatement(Statement node) => visitNode(node);
 
+  @override
   R visitStringInterpolation(StringInterpolation node) => visitStringLiteral(node);
 
   R visitStringLiteral(StringLiteral node) => visitLiteral(node);
 
+  @override
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitConstructorInitializer(node);
 
+  @override
   R visitSuperExpression(SuperExpression node) => visitExpression(node);
 
+  @override
   R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
 
+  @override
   R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
 
   R visitSwitchMember(SwitchMember node) => visitNode(node);
 
+  @override
   R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
 
+  @override
   R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
 
+  @override
   R visitThisExpression(ThisExpression node) => visitExpression(node);
 
+  @override
   R visitThrowExpression(ThrowExpression node) => visitExpression(node);
 
+  @override
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitCompilationUnitMember(node);
 
+  @override
   R visitTryStatement(TryStatement node) => visitStatement(node);
 
   R visitTypeAlias(TypeAlias node) => visitCompilationUnitMember(node);
 
+  @override
   R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
 
   R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
 
+  @override
   R visitTypeName(TypeName node) => visitNode(node);
 
+  @override
   R visitTypeParameter(TypeParameter node) => visitNode(node);
 
+  @override
   R visitTypeParameterList(TypeParameterList node) => visitNode(node);
 
   R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
 
+  @override
   R visitVariableDeclaration(VariableDeclaration node) => visitDeclaration(node);
 
+  @override
   R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
 
+  @override
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitStatement(node);
 
+  @override
   R visitWhileStatement(WhileStatement node) => visitStatement(node);
 
+  @override
   R visitWithClause(WithClause node) => visitNode(node);
 }
 
@@ -12552,12 +13199,13 @@
       node.accept(this);
     } on NodeLocator_NodeFoundException catch (exception) {
     } on JavaException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
+      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
       return null;
     }
     return _foundNode;
   }
 
+  @override
   Object visitNode(AstNode node) {
     int start = node.offset;
     int end = start + node.length;
@@ -12573,7 +13221,7 @@
       throw exception;
     } on JavaException catch (exception) {
       // Ignore the exception and proceed in order to visit the rest of the structure.
-      AnalysisEngine.instance.logger.logInformation3("Exception caught while traversing an AST structure.", exception);
+      AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
     }
     if (start <= _startOffset && _endOffset <= end) {
       _foundNode = node;
@@ -12601,516 +13249,619 @@
  * of the visited node to not be visited.
  */
 class RecursiveAstVisitor<R> implements AstVisitor<R> {
+  @override
   R visitAdjacentStrings(AdjacentStrings node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAnnotation(Annotation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitArgumentList(ArgumentList node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAsExpression(AsExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAssertStatement(AssertStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAssignmentExpression(AssignmentExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitBlock(Block node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitBlockFunctionBody(BlockFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitBooleanLiteral(BooleanLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitBreakStatement(BreakStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitCascadeExpression(CascadeExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitCatchClause(CatchClause node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitClassDeclaration(ClassDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitClassTypeAlias(ClassTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitComment(Comment node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitCommentReference(CommentReference node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitConditionalExpression(ConditionalExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitConstructorDeclaration(ConstructorDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitConstructorName(ConstructorName node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitContinueStatement(ContinueStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitDeclaredIdentifier(DeclaredIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitDefaultFormalParameter(DefaultFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitDoStatement(DoStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitDoubleLiteral(DoubleLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitEmptyFunctionBody(EmptyFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitEmptyStatement(EmptyStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExportDirective(ExportDirective node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExpressionFunctionBody(ExpressionFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExpressionStatement(ExpressionStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExtendsClause(ExtendsClause node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFieldDeclaration(FieldDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFieldFormalParameter(FieldFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitForEachStatement(ForEachStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFormalParameterList(FormalParameterList node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitForStatement(ForStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionExpression(FunctionExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionTypeAlias(FunctionTypeAlias node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitHideCombinator(HideCombinator node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitIfStatement(IfStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitImplementsClause(ImplementsClause node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitImportDirective(ImportDirective node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitIntegerLiteral(IntegerLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitInterpolationExpression(InterpolationExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitInterpolationString(InterpolationString node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitIsExpression(IsExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLabel(Label node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLabeledStatement(LabeledStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLibraryDirective(LibraryDirective node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLibraryIdentifier(LibraryIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitListLiteral(ListLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMapLiteral(MapLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMapLiteralEntry(MapLiteralEntry node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMethodDeclaration(MethodDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMethodInvocation(MethodInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitNamedExpression(NamedExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitNativeClause(NativeClause node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitNativeFunctionBody(NativeFunctionBody node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitNullLiteral(NullLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPartDirective(PartDirective node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPartOfDirective(PartOfDirective node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPrefixedIdentifier(PrefixedIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPropertyAccess(PropertyAccess node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitRethrowExpression(RethrowExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitReturnStatement(ReturnStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitScriptTag(ScriptTag node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitShowCombinator(ShowCombinator node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSimpleFormalParameter(SimpleFormalParameter node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSimpleIdentifier(SimpleIdentifier node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSimpleStringLiteral(SimpleStringLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitStringInterpolation(StringInterpolation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSuperExpression(SuperExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSwitchCase(SwitchCase node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSwitchDefault(SwitchDefault node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSwitchStatement(SwitchStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitSymbolLiteral(SymbolLiteral node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitThisExpression(ThisExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitThrowExpression(ThrowExpression node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTryStatement(TryStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTypeArgumentList(TypeArgumentList node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTypeName(TypeName node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTypeParameter(TypeParameter node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTypeParameterList(TypeParameterList node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitVariableDeclaration(VariableDeclaration node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitVariableDeclarationList(VariableDeclarationList node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitWhileStatement(WhileStatement node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitWithClause(WithClause node) {
     node.visitChildren(this);
     return null;
@@ -13124,210 +13875,313 @@
  * structure) and that only need to visit a small number of node types.
  */
 class SimpleAstVisitor<R> implements AstVisitor<R> {
+  @override
   R visitAdjacentStrings(AdjacentStrings node) => null;
 
+  @override
   R visitAnnotation(Annotation node) => null;
 
+  @override
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => null;
 
+  @override
   R visitArgumentList(ArgumentList node) => null;
 
+  @override
   R visitAsExpression(AsExpression node) => null;
 
+  @override
   R visitAssertStatement(AssertStatement node) => null;
 
+  @override
   R visitAssignmentExpression(AssignmentExpression node) => null;
 
+  @override
   R visitBinaryExpression(BinaryExpression node) => null;
 
+  @override
   R visitBlock(Block node) => null;
 
+  @override
   R visitBlockFunctionBody(BlockFunctionBody node) => null;
 
+  @override
   R visitBooleanLiteral(BooleanLiteral node) => null;
 
+  @override
   R visitBreakStatement(BreakStatement node) => null;
 
+  @override
   R visitCascadeExpression(CascadeExpression node) => null;
 
+  @override
   R visitCatchClause(CatchClause node) => null;
 
+  @override
   R visitClassDeclaration(ClassDeclaration node) => null;
 
+  @override
   R visitClassTypeAlias(ClassTypeAlias node) => null;
 
+  @override
   R visitComment(Comment node) => null;
 
+  @override
   R visitCommentReference(CommentReference node) => null;
 
+  @override
   R visitCompilationUnit(CompilationUnit node) => null;
 
+  @override
   R visitConditionalExpression(ConditionalExpression node) => null;
 
+  @override
   R visitConstructorDeclaration(ConstructorDeclaration node) => null;
 
+  @override
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
 
+  @override
   R visitConstructorName(ConstructorName node) => null;
 
+  @override
   R visitContinueStatement(ContinueStatement node) => null;
 
+  @override
   R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
 
+  @override
   R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
 
+  @override
   R visitDoStatement(DoStatement node) => null;
 
+  @override
   R visitDoubleLiteral(DoubleLiteral node) => null;
 
+  @override
   R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
 
+  @override
   R visitEmptyStatement(EmptyStatement node) => null;
 
+  @override
   R visitExportDirective(ExportDirective node) => null;
 
+  @override
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
 
+  @override
   R visitExpressionStatement(ExpressionStatement node) => null;
 
+  @override
   R visitExtendsClause(ExtendsClause node) => null;
 
+  @override
   R visitFieldDeclaration(FieldDeclaration node) => null;
 
+  @override
   R visitFieldFormalParameter(FieldFormalParameter node) => null;
 
+  @override
   R visitForEachStatement(ForEachStatement node) => null;
 
+  @override
   R visitFormalParameterList(FormalParameterList node) => null;
 
+  @override
   R visitForStatement(ForStatement node) => null;
 
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node) => null;
 
+  @override
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => null;
 
+  @override
   R visitFunctionExpression(FunctionExpression node) => null;
 
+  @override
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
 
+  @override
   R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
 
+  @override
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => null;
 
+  @override
   R visitHideCombinator(HideCombinator node) => null;
 
+  @override
   R visitIfStatement(IfStatement node) => null;
 
+  @override
   R visitImplementsClause(ImplementsClause node) => null;
 
+  @override
   R visitImportDirective(ImportDirective node) => null;
 
+  @override
   R visitIndexExpression(IndexExpression node) => null;
 
+  @override
   R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
 
+  @override
   R visitIntegerLiteral(IntegerLiteral node) => null;
 
+  @override
   R visitInterpolationExpression(InterpolationExpression node) => null;
 
+  @override
   R visitInterpolationString(InterpolationString node) => null;
 
+  @override
   R visitIsExpression(IsExpression node) => null;
 
+  @override
   R visitLabel(Label node) => null;
 
+  @override
   R visitLabeledStatement(LabeledStatement node) => null;
 
+  @override
   R visitLibraryDirective(LibraryDirective node) => null;
 
+  @override
   R visitLibraryIdentifier(LibraryIdentifier node) => null;
 
+  @override
   R visitListLiteral(ListLiteral node) => null;
 
+  @override
   R visitMapLiteral(MapLiteral node) => null;
 
+  @override
   R visitMapLiteralEntry(MapLiteralEntry node) => null;
 
+  @override
   R visitMethodDeclaration(MethodDeclaration node) => null;
 
+  @override
   R visitMethodInvocation(MethodInvocation node) => null;
 
+  @override
   R visitNamedExpression(NamedExpression node) => null;
 
+  @override
   R visitNativeClause(NativeClause node) => null;
 
+  @override
   R visitNativeFunctionBody(NativeFunctionBody node) => null;
 
+  @override
   R visitNullLiteral(NullLiteral node) => null;
 
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) => null;
 
+  @override
   R visitPartDirective(PartDirective node) => null;
 
+  @override
   R visitPartOfDirective(PartOfDirective node) => null;
 
+  @override
   R visitPostfixExpression(PostfixExpression node) => null;
 
+  @override
   R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
 
+  @override
   R visitPrefixExpression(PrefixExpression node) => null;
 
+  @override
   R visitPropertyAccess(PropertyAccess node) => null;
 
+  @override
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => null;
 
+  @override
   R visitRethrowExpression(RethrowExpression node) => null;
 
+  @override
   R visitReturnStatement(ReturnStatement node) => null;
 
+  @override
   R visitScriptTag(ScriptTag node) => null;
 
+  @override
   R visitShowCombinator(ShowCombinator node) => null;
 
+  @override
   R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
 
+  @override
   R visitSimpleIdentifier(SimpleIdentifier node) => null;
 
+  @override
   R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
 
+  @override
   R visitStringInterpolation(StringInterpolation node) => null;
 
+  @override
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
 
+  @override
   R visitSuperExpression(SuperExpression node) => null;
 
+  @override
   R visitSwitchCase(SwitchCase node) => null;
 
+  @override
   R visitSwitchDefault(SwitchDefault node) => null;
 
+  @override
   R visitSwitchStatement(SwitchStatement node) => null;
 
+  @override
   R visitSymbolLiteral(SymbolLiteral node) => null;
 
+  @override
   R visitThisExpression(ThisExpression node) => null;
 
+  @override
   R visitThrowExpression(ThrowExpression node) => null;
 
+  @override
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
 
+  @override
   R visitTryStatement(TryStatement node) => null;
 
+  @override
   R visitTypeArgumentList(TypeArgumentList node) => null;
 
+  @override
   R visitTypeName(TypeName node) => null;
 
+  @override
   R visitTypeParameter(TypeParameter node) => null;
 
+  @override
   R visitTypeParameterList(TypeParameterList node) => null;
 
+  @override
   R visitVariableDeclaration(VariableDeclaration node) => null;
 
+  @override
   R visitVariableDeclarationList(VariableDeclarationList node) => null;
 
+  @override
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => null;
 
+  @override
   R visitWhileStatement(WhileStatement node) => null;
 
+  @override
   R visitWithClause(WithClause node) => null;
 }
 
@@ -13351,299 +14205,343 @@
     this._writer = writer;
   }
 
+  @override
   Object visitAdjacentStrings(AdjacentStrings node) {
-    visitNodeListWithSeparator(node.strings, " ");
+    _visitNodeListWithSeparator(node.strings, " ");
     return null;
   }
 
+  @override
   Object visitAnnotation(Annotation node) {
     _writer.print('@');
-    visitNode(node.name);
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.arguments);
+    _visitNode(node.name);
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.arguments);
     return null;
   }
 
+  @override
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     _writer.print('?');
-    visitNode(node.identifier);
+    _visitNode(node.identifier);
     return null;
   }
 
+  @override
   Object visitArgumentList(ArgumentList node) {
     _writer.print('(');
-    visitNodeListWithSeparator(node.arguments, ", ");
+    _visitNodeListWithSeparator(node.arguments, ", ");
     _writer.print(')');
     return null;
   }
 
+  @override
   Object visitAsExpression(AsExpression node) {
-    visitNode(node.expression);
+    _visitNode(node.expression);
     _writer.print(" as ");
-    visitNode(node.type);
+    _visitNode(node.type);
     return null;
   }
 
+  @override
   Object visitAssertStatement(AssertStatement node) {
     _writer.print("assert (");
-    visitNode(node.condition);
+    _visitNode(node.condition);
     _writer.print(");");
     return null;
   }
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
-    visitNode(node.leftHandSide);
+    _visitNode(node.leftHandSide);
     _writer.print(' ');
     _writer.print(node.operator.lexeme);
     _writer.print(' ');
-    visitNode(node.rightHandSide);
+    _visitNode(node.rightHandSide);
     return null;
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
-    visitNode(node.leftOperand);
+    _visitNode(node.leftOperand);
     _writer.print(' ');
     _writer.print(node.operator.lexeme);
     _writer.print(' ');
-    visitNode(node.rightOperand);
+    _visitNode(node.rightOperand);
     return null;
   }
 
+  @override
   Object visitBlock(Block node) {
     _writer.print('{');
-    visitNodeListWithSeparator(node.statements, " ");
+    _visitNodeListWithSeparator(node.statements, " ");
     _writer.print('}');
     return null;
   }
 
+  @override
   Object visitBlockFunctionBody(BlockFunctionBody node) {
-    visitNode(node.block);
+    _visitNode(node.block);
     return null;
   }
 
+  @override
   Object visitBooleanLiteral(BooleanLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
 
+  @override
   Object visitBreakStatement(BreakStatement node) {
     _writer.print("break");
-    visitNodeWithPrefix(" ", node.label);
+    _visitNodeWithPrefix(" ", node.label);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitCascadeExpression(CascadeExpression node) {
-    visitNode(node.target);
-    visitNodeList(node.cascadeSections);
+    _visitNode(node.target);
+    _visitNodeList(node.cascadeSections);
     return null;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
-    visitNodeWithPrefix("on ", node.exceptionType);
+    _visitNodeWithPrefix("on ", node.exceptionType);
     if (node.catchKeyword != null) {
       if (node.exceptionType != null) {
         _writer.print(' ');
       }
       _writer.print("catch (");
-      visitNode(node.exceptionParameter);
-      visitNodeWithPrefix(", ", node.stackTraceParameter);
+      _visitNode(node.exceptionParameter);
+      _visitNodeWithPrefix(", ", node.stackTraceParameter);
       _writer.print(") ");
     } else {
       _writer.print(" ");
     }
-    visitNode(node.body);
+    _visitNode(node.body);
     return null;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    visitTokenWithSuffix(node.abstractKeyword, " ");
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.abstractKeyword, " ");
     _writer.print("class ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
-    visitNodeWithPrefix(" ", node.extendsClause);
-    visitNodeWithPrefix(" ", node.withClause);
-    visitNodeWithPrefix(" ", node.implementsClause);
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNodeWithPrefix(" ", node.extendsClause);
+    _visitNodeWithPrefix(" ", node.withClause);
+    _visitNodeWithPrefix(" ", node.implementsClause);
     _writer.print(" {");
-    visitNodeListWithSeparator(node.members, " ");
+    _visitNodeListWithSeparator(node.members, " ");
     _writer.print("}");
     return null;
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     if (node.abstractKeyword != null) {
       _writer.print("abstract ");
     }
     _writer.print("class ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
     _writer.print(" = ");
-    visitNode(node.superclass);
-    visitNodeWithPrefix(" ", node.withClause);
-    visitNodeWithPrefix(" ", node.implementsClause);
+    _visitNode(node.superclass);
+    _visitNodeWithPrefix(" ", node.withClause);
+    _visitNodeWithPrefix(" ", node.implementsClause);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitComment(Comment node) => null;
 
+  @override
   Object visitCommentReference(CommentReference node) => null;
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     ScriptTag scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
-    visitNode(scriptTag);
+    _visitNode(scriptTag);
     String prefix = scriptTag == null ? "" : " ";
-    visitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
+    _visitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
     prefix = scriptTag == null && directives.isEmpty ? "" : " ";
-    visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
+    _visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
     return null;
   }
 
+  @override
   Object visitConditionalExpression(ConditionalExpression node) {
-    visitNode(node.condition);
+    _visitNode(node.condition);
     _writer.print(" ? ");
-    visitNode(node.thenExpression);
+    _visitNode(node.thenExpression);
     _writer.print(" : ");
-    visitNode(node.elseExpression);
+    _visitNode(node.elseExpression);
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    visitTokenWithSuffix(node.externalKeyword, " ");
-    visitTokenWithSuffix(node.constKeyword, " ");
-    visitTokenWithSuffix(node.factoryKeyword, " ");
-    visitNode(node.returnType);
-    visitNodeWithPrefix(".", node.name);
-    visitNode(node.parameters);
-    visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
-    visitNodeWithPrefix(" = ", node.redirectedConstructor);
-    visitFunctionWithPrefix(" ", node.body);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.externalKeyword, " ");
+    _visitTokenWithSuffix(node.constKeyword, " ");
+    _visitTokenWithSuffix(node.factoryKeyword, " ");
+    _visitNode(node.returnType);
+    _visitNodeWithPrefix(".", node.name);
+    _visitNode(node.parameters);
+    _visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
+    _visitNodeWithPrefix(" = ", node.redirectedConstructor);
+    _visitFunctionWithPrefix(" ", node.body);
     return null;
   }
 
+  @override
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    visitTokenWithSuffix(node.keyword, ".");
-    visitNode(node.fieldName);
+    _visitTokenWithSuffix(node.keyword, ".");
+    _visitNode(node.fieldName);
     _writer.print(" = ");
-    visitNode(node.expression);
+    _visitNode(node.expression);
     return null;
   }
 
+  @override
   Object visitConstructorName(ConstructorName node) {
-    visitNode(node.type);
-    visitNodeWithPrefix(".", node.name);
+    _visitNode(node.type);
+    _visitNodeWithPrefix(".", node.name);
     return null;
   }
 
+  @override
   Object visitContinueStatement(ContinueStatement node) {
     _writer.print("continue");
-    visitNodeWithPrefix(" ", node.label);
+    _visitNodeWithPrefix(" ", node.label);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNode(node.identifier);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNode(node.identifier);
     return null;
   }
 
+  @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    visitNode(node.parameter);
+    _visitNode(node.parameter);
     if (node.separator != null) {
       _writer.print(" ");
       _writer.print(node.separator.lexeme);
-      visitNodeWithPrefix(" ", node.defaultValue);
+      _visitNodeWithPrefix(" ", node.defaultValue);
     }
     return null;
   }
 
+  @override
   Object visitDoStatement(DoStatement node) {
     _writer.print("do ");
-    visitNode(node.body);
+    _visitNode(node.body);
     _writer.print(" while (");
-    visitNode(node.condition);
+    _visitNode(node.condition);
     _writer.print(");");
     return null;
   }
 
+  @override
   Object visitDoubleLiteral(DoubleLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
 
+  @override
   Object visitEmptyFunctionBody(EmptyFunctionBody node) {
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitEmptyStatement(EmptyStatement node) {
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("export ");
-    visitNode(node.uri);
-    visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+    _visitNode(node.uri);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _writer.print("=> ");
-    visitNode(node.expression);
+    _visitNode(node.expression);
     if (node.semicolon != null) {
       _writer.print(';');
     }
     return null;
   }
 
+  @override
   Object visitExpressionStatement(ExpressionStatement node) {
-    visitNode(node.expression);
+    _visitNode(node.expression);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitExtendsClause(ExtendsClause node) {
     _writer.print("extends ");
-    visitNode(node.superclass);
+    _visitNode(node.superclass);
     return null;
   }
 
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
-    visitTokenWithSuffix(node.staticKeyword, " ");
-    visitNode(node.fields);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.staticKeyword, " ");
+    _visitNode(node.fields);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
     _writer.print("this.");
-    visitNode(node.identifier);
-    visitNode(node.parameters);
+    _visitNode(node.identifier);
+    _visitNode(node.parameters);
     return null;
   }
 
+  @override
   Object visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     _writer.print("for (");
     if (loopVariable == null) {
-      visitNode(node.identifier);
+      _visitNode(node.identifier);
     } else {
-      visitNode(loopVariable);
+      _visitNode(loopVariable);
     }
     _writer.print(" in ");
-    visitNode(node.iterator);
+    _visitNode(node.iterator);
     _writer.print(") ");
-    visitNode(node.body);
+    _visitNode(node.body);
     return null;
   }
 
+  @override
   Object visitFormalParameterList(FormalParameterList node) {
     String groupEnd = null;
     _writer.print('(');
@@ -13672,316 +14570,363 @@
     return null;
   }
 
+  @override
   Object visitForStatement(ForStatement node) {
     Expression initialization = node.initialization;
     _writer.print("for (");
     if (initialization != null) {
-      visitNode(initialization);
+      _visitNode(initialization);
     } else {
-      visitNode(node.variables);
+      _visitNode(node.variables);
     }
     _writer.print(";");
-    visitNodeWithPrefix(" ", node.condition);
+    _visitNodeWithPrefix(" ", node.condition);
     _writer.print(";");
-    visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
+    _visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
     _writer.print(") ");
-    visitNode(node.body);
+    _visitNode(node.body);
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    visitNodeWithSuffix(node.returnType, " ");
-    visitTokenWithSuffix(node.propertyKeyword, " ");
-    visitNode(node.name);
-    visitNode(node.functionExpression);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitTokenWithSuffix(node.propertyKeyword, " ");
+    _visitNode(node.name);
+    _visitNode(node.functionExpression);
     return null;
   }
 
+  @override
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    visitNode(node.functionDeclaration);
+    _visitNode(node.functionDeclaration);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
-    visitNode(node.parameters);
+    _visitNode(node.parameters);
     _writer.print(' ');
-    visitNode(node.body);
+    _visitNode(node.body);
     return null;
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    visitNode(node.function);
-    visitNode(node.argumentList);
+    _visitNode(node.function);
+    _visitNode(node.argumentList);
     return null;
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("typedef ");
-    visitNodeWithSuffix(node.returnType, " ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
-    visitNode(node.parameters);
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    visitNodeWithSuffix(node.returnType, " ");
-    visitNode(node.identifier);
-    visitNode(node.parameters);
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitNode(node.identifier);
+    _visitNode(node.parameters);
     return null;
   }
 
+  @override
   Object visitHideCombinator(HideCombinator node) {
     _writer.print("hide ");
-    visitNodeListWithSeparator(node.hiddenNames, ", ");
+    _visitNodeListWithSeparator(node.hiddenNames, ", ");
     return null;
   }
 
+  @override
   Object visitIfStatement(IfStatement node) {
     _writer.print("if (");
-    visitNode(node.condition);
+    _visitNode(node.condition);
     _writer.print(") ");
-    visitNode(node.thenStatement);
-    visitNodeWithPrefix(" else ", node.elseStatement);
+    _visitNode(node.thenStatement);
+    _visitNodeWithPrefix(" else ", node.elseStatement);
     return null;
   }
 
+  @override
   Object visitImplementsClause(ImplementsClause node) {
     _writer.print("implements ");
-    visitNodeListWithSeparator(node.interfaces, ", ");
+    _visitNodeListWithSeparator(node.interfaces, ", ");
     return null;
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("import ");
-    visitNode(node.uri);
-    visitNodeWithPrefix(" as ", node.prefix);
-    visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+    _visitNode(node.uri);
+    _visitNodeWithPrefix(" as ", node.prefix);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
-      visitNode(node.target);
+      _visitNode(node.target);
     }
     _writer.print('[');
-    visitNode(node.index);
+    _visitNode(node.index);
     _writer.print(']');
     return null;
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNode(node.constructorName);
-    visitNode(node.argumentList);
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNode(node.constructorName);
+    _visitNode(node.argumentList);
     return null;
   }
 
+  @override
   Object visitIntegerLiteral(IntegerLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
 
+  @override
   Object visitInterpolationExpression(InterpolationExpression node) {
     if (node.rightBracket != null) {
       _writer.print("\${");
-      visitNode(node.expression);
+      _visitNode(node.expression);
       _writer.print("}");
     } else {
       _writer.print("\$");
-      visitNode(node.expression);
+      _visitNode(node.expression);
     }
     return null;
   }
 
+  @override
   Object visitInterpolationString(InterpolationString node) {
     _writer.print(node.contents.lexeme);
     return null;
   }
 
+  @override
   Object visitIsExpression(IsExpression node) {
-    visitNode(node.expression);
+    _visitNode(node.expression);
     if (node.notOperator == null) {
       _writer.print(" is ");
     } else {
       _writer.print(" is! ");
     }
-    visitNode(node.type);
+    _visitNode(node.type);
     return null;
   }
 
+  @override
   Object visitLabel(Label node) {
-    visitNode(node.label);
+    _visitNode(node.label);
     _writer.print(":");
     return null;
   }
 
+  @override
   Object visitLabeledStatement(LabeledStatement node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
-    visitNode(node.statement);
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _visitNode(node.statement);
     return null;
   }
 
+  @override
   Object visitLibraryDirective(LibraryDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("library ");
-    visitNode(node.name);
+    _visitNode(node.name);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitLibraryIdentifier(LibraryIdentifier node) {
     _writer.print(node.name);
     return null;
   }
 
+  @override
   Object visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
-    visitNodeWithSuffix(node.typeArguments, " ");
+    _visitNodeWithSuffix(node.typeArguments, " ");
     _writer.print("[");
-    visitNodeListWithSeparator(node.elements, ", ");
+    _visitNodeListWithSeparator(node.elements, ", ");
     _writer.print("]");
     return null;
   }
 
+  @override
   Object visitMapLiteral(MapLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
-    visitNodeWithSuffix(node.typeArguments, " ");
+    _visitNodeWithSuffix(node.typeArguments, " ");
     _writer.print("{");
-    visitNodeListWithSeparator(node.entries, ", ");
+    _visitNodeListWithSeparator(node.entries, ", ");
     _writer.print("}");
     return null;
   }
 
+  @override
   Object visitMapLiteralEntry(MapLiteralEntry node) {
-    visitNode(node.key);
+    _visitNode(node.key);
     _writer.print(" : ");
-    visitNode(node.value);
+    _visitNode(node.value);
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    visitTokenWithSuffix(node.externalKeyword, " ");
-    visitTokenWithSuffix(node.modifierKeyword, " ");
-    visitNodeWithSuffix(node.returnType, " ");
-    visitTokenWithSuffix(node.propertyKeyword, " ");
-    visitTokenWithSuffix(node.operatorKeyword, " ");
-    visitNode(node.name);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.externalKeyword, " ");
+    _visitTokenWithSuffix(node.modifierKeyword, " ");
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitTokenWithSuffix(node.propertyKeyword, " ");
+    _visitTokenWithSuffix(node.operatorKeyword, " ");
+    _visitNode(node.name);
     if (!node.isGetter) {
-      visitNode(node.parameters);
+      _visitNode(node.parameters);
     }
-    visitFunctionWithPrefix(" ", node.body);
+    _visitFunctionWithPrefix(" ", node.body);
     return null;
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
-      visitNodeWithSuffix(node.target, ".");
+      _visitNodeWithSuffix(node.target, ".");
     }
-    visitNode(node.methodName);
-    visitNode(node.argumentList);
+    _visitNode(node.methodName);
+    _visitNode(node.argumentList);
     return null;
   }
 
+  @override
   Object visitNamedExpression(NamedExpression node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" ", node.expression);
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" ", node.expression);
     return null;
   }
 
+  @override
   Object visitNativeClause(NativeClause node) {
     _writer.print("native ");
-    visitNode(node.name);
+    _visitNode(node.name);
     return null;
   }
 
+  @override
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     _writer.print("native ");
-    visitNode(node.stringLiteral);
+    _visitNode(node.stringLiteral);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitNullLiteral(NullLiteral node) {
     _writer.print("null");
     return null;
   }
 
+  @override
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     _writer.print('(');
-    visitNode(node.expression);
+    _visitNode(node.expression);
     _writer.print(')');
     return null;
   }
 
+  @override
   Object visitPartDirective(PartDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("part ");
-    visitNode(node.uri);
+    _visitNode(node.uri);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitPartOfDirective(PartOfDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("part of ");
-    visitNode(node.libraryName);
+    _visitNode(node.libraryName);
     _writer.print(';');
     return null;
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
-    visitNode(node.operand);
+    _visitNode(node.operand);
     _writer.print(node.operator.lexeme);
     return null;
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    visitNode(node.prefix);
+    _visitNode(node.prefix);
     _writer.print('.');
-    visitNode(node.identifier);
+    _visitNode(node.identifier);
     return null;
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     _writer.print(node.operator.lexeme);
-    visitNode(node.operand);
+    _visitNode(node.operand);
     return null;
   }
 
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
-      visitNode(node.target);
+      _visitNode(node.target);
       _writer.print('.');
     }
-    visitNode(node.propertyName);
+    _visitNode(node.propertyName);
     return null;
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     _writer.print("this");
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.argumentList);
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.argumentList);
     return null;
   }
 
+  @override
   Object visitRethrowExpression(RethrowExpression node) {
     _writer.print("rethrow");
     return null;
   }
 
+  @override
   Object visitReturnStatement(ReturnStatement node) {
     Expression expression = node.expression;
     if (expression == null) {
@@ -13994,76 +14939,88 @@
     return null;
   }
 
+  @override
   Object visitScriptTag(ScriptTag node) {
     _writer.print(node.scriptTag.lexeme);
     return null;
   }
 
+  @override
   Object visitShowCombinator(ShowCombinator node) {
     _writer.print("show ");
-    visitNodeListWithSeparator(node.shownNames, ", ");
+    _visitNodeListWithSeparator(node.shownNames, ", ");
     return null;
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNode(node.identifier);
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNode(node.identifier);
     return null;
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     _writer.print(node.token.lexeme);
     return null;
   }
 
+  @override
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
     _writer.print(node.literal.lexeme);
     return null;
   }
 
+  @override
   Object visitStringInterpolation(StringInterpolation node) {
-    visitNodeList(node.elements);
+    _visitNodeList(node.elements);
     return null;
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _writer.print("super");
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.argumentList);
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.argumentList);
     return null;
   }
 
+  @override
   Object visitSuperExpression(SuperExpression node) {
     _writer.print("super");
     return null;
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     _writer.print("case ");
-    visitNode(node.expression);
+    _visitNode(node.expression);
     _writer.print(": ");
-    visitNodeListWithSeparator(node.statements, " ");
+    _visitNodeListWithSeparator(node.statements, " ");
     return null;
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     _writer.print("default: ");
-    visitNodeListWithSeparator(node.statements, " ");
+    _visitNodeListWithSeparator(node.statements, " ");
     return null;
   }
 
+  @override
   Object visitSwitchStatement(SwitchStatement node) {
     _writer.print("switch (");
-    visitNode(node.expression);
+    _visitNode(node.expression);
     _writer.print(") {");
-    visitNodeListWithSeparator(node.members, " ");
+    _visitNodeListWithSeparator(node.members, " ");
     _writer.print("}");
     return null;
   }
 
+  @override
   Object visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
     List<Token> components = node.components;
@@ -14076,86 +15033,102 @@
     return null;
   }
 
+  @override
   Object visitThisExpression(ThisExpression node) {
     _writer.print("this");
     return null;
   }
 
+  @override
   Object visitThrowExpression(ThrowExpression node) {
     _writer.print("throw ");
-    visitNode(node.expression);
+    _visitNode(node.expression);
     return null;
   }
 
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    visitNodeWithSuffix(node.variables, ";");
+    _visitNodeWithSuffix(node.variables, ";");
     return null;
   }
 
+  @override
   Object visitTryStatement(TryStatement node) {
     _writer.print("try ");
-    visitNode(node.body);
-    visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
-    visitNodeWithPrefix(" finally ", node.finallyBlock);
+    _visitNode(node.body);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
+    _visitNodeWithPrefix(" finally ", node.finallyBlock);
     return null;
   }
 
+  @override
   Object visitTypeArgumentList(TypeArgumentList node) {
     _writer.print('<');
-    visitNodeListWithSeparator(node.arguments, ", ");
+    _visitNodeListWithSeparator(node.arguments, ", ");
     _writer.print('>');
     return null;
   }
 
+  @override
   Object visitTypeName(TypeName node) {
-    visitNode(node.name);
-    visitNode(node.typeArguments);
+    _visitNode(node.name);
+    _visitNode(node.typeArguments);
     return null;
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" extends ", node.bound);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" extends ", node.bound);
     return null;
   }
 
+  @override
   Object visitTypeParameterList(TypeParameterList node) {
     _writer.print('<');
-    visitNodeListWithSeparator(node.typeParameters, ", ");
+    _visitNodeListWithSeparator(node.typeParameters, ", ");
     _writer.print('>');
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" = ", node.initializer);
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" = ", node.initializer);
     return null;
   }
 
+  @override
   Object visitVariableDeclarationList(VariableDeclarationList node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNodeListWithSeparator(node.variables, ", ");
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNodeListWithSeparator(node.variables, ", ");
     return null;
   }
 
+  @override
   Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    visitNode(node.variables);
+    _visitNode(node.variables);
     _writer.print(";");
     return null;
   }
 
+  @override
   Object visitWhileStatement(WhileStatement node) {
     _writer.print("while (");
-    visitNode(node.condition);
+    _visitNode(node.condition);
     _writer.print(") ");
-    visitNode(node.body);
+    _visitNode(node.body);
     return null;
   }
 
+  @override
   Object visitWithClause(WithClause node) {
     _writer.print("with ");
-    visitNodeListWithSeparator(node.mixinTypes, ", ");
+    _visitNodeListWithSeparator(node.mixinTypes, ", ");
     return null;
   }
 
@@ -14165,11 +15138,11 @@
    * @param prefix the prefix to be printed if there is a node to visit
    * @param body the function body to be visited
    */
-  void visitFunctionWithPrefix(String prefix, FunctionBody body) {
+  void _visitFunctionWithPrefix(String prefix, FunctionBody body) {
     if (body is! EmptyFunctionBody) {
       _writer.print(prefix);
     }
-    visitNode(body);
+    _visitNode(body);
   }
 
   /**
@@ -14177,7 +15150,7 @@
    *
    * @param node the node to be visited
    */
-  void visitNode(AstNode node) {
+  void _visitNode(AstNode node) {
     if (node != null) {
       node.accept(this);
     }
@@ -14189,8 +15162,8 @@
    * @param nodes the nodes to be printed
    * @param separator the separator to be printed between adjacent nodes
    */
-  void visitNodeList(NodeList<AstNode> nodes) {
-    visitNodeListWithSeparator(nodes, "");
+  void _visitNodeList(NodeList<AstNode> nodes) {
+    _visitNodeListWithSeparator(nodes, "");
   }
 
   /**
@@ -14199,7 +15172,7 @@
    * @param nodes the nodes to be printed
    * @param separator the separator to be printed between adjacent nodes
    */
-  void visitNodeListWithSeparator(NodeList<AstNode> nodes, String separator) {
+  void _visitNodeListWithSeparator(NodeList<AstNode> nodes, String separator) {
     if (nodes != null) {
       int size = nodes.length;
       for (int i = 0; i < size; i++) {
@@ -14218,7 +15191,7 @@
    * @param nodes the nodes to be printed
    * @param separator the separator to be printed between adjacent nodes
    */
-  void visitNodeListWithSeparatorAndPrefix(String prefix, NodeList<AstNode> nodes, String separator) {
+  void _visitNodeListWithSeparatorAndPrefix(String prefix, NodeList<AstNode> nodes, String separator) {
     if (nodes != null) {
       int size = nodes.length;
       if (size > 0) {
@@ -14240,7 +15213,7 @@
    * @param separator the separator to be printed between adjacent nodes
    * @param suffix the suffix to be printed if the list is not empty
    */
-  void visitNodeListWithSeparatorAndSuffix(NodeList<AstNode> nodes, String separator, String suffix) {
+  void _visitNodeListWithSeparatorAndSuffix(NodeList<AstNode> nodes, String separator, String suffix) {
     if (nodes != null) {
       int size = nodes.length;
       if (size > 0) {
@@ -14261,7 +15234,7 @@
    * @param prefix the prefix to be printed if there is a node to visit
    * @param node the node to be visited
    */
-  void visitNodeWithPrefix(String prefix, AstNode node) {
+  void _visitNodeWithPrefix(String prefix, AstNode node) {
     if (node != null) {
       _writer.print(prefix);
       node.accept(this);
@@ -14274,7 +15247,7 @@
    * @param suffix the suffix to be printed if there is a node to visit
    * @param node the node to be visited
    */
-  void visitNodeWithSuffix(AstNode node, String suffix) {
+  void _visitNodeWithSuffix(AstNode node, String suffix) {
     if (node != null) {
       node.accept(this);
       _writer.print(suffix);
@@ -14287,7 +15260,7 @@
    * @param suffix the suffix to be printed if there is a node to visit
    * @param node the node to be visited
    */
-  void visitTokenWithSuffix(Token token, String suffix) {
+  void _visitTokenWithSuffix(Token token, String suffix) {
     if (token != null) {
       _writer.print(token.lexeme);
       _writer.print(suffix);
@@ -14306,138 +15279,205 @@
  * cause the children of the visited node to not be visited.
  */
 class UnifyingAstVisitor<R> implements AstVisitor<R> {
+  @override
   R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
 
+  @override
   R visitAnnotation(Annotation node) => visitNode(node);
 
+  @override
   R visitArgumentDefinitionTest(ArgumentDefinitionTest node) => visitNode(node);
 
+  @override
   R visitArgumentList(ArgumentList node) => visitNode(node);
 
+  @override
   R visitAsExpression(AsExpression node) => visitNode(node);
 
+  @override
   R visitAssertStatement(AssertStatement node) => visitNode(node);
 
+  @override
   R visitAssignmentExpression(AssignmentExpression node) => visitNode(node);
 
+  @override
   R visitBinaryExpression(BinaryExpression node) => visitNode(node);
 
+  @override
   R visitBlock(Block node) => visitNode(node);
 
+  @override
   R visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node);
 
+  @override
   R visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
 
+  @override
   R visitBreakStatement(BreakStatement node) => visitNode(node);
 
+  @override
   R visitCascadeExpression(CascadeExpression node) => visitNode(node);
 
+  @override
   R visitCatchClause(CatchClause node) => visitNode(node);
 
+  @override
   R visitClassDeclaration(ClassDeclaration node) => visitNode(node);
 
+  @override
   R visitClassTypeAlias(ClassTypeAlias node) => visitNode(node);
 
+  @override
   R visitComment(Comment node) => visitNode(node);
 
+  @override
   R visitCommentReference(CommentReference node) => visitNode(node);
 
+  @override
   R visitCompilationUnit(CompilationUnit node) => visitNode(node);
 
+  @override
   R visitConditionalExpression(ConditionalExpression node) => visitNode(node);
 
+  @override
   R visitConstructorDeclaration(ConstructorDeclaration node) => visitNode(node);
 
+  @override
   R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => visitNode(node);
 
+  @override
   R visitConstructorName(ConstructorName node) => visitNode(node);
 
+  @override
   R visitContinueStatement(ContinueStatement node) => visitNode(node);
 
+  @override
   R visitDeclaredIdentifier(DeclaredIdentifier node) => visitNode(node);
 
+  @override
   R visitDefaultFormalParameter(DefaultFormalParameter node) => visitNode(node);
 
+  @override
   R visitDoStatement(DoStatement node) => visitNode(node);
 
+  @override
   R visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
 
+  @override
   R visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
 
+  @override
   R visitEmptyStatement(EmptyStatement node) => visitNode(node);
 
+  @override
   R visitExportDirective(ExportDirective node) => visitNode(node);
 
+  @override
   R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitNode(node);
 
+  @override
   R visitExpressionStatement(ExpressionStatement node) => visitNode(node);
 
+  @override
   R visitExtendsClause(ExtendsClause node) => visitNode(node);
 
+  @override
   R visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
 
+  @override
   R visitFieldFormalParameter(FieldFormalParameter node) => visitNode(node);
 
+  @override
   R visitForEachStatement(ForEachStatement node) => visitNode(node);
 
+  @override
   R visitFormalParameterList(FormalParameterList node) => visitNode(node);
 
+  @override
   R visitForStatement(ForStatement node) => visitNode(node);
 
+  @override
   R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
 
+  @override
   R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => visitNode(node);
 
+  @override
   R visitFunctionExpression(FunctionExpression node) => visitNode(node);
 
+  @override
   R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => visitNode(node);
 
+  @override
   R visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
 
+  @override
   R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => visitNode(node);
 
+  @override
   R visitHideCombinator(HideCombinator node) => visitNode(node);
 
+  @override
   R visitIfStatement(IfStatement node) => visitNode(node);
 
+  @override
   R visitImplementsClause(ImplementsClause node) => visitNode(node);
 
+  @override
   R visitImportDirective(ImportDirective node) => visitNode(node);
 
+  @override
   R visitIndexExpression(IndexExpression node) => visitNode(node);
 
+  @override
   R visitInstanceCreationExpression(InstanceCreationExpression node) => visitNode(node);
 
+  @override
   R visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
 
+  @override
   R visitInterpolationExpression(InterpolationExpression node) => visitNode(node);
 
+  @override
   R visitInterpolationString(InterpolationString node) => visitNode(node);
 
+  @override
   R visitIsExpression(IsExpression node) => visitNode(node);
 
+  @override
   R visitLabel(Label node) => visitNode(node);
 
+  @override
   R visitLabeledStatement(LabeledStatement node) => visitNode(node);
 
+  @override
   R visitLibraryDirective(LibraryDirective node) => visitNode(node);
 
+  @override
   R visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node);
 
+  @override
   R visitListLiteral(ListLiteral node) => visitNode(node);
 
+  @override
   R visitMapLiteral(MapLiteral node) => visitNode(node);
 
+  @override
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
 
+  @override
   R visitMethodDeclaration(MethodDeclaration node) => visitNode(node);
 
+  @override
   R visitMethodInvocation(MethodInvocation node) => visitNode(node);
 
+  @override
   R visitNamedExpression(NamedExpression node) => visitNode(node);
 
+  @override
   R visitNativeClause(NativeClause node) => visitNode(node);
 
+  @override
   R visitNativeFunctionBody(NativeFunctionBody node) => visitNode(node);
 
   R visitNode(AstNode node) {
@@ -14445,76 +15485,112 @@
     return null;
   }
 
+  @override
   R visitNullLiteral(NullLiteral node) => visitNode(node);
 
+  @override
   R visitParenthesizedExpression(ParenthesizedExpression node) => visitNode(node);
 
+  @override
   R visitPartDirective(PartDirective node) => visitNode(node);
 
+  @override
   R visitPartOfDirective(PartOfDirective node) => visitNode(node);
 
+  @override
   R visitPostfixExpression(PostfixExpression node) => visitNode(node);
 
+  @override
   R visitPrefixedIdentifier(PrefixedIdentifier node) => visitNode(node);
 
+  @override
   R visitPrefixExpression(PrefixExpression node) => visitNode(node);
 
+  @override
   R visitPropertyAccess(PropertyAccess node) => visitNode(node);
 
+  @override
   R visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => visitNode(node);
 
+  @override
   R visitRethrowExpression(RethrowExpression node) => visitNode(node);
 
+  @override
   R visitReturnStatement(ReturnStatement node) => visitNode(node);
 
+  @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
+  @override
   R visitShowCombinator(ShowCombinator node) => visitNode(node);
 
+  @override
   R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
 
+  @override
   R visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
 
+  @override
   R visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
 
+  @override
   R visitStringInterpolation(StringInterpolation node) => visitNode(node);
 
+  @override
   R visitSuperConstructorInvocation(SuperConstructorInvocation node) => visitNode(node);
 
+  @override
   R visitSuperExpression(SuperExpression node) => visitNode(node);
 
+  @override
   R visitSwitchCase(SwitchCase node) => visitNode(node);
 
+  @override
   R visitSwitchDefault(SwitchDefault node) => visitNode(node);
 
+  @override
   R visitSwitchStatement(SwitchStatement node) => visitNode(node);
 
+  @override
   R visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
 
+  @override
   R visitThisExpression(ThisExpression node) => visitNode(node);
 
+  @override
   R visitThrowExpression(ThrowExpression node) => visitNode(node);
 
+  @override
   R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => visitNode(node);
 
+  @override
   R visitTryStatement(TryStatement node) => visitNode(node);
 
+  @override
   R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
 
+  @override
   R visitTypeName(TypeName node) => visitNode(node);
 
+  @override
   R visitTypeParameter(TypeParameter node) => visitNode(node);
 
+  @override
   R visitTypeParameterList(TypeParameterList node) => visitNode(node);
 
+  @override
   R visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
 
+  @override
   R visitVariableDeclarationList(VariableDeclarationList node) => visitNode(node);
 
+  @override
   R visitVariableDeclarationStatement(VariableDeclarationStatement node) => visitNode(node);
 
+  @override
   R visitWhileStatement(WhileStatement node) => visitNode(node);
 
+  @override
   R visitWithClause(WithClause node) => visitNode(node);
 }
 
@@ -14524,248 +15600,351 @@
  * results or properties associated with the nodes.
  */
 class AstCloner implements AstVisitor<AstNode> {
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(cloneNodeList(node.strings));
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
 
-  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, cloneNode(node.name), node.period, cloneNode(node.constructorName), cloneNode(node.arguments));
+  @override
+  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, _cloneNode(node.name), node.period, _cloneNode(node.constructorName), _cloneNode(node.arguments));
 
-  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, cloneNode(node.identifier));
+  @override
+  ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) => new ArgumentDefinitionTest(node.question, _cloneNode(node.identifier));
 
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, cloneNodeList(node.arguments), node.rightParenthesis);
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, _cloneNodeList(node.arguments), node.rightParenthesis);
 
-  AsExpression visitAsExpression(AsExpression node) => new AsExpression(cloneNode(node.expression), node.asOperator, cloneNode(node.type));
+  @override
+  AsExpression visitAsExpression(AsExpression node) => new AsExpression(_cloneNode(node.expression), node.asOperator, _cloneNode(node.type));
 
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
 
-  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(cloneNode(node.leftHandSide), node.operator, cloneNode(node.rightHandSide));
+  @override
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(_cloneNode(node.leftHandSide), node.operator, _cloneNode(node.rightHandSide));
 
-  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(cloneNode(node.leftOperand), node.operator, cloneNode(node.rightOperand));
+  @override
+  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(_cloneNode(node.leftOperand), node.operator, _cloneNode(node.rightOperand));
 
-  Block visitBlock(Block node) => new Block(node.leftBracket, cloneNodeList(node.statements), node.rightBracket);
+  @override
+  Block visitBlock(Block node) => new Block(node.leftBracket, _cloneNodeList(node.statements), node.rightBracket);
 
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(cloneNode(node.block));
+  @override
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
 
+  @override
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral(node.literal, node.value);
 
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, cloneNode(node.label), node.semicolon);
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, _cloneNode(node.label), node.semicolon);
 
-  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(cloneNode(node.target), cloneNodeList(node.cascadeSections));
+  @override
+  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
 
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, cloneNode(node.exceptionParameter), node.comma, cloneNode(node.stackTraceParameter), node.rightParenthesis, cloneNode(node.body));
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, _cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, _cloneNode(node.exceptionParameter), node.comma, _cloneNode(node.stackTraceParameter), node.rightParenthesis, _cloneNode(node.body));
 
+  @override
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.extendsClause), cloneNode(node.withClause), cloneNode(node.implementsClause), node.leftBracket, cloneNodeList(node.members), node.rightBracket);
-    copy.nativeClause = cloneNode(node.nativeClause);
+    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
+    copy.nativeClause = _cloneNode(node.nativeClause);
     return copy;
   }
 
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.name), cloneNode(node.typeParameters), node.equals, node.abstractKeyword, cloneNode(node.superclass), cloneNode(node.withClause), cloneNode(node.implementsClause), node.semicolon);
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.name), _cloneNode(node.typeParameters), node.equals, node.abstractKeyword, _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), node.semicolon);
 
+  @override
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(node.tokens, cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(node.tokens, _cloneNodeList(node.references));
     } else if (node.isBlock) {
       return Comment.createBlockComment(node.tokens);
     }
     return Comment.createEndOfLineComment(node.tokens);
   }
 
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, cloneNode(node.identifier));
+  @override
+  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, _cloneNode(node.identifier));
 
+  @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit clone = new CompilationUnit(node.beginToken, cloneNode(node.scriptTag), cloneNodeList(node.directives), cloneNodeList(node.declarations), node.endToken);
+    CompilationUnit clone = new CompilationUnit(node.beginToken, _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), node.endToken);
     clone.lineInfo = node.lineInfo;
     return clone;
   }
 
-  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(cloneNode(node.condition), node.question, cloneNode(node.thenExpression), node.colon, cloneNode(node.elseExpression));
+  @override
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(_cloneNode(node.condition), node.question, _cloneNode(node.thenExpression), node.colon, _cloneNode(node.elseExpression));
 
-  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, cloneNode(node.returnType), node.period, cloneNode(node.name), cloneNode(node.parameters), node.separator, cloneNodeList(node.initializers), cloneNode(node.redirectedConstructor), cloneNode(node.body));
+  @override
+  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, _cloneNode(node.returnType), node.period, _cloneNode(node.name), _cloneNode(node.parameters), node.separator, _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
 
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, cloneNode(node.fieldName), node.equals, cloneNode(node.expression));
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, _cloneNode(node.fieldName), node.equals, _cloneNode(node.expression));
 
-  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(cloneNode(node.type), node.period, cloneNode(node.name));
+  @override
+  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(_cloneNode(node.type), node.period, _cloneNode(node.name));
 
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, cloneNode(node.label), node.semicolon);
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, _cloneNode(node.label), node.semicolon);
 
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
 
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(cloneNode(node.parameter), node.kind, node.separator, cloneNode(node.defaultValue));
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, node.separator, _cloneNode(node.defaultValue));
 
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, cloneNode(node.body), node.whileKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, _cloneNode(node.body), node.whileKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, node.semicolon);
 
+  @override
   DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral(node.literal, node.value);
 
+  @override
   EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(node.semicolon);
 
+  @override
   EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(node.semicolon);
 
-  ExportDirective visitExportDirective(ExportDirective node) => new ExportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), cloneNodeList(node.combinators), node.semicolon);
+  @override
+  ExportDirective visitExportDirective(ExportDirective node) => new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), _cloneNodeList(node.combinators), node.semicolon);
 
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, cloneNode(node.expression), node.semicolon);
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.functionDefinition, _cloneNode(node.expression), node.semicolon);
 
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(cloneNode(node.expression), node.semicolon);
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), node.semicolon);
 
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, cloneNode(node.superclass));
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, _cloneNode(node.superclass));
 
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.staticKeyword, cloneNode(node.fields), node.semicolon);
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.staticKeyword, _cloneNode(node.fields), node.semicolon);
 
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), node.thisToken, node.period, cloneNode(node.identifier), cloneNode(node.parameters));
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), node.thisToken, node.period, _cloneNode(node.identifier), _cloneNode(node.parameters));
 
+  @override
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
-      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, cloneNode(node.identifier), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
+      return new ForEachStatement.con2(node.forKeyword, node.leftParenthesis, _cloneNode(node.identifier), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
     }
-    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, cloneNode(loopVariable), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
+    return new ForEachStatement.con1(node.forKeyword, node.leftParenthesis, _cloneNode(loopVariable), node.inKeyword, _cloneNode(node.iterator), node.rightParenthesis, _cloneNode(node.body));
   }
 
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, _cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
 
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, cloneNode(node.variables), cloneNode(node.initialization), node.leftSeparator, cloneNode(node.condition), node.rightSeparator, cloneNodeList(node.updaters), node.rightParenthesis, cloneNode(node.body));
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, _cloneNode(node.variables), _cloneNode(node.initialization), node.leftSeparator, _cloneNode(node.condition), node.rightSeparator, _cloneNodeList(node.updaters), node.rightParenthesis, _cloneNode(node.body));
 
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, cloneNode(node.returnType), node.propertyKeyword, cloneNode(node.name), cloneNode(node.functionExpression));
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, _cloneNode(node.returnType), node.propertyKeyword, _cloneNode(node.name), _cloneNode(node.functionExpression));
 
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
 
-  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(cloneNode(node.parameters), cloneNode(node.body));
+  @override
+  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
 
-  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(cloneNode(node.function), cloneNode(node.argumentList));
+  @override
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
 
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.returnType), cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.parameters), node.semicolon);
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), node.semicolon);
 
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.returnType), cloneNode(node.identifier), cloneNode(node.parameters));
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
 
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, cloneNodeList(node.hiddenNames));
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, _cloneNodeList(node.hiddenNames));
 
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.thenStatement), node.elseKeyword, cloneNode(node.elseStatement));
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.thenStatement), node.elseKeyword, _cloneNode(node.elseStatement));
 
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, cloneNodeList(node.interfaces));
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, _cloneNodeList(node.interfaces));
 
-  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), node.asToken, cloneNode(node.prefix), cloneNodeList(node.combinators), node.semicolon);
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.uri), node.asToken, _cloneNode(node.prefix), _cloneNodeList(node.combinators), node.semicolon);
 
+  @override
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = node.period;
     if (period == null) {
-      return new IndexExpression.forTarget(cloneNode(node.target), node.leftBracket, cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forTarget(_cloneNode(node.target), node.leftBracket, _cloneNode(node.index), node.rightBracket);
     } else {
-      return new IndexExpression.forCascade(period, node.leftBracket, cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forCascade(period, node.leftBracket, _cloneNode(node.index), node.rightBracket);
     }
   }
 
-  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
 
+  @override
   IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral(node.literal, node.value);
 
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, cloneNode(node.expression), node.rightBracket);
+  @override
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, _cloneNode(node.expression), node.rightBracket);
 
+  @override
   InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(node.contents, node.value);
 
-  IsExpression visitIsExpression(IsExpression node) => new IsExpression(cloneNode(node.expression), node.isOperator, node.notOperator, cloneNode(node.type));
+  @override
+  IsExpression visitIsExpression(IsExpression node) => new IsExpression(_cloneNode(node.expression), node.isOperator, node.notOperator, _cloneNode(node.type));
 
-  Label visitLabel(Label node) => new Label(cloneNode(node.label), node.colon);
+  @override
+  Label visitLabel(Label node) => new Label(_cloneNode(node.label), node.colon);
 
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(cloneNodeList(node.labels), cloneNode(node.statement));
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
 
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.libraryToken, cloneNode(node.name), node.semicolon);
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.libraryToken, _cloneNode(node.name), node.semicolon);
 
-  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(cloneNodeList(node.components));
+  @override
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(_cloneNodeList(node.components));
 
-  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.elements), node.rightBracket);
+  @override
+  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.elements), node.rightBracket);
 
-  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.entries), node.rightBracket);
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, _cloneNode(node.typeArguments), node.leftBracket, _cloneNodeList(node.entries), node.rightBracket);
 
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(cloneNode(node.key), node.separator, cloneNode(node.value));
+  @override
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), node.separator, _cloneNode(node.value));
 
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, cloneNode(node.name), cloneNode(node.parameters), cloneNode(node.body));
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, _cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
 
-  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(cloneNode(node.target), node.period, cloneNode(node.methodName), cloneNode(node.argumentList));
+  @override
+  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(_cloneNode(node.target), node.period, _cloneNode(node.methodName), _cloneNode(node.argumentList));
 
-  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
+  @override
+  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
 
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, cloneNode(node.name));
+  @override
+  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, _cloneNode(node.name));
 
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, cloneNode(node.stringLiteral), node.semicolon);
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, _cloneNode(node.stringLiteral), node.semicolon);
 
+  @override
   NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral(node.literal);
 
-  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis);
+  @override
+  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis);
 
-  PartDirective visitPartDirective(PartDirective node) => new PartDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, cloneNode(node.uri), node.semicolon);
+  @override
+  PartDirective visitPartDirective(PartDirective node) => new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, _cloneNode(node.uri), node.semicolon);
 
-  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, node.ofToken, cloneNode(node.libraryName), node.semicolon);
+  @override
+  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.partToken, node.ofToken, _cloneNode(node.libraryName), node.semicolon);
 
-  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(cloneNode(node.operand), node.operator);
+  @override
+  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(_cloneNode(node.operand), node.operator);
 
-  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(cloneNode(node.prefix), node.period, cloneNode(node.identifier));
+  @override
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(_cloneNode(node.prefix), node.period, _cloneNode(node.identifier));
 
-  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, cloneNode(node.operand));
+  @override
+  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, _cloneNode(node.operand));
 
-  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(cloneNode(node.target), node.operator, cloneNode(node.propertyName));
+  @override
+  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(_cloneNode(node.target), node.operator, _cloneNode(node.propertyName));
 
-  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
 
+  @override
   RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression(node.keyword);
 
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, cloneNode(node.expression), node.semicolon);
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, _cloneNode(node.expression), node.semicolon);
 
+  @override
   ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(node.scriptTag);
 
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, cloneNodeList(node.shownNames));
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, _cloneNodeList(node.shownNames));
 
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNode(node.identifier));
 
+  @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier(node.token);
 
+  @override
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral(node.literal, node.value);
 
-  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(cloneNodeList(node.elements));
+  @override
+  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(_cloneNodeList(node.elements));
 
-  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, _cloneNode(node.constructorName), _cloneNode(node.argumentList));
 
+  @override
   SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression(node.keyword);
 
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(cloneNodeList(node.labels), node.keyword, cloneNode(node.expression), node.colon, cloneNodeList(node.statements));
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), node.keyword, _cloneNode(node.expression), node.colon, _cloneNodeList(node.statements));
 
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(cloneNodeList(node.labels), node.keyword, node.colon, cloneNodeList(node.statements));
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), node.keyword, node.colon, _cloneNodeList(node.statements));
 
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis, node.leftBracket, cloneNodeList(node.members), node.rightBracket);
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, _cloneNode(node.expression), node.rightParenthesis, node.leftBracket, _cloneNodeList(node.members), node.rightBracket);
 
+  @override
   AstNode visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(node.poundSign, node.components);
 
+  @override
   ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression(node.keyword);
 
-  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, cloneNode(node.expression));
+  @override
+  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, _cloneNode(node.expression));
 
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.variables), node.semicolon);
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), node.semicolon);
 
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, cloneNode(node.body), cloneNodeList(node.catchClauses), node.finallyKeyword, cloneNode(node.finallyBlock));
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, _cloneNode(node.body), _cloneNodeList(node.catchClauses), node.finallyKeyword, _cloneNode(node.finallyBlock));
 
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, cloneNodeList(node.arguments), node.rightBracket);
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, _cloneNodeList(node.arguments), node.rightBracket);
 
-  TypeName visitTypeName(TypeName node) => new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
+  @override
+  TypeName visitTypeName(TypeName node) => new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
 
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name), node.keyword, cloneNode(node.bound));
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), node.keyword, _cloneNode(node.bound));
 
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, cloneNodeList(node.typeParameters), node.rightBracket);
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, _cloneNodeList(node.typeParameters), node.rightBracket);
 
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, cloneNodeList(node.metadata), cloneNode(node.name), node.equals, cloneNode(node.initializer));
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), node.equals, _cloneNode(node.initializer));
 
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNodeList(node.variables));
+  @override
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), node.keyword, _cloneNode(node.type), _cloneNodeList(node.variables));
 
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(cloneNode(node.variables), node.semicolon);
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), node.semicolon);
 
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.body));
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, _cloneNode(node.condition), node.rightParenthesis, _cloneNode(node.body));
 
-  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, cloneNodeList(node.mixinTypes));
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, _cloneNodeList(node.mixinTypes));
 
-  AstNode cloneNode(AstNode node) {
+  AstNode _cloneNode(AstNode node) {
     if (node == null) {
       return null;
     }
     return node.accept(this) as AstNode;
   }
 
-  List cloneNodeList(NodeList nodes) {
+  List _cloneNodeList(NodeList nodes) {
     int count = nodes.length;
     List clonedNodes = new List();
     for (int i = 0; i < count; i++) {
@@ -14789,7 +15968,7 @@
    */
   static bool equalUnits(CompilationUnit first, CompilationUnit second) {
     AstComparator comparator = new AstComparator();
-    return comparator.isEqualNodes(first, second);
+    return comparator._isEqualNodes(first, second);
   }
 
   /**
@@ -14798,519 +15977,622 @@
    */
   AstNode _other;
 
+  @override
   bool visitAdjacentStrings(AdjacentStrings node) {
     AdjacentStrings other = this._other as AdjacentStrings;
-    return isEqualNodeLists(node.strings, other.strings);
+    return _isEqualNodeLists(node.strings, other.strings);
   }
 
+  @override
   bool visitAnnotation(Annotation node) {
     Annotation other = this._other as Annotation;
-    return isEqualTokens(node.atSign, other.atSign) && isEqualNodes(node.name, other.name) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.arguments, other.arguments);
+    return _isEqualTokens(node.atSign, other.atSign) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.arguments, other.arguments);
   }
 
+  @override
   bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     ArgumentDefinitionTest other = this._other as ArgumentDefinitionTest;
-    return isEqualTokens(node.question, other.question) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualTokens(node.question, other.question) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList other = this._other as ArgumentList;
-    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodeLists(node.arguments, other.arguments) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
+  @override
   bool visitAsExpression(AsExpression node) {
     AsExpression other = this._other as AsExpression;
-    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.asOperator, other.asOperator) && isEqualNodes(node.type, other.type);
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.asOperator, other.asOperator) && _isEqualNodes(node.type, other.type);
   }
 
+  @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement other = this._other as AssertStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression other = this._other as AssignmentExpression;
-    return isEqualNodes(node.leftHandSide, other.leftHandSide) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.rightHandSide, other.rightHandSide);
+    return _isEqualNodes(node.leftHandSide, other.leftHandSide) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightHandSide, other.rightHandSide);
   }
 
+  @override
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression other = this._other as BinaryExpression;
-    return isEqualNodes(node.leftOperand, other.leftOperand) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.rightOperand, other.rightOperand);
+    return _isEqualNodes(node.leftOperand, other.leftOperand) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightOperand, other.rightOperand);
   }
 
+  @override
   bool visitBlock(Block node) {
     Block other = this._other as Block;
-    return isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.statements, other.statements) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.statements, other.statements) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitBlockFunctionBody(BlockFunctionBody node) {
     BlockFunctionBody other = this._other as BlockFunctionBody;
-    return isEqualNodes(node.block, other.block);
+    return _isEqualNodes(node.block, other.block);
   }
 
+  @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral other = this._other as BooleanLiteral;
-    return isEqualTokens(node.literal, other.literal) && identical(node.value, other.value);
+    return _isEqualTokens(node.literal, other.literal) && identical(node.value, other.value);
   }
 
+  @override
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement other = this._other as BreakStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.label, other.label) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression other = this._other as CascadeExpression;
-    return isEqualNodes(node.target, other.target) && isEqualNodeLists(node.cascadeSections, other.cascadeSections);
+    return _isEqualNodes(node.target, other.target) && _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
   }
 
+  @override
   bool visitCatchClause(CatchClause node) {
     CatchClause other = this._other as CatchClause;
-    return isEqualTokens(node.onKeyword, other.onKeyword) && isEqualNodes(node.exceptionType, other.exceptionType) && isEqualTokens(node.catchKeyword, other.catchKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.exceptionParameter, other.exceptionParameter) && isEqualTokens(node.comma, other.comma) && isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
+    return _isEqualTokens(node.onKeyword, other.onKeyword) && _isEqualNodes(node.exceptionType, other.exceptionType) && _isEqualTokens(node.catchKeyword, other.catchKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.exceptionParameter, other.exceptionParameter) && _isEqualTokens(node.comma, other.comma) && _isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration other = this._other as ClassDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.abstractKeyword, other.abstractKeyword) && isEqualTokens(node.classKeyword, other.classKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualNodes(node.extendsClause, other.extendsClause) && isEqualNodes(node.withClause, other.withClause) && isEqualNodes(node.implementsClause, other.implementsClause) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.members, other.members) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualTokens(node.classKeyword, other.classKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.extendsClause, other.extendsClause) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias other = this._other as ClassTypeAlias;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualTokens(node.equals, other.equals) && isEqualTokens(node.abstractKeyword, other.abstractKeyword) && isEqualNodes(node.superclass, other.superclass) && isEqualNodes(node.withClause, other.withClause) && isEqualNodes(node.implementsClause, other.implementsClause) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualTokens(node.equals, other.equals) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualNodes(node.superclass, other.superclass) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitComment(Comment node) {
     Comment other = this._other as Comment;
-    return isEqualNodeLists(node.references, other.references);
+    return _isEqualNodeLists(node.references, other.references);
   }
 
+  @override
   bool visitCommentReference(CommentReference node) {
     CommentReference other = this._other as CommentReference;
-    return isEqualTokens(node.newKeyword, other.newKeyword) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualTokens(node.newKeyword, other.newKeyword) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit other = this._other as CompilationUnit;
-    return isEqualTokens(node.beginToken, other.beginToken) && isEqualNodes(node.scriptTag, other.scriptTag) && isEqualNodeLists(node.directives, other.directives) && isEqualNodeLists(node.declarations, other.declarations) && isEqualTokens(node.endToken, other.endToken);
+    return _isEqualTokens(node.beginToken, other.beginToken) && _isEqualNodes(node.scriptTag, other.scriptTag) && _isEqualNodeLists(node.directives, other.directives) && _isEqualNodeLists(node.declarations, other.declarations) && _isEqualTokens(node.endToken, other.endToken);
   }
 
+  @override
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression other = this._other as ConditionalExpression;
-    return isEqualNodes(node.condition, other.condition) && isEqualTokens(node.question, other.question) && isEqualNodes(node.thenExpression, other.thenExpression) && isEqualTokens(node.colon, other.colon) && isEqualNodes(node.elseExpression, other.elseExpression);
+    return _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.question, other.question) && _isEqualNodes(node.thenExpression, other.thenExpression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodes(node.elseExpression, other.elseExpression);
   }
 
+  @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration other = this._other as ConstructorDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualTokens(node.constKeyword, other.constKeyword) && isEqualTokens(node.factoryKeyword, other.factoryKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.period, other.period) && isEqualNodes(node.name, other.name) && isEqualNodes(node.parameters, other.parameters) && isEqualTokens(node.separator, other.separator) && isEqualNodeLists(node.initializers, other.initializers) && isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && isEqualNodes(node.body, other.body);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualTokens(node.factoryKeyword, other.factoryKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.separator, other.separator) && _isEqualNodeLists(node.initializers, other.initializers) && _isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.fieldName, other.fieldName) && isEqualTokens(node.equals, other.equals) && isEqualNodes(node.expression, other.expression);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.fieldName, other.fieldName) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.expression, other.expression);
   }
 
+  @override
   bool visitConstructorName(ConstructorName node) {
     ConstructorName other = this._other as ConstructorName;
-    return isEqualNodes(node.type, other.type) && isEqualTokens(node.period, other.period) && isEqualNodes(node.name, other.name);
+    return _isEqualNodes(node.type, other.type) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name);
   }
 
+  @override
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement other = this._other as ContinueStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.label, other.label) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier other = this._other as DeclaredIdentifier;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter other = this._other as DefaultFormalParameter;
-    return isEqualNodes(node.parameter, other.parameter) && identical(node.kind, other.kind) && isEqualTokens(node.separator, other.separator) && isEqualNodes(node.defaultValue, other.defaultValue);
+    return _isEqualNodes(node.parameter, other.parameter) && identical(node.kind, other.kind) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
   }
 
+  @override
   bool visitDoStatement(DoStatement node) {
     DoStatement other = this._other as DoStatement;
-    return isEqualTokens(node.doKeyword, other.doKeyword) && isEqualNodes(node.body, other.body) && isEqualTokens(node.whileKeyword, other.whileKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.doKeyword, other.doKeyword) && _isEqualNodes(node.body, other.body) && _isEqualTokens(node.whileKeyword, other.whileKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral other = this._other as DoubleLiteral;
-    return isEqualTokens(node.literal, other.literal) && node.value == other.value;
+    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
   }
 
+  @override
   bool visitEmptyFunctionBody(EmptyFunctionBody node) {
     EmptyFunctionBody other = this._other as EmptyFunctionBody;
-    return isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitEmptyStatement(EmptyStatement node) {
     EmptyStatement other = this._other as EmptyStatement;
-    return isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective other = this._other as ExportDirective;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.uri, other.uri) && isEqualNodeLists(node.combinators, other.combinators) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
-    return isEqualTokens(node.functionDefinition, other.functionDefinition) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.functionDefinition, other.functionDefinition) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement other = this._other as ExpressionStatement;
-    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause other = this._other as ExtendsClause;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.superclass, other.superclass);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.superclass, other.superclass);
   }
 
+  @override
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration other = this._other as FieldDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.staticKeyword, other.staticKeyword) && isEqualNodes(node.fields, other.fields) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.staticKeyword, other.staticKeyword) && _isEqualNodes(node.fields, other.fields) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter other = this._other as FieldFormalParameter;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualTokens(node.thisToken, other.thisToken) && isEqualTokens(node.period, other.period) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualTokens(node.thisToken, other.thisToken) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement other = this._other as ForEachStatement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.loopVariable, other.loopVariable) && isEqualTokens(node.inKeyword, other.inKeyword) && isEqualNodes(node.iterator, other.iterator) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
+    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.loopVariable, other.loopVariable) && _isEqualTokens(node.inKeyword, other.inKeyword) && _isEqualNodes(node.iterator, other.iterator) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList other = this._other as FormalParameterList;
-    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodeLists(node.parameters, other.parameters) && isEqualTokens(node.leftDelimiter, other.leftDelimiter) && isEqualTokens(node.rightDelimiter, other.rightDelimiter) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.parameters, other.parameters) && _isEqualTokens(node.leftDelimiter, other.leftDelimiter) && _isEqualTokens(node.rightDelimiter, other.rightDelimiter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
+  @override
   bool visitForStatement(ForStatement node) {
     ForStatement other = this._other as ForStatement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.variables, other.variables) && isEqualNodes(node.initialization, other.initialization) && isEqualTokens(node.leftSeparator, other.leftSeparator) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightSeparator, other.rightSeparator) && isEqualNodeLists(node.updaters, other.updaters) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
+    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.variables, other.variables) && _isEqualNodes(node.initialization, other.initialization) && _isEqualTokens(node.leftSeparator, other.leftSeparator) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightSeparator, other.rightSeparator) && _isEqualNodeLists(node.updaters, other.updaters) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration other = this._other as FunctionDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.functionExpression, other.functionExpression);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.functionExpression, other.functionExpression);
   }
 
+  @override
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
-    return isEqualNodes(node.functionDeclaration, other.functionDeclaration);
+    return _isEqualNodes(node.functionDeclaration, other.functionDeclaration);
   }
 
+  @override
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression other = this._other as FunctionExpression;
-    return isEqualNodes(node.parameters, other.parameters) && isEqualNodes(node.body, other.body);
+    return _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
-    return isEqualNodes(node.function, other.function) && isEqualNodes(node.argumentList, other.argumentList);
+    return _isEqualNodes(node.function, other.function) && _isEqualNodes(node.argumentList, other.argumentList);
   }
 
+  @override
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias other = this._other as FunctionTypeAlias;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.returnType, other.returnType) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualNodes(node.parameters, other.parameters) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.returnType, other.returnType) && isEqualNodes(node.identifier, other.identifier) && isEqualNodes(node.parameters, other.parameters);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.identifier, other.identifier) && _isEqualNodes(node.parameters, other.parameters);
   }
 
+  @override
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator other = this._other as HideCombinator;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodeLists(node.hiddenNames, other.hiddenNames);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
   }
 
+  @override
   bool visitIfStatement(IfStatement node) {
     IfStatement other = this._other as IfStatement;
-    return isEqualTokens(node.ifKeyword, other.ifKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.thenStatement, other.thenStatement) && isEqualTokens(node.elseKeyword, other.elseKeyword) && isEqualNodes(node.elseStatement, other.elseStatement);
+    return _isEqualTokens(node.ifKeyword, other.ifKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.thenStatement, other.thenStatement) && _isEqualTokens(node.elseKeyword, other.elseKeyword) && _isEqualNodes(node.elseStatement, other.elseStatement);
   }
 
+  @override
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause other = this._other as ImplementsClause;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodeLists(node.interfaces, other.interfaces);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.interfaces, other.interfaces);
   }
 
+  @override
   bool visitImportDirective(ImportDirective node) {
     ImportDirective other = this._other as ImportDirective;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.uri, other.uri) && isEqualTokens(node.asToken, other.asToken) && isEqualNodes(node.prefix, other.prefix) && isEqualNodeLists(node.combinators, other.combinators) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.asToken, other.asToken) && _isEqualNodes(node.prefix, other.prefix) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression other = this._other as IndexExpression;
-    return isEqualNodes(node.target, other.target) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodes(node.index, other.index) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.index, other.index) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression other = this._other as InstanceCreationExpression;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
   }
 
+  @override
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral other = this._other as IntegerLiteral;
-    return isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
   }
 
+  @override
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression other = this._other as InterpolationExpression;
-    return isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString other = this._other as InterpolationString;
-    return isEqualTokens(node.contents, other.contents) && node.value == other.value;
+    return _isEqualTokens(node.contents, other.contents) && node.value == other.value;
   }
 
+  @override
   bool visitIsExpression(IsExpression node) {
     IsExpression other = this._other as IsExpression;
-    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.isOperator, other.isOperator) && isEqualTokens(node.notOperator, other.notOperator) && isEqualNodes(node.type, other.type);
+    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.isOperator, other.isOperator) && _isEqualTokens(node.notOperator, other.notOperator) && _isEqualNodes(node.type, other.type);
   }
 
+  @override
   bool visitLabel(Label node) {
     Label other = this._other as Label;
-    return isEqualNodes(node.label, other.label) && isEqualTokens(node.colon, other.colon);
+    return _isEqualNodes(node.label, other.label) && _isEqualTokens(node.colon, other.colon);
   }
 
+  @override
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement other = this._other as LabeledStatement;
-    return isEqualNodeLists(node.labels, other.labels) && isEqualNodes(node.statement, other.statement);
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualNodes(node.statement, other.statement);
   }
 
+  @override
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective other = this._other as LibraryDirective;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.libraryToken, other.libraryToken) && isEqualNodes(node.name, other.name) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.libraryToken, other.libraryToken) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitLibraryIdentifier(LibraryIdentifier node) {
     LibraryIdentifier other = this._other as LibraryIdentifier;
-    return isEqualNodeLists(node.components, other.components);
+    return _isEqualNodeLists(node.components, other.components);
   }
 
+  @override
   bool visitListLiteral(ListLiteral node) {
     ListLiteral other = this._other as ListLiteral;
-    return isEqualTokens(node.constKeyword, other.constKeyword) && isEqualNodes(node.typeArguments, other.typeArguments) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.elements, other.elements) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.elements, other.elements) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral other = this._other as MapLiteral;
-    return isEqualTokens(node.constKeyword, other.constKeyword) && isEqualNodes(node.typeArguments, other.typeArguments) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.entries, other.entries) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.entries, other.entries) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry other = this._other as MapLiteralEntry;
-    return isEqualNodes(node.key, other.key) && isEqualTokens(node.separator, other.separator) && isEqualNodes(node.value, other.value);
+    return _isEqualNodes(node.key, other.key) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.value, other.value);
   }
 
+  @override
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration other = this._other as MethodDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualTokens(node.modifierKeyword, other.modifierKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.parameters, other.parameters) && isEqualNodes(node.body, other.body);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.modifierKeyword, other.modifierKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation other = this._other as MethodInvocation;
-    return isEqualNodes(node.target, other.target) && isEqualTokens(node.period, other.period) && isEqualNodes(node.methodName, other.methodName) && isEqualNodes(node.argumentList, other.argumentList);
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.methodName, other.methodName) && _isEqualNodes(node.argumentList, other.argumentList);
   }
 
+  @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression other = this._other as NamedExpression;
-    return isEqualNodes(node.name, other.name) && isEqualNodes(node.expression, other.expression);
+    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.expression, other.expression);
   }
 
+  @override
   bool visitNativeClause(NativeClause node) {
     NativeClause other = this._other as NativeClause;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.name, other.name);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name);
   }
 
+  @override
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody other = this._other as NativeFunctionBody;
-    return isEqualTokens(node.nativeToken, other.nativeToken) && isEqualNodes(node.stringLiteral, other.stringLiteral) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.nativeToken, other.nativeToken) && _isEqualNodes(node.stringLiteral, other.stringLiteral) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitNullLiteral(NullLiteral node) {
     NullLiteral other = this._other as NullLiteral;
-    return isEqualTokens(node.literal, other.literal);
+    return _isEqualTokens(node.literal, other.literal);
   }
 
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression other = this._other as ParenthesizedExpression;
-    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
+  @override
   bool visitPartDirective(PartDirective node) {
     PartDirective other = this._other as PartDirective;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.partToken, other.partToken) && isEqualNodes(node.uri, other.uri) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective other = this._other as PartOfDirective;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.partToken, other.partToken) && isEqualTokens(node.ofToken, other.ofToken) && isEqualNodes(node.libraryName, other.libraryName) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualTokens(node.ofToken, other.ofToken) && _isEqualNodes(node.libraryName, other.libraryName) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression other = this._other as PostfixExpression;
-    return isEqualNodes(node.operand, other.operand) && isEqualTokens(node.operator, other.operator);
+    return _isEqualNodes(node.operand, other.operand) && _isEqualTokens(node.operator, other.operator);
   }
 
+  @override
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier other = this._other as PrefixedIdentifier;
-    return isEqualNodes(node.prefix, other.prefix) && isEqualTokens(node.period, other.period) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualNodes(node.prefix, other.prefix) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression other = this._other as PrefixExpression;
-    return isEqualTokens(node.operator, other.operator) && isEqualNodes(node.operand, other.operand);
+    return _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.operand, other.operand);
   }
 
+  @override
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess other = this._other as PropertyAccess;
-    return isEqualNodes(node.target, other.target) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.propertyName, other.propertyName);
+    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.propertyName, other.propertyName);
   }
 
+  @override
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
   }
 
+  @override
   bool visitRethrowExpression(RethrowExpression node) {
     RethrowExpression other = this._other as RethrowExpression;
-    return isEqualTokens(node.keyword, other.keyword);
+    return _isEqualTokens(node.keyword, other.keyword);
   }
 
+  @override
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement other = this._other as ReturnStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitScriptTag(ScriptTag node) {
     ScriptTag other = this._other as ScriptTag;
-    return isEqualTokens(node.scriptTag, other.scriptTag);
+    return _isEqualTokens(node.scriptTag, other.scriptTag);
   }
 
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator other = this._other as ShowCombinator;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodeLists(node.shownNames, other.shownNames);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.shownNames, other.shownNames);
   }
 
+  @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter other = this._other as SimpleFormalParameter;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualNodes(node.identifier, other.identifier);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
   }
 
+  @override
   bool visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier other = this._other as SimpleIdentifier;
-    return isEqualTokens(node.token, other.token);
+    return _isEqualTokens(node.token, other.token);
   }
 
+  @override
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral other = this._other as SimpleStringLiteral;
-    return isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
   }
 
+  @override
   bool visitStringInterpolation(StringInterpolation node) {
     StringInterpolation other = this._other as StringInterpolation;
-    return isEqualNodeLists(node.elements, other.elements);
+    return _isEqualNodeLists(node.elements, other.elements);
   }
 
+  @override
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
   }
 
+  @override
   bool visitSuperExpression(SuperExpression node) {
     SuperExpression other = this._other as SuperExpression;
-    return isEqualTokens(node.keyword, other.keyword);
+    return _isEqualTokens(node.keyword, other.keyword);
   }
 
+  @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase other = this._other as SwitchCase;
-    return isEqualNodeLists(node.labels, other.labels) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.colon, other.colon) && isEqualNodeLists(node.statements, other.statements);
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
   }
 
+  @override
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault other = this._other as SwitchDefault;
-    return isEqualNodeLists(node.labels, other.labels) && isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.colon, other.colon) && isEqualNodeLists(node.statements, other.statements);
+    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
   }
 
+  @override
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement other = this._other as SwitchStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.members, other.members) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral other = this._other as SymbolLiteral;
-    return isEqualTokens(node.poundSign, other.poundSign) && isEqualTokenLists(node.components, other.components);
+    return _isEqualTokens(node.poundSign, other.poundSign) && _isEqualTokenLists(node.components, other.components);
   }
 
+  @override
   bool visitThisExpression(ThisExpression node) {
     ThisExpression other = this._other as ThisExpression;
-    return isEqualTokens(node.keyword, other.keyword);
+    return _isEqualTokens(node.keyword, other.keyword);
   }
 
+  @override
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression other = this._other as ThrowExpression;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression);
   }
 
+  @override
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.variables, other.variables) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitTryStatement(TryStatement node) {
     TryStatement other = this._other as TryStatement;
-    return isEqualTokens(node.tryKeyword, other.tryKeyword) && isEqualNodes(node.body, other.body) && isEqualNodeLists(node.catchClauses, other.catchClauses) && isEqualTokens(node.finallyKeyword, other.finallyKeyword) && isEqualNodes(node.finallyBlock, other.finallyBlock);
+    return _isEqualTokens(node.tryKeyword, other.tryKeyword) && _isEqualNodes(node.body, other.body) && _isEqualNodeLists(node.catchClauses, other.catchClauses) && _isEqualTokens(node.finallyKeyword, other.finallyKeyword) && _isEqualNodes(node.finallyBlock, other.finallyBlock);
   }
 
+  @override
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList other = this._other as TypeArgumentList;
-    return isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.arguments, other.arguments) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitTypeName(TypeName node) {
     TypeName other = this._other as TypeName;
-    return isEqualNodes(node.name, other.name) && isEqualNodes(node.typeArguments, other.typeArguments);
+    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeArguments, other.typeArguments);
   }
 
+  @override
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter other = this._other as TypeParameter;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.name, other.name) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.bound, other.bound);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.bound, other.bound);
   }
 
+  @override
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList other = this._other as TypeParameterList;
-    return isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodeLists(node.typeParameters, other.typeParameters) && isEqualTokens(node.rightBracket, other.rightBracket);
+    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.typeParameters, other.typeParameters) && _isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
+  @override
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration other = this._other as VariableDeclaration;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.name, other.name) && isEqualTokens(node.equals, other.equals) && isEqualNodes(node.initializer, other.initializer);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.initializer, other.initializer);
   }
 
+  @override
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList other = this._other as VariableDeclarationList;
-    return isEqualNodes(node.documentationComment, other.documentationComment) && isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualNodeLists(node.variables, other.variables);
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodeLists(node.variables, other.variables);
   }
 
+  @override
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
-    return isEqualNodes(node.variables, other.variables) && isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
   }
 
+  @override
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement other = this._other as WhileStatement;
-    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
+    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
   }
 
+  @override
   bool visitWithClause(WithClause node) {
     WithClause other = this._other as WithClause;
-    return isEqualTokens(node.withKeyword, other.withKeyword) && isEqualNodeLists(node.mixinTypes, other.mixinTypes);
+    return _isEqualTokens(node.withKeyword, other.withKeyword) && _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
   }
 
   /**
@@ -15322,7 +16604,7 @@
    * @return `true` if the given AST nodes have the same size and corresponding elements are
    *         equal
    */
-  bool isEqualNodeLists(NodeList first, NodeList second) {
+  bool _isEqualNodeLists(NodeList first, NodeList second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -15333,7 +16615,7 @@
       return false;
     }
     for (int i = 0; i < size; i++) {
-      if (!isEqualNodes(first[i], second[i])) {
+      if (!_isEqualNodes(first[i], second[i])) {
         return false;
       }
     }
@@ -15347,7 +16629,7 @@
    * @param second the second node being compared
    * @return `true` if the given AST nodes have the same structure
    */
-  bool isEqualNodes(AstNode first, AstNode second) {
+  bool _isEqualNodes(AstNode first, AstNode second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -15368,13 +16650,13 @@
    * @return `true` if the given arrays of tokens have the same length and corresponding
    *         elements are equal
    */
-  bool isEqualTokenLists(List<Token> first, List<Token> second) {
+  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
     int length = first.length;
     if (second.length != length) {
       return false;
     }
     for (int i = 0; i < length; i++) {
-      if (isEqualTokens(first[i], second[i])) {
+      if (_isEqualTokens(first[i], second[i])) {
         return false;
       }
     }
@@ -15388,7 +16670,7 @@
    * @param second the second node being compared
    * @return `true` if the given tokens have the same structure
    */
-  bool isEqualTokens(Token first, Token second) {
+  bool _isEqualTokens(Token first, Token second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -15434,34 +16716,41 @@
     this._tokenMap = tokenMap;
   }
 
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(cloneNodeList(node.strings));
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
 
+  @override
   Annotation visitAnnotation(Annotation node) {
-    Annotation copy = new Annotation(mapToken(node.atSign), cloneNode(node.name), mapToken(node.period), cloneNode(node.constructorName), cloneNode(node.arguments));
+    Annotation copy = new Annotation(_mapToken(node.atSign), _cloneNode(node.name), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.arguments));
     copy.element = node.element;
     return copy;
   }
 
+  @override
   ArgumentDefinitionTest visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    ArgumentDefinitionTest copy = new ArgumentDefinitionTest(mapToken(node.question), cloneNode(node.identifier));
+    ArgumentDefinitionTest copy = new ArgumentDefinitionTest(_mapToken(node.question), _cloneNode(node.identifier));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(mapToken(node.leftParenthesis), cloneNodeList(node.arguments), mapToken(node.rightParenthesis));
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(_mapToken(node.leftParenthesis), _cloneNodeList(node.arguments), _mapToken(node.rightParenthesis));
 
+  @override
   AsExpression visitAsExpression(AsExpression node) {
-    AsExpression copy = new AsExpression(cloneNode(node.expression), mapToken(node.asOperator), cloneNode(node.type));
+    AsExpression copy = new AsExpression(_cloneNode(node.expression), _mapToken(node.asOperator), _cloneNode(node.type));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(mapToken(node.keyword), mapToken(node.leftParenthesis), cloneNode(node.condition), mapToken(node.rightParenthesis), mapToken(node.semicolon));
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
 
+  @override
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
-    AssignmentExpression copy = new AssignmentExpression(cloneNode(node.leftHandSide), mapToken(node.operator), cloneNode(node.rightHandSide));
+    AssignmentExpression copy = new AssignmentExpression(_cloneNode(node.leftHandSide), _mapToken(node.operator), _cloneNode(node.rightHandSide));
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
@@ -15469,8 +16758,9 @@
     return copy;
   }
 
+  @override
   BinaryExpression visitBinaryExpression(BinaryExpression node) {
-    BinaryExpression copy = new BinaryExpression(cloneNode(node.leftOperand), mapToken(node.operator), cloneNode(node.rightOperand));
+    BinaryExpression copy = new BinaryExpression(_cloneNode(node.leftOperand), _mapToken(node.operator), _cloneNode(node.rightOperand));
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
@@ -15478,136 +16768,171 @@
     return copy;
   }
 
-  Block visitBlock(Block node) => new Block(mapToken(node.leftBracket), cloneNodeList(node.statements), mapToken(node.rightBracket));
+  @override
+  Block visitBlock(Block node) => new Block(_mapToken(node.leftBracket), _cloneNodeList(node.statements), _mapToken(node.rightBracket));
 
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(cloneNode(node.block));
+  @override
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(_cloneNode(node.block));
 
+  @override
   BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
-    BooleanLiteral copy = new BooleanLiteral(mapToken(node.literal), node.value);
+    BooleanLiteral copy = new BooleanLiteral(_mapToken(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(mapToken(node.keyword), cloneNode(node.label), mapToken(node.semicolon));
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
 
+  @override
   CascadeExpression visitCascadeExpression(CascadeExpression node) {
-    CascadeExpression copy = new CascadeExpression(cloneNode(node.target), cloneNodeList(node.cascadeSections));
+    CascadeExpression copy = new CascadeExpression(_cloneNode(node.target), _cloneNodeList(node.cascadeSections));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(mapToken(node.onKeyword), cloneNode(node.exceptionType), mapToken(node.catchKeyword), mapToken(node.leftParenthesis), cloneNode(node.exceptionParameter), mapToken(node.comma), cloneNode(node.stackTraceParameter), mapToken(node.rightParenthesis), cloneNode(node.body));
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(_mapToken(node.onKeyword), _cloneNode(node.exceptionType), _mapToken(node.catchKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.exceptionParameter), _mapToken(node.comma), _cloneNode(node.stackTraceParameter), _mapToken(node.rightParenthesis), _cloneNode(node.body));
 
+  @override
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.abstractKeyword), mapToken(node.classKeyword), cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.extendsClause), cloneNode(node.withClause), cloneNode(node.implementsClause), mapToken(node.leftBracket), cloneNodeList(node.members), mapToken(node.rightBracket));
-    copy.nativeClause = cloneNode(node.nativeClause);
+    ClassDeclaration copy = new ClassDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.abstractKeyword), _mapToken(node.classKeyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.extendsClause), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
+    copy.nativeClause = _cloneNode(node.nativeClause);
     return copy;
   }
 
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.name), cloneNode(node.typeParameters), mapToken(node.equals), mapToken(node.abstractKeyword), cloneNode(node.superclass), cloneNode(node.withClause), cloneNode(node.implementsClause), mapToken(node.semicolon));
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.name), _cloneNode(node.typeParameters), _mapToken(node.equals), _mapToken(node.abstractKeyword), _cloneNode(node.superclass), _cloneNode(node.withClause), _cloneNode(node.implementsClause), _mapToken(node.semicolon));
 
+  @override
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(mapTokens(node.tokens), cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(_mapTokens(node.tokens), _cloneNodeList(node.references));
     } else if (node.isBlock) {
-      return Comment.createBlockComment(mapTokens(node.tokens));
+      return Comment.createBlockComment(_mapTokens(node.tokens));
     }
-    return Comment.createEndOfLineComment(mapTokens(node.tokens));
+    return Comment.createEndOfLineComment(_mapTokens(node.tokens));
   }
 
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(mapToken(node.newKeyword), cloneNode(node.identifier));
+  @override
+  CommentReference visitCommentReference(CommentReference node) => new CommentReference(_mapToken(node.newKeyword), _cloneNode(node.identifier));
 
+  @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit copy = new CompilationUnit(mapToken(node.beginToken), cloneNode(node.scriptTag), cloneNodeList(node.directives), cloneNodeList(node.declarations), mapToken(node.endToken));
+    CompilationUnit copy = new CompilationUnit(_mapToken(node.beginToken), _cloneNode(node.scriptTag), _cloneNodeList(node.directives), _cloneNodeList(node.declarations), _mapToken(node.endToken));
     copy.lineInfo = node.lineInfo;
     copy.element = node.element;
     return copy;
   }
 
+  @override
   ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
-    ConditionalExpression copy = new ConditionalExpression(cloneNode(node.condition), mapToken(node.question), cloneNode(node.thenExpression), mapToken(node.colon), cloneNode(node.elseExpression));
+    ConditionalExpression copy = new ConditionalExpression(_cloneNode(node.condition), _mapToken(node.question), _cloneNode(node.thenExpression), _mapToken(node.colon), _cloneNode(node.elseExpression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorDeclaration copy = new ConstructorDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.externalKeyword), mapToken(node.constKeyword), mapToken(node.factoryKeyword), cloneNode(node.returnType), mapToken(node.period), cloneNode(node.name), cloneNode(node.parameters), mapToken(node.separator), cloneNodeList(node.initializers), cloneNode(node.redirectedConstructor), cloneNode(node.body));
+    ConstructorDeclaration copy = new ConstructorDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.constKeyword), _mapToken(node.factoryKeyword), _cloneNode(node.returnType), _mapToken(node.period), _cloneNode(node.name), _cloneNode(node.parameters), _mapToken(node.separator), _cloneNodeList(node.initializers), _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
     copy.element = node.element;
     return copy;
   }
 
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(mapToken(node.keyword), mapToken(node.period), cloneNode(node.fieldName), mapToken(node.equals), cloneNode(node.expression));
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.fieldName), _mapToken(node.equals), _cloneNode(node.expression));
 
+  @override
   ConstructorName visitConstructorName(ConstructorName node) {
-    ConstructorName copy = new ConstructorName(cloneNode(node.type), mapToken(node.period), cloneNode(node.name));
+    ConstructorName copy = new ConstructorName(_cloneNode(node.type), _mapToken(node.period), _cloneNode(node.name));
     copy.staticElement = node.staticElement;
     return copy;
   }
 
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(mapToken(node.keyword), cloneNode(node.label), mapToken(node.semicolon));
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(_mapToken(node.keyword), _cloneNode(node.label), _mapToken(node.semicolon));
 
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.type), cloneNode(node.identifier));
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
 
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(cloneNode(node.parameter), node.kind, mapToken(node.separator), cloneNode(node.defaultValue));
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(_cloneNode(node.parameter), node.kind, _mapToken(node.separator), _cloneNode(node.defaultValue));
 
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(mapToken(node.doKeyword), cloneNode(node.body), mapToken(node.whileKeyword), mapToken(node.leftParenthesis), cloneNode(node.condition), mapToken(node.rightParenthesis), mapToken(node.semicolon));
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(_mapToken(node.doKeyword), _cloneNode(node.body), _mapToken(node.whileKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _mapToken(node.semicolon));
 
+  @override
   DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
-    DoubleLiteral copy = new DoubleLiteral(mapToken(node.literal), node.value);
+    DoubleLiteral copy = new DoubleLiteral(_mapToken(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(mapToken(node.semicolon));
+  @override
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(_mapToken(node.semicolon));
 
-  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(mapToken(node.semicolon));
+  @override
+  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(_mapToken(node.semicolon));
 
+  @override
   ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirective copy = new ExportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.uri), cloneNodeList(node.combinators), mapToken(node.semicolon));
+    ExportDirective copy = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
     copy.element = node.element;
     return copy;
   }
 
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(mapToken(node.functionDefinition), cloneNode(node.expression), mapToken(node.semicolon));
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(_mapToken(node.functionDefinition), _cloneNode(node.expression), _mapToken(node.semicolon));
 
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(cloneNode(node.expression), mapToken(node.semicolon));
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(_cloneNode(node.expression), _mapToken(node.semicolon));
 
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(mapToken(node.keyword), cloneNode(node.superclass));
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(_mapToken(node.keyword), _cloneNode(node.superclass));
 
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.staticKeyword), cloneNode(node.fields), mapToken(node.semicolon));
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.staticKeyword), _cloneNode(node.fields), _mapToken(node.semicolon));
 
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.type), mapToken(node.thisToken), mapToken(node.period), cloneNode(node.identifier), cloneNode(node.parameters));
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _mapToken(node.thisToken), _mapToken(node.period), _cloneNode(node.identifier), _cloneNode(node.parameters));
 
+  @override
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
-      return new ForEachStatement.con2(mapToken(node.forKeyword), mapToken(node.leftParenthesis), cloneNode(node.identifier), mapToken(node.inKeyword), cloneNode(node.iterator), mapToken(node.rightParenthesis), cloneNode(node.body));
+      return new ForEachStatement.con2(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.identifier), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
     }
-    return new ForEachStatement.con1(mapToken(node.forKeyword), mapToken(node.leftParenthesis), cloneNode(loopVariable), mapToken(node.inKeyword), cloneNode(node.iterator), mapToken(node.rightParenthesis), cloneNode(node.body));
+    return new ForEachStatement.con1(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(loopVariable), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
   }
 
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(mapToken(node.leftParenthesis), cloneNodeList(node.parameters), mapToken(node.leftDelimiter), mapToken(node.rightDelimiter), mapToken(node.rightParenthesis));
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(_mapToken(node.leftParenthesis), _cloneNodeList(node.parameters), _mapToken(node.leftDelimiter), _mapToken(node.rightDelimiter), _mapToken(node.rightParenthesis));
 
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(mapToken(node.forKeyword), mapToken(node.leftParenthesis), cloneNode(node.variables), cloneNode(node.initialization), mapToken(node.leftSeparator), cloneNode(node.condition), mapToken(node.rightSeparator), cloneNodeList(node.updaters), mapToken(node.rightParenthesis), cloneNode(node.body));
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(_mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.variables), _cloneNode(node.initialization), _mapToken(node.leftSeparator), _cloneNode(node.condition), _mapToken(node.rightSeparator), _cloneNodeList(node.updaters), _mapToken(node.rightParenthesis), _cloneNode(node.body));
 
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.externalKeyword), cloneNode(node.returnType), mapToken(node.propertyKeyword), cloneNode(node.name), cloneNode(node.functionExpression));
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _cloneNode(node.name), _cloneNode(node.functionExpression));
 
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
 
+  @override
   FunctionExpression visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression copy = new FunctionExpression(cloneNode(node.parameters), cloneNode(node.body));
+    FunctionExpression copy = new FunctionExpression(_cloneNode(node.parameters), _cloneNode(node.body));
     copy.element = node.element;
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    FunctionExpressionInvocation copy = new FunctionExpressionInvocation(cloneNode(node.function), cloneNode(node.argumentList));
+    FunctionExpressionInvocation copy = new FunctionExpressionInvocation(_cloneNode(node.function), _cloneNode(node.argumentList));
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
@@ -15615,25 +16940,32 @@
     return copy;
   }
 
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.returnType), cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.parameters), mapToken(node.semicolon));
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.returnType), _cloneNode(node.name), _cloneNode(node.typeParameters), _cloneNode(node.parameters), _mapToken(node.semicolon));
 
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.returnType), cloneNode(node.identifier), cloneNode(node.parameters));
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.returnType), _cloneNode(node.identifier), _cloneNode(node.parameters));
 
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(mapToken(node.keyword), cloneNodeList(node.hiddenNames));
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(_mapToken(node.keyword), _cloneNodeList(node.hiddenNames));
 
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(mapToken(node.ifKeyword), mapToken(node.leftParenthesis), cloneNode(node.condition), mapToken(node.rightParenthesis), cloneNode(node.thenStatement), mapToken(node.elseKeyword), cloneNode(node.elseStatement));
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(_mapToken(node.ifKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.thenStatement), _mapToken(node.elseKeyword), _cloneNode(node.elseStatement));
 
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(mapToken(node.keyword), cloneNodeList(node.interfaces));
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(_mapToken(node.keyword), _cloneNodeList(node.interfaces));
 
-  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.uri), mapToken(node.asToken), cloneNode(node.prefix), cloneNodeList(node.combinators), mapToken(node.semicolon));
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) => new ImportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _mapToken(node.asToken), _cloneNode(node.prefix), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
 
+  @override
   IndexExpression visitIndexExpression(IndexExpression node) {
-    Token period = mapToken(node.period);
+    Token period = _mapToken(node.period);
     IndexExpression copy;
     if (period == null) {
-      copy = new IndexExpression.forTarget(cloneNode(node.target), mapToken(node.leftBracket), cloneNode(node.index), mapToken(node.rightBracket));
+      copy = new IndexExpression.forTarget(_cloneNode(node.target), _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
     } else {
-      copy = new IndexExpression.forCascade(period, mapToken(node.leftBracket), cloneNode(node.index), mapToken(node.rightBracket));
+      copy = new IndexExpression.forCascade(period, _mapToken(node.leftBracket), _cloneNode(node.index), _mapToken(node.rightBracket));
     }
     copy.auxiliaryElements = node.auxiliaryElements;
     copy.propagatedElement = node.propagatedElement;
@@ -15643,109 +16975,131 @@
     return copy;
   }
 
+  @override
   InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
-    InstanceCreationExpression copy = new InstanceCreationExpression(mapToken(node.keyword), cloneNode(node.constructorName), cloneNode(node.argumentList));
+    InstanceCreationExpression copy = new InstanceCreationExpression(_mapToken(node.keyword), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
-    IntegerLiteral copy = new IntegerLiteral(mapToken(node.literal), node.value);
+    IntegerLiteral copy = new IntegerLiteral(_mapToken(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(mapToken(node.leftBracket), cloneNode(node.expression), mapToken(node.rightBracket));
+  @override
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(_mapToken(node.leftBracket), _cloneNode(node.expression), _mapToken(node.rightBracket));
 
-  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(mapToken(node.contents), node.value);
+  @override
+  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(_mapToken(node.contents), node.value);
 
+  @override
   IsExpression visitIsExpression(IsExpression node) {
-    IsExpression copy = new IsExpression(cloneNode(node.expression), mapToken(node.isOperator), mapToken(node.notOperator), cloneNode(node.type));
+    IsExpression copy = new IsExpression(_cloneNode(node.expression), _mapToken(node.isOperator), _mapToken(node.notOperator), _cloneNode(node.type));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  Label visitLabel(Label node) => new Label(cloneNode(node.label), mapToken(node.colon));
+  @override
+  Label visitLabel(Label node) => new Label(_cloneNode(node.label), _mapToken(node.colon));
 
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(cloneNodeList(node.labels), cloneNode(node.statement));
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(_cloneNodeList(node.labels), _cloneNode(node.statement));
 
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.libraryToken), cloneNode(node.name), mapToken(node.semicolon));
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.libraryToken), _cloneNode(node.name), _mapToken(node.semicolon));
 
+  @override
   LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
-    LibraryIdentifier copy = new LibraryIdentifier(cloneNodeList(node.components));
+    LibraryIdentifier copy = new LibraryIdentifier(_cloneNodeList(node.components));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   ListLiteral visitListLiteral(ListLiteral node) {
-    ListLiteral copy = new ListLiteral(mapToken(node.constKeyword), cloneNode(node.typeArguments), mapToken(node.leftBracket), cloneNodeList(node.elements), mapToken(node.rightBracket));
+    ListLiteral copy = new ListLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.elements), _mapToken(node.rightBracket));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   MapLiteral visitMapLiteral(MapLiteral node) {
-    MapLiteral copy = new MapLiteral(mapToken(node.constKeyword), cloneNode(node.typeArguments), mapToken(node.leftBracket), cloneNodeList(node.entries), mapToken(node.rightBracket));
+    MapLiteral copy = new MapLiteral(_mapToken(node.constKeyword), _cloneNode(node.typeArguments), _mapToken(node.leftBracket), _cloneNodeList(node.entries), _mapToken(node.rightBracket));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(cloneNode(node.key), mapToken(node.separator), cloneNode(node.value));
+  @override
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(_cloneNode(node.key), _mapToken(node.separator), _cloneNode(node.value));
 
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.externalKeyword), mapToken(node.modifierKeyword), cloneNode(node.returnType), mapToken(node.propertyKeyword), mapToken(node.operatorKeyword), cloneNode(node.name), cloneNode(node.parameters), cloneNode(node.body));
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.externalKeyword), _mapToken(node.modifierKeyword), _cloneNode(node.returnType), _mapToken(node.propertyKeyword), _mapToken(node.operatorKeyword), _cloneNode(node.name), _cloneNode(node.parameters), _cloneNode(node.body));
 
+  @override
   MethodInvocation visitMethodInvocation(MethodInvocation node) {
-    MethodInvocation copy = new MethodInvocation(cloneNode(node.target), mapToken(node.period), cloneNode(node.methodName), cloneNode(node.argumentList));
+    MethodInvocation copy = new MethodInvocation(_cloneNode(node.target), _mapToken(node.period), _cloneNode(node.methodName), _cloneNode(node.argumentList));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   NamedExpression visitNamedExpression(NamedExpression node) {
-    NamedExpression copy = new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
+    NamedExpression copy = new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(mapToken(node.keyword), cloneNode(node.name));
+  @override
+  AstNode visitNativeClause(NativeClause node) => new NativeClause(_mapToken(node.keyword), _cloneNode(node.name));
 
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(mapToken(node.nativeToken), cloneNode(node.stringLiteral), mapToken(node.semicolon));
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(_mapToken(node.nativeToken), _cloneNode(node.stringLiteral), _mapToken(node.semicolon));
 
+  @override
   NullLiteral visitNullLiteral(NullLiteral node) {
-    NullLiteral copy = new NullLiteral(mapToken(node.literal));
+    NullLiteral copy = new NullLiteral(_mapToken(node.literal));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) {
-    ParenthesizedExpression copy = new ParenthesizedExpression(mapToken(node.leftParenthesis), cloneNode(node.expression), mapToken(node.rightParenthesis));
+    ParenthesizedExpression copy = new ParenthesizedExpression(_mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   PartDirective visitPartDirective(PartDirective node) {
-    PartDirective copy = new PartDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.partToken), cloneNode(node.uri), mapToken(node.semicolon));
+    PartDirective copy = new PartDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _cloneNode(node.uri), _mapToken(node.semicolon));
     copy.element = node.element;
     return copy;
   }
 
+  @override
   PartOfDirective visitPartOfDirective(PartOfDirective node) {
-    PartOfDirective copy = new PartOfDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.partToken), mapToken(node.ofToken), cloneNode(node.libraryName), mapToken(node.semicolon));
+    PartOfDirective copy = new PartOfDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.partToken), _mapToken(node.ofToken), _cloneNode(node.libraryName), _mapToken(node.semicolon));
     copy.element = node.element;
     return copy;
   }
 
+  @override
   PostfixExpression visitPostfixExpression(PostfixExpression node) {
-    PostfixExpression copy = new PostfixExpression(cloneNode(node.operand), mapToken(node.operator));
+    PostfixExpression copy = new PostfixExpression(_cloneNode(node.operand), _mapToken(node.operator));
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
@@ -15753,15 +17107,17 @@
     return copy;
   }
 
+  @override
   PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
-    PrefixedIdentifier copy = new PrefixedIdentifier(cloneNode(node.prefix), mapToken(node.period), cloneNode(node.identifier));
+    PrefixedIdentifier copy = new PrefixedIdentifier(_cloneNode(node.prefix), _mapToken(node.period), _cloneNode(node.identifier));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   PrefixExpression visitPrefixExpression(PrefixExpression node) {
-    PrefixExpression copy = new PrefixExpression(mapToken(node.operator), cloneNode(node.operand));
+    PrefixExpression copy = new PrefixExpression(_mapToken(node.operator), _cloneNode(node.operand));
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
     copy.staticElement = node.staticElement;
@@ -15769,36 +17125,44 @@
     return copy;
   }
 
+  @override
   PropertyAccess visitPropertyAccess(PropertyAccess node) {
-    PropertyAccess copy = new PropertyAccess(cloneNode(node.target), mapToken(node.operator), cloneNode(node.propertyName));
+    PropertyAccess copy = new PropertyAccess(_cloneNode(node.target), _mapToken(node.operator), _cloneNode(node.propertyName));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    RedirectingConstructorInvocation copy = new RedirectingConstructorInvocation(mapToken(node.keyword), mapToken(node.period), cloneNode(node.constructorName), cloneNode(node.argumentList));
+    RedirectingConstructorInvocation copy = new RedirectingConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
     copy.staticElement = node.staticElement;
     return copy;
   }
 
+  @override
   RethrowExpression visitRethrowExpression(RethrowExpression node) {
-    RethrowExpression copy = new RethrowExpression(mapToken(node.keyword));
+    RethrowExpression copy = new RethrowExpression(_mapToken(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(mapToken(node.keyword), cloneNode(node.expression), mapToken(node.semicolon));
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(_mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.semicolon));
 
-  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(mapToken(node.scriptTag));
+  @override
+  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(_mapToken(node.scriptTag));
 
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(mapToken(node.keyword), cloneNodeList(node.shownNames));
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(_mapToken(node.keyword), _cloneNodeList(node.shownNames));
 
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.type), cloneNode(node.identifier));
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNode(node.identifier));
 
+  @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
-    Token mappedToken = mapToken(node.token);
+    Token mappedToken = _mapToken(node.token);
     if (mappedToken == null) {
       // This only happens for SimpleIdentifiers created by the parser as part of scanning
       // documentation comments (the tokens for those identifiers are not in the original token
@@ -15815,87 +17179,108 @@
     return copy;
   }
 
+  @override
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
-    SimpleStringLiteral copy = new SimpleStringLiteral(mapToken(node.literal), node.value);
+    SimpleStringLiteral copy = new SimpleStringLiteral(_mapToken(node.literal), node.value);
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   StringInterpolation visitStringInterpolation(StringInterpolation node) {
-    StringInterpolation copy = new StringInterpolation(cloneNodeList(node.elements));
+    StringInterpolation copy = new StringInterpolation(_cloneNodeList(node.elements));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    SuperConstructorInvocation copy = new SuperConstructorInvocation(mapToken(node.keyword), mapToken(node.period), cloneNode(node.constructorName), cloneNode(node.argumentList));
+    SuperConstructorInvocation copy = new SuperConstructorInvocation(_mapToken(node.keyword), _mapToken(node.period), _cloneNode(node.constructorName), _cloneNode(node.argumentList));
     copy.staticElement = node.staticElement;
     return copy;
   }
 
+  @override
   SuperExpression visitSuperExpression(SuperExpression node) {
-    SuperExpression copy = new SuperExpression(mapToken(node.keyword));
+    SuperExpression copy = new SuperExpression(_mapToken(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(cloneNodeList(node.labels), mapToken(node.keyword), cloneNode(node.expression), mapToken(node.colon), cloneNodeList(node.statements));
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(_cloneNodeList(node.labels), _mapToken(node.keyword), _cloneNode(node.expression), _mapToken(node.colon), _cloneNodeList(node.statements));
 
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(cloneNodeList(node.labels), mapToken(node.keyword), mapToken(node.colon), cloneNodeList(node.statements));
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(_cloneNodeList(node.labels), _mapToken(node.keyword), _mapToken(node.colon), _cloneNodeList(node.statements));
 
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(mapToken(node.keyword), mapToken(node.leftParenthesis), cloneNode(node.expression), mapToken(node.rightParenthesis), mapToken(node.leftBracket), cloneNodeList(node.members), mapToken(node.rightBracket));
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.expression), _mapToken(node.rightParenthesis), _mapToken(node.leftBracket), _cloneNodeList(node.members), _mapToken(node.rightBracket));
 
+  @override
   AstNode visitSymbolLiteral(SymbolLiteral node) {
-    SymbolLiteral copy = new SymbolLiteral(mapToken(node.poundSign), mapTokens(node.components));
+    SymbolLiteral copy = new SymbolLiteral(_mapToken(node.poundSign), _mapTokens(node.components));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   ThisExpression visitThisExpression(ThisExpression node) {
-    ThisExpression copy = new ThisExpression(mapToken(node.keyword));
+    ThisExpression copy = new ThisExpression(_mapToken(node.keyword));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
+  @override
   ThrowExpression visitThrowExpression(ThrowExpression node) {
-    ThrowExpression copy = new ThrowExpression(mapToken(node.keyword), cloneNode(node.expression));
+    ThrowExpression copy = new ThrowExpression(_mapToken(node.keyword), _cloneNode(node.expression));
     copy.propagatedType = node.propagatedType;
     copy.staticType = node.staticType;
     return copy;
   }
 
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.variables), mapToken(node.semicolon));
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.variables), _mapToken(node.semicolon));
 
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(mapToken(node.tryKeyword), cloneNode(node.body), cloneNodeList(node.catchClauses), mapToken(node.finallyKeyword), cloneNode(node.finallyBlock));
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(_mapToken(node.tryKeyword), _cloneNode(node.body), _cloneNodeList(node.catchClauses), _mapToken(node.finallyKeyword), _cloneNode(node.finallyBlock));
 
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(mapToken(node.leftBracket), cloneNodeList(node.arguments), mapToken(node.rightBracket));
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(_mapToken(node.leftBracket), _cloneNodeList(node.arguments), _mapToken(node.rightBracket));
 
+  @override
   TypeName visitTypeName(TypeName node) {
-    TypeName copy = new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
+    TypeName copy = new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
     copy.type = node.type;
     return copy;
   }
 
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name), mapToken(node.keyword), cloneNode(node.bound));
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.keyword), _cloneNode(node.bound));
 
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(mapToken(node.leftBracket), cloneNodeList(node.typeParameters), mapToken(node.rightBracket));
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(_mapToken(node.leftBracket), _cloneNodeList(node.typeParameters), _mapToken(node.rightBracket));
 
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, cloneNodeList(node.metadata), cloneNode(node.name), mapToken(node.equals), cloneNode(node.initializer));
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, _cloneNodeList(node.metadata), _cloneNode(node.name), _mapToken(node.equals), _cloneNode(node.initializer));
 
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, cloneNodeList(node.metadata), mapToken(node.keyword), cloneNode(node.type), cloneNodeList(node.variables));
+  @override
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.type), _cloneNodeList(node.variables));
 
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(cloneNode(node.variables), mapToken(node.semicolon));
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(_cloneNode(node.variables), _mapToken(node.semicolon));
 
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(mapToken(node.keyword), mapToken(node.leftParenthesis), cloneNode(node.condition), mapToken(node.rightParenthesis), cloneNode(node.body));
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(_mapToken(node.keyword), _mapToken(node.leftParenthesis), _cloneNode(node.condition), _mapToken(node.rightParenthesis), _cloneNode(node.body));
 
-  WithClause visitWithClause(WithClause node) => new WithClause(mapToken(node.withKeyword), cloneNodeList(node.mixinTypes));
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(_mapToken(node.withKeyword), _cloneNodeList(node.mixinTypes));
 
-  AstNode cloneNode(AstNode node) {
+  AstNode _cloneNode(AstNode node) {
     if (node == null) {
       return null;
     }
@@ -15905,25 +17290,25 @@
     return node.accept(this) as AstNode;
   }
 
-  List cloneNodeList(NodeList nodes) {
+  List _cloneNodeList(NodeList nodes) {
     List clonedNodes = new List();
     for (AstNode node in nodes) {
-      clonedNodes.add(cloneNode(node));
+      clonedNodes.add(_cloneNode(node));
     }
     return clonedNodes;
   }
 
-  Token mapToken(Token oldToken) {
+  Token _mapToken(Token oldToken) {
     if (oldToken == null) {
       return null;
     }
     return _tokenMap.get(oldToken);
   }
 
-  List<Token> mapTokens(List<Token> oldTokens) {
+  List<Token> _mapTokens(List<Token> oldTokens) {
     List<Token> newTokens = new List<Token>(oldTokens.length);
     for (int index = 0; index < newTokens.length; index++) {
-      newTokens[index] = mapToken(oldTokens[index]);
+      newTokens[index] = _mapToken(oldTokens[index]);
     }
     return newTokens;
   }
@@ -15956,45 +17341,52 @@
 
   Map<String, SimpleIdentifier> get locals => _locals;
 
+  @override
   Object visitBlock(Block node) {
-    checkStatements(node.statements);
+    _checkStatements(node.statements);
     return super.visitBlock(node);
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
-    addToScope(node.exceptionParameter);
-    addToScope(node.stackTraceParameter);
+    _addToScope(node.exceptionParameter);
+    _addToScope(node.stackTraceParameter);
     return super.visitCatchClause(node);
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     if (_immediateChild != node.parameters) {
-      addParameters(node.parameters.parameters);
+      _addParameters(node.parameters.parameters);
     }
     _declarationNode = node;
     return null;
   }
 
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     _declarationNode = node;
     return null;
   }
 
+  @override
   Object visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable != null) {
-      addToScope(loopVariable.identifier);
+      _addToScope(loopVariable.identifier);
     }
     return super.visitForEachStatement(node);
   }
 
+  @override
   Object visitForStatement(ForStatement node) {
     if (_immediateChild != node.variables && node.variables != null) {
-      addVariables(node.variables.variables);
+      _addVariables(node.variables.variables);
     }
     return super.visitForStatement(node);
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     if (node.parent is! FunctionDeclarationStatement) {
       _declarationNode = node;
@@ -16003,29 +17395,33 @@
     return super.visitFunctionDeclaration(node);
   }
 
+  @override
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     _referenceIsWithinLocalFunction = true;
     return super.visitFunctionDeclarationStatement(node);
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parameters != null && _immediateChild != node.parameters) {
-      addParameters(node.parameters.parameters);
+      _addParameters(node.parameters.parameters);
     }
     return super.visitFunctionExpression(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     _declarationNode = node;
     if (node.parameters == null) {
       return null;
     }
     if (_immediateChild != node.parameters) {
-      addParameters(node.parameters.parameters);
+      _addParameters(node.parameters.parameters);
     }
     return null;
   }
 
+  @override
   Object visitNode(AstNode node) {
     _immediateChild = node;
     AstNode parent = node.parent;
@@ -16035,29 +17431,32 @@
     return null;
   }
 
+  @override
   Object visitSwitchMember(SwitchMember node) {
-    checkStatements(node.statements);
+    _checkStatements(node.statements);
     return super.visitSwitchMember(node);
   }
 
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _declarationNode = node;
     return null;
   }
 
+  @override
   Object visitTypeAlias(TypeAlias node) {
     _declarationNode = node;
     return null;
   }
 
-  void addParameters(NodeList<FormalParameter> vars) {
+  void _addParameters(NodeList<FormalParameter> vars) {
     for (FormalParameter var2 in vars) {
-      addToScope(var2.identifier);
+      _addToScope(var2.identifier);
     }
   }
 
-  void addToScope(SimpleIdentifier identifier) {
-    if (identifier != null && isInRange(identifier)) {
+  void _addToScope(SimpleIdentifier identifier) {
+    if (identifier != null && _isInRange(identifier)) {
       String name = identifier.name;
       if (!_locals.containsKey(name)) {
         _locals[name] = identifier;
@@ -16065,9 +17464,9 @@
     }
   }
 
-  void addVariables(NodeList<VariableDeclaration> vars) {
+  void _addVariables(NodeList<VariableDeclaration> vars) {
     for (VariableDeclaration var2 in vars) {
-      addToScope(var2.name);
+      _addToScope(var2.name);
     }
   }
 
@@ -16076,20 +17475,20 @@
    *
    * @param statements the list of statements to check for name definitions
    */
-  void checkStatements(List<Statement> statements) {
+  void _checkStatements(List<Statement> statements) {
     for (Statement stmt in statements) {
       if (identical(stmt, _immediateChild)) {
         return;
       }
       if (stmt is VariableDeclarationStatement) {
-        addVariables(stmt.variables.variables);
+        _addVariables(stmt.variables.variables);
       } else if (stmt is FunctionDeclarationStatement && !_referenceIsWithinLocalFunction) {
-        addToScope(stmt.functionDeclaration.name);
+        _addToScope(stmt.functionDeclaration.name);
       }
     }
   }
 
-  bool isInRange(AstNode node) {
+  bool _isInRange(AstNode node) {
     if (_position < 0) {
       // if source position is not set then all nodes are in range
       return true;
@@ -16214,6 +17613,9 @@
     owner.becomeParentOf(node);
     _elements[index] = node;
   }
+  void clear() {
+    _elements = <E> [];
+  }
   int get length => _elements.length;
   void set length(int value) {
     throw new UnsupportedError("Cannot resize NodeList.");
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index e998954..77901f8 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -17,6 +17,7 @@
 import 'resolver.dart' show TypeProvider;
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_dart.dart' show ParameterKind;
+import 'utilities_collection.dart' show DirectedGraph;
 
 /**
  * Instances of the class `ConstantEvaluator` evaluate constant expressions to produce their
@@ -251,6 +252,7 @@
    */
   final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
@@ -326,7 +328,7 @@
     while (!_referenceGraph.isEmpty) {
       VariableElement element = _referenceGraph.removeSink();
       while (element != null) {
-        computeValueFor(element);
+        _computeValueFor(element);
         element = _referenceGraph.removeSink();
       }
       if (!_referenceGraph.isEmpty) {
@@ -341,7 +343,7 @@
           return;
         }
         for (VariableElement variable in variablesInCycle) {
-          generateCycleError(variablesInCycle, variable);
+          _generateCycleError(variablesInCycle, variable);
         }
         _referenceGraph.removeAllNodes(variablesInCycle);
       }
@@ -353,7 +355,7 @@
    *
    * @param variable the variable for which a value is to be computed
    */
-  void computeValueFor(VariableElement variable) {
+  void _computeValueFor(VariableElement variable) {
     VariableDeclaration declaration = _declarationMap[variable];
     if (declaration == null) {
       //
@@ -384,7 +386,7 @@
    * @param variablesInCycle the variables in the cycle that includes the given variable
    * @param variable the variable that is not a valid compile-time constant
    */
-  void generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) {
+  void _generateCycleError(List<VariableElement> variablesInCycle, VariableElement variable) {
   }
 }
 
@@ -451,6 +453,7 @@
     this._typeProvider = typeProvider;
   }
 
+  @override
   EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) {
     EvaluationResultImpl result = null;
     for (StringLiteral string in node.strings) {
@@ -463,6 +466,7 @@
     return result;
   }
 
+  @override
   EvaluationResultImpl visitBinaryExpression(BinaryExpression node) {
     EvaluationResultImpl leftResult = node.leftOperand.accept(this);
     EvaluationResultImpl rightResult = node.rightOperand.accept(this);
@@ -470,7 +474,7 @@
     // 'null' is almost never good operand
     if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
       if (leftResult is ValidResult && leftResult.isNull || rightResult is ValidResult && rightResult.isNull) {
-        return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+        return _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
       }
     }
     // evaluate operator
@@ -515,25 +519,27 @@
         return leftResult.integerDivide(_typeProvider, node, rightResult);
       } else {
         // TODO(brianwilkerson) Figure out which error to report.
-        return error(node, null);
+        return _error(node, null);
       }
       break;
     }
   }
 
-  EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => valid(_typeProvider.boolType, BoolState.from(node.value));
+  @override
+  EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => _valid(_typeProvider.boolType, BoolState.from(node.value));
 
+  @override
   EvaluationResultImpl visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     EvaluationResultImpl conditionResult = condition.accept(this);
     EvaluationResultImpl thenResult = node.thenExpression.accept(this);
     EvaluationResultImpl elseResult = node.elseExpression.accept(this);
     if (conditionResult is ErrorResult) {
-      return union(union(conditionResult as ErrorResult, thenResult), elseResult);
+      return _union(_union(conditionResult as ErrorResult, thenResult), elseResult);
     } else if (!(conditionResult as ValidResult).isBool) {
       return new ErrorResult.con1(condition, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
     } else if (thenResult is ErrorResult) {
-      return union(thenResult, elseResult);
+      return _union(thenResult, elseResult);
     } else if (elseResult is ErrorResult) {
       return elseResult;
     }
@@ -549,15 +555,17 @@
     }
     InterfaceType thenType = (thenResult as ValidResult).value.type;
     InterfaceType elseType = (elseResult as ValidResult).value.type;
-    return validWithUnknownValue(thenType.getLeastUpperBound(elseType) as InterfaceType);
+    return _validWithUnknownValue(thenType.getLeastUpperBound(elseType) as InterfaceType);
   }
 
-  EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => valid(_typeProvider.doubleType, new DoubleState(node.value));
+  @override
+  EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => _valid(_typeProvider.doubleType, new DoubleState(node.value));
 
+  @override
   EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (!node.isConst) {
       // TODO(brianwilkerson) Figure out which error to report.
-      return error(node, null);
+      return _error(node, null);
     }
     ConstructorElement constructor = node.staticElement;
     if (constructor != null && constructor.isConst) {
@@ -570,10 +578,10 @@
         if (argument is NamedExpression) {
           NamedExpression namedExpression = argument;
           String name = namedExpression.name.label.name;
-          namedArgumentValues[name] = valueOf(namedExpression.expression);
+          namedArgumentValues[name] = _valueOf(namedExpression.expression);
           argumentValues[i] = null2;
         } else {
-          argumentValues[i] = valueOf(argument);
+          argumentValues[i] = _valueOf(argument);
         }
       }
       InterfaceType definingClass = constructor.returnType as InterfaceType;
@@ -582,7 +590,7 @@
         if (className == "Symbol" && argumentCount == 1) {
           String argumentValue = argumentValues[0].stringValue;
           if (argumentValue != null) {
-            return valid(definingClass, new SymbolState(argumentValue));
+            return _valid(definingClass, new SymbolState(argumentValue));
           }
         }
       }
@@ -606,24 +614,28 @@
       // TODO(brianwilkerson) This doesn't handle fields initialized in an initializer. We should be
       // able to handle fields initialized by the superclass' constructor fairly easily, but other
       // initializers will be harder.
-      return valid(definingClass, new GenericState(fieldMap));
+      return _valid(definingClass, new GenericState(fieldMap));
     }
     // TODO(brianwilkerson) Figure out which error to report.
-    return error(node, null);
+    return _error(node, null);
   }
 
-  EvaluationResultImpl visitIntegerLiteral(IntegerLiteral node) => valid(_typeProvider.intType, new IntState(node.value));
+  @override
+  EvaluationResultImpl visitIntegerLiteral(IntegerLiteral node) => _valid(_typeProvider.intType, new IntState(node.value));
 
+  @override
   EvaluationResultImpl visitInterpolationExpression(InterpolationExpression node) {
     EvaluationResultImpl result = node.expression.accept(this);
     if (result is ValidResult && !result.isBoolNumStringOrNull) {
-      return error(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+      return _error(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
     }
     return result.performToString(_typeProvider, node);
   }
 
-  EvaluationResultImpl visitInterpolationString(InterpolationString node) => valid(_typeProvider.stringType, new StringState(node.value));
+  @override
+  EvaluationResultImpl visitInterpolationString(InterpolationString node) => _valid(_typeProvider.stringType, new StringState(node.value));
 
+  @override
   EvaluationResultImpl visitListLiteral(ListLiteral node) {
     if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL);
@@ -632,7 +644,7 @@
     List<DartObjectImpl> elements = new List<DartObjectImpl>();
     for (Expression element in node.elements) {
       EvaluationResultImpl elementResult = element.accept(this);
-      result = union(result, elementResult);
+      result = _union(result, elementResult);
       if (elementResult is ValidResult) {
         elements.add(elementResult.value);
       }
@@ -640,9 +652,10 @@
     if (result != null) {
       return result;
     }
-    return valid(_typeProvider.listType, new ListState(new List.from(elements)));
+    return _valid(_typeProvider.listType, new ListState(new List.from(elements)));
   }
 
+  @override
   EvaluationResultImpl visitMapLiteral(MapLiteral node) {
     if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
@@ -652,8 +665,8 @@
     for (MapLiteralEntry entry in node.entries) {
       EvaluationResultImpl keyResult = entry.key.accept(this);
       EvaluationResultImpl valueResult = entry.value.accept(this);
-      result = union(result, keyResult);
-      result = union(result, valueResult);
+      result = _union(result, keyResult);
+      result = _union(result, valueResult);
       if (keyResult is ValidResult && valueResult is ValidResult) {
         map[keyResult.value] = valueResult.value;
       }
@@ -661,9 +674,10 @@
     if (result != null) {
       return result;
     }
-    return valid(_typeProvider.mapType, new MapState(map));
+    return _valid(_typeProvider.mapType, new MapState(map));
   }
 
+  @override
   EvaluationResultImpl visitMethodInvocation(MethodInvocation node) {
     Element element = node.methodName.staticElement;
     if (element is FunctionElement) {
@@ -684,17 +698,22 @@
       }
     }
     // TODO(brianwilkerson) Figure out which error to report.
-    return error(node, null);
+    return _error(node, null);
   }
 
+  @override
   EvaluationResultImpl visitNamedExpression(NamedExpression node) => node.expression.accept(this);
 
-  EvaluationResultImpl visitNode(AstNode node) => error(node, null);
+  @override
+  EvaluationResultImpl visitNode(AstNode node) => _error(node, null);
 
+  @override
   EvaluationResultImpl visitNullLiteral(NullLiteral node) => new ValidResult(null2);
 
+  @override
   EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
 
+  @override
   EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) {
     // validate prefix
     SimpleIdentifier prefixNode = node.prefix;
@@ -702,17 +721,18 @@
     if (prefixElement is! PrefixElement) {
       EvaluationResultImpl prefixResult = prefixNode.accept(this);
       if (prefixResult is! ValidResult) {
-        return error(node, null);
+        return _error(node, null);
       }
     }
     // validate prefixed identifier
-    return getConstantValue(node, node.staticElement);
+    return _getConstantValue(node, node.staticElement);
   }
 
+  @override
   EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
     EvaluationResultImpl operand = node.operand.accept(this);
     if (operand is ValidResult && operand.isNull) {
-      return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+      return _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
     }
     while (true) {
       if (node.operator.type == TokenType.BANG) {
@@ -723,18 +743,22 @@
         return operand.negated(_typeProvider, node);
       } else {
         // TODO(brianwilkerson) Figure out which error to report.
-        return error(node, null);
+        return _error(node, null);
       }
       break;
     }
   }
 
-  EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.staticElement);
+  @override
+  EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => _getConstantValue(node, node.propertyName.staticElement);
 
-  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.staticElement);
+  @override
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => _getConstantValue(node, node.staticElement);
 
-  EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => valid(_typeProvider.stringType, new StringState(node.value));
+  @override
+  EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => _valid(_typeProvider.stringType, new StringState(node.value));
 
+  @override
   EvaluationResultImpl visitStringInterpolation(StringInterpolation node) {
     EvaluationResultImpl result = null;
     for (InterpolationElement element in node.elements) {
@@ -747,6 +771,7 @@
     return result;
   }
 
+  @override
   EvaluationResultImpl visitSymbolLiteral(SymbolLiteral node) {
     JavaStringBuilder builder = new JavaStringBuilder();
     List<Token> components = node.components;
@@ -756,7 +781,7 @@
       }
       builder.append(components[i].lexeme);
     }
-    return valid(_typeProvider.symbolType, new SymbolState(builder.toString()));
+    return _valid(_typeProvider.symbolType, new SymbolState(builder.toString()));
   }
 
   /**
@@ -766,7 +791,7 @@
    * @param code the error code indicating the nature of the error
    * @return a result object representing an error associated with the given node
    */
-  ErrorResult error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
+  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
 
   /**
    * Return the constant value of the static constant represented by the given element.
@@ -775,7 +800,7 @@
    * @param element the element whose value is to be returned
    * @return the constant value of the static constant
    */
-  EvaluationResultImpl getConstantValue(AstNode node, Element element) {
+  EvaluationResultImpl _getConstantValue(AstNode node, Element element) {
     if (element is PropertyAccessorElement) {
       element = (element as PropertyAccessorElement).variable;
     }
@@ -788,13 +813,13 @@
     } else if (element is ExecutableElement) {
       ExecutableElement function = element;
       if (function.isStatic) {
-        return valid(_typeProvider.functionType, new FunctionState(function));
+        return _valid(_typeProvider.functionType, new FunctionState(function));
       }
     } else if (element is ClassElement || element is FunctionTypeAliasElement) {
-      return valid(_typeProvider.typeType, new TypeState(element));
+      return _valid(_typeProvider.typeType, new TypeState(element));
     }
     // TODO(brianwilkerson) Figure out which error to report.
-    return error(node, null);
+    return _error(node, null);
   }
 
   /**
@@ -818,7 +843,7 @@
    *          errors to be added
    * @return the union of the errors encoded in the given results
    */
-  ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
+  ErrorResult _union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
     if (rightResult is ErrorResult) {
       if (leftResult != null) {
         return new ErrorResult.con2(leftResult, rightResult);
@@ -829,22 +854,22 @@
     return leftResult;
   }
 
-  ValidResult valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
+  ValidResult _valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
 
-  ValidResult validWithUnknownValue(InterfaceType type) {
+  ValidResult _validWithUnknownValue(InterfaceType type) {
     if (type.element.library.isDartCore) {
       String typeName = type.name;
       if (typeName == "bool") {
-        return valid(type, BoolState.UNKNOWN_VALUE);
+        return _valid(type, BoolState.UNKNOWN_VALUE);
       } else if (typeName == "double") {
-        return valid(type, DoubleState.UNKNOWN_VALUE);
+        return _valid(type, DoubleState.UNKNOWN_VALUE);
       } else if (typeName == "int") {
-        return valid(type, IntState.UNKNOWN_VALUE);
+        return _valid(type, IntState.UNKNOWN_VALUE);
       } else if (typeName == "String") {
-        return valid(type, StringState.UNKNOWN_VALUE);
+        return _valid(type, StringState.UNKNOWN_VALUE);
       }
     }
-    return valid(type, GenericState.UNKNOWN_VALUE);
+    return _valid(type, GenericState.UNKNOWN_VALUE);
   }
 
   /**
@@ -854,7 +879,7 @@
    * @param expression the expression whose value is to be returned
    * @return the value of the given expression
    */
-  DartObjectImpl valueOf(Expression expression) {
+  DartObjectImpl _valueOf(Expression expression) {
     EvaluationResultImpl expressionValue = expression.accept(this);
     if (expressionValue is ValidResult) {
       return expressionValue.value;
@@ -864,170 +889,6 @@
 }
 
 /**
- * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
- * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
- * edge from any node to any other node, including itself, but will not represent multiple edges
- * between the same pair of nodes.
- *
- * @param N the type of the nodes in the graph
- */
-class DirectedGraph<N> {
-  /**
-   * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
-   * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
-   * the node to an empty set of tails.
-   */
-  Map<N, Set<N>> _edges = new Map<N, Set<N>>();
-
-  /**
-   * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
-   * graph after this method is invoked, whether or not they were before.
-   *
-   * @param head the node at the head of the edge
-   * @param tail the node at the tail of the edge
-   */
-  void addEdge(N head, N tail) {
-    //
-    // First, ensure that the tail is a node known to the graph.
-    //
-    Set<N> tails = _edges[tail];
-    if (tails == null) {
-      _edges[tail] = new Set<N>();
-    }
-    //
-    // Then create the edge.
-    //
-    tails = _edges[head];
-    if (tails == null) {
-      tails = new Set<N>();
-      _edges[head] = tails;
-    }
-    tails.add(tail);
-  }
-
-  /**
-   * Add the given node to the set of nodes in the graph.
-   *
-   * @param node the node to be added
-   */
-  void addNode(N node) {
-    Set<N> tails = _edges[node];
-    if (tails == null) {
-      _edges[node] = new Set<N>();
-    }
-  }
-
-  /**
-   * Return a list of nodes that form a cycle, or `null` if there are no cycles in this graph.
-   *
-   * @return a list of nodes that form a cycle
-   */
-  List<N> findCycle() => null;
-
-  /**
-   * Return the number of nodes in this graph.
-   *
-   * @return the number of nodes in this graph
-   */
-  int get nodeCount => _edges.length;
-
-  /**
-   * Return a set containing the tails of edges that have the given node as their head. The set will
-   * be empty if there are no such edges or if the node is not part of the graph. Clients must not
-   * modify the returned set.
-   *
-   * @param head the node at the head of all of the edges whose tails are to be returned
-   * @return a set containing the tails of edges that have the given node as their head
-   */
-  Set<N> getTails(N head) {
-    Set<N> tails = _edges[head];
-    if (tails == null) {
-      return new Set<N>();
-    }
-    return tails;
-  }
-
-  /**
-   * Return `true` if this graph is empty.
-   *
-   * @return `true` if this graph is empty
-   */
-  bool get isEmpty => _edges.isEmpty;
-
-  /**
-   * Remove all of the given nodes from this graph. As a consequence, any edges for which those
-   * nodes were either a head or a tail will also be removed.
-   *
-   * @param nodes the nodes to be removed
-   */
-  void removeAllNodes(List<N> nodes) {
-    for (N node in nodes) {
-      removeNode(node);
-    }
-  }
-
-  /**
-   * Remove the edge from the given head node to the given tail node. If there was no such edge then
-   * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
-   * the same (neither node will either be added or removed).
-   *
-   * @param head the node at the head of the edge
-   * @param tail the node at the tail of the edge
-   * @return `true` if the graph was modified as a result of this operation
-   */
-  void removeEdge(N head, N tail) {
-    Set<N> tails = _edges[head];
-    if (tails != null) {
-      tails.remove(tail);
-    }
-  }
-
-  /**
-   * Remove the given node from this graph. As a consequence, any edges for which that node was
-   * either a head or a tail will also be removed.
-   *
-   * @param node the node to be removed
-   */
-  void removeNode(N node) {
-    _edges.remove(node);
-    for (Set<N> tails in _edges.values) {
-      tails.remove(node);
-    }
-  }
-
-  /**
-   * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
-   * are no edges that have that node as the head of the edge) and remove it from this graph. Return
-   * the node that was removed, or `null` if there are no such nodes either because the graph
-   * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
-   * removing the node from the graph any edges for which that node was a tail will also be removed.
-   *
-   * @return the sink node that was removed
-   */
-  N removeSink() {
-    N sink = findSink();
-    if (sink == null) {
-      return null;
-    }
-    removeNode(sink);
-    return sink;
-  }
-
-  /**
-   * Return one node that has no outgoing edges (that is, for which there are no edges that have
-   * that node as the head of the edge), or `null` if there are no such nodes.
-   *
-   * @return a sink node
-   */
-  N findSink() {
-    for (N key in _edges.keys) {
-      if (_edges[key].isEmpty) return key;
-    }
-    return null;
-  }
-}
-
-/**
  * Instances of the class `ErrorResult` represent the result of evaluating an expression that
  * is not a valid compile time constant.
  */
@@ -1060,138 +921,204 @@
     _errors.addAll(secondResult._errors);
   }
 
+  @override
   EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToError(node, this);
 
+  @override
   EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) => this;
 
+  @override
   EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndError(node, this);
 
+  @override
   EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) => this;
 
+  @override
   EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrError(node, this);
 
+  @override
   EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorError(node, this);
 
+  @override
   EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateError(node, this);
 
+  @override
   EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideError(node, this);
 
+  @override
   EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualError(node, this);
 
+  @override
   bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) => false;
 
   List<ErrorResult_ErrorData> get errorData => _errors;
 
+  @override
   EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanError(node, this);
 
+  @override
   EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualError(node, this);
 
+  @override
   EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideError(node, this);
 
+  @override
   EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanError(node, this);
 
+  @override
   EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualError(node, this);
 
+  @override
   EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndError(node, this);
 
+  @override
   EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) => this;
 
+  @override
   EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrError(node, this);
 
+  @override
   EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusError(node, this);
 
+  @override
   EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) => this;
 
+  @override
   EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualError(node, this);
 
+  @override
   EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) => this;
 
+  @override
   EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderError(node, this);
 
+  @override
   EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftError(node, this);
 
+  @override
   EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightError(node, this);
 
+  @override
   EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesError(node, this);
 
+  @override
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 
+  @override
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => new ErrorResult.con2(this, leftOperand);
 
+  @override
   EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) => this;
 }
 
@@ -1390,6 +1317,7 @@
     this._referenceGraph = referenceGraph;
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
     if (element is PropertyAccessorElement) {
@@ -1422,6 +1350,7 @@
    */
   ValidResult(this.value);
 
+  @override
   EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
 
   /**
@@ -1430,34 +1359,43 @@
    * @param node the node against which errors should be reported
    * @return the result of applying boolean conversion to the given value
    */
+  @override
   EvaluationResultImpl applyBooleanConversion(TypeProvider typeProvider, AstNode node) {
     try {
-      return valueOf(value.convertToBool(typeProvider));
+      return _valueOf(value.convertToBool(typeProvider));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl bitAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitAndValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl bitNot(TypeProvider typeProvider, Expression node) {
     try {
-      return valueOf(value.bitNot(typeProvider));
+      return _valueOf(value.bitNot(typeProvider));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl bitOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitOrValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl bitXor(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.bitXorValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl concatenate(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.concatenateValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl divide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.divideValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl equalEqual(TypeProvider typeProvider, Expression node, EvaluationResultImpl rightOperand) => rightOperand.equalEqualValid(typeProvider, node, this);
 
+  @override
   bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) {
     if (result is! ValidResult) {
       return false;
@@ -1465,10 +1403,13 @@
     return value == (result as ValidResult).value;
   }
 
+  @override
   EvaluationResultImpl greaterThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl greaterThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.greaterThanOrEqualValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl integerDivide(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(typeProvider, node, this);
 
   /**
@@ -1514,50 +1455,64 @@
    */
   bool get isUserDefinedObject => value.isUserDefinedObject;
 
+  @override
   EvaluationResultImpl lessThan(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl lessThanOrEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.lessThanOrEqualValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl logicalAnd(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalAndValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl logicalNot(TypeProvider typeProvider, Expression node) {
     try {
-      return valueOf(value.logicalNot(typeProvider));
+      return _valueOf(value.logicalNot(typeProvider));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl logicalOr(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.logicalOrValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl minus(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.minusValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl negated(TypeProvider typeProvider, Expression node) {
     try {
-      return valueOf(value.negated(typeProvider));
+      return _valueOf(value.negated(typeProvider));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl notEqual(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.notEqualValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl performToString(TypeProvider typeProvider, AstNode node) {
     try {
-      return valueOf(value.performToString(typeProvider));
+      return _valueOf(value.performToString(typeProvider));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl remainder(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.remainderValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl shiftLeft(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftLeftValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl shiftRight(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.shiftRightValid(typeProvider, node, this);
 
+  @override
   EvaluationResultImpl times(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.timesValid(typeProvider, node, this);
 
+  @override
   String toString() {
     if (value == null) {
       return "null";
@@ -1565,203 +1520,243 @@
     return value.toString();
   }
 
+  @override
   EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl addToValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.add(typeProvider, value));
+      return _valueOf(leftOperand.value.add(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl bitAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.bitAnd(typeProvider, value));
+      return _valueOf(leftOperand.value.bitAnd(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl bitOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.bitOr(typeProvider, value));
+      return _valueOf(leftOperand.value.bitOr(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl bitXorValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.bitXor(typeProvider, value));
+      return _valueOf(leftOperand.value.bitXor(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl concatenateValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.concatenate(typeProvider, value));
+      return _valueOf(leftOperand.value.concatenate(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl divideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.divide(typeProvider, value));
+      return _valueOf(leftOperand.value.divide(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl equalEqualValid(TypeProvider typeProvider, Expression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.equalEqual(typeProvider, value));
+      return _valueOf(leftOperand.value.equalEqual(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl greaterThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.greaterThanOrEqual(typeProvider, value));
+      return _valueOf(leftOperand.value.greaterThanOrEqual(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl greaterThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.greaterThan(typeProvider, value));
+      return _valueOf(leftOperand.value.greaterThan(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl integerDivideValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.integerDivide(typeProvider, value));
+      return _valueOf(leftOperand.value.integerDivide(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl lessThanOrEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.lessThanOrEqual(typeProvider, value));
+      return _valueOf(leftOperand.value.lessThanOrEqual(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl lessThanValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.lessThan(typeProvider, value));
+      return _valueOf(leftOperand.value.lessThan(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl logicalAndValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.logicalAnd(typeProvider, value));
+      return _valueOf(leftOperand.value.logicalAnd(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl logicalOrValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.logicalOr(typeProvider, value));
+      return _valueOf(leftOperand.value.logicalOr(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl minusValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.minus(typeProvider, value));
+      return _valueOf(leftOperand.value.minus(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl notEqualValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.notEqual(typeProvider, value));
+      return _valueOf(leftOperand.value.notEqual(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl remainderValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.remainder(typeProvider, value));
+      return _valueOf(leftOperand.value.remainder(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl shiftLeftValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.shiftLeft(typeProvider, value));
+      return _valueOf(leftOperand.value.shiftLeft(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl shiftRightValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.shiftRight(typeProvider, value));
+      return _valueOf(leftOperand.value.shiftRight(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
+  @override
   EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand) => leftOperand;
 
+  @override
   EvaluationResultImpl timesValid(TypeProvider typeProvider, BinaryExpression node, ValidResult leftOperand) {
     try {
-      return valueOf(leftOperand.value.times(typeProvider, value));
+      return _valueOf(leftOperand.value.times(typeProvider, value));
     } on EvaluationException catch (exception) {
-      return error(node, exception.errorCode);
+      return _error(node, exception.errorCode);
     }
   }
 
@@ -1772,7 +1767,7 @@
    * @param code the error code indicating the nature of the error
    * @return a result object representing an error associated with the given node
    */
-  ErrorResult error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code);
+  ErrorResult _error(AstNode node, ErrorCode code) => new ErrorResult.con1(node, code);
 
   /**
    * Return a result object representing the given value.
@@ -1780,7 +1775,7 @@
    * @param value the value to be represented as a result object
    * @return a result object representing the given value
    */
-  ValidResult valueOf(DartObjectImpl value) => new ValidResult(value);
+  ValidResult _valueOf(DartObjectImpl value) => new ValidResult(value);
 }
 
 /**
@@ -1823,8 +1818,10 @@
    */
   BoolState(this.value);
 
+  @override
   BoolState convertToBool() => this;
 
+  @override
   StringState convertToString() {
     if (value == null) {
       return StringState.UNKNOWN_VALUE;
@@ -1832,6 +1829,7 @@
     return new StringState(value ? "true" : "false");
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (value == null) {
@@ -1849,12 +1847,16 @@
     return FALSE_STATE;
   }
 
+  @override
   bool operator ==(Object object) => object is BoolState && identical(value, object.value);
 
+  @override
   String get typeName => "bool";
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => value == null ? 0 : (value ? 2 : 3);
 
   /**
@@ -1862,10 +1864,13 @@
    *
    * @return `true` if this object represents a boolean value
    */
+  @override
   bool get isBool => true;
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState logicalAnd(InstanceState rightOperand) {
     assertBool(rightOperand);
     if (value == null) {
@@ -1874,6 +1879,7 @@
     return value ? rightOperand.convertToBool() : FALSE_STATE;
   }
 
+  @override
   BoolState logicalNot() {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -1881,6 +1887,7 @@
     return value ? FALSE_STATE : TRUE_STATE;
   }
 
+  @override
   BoolState logicalOr(InstanceState rightOperand) {
     assertBool(rightOperand);
     if (value == null) {
@@ -1889,6 +1896,7 @@
     return value ? TRUE_STATE : rightOperand.convertToBool();
   }
 
+  @override
   String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
 }
 
@@ -2040,6 +2048,7 @@
     return new DartObjectImpl(typeProvider.boolType, _state.equalEqual(rightOperand._state));
   }
 
+  @override
   bool operator ==(Object object) {
     if (object is! DartObjectImpl) {
       return false;
@@ -2048,6 +2057,7 @@
     return type == dartObject.type && _state == dartObject._state;
   }
 
+  @override
   bool get boolValue {
     if (_state is BoolState) {
       return (_state as BoolState).value;
@@ -2055,6 +2065,7 @@
     return null;
   }
 
+  @override
   double get doubleValue {
     if (_state is DoubleState) {
       return (_state as DoubleState).value;
@@ -2062,6 +2073,7 @@
     return null;
   }
 
+  @override
   int get intValue {
     if (_state is IntState) {
       return (_state as IntState).value;
@@ -2069,6 +2081,7 @@
     return null;
   }
 
+  @override
   String get stringValue {
     if (_state is StringState) {
       return (_state as StringState).value;
@@ -2076,6 +2089,7 @@
     return null;
   }
 
+  @override
   Object get value => _state.value;
 
   /**
@@ -2098,8 +2112,10 @@
    */
   DartObjectImpl greaterThanOrEqual(TypeProvider typeProvider, DartObjectImpl rightOperand) => new DartObjectImpl(typeProvider.boolType, _state.greaterThanOrEqual(rightOperand._state));
 
+  @override
   bool get hasExactValue => _state.hasExactValue;
 
+  @override
   int get hashCode => ObjectUtilities.combineHashCodes(type.hashCode, _state.hashCode);
 
   /**
@@ -2127,10 +2143,13 @@
    */
   bool get isBoolNumStringOrNull => _state.isBoolNumStringOrNull;
 
+  @override
   bool get isFalse => _state is BoolState && identical((_state as BoolState).value, false);
 
+  @override
   bool get isNull => _state is NullState;
 
+  @override
   bool get isTrue => _state is BoolState && identical((_state as BoolState).value, true);
 
   /**
@@ -2325,6 +2344,7 @@
     throw new IllegalStateException("times returned a ${result.runtimeType.toString()}");
   }
 
+  @override
   String toString() => "${type.displayName} (${_state.toString()})";
 }
 
@@ -2350,6 +2370,7 @@
    */
   DoubleState(this.value);
 
+  @override
   NumState add(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2373,6 +2394,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   StringState convertToString() {
     if (value == null) {
       return StringState.UNKNOWN_VALUE;
@@ -2380,6 +2402,7 @@
     return new StringState(value.toString());
   }
 
+  @override
   NumState divide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2403,6 +2426,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (value == null) {
@@ -2426,10 +2450,13 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   bool operator ==(Object object) => object is DoubleState && (value == object.value);
 
+  @override
   String get typeName => "double";
 
+  @override
   BoolState greaterThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2453,6 +2480,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState greaterThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2476,10 +2504,13 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => value == null ? 0 : value.hashCode;
 
+  @override
   IntState integerDivide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2505,8 +2536,10 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2530,6 +2563,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState lessThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2553,6 +2587,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2576,6 +2611,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState negated() {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -2583,6 +2619,7 @@
     return new DoubleState(-(value));
   }
 
+  @override
   NumState remainder(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2606,6 +2643,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState times(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2629,6 +2667,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   String toString() => value == null ? "-unknown-" : value.toString();
 }
 
@@ -2642,115 +2681,142 @@
    */
   static DynamicState DYNAMIC_STATE = new DynamicState();
 
+  @override
   NumState add(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
-    return unknownNum(rightOperand);
+    return _unknownNum(rightOperand);
   }
 
+  @override
   IntState bitAnd(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   IntState bitNot() => IntState.UNKNOWN_VALUE;
 
+  @override
   IntState bitOr(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   IntState bitXor(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   StringState concatenate(InstanceState rightOperand) {
     assertString(rightOperand);
     return StringState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState convertToBool() => BoolState.UNKNOWN_VALUE;
 
+  @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
+  @override
   NumState divide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
-    return unknownNum(rightOperand);
+    return _unknownNum(rightOperand);
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   String get typeName => "dynamic";
 
+  @override
   BoolState greaterThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState greaterThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   IntState integerDivide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   bool get isBool => true;
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState lessThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState logicalAnd(InstanceState rightOperand) {
     assertBool(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState logicalNot() => BoolState.UNKNOWN_VALUE;
 
+  @override
   BoolState logicalOr(InstanceState rightOperand) {
     assertBool(rightOperand);
     return rightOperand.convertToBool();
   }
 
+  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
-    return unknownNum(rightOperand);
+    return _unknownNum(rightOperand);
   }
 
+  @override
   NumState negated() => NumState.UNKNOWN_VALUE;
 
+  @override
   NumState remainder(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
-    return unknownNum(rightOperand);
+    return _unknownNum(rightOperand);
   }
 
+  @override
   IntState shiftLeft(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   IntState shiftRight(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   NumState times(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
-    return unknownNum(rightOperand);
+    return _unknownNum(rightOperand);
   }
 
   /**
@@ -2760,7 +2826,7 @@
    * @param rightOperand the operand whose type will determine the type of the result
    * @return an object representing an unknown numeric value
    */
-  NumState unknownNum(InstanceState rightOperand) {
+  NumState _unknownNum(InstanceState rightOperand) {
     if (rightOperand is IntState) {
       return IntState.UNKNOWN_VALUE;
     } else if (rightOperand is DoubleState) {
@@ -2807,6 +2873,7 @@
     this._element = element;
   }
 
+  @override
   StringState convertToString() {
     if (_element == null) {
       return StringState.UNKNOWN_VALUE;
@@ -2814,8 +2881,10 @@
     return new StringState(_element.name);
   }
 
+  @override
   bool operator ==(Object object) => object is FunctionState && (_element == object._element);
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     if (_element == null) {
       return BoolState.UNKNOWN_VALUE;
@@ -2832,10 +2901,13 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   String get typeName => "Function";
 
+  @override
   int get hashCode => _element == null ? 0 : _element.hashCode;
 
+  @override
   String toString() => _element == null ? "-unknown-" : _element.name;
 }
 
@@ -2863,8 +2935,10 @@
     this._fieldMap = fieldMap;
   }
 
+  @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
+  @override
   bool operator ==(Object object) {
     if (object is! GenericState) {
       return false;
@@ -2885,6 +2959,7 @@
     return true;
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (rightOperand is DynamicState) {
@@ -2893,8 +2968,10 @@
     return BoolState.from(this == rightOperand);
   }
 
+  @override
   String get typeName => "user defined type";
 
+  @override
   int get hashCode {
     int hashCode = 0;
     for (DartObjectImpl value in _fieldMap.values) {
@@ -3324,6 +3401,7 @@
    */
   IntState(this.value);
 
+  @override
   NumState add(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3350,6 +3428,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   IntState bitAnd(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     if (value == null) {
@@ -3367,6 +3446,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   IntState bitNot() {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -3374,6 +3454,7 @@
     return new IntState(~value);
   }
 
+  @override
   IntState bitOr(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     if (value == null) {
@@ -3391,6 +3472,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   IntState bitXor(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     if (value == null) {
@@ -3408,6 +3490,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   StringState convertToString() {
     if (value == null) {
       return StringState.UNKNOWN_VALUE;
@@ -3415,6 +3498,7 @@
     return new StringState(value.toString());
   }
 
+  @override
   NumState divide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3443,6 +3527,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (value == null) {
@@ -3466,10 +3551,13 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   bool operator ==(Object object) => object is IntState && (value == object.value);
 
+  @override
   String get typeName => "int";
 
+  @override
   BoolState greaterThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3493,6 +3581,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState greaterThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3516,10 +3605,13 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => value == null ? 0 : value.hashCode;
 
+  @override
   IntState integerDivide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3546,8 +3638,10 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3571,6 +3665,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   BoolState lessThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3594,6 +3689,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3620,6 +3716,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState negated() {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -3627,6 +3724,7 @@
     return new IntState(-value);
   }
 
+  @override
   NumState remainder(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3655,6 +3753,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   IntState shiftLeft(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     if (value == null) {
@@ -3674,6 +3773,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   IntState shiftRight(InstanceState rightOperand) {
     assertIntOrNull(rightOperand);
     if (value == null) {
@@ -3693,6 +3793,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   NumState times(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -3719,6 +3820,7 @@
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   String toString() => value == null ? "-unknown-" : value.toString();
 }
 
@@ -3741,8 +3843,10 @@
     this._elements = elements;
   }
 
+  @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (rightOperand is DynamicState) {
@@ -3751,6 +3855,7 @@
     return BoolState.from(this == rightOperand);
   }
 
+  @override
   bool operator ==(Object object) {
     if (object is! ListState) {
       return false;
@@ -3770,8 +3875,10 @@
     return true;
   }
 
+  @override
   String get typeName => "List";
 
+  @override
   List<Object> get value {
     int count = _elements.length;
     List<Object> result = new List<Object>(count);
@@ -3785,6 +3892,7 @@
     return result;
   }
 
+  @override
   bool get hasExactValue {
     int count = _elements.length;
     for (int i = 0; i < count; i++) {
@@ -3795,6 +3903,7 @@
     return true;
   }
 
+  @override
   int get hashCode {
     int value = 0;
     int count = _elements.length;
@@ -3824,8 +3933,10 @@
     this._entries = entries;
   }
 
+  @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (rightOperand is DynamicState) {
@@ -3834,6 +3945,7 @@
     return BoolState.from(this == rightOperand);
   }
 
+  @override
   bool operator ==(Object object) {
     if (object is! MapState) {
       return false;
@@ -3856,8 +3968,10 @@
     return true;
   }
 
+  @override
   String get typeName => "Map";
 
+  @override
   Map<Object, Object> get value {
     Map<Object, Object> result = new Map<Object, Object>();
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
@@ -3871,6 +3985,7 @@
     return result;
   }
 
+  @override
   bool get hasExactValue {
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
       if (!entry.getKey().hasExactValue || !entry.getValue().hasExactValue) {
@@ -3880,6 +3995,7 @@
     return true;
   }
 
+  @override
   int get hashCode {
     int value = 0;
     for (DartObjectImpl key in _entries.keys.toSet()) {
@@ -3898,12 +4014,15 @@
    */
   static NullState NULL_STATE = new NullState();
 
+  @override
   BoolState convertToBool() {
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   StringState convertToString() => new StringState("null");
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (rightOperand is DynamicState) {
@@ -3912,20 +4031,27 @@
     return BoolState.from(rightOperand is NullState);
   }
 
+  @override
   bool operator ==(Object object) => object is NullState;
 
+  @override
   String get typeName => "Null";
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => 0;
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState logicalNot() {
     throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
   }
 
+  @override
   String toString() => "null";
 }
 
@@ -3939,39 +4065,49 @@
    */
   static NumState UNKNOWN_VALUE = new NumState();
 
+  @override
   NumState add(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return UNKNOWN_VALUE;
   }
 
+  @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
 
+  @override
   NumState divide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return UNKNOWN_VALUE;
   }
 
+  @override
   bool operator ==(Object object) => object is NumState;
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   String get typeName => "num";
 
+  @override
   BoolState greaterThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState greaterThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   int get hashCode => 7;
 
+  @override
   IntState integerDivide(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (rightOperand is IntState) {
@@ -3987,35 +4123,43 @@
     return IntState.UNKNOWN_VALUE;
   }
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   BoolState lessThanOrEqual(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
   }
 
+  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return UNKNOWN_VALUE;
   }
 
+  @override
   NumState negated() => UNKNOWN_VALUE;
 
+  @override
   NumState remainder(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return UNKNOWN_VALUE;
   }
 
+  @override
   NumState times(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return UNKNOWN_VALUE;
   }
 
+  @override
   String toString() => "-unknown-";
 }
 
@@ -4041,6 +4185,7 @@
    */
   StringState(this.value);
 
+  @override
   StringState concatenate(InstanceState rightOperand) {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -4057,8 +4202,10 @@
     return super.concatenate(rightOperand);
   }
 
+  @override
   StringState convertToString() => this;
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (value == null) {
@@ -4076,16 +4223,22 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   bool operator ==(Object object) => object is StringState && (value == object.value);
 
+  @override
   String get typeName => "String";
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => value == null ? 0 : value.hashCode;
 
+  @override
   bool get isBoolNumStringOrNull => true;
 
+  @override
   String toString() => value == null ? "-unknown-" : "'${value}'";
 }
 
@@ -4106,6 +4259,7 @@
    */
   SymbolState(this.value);
 
+  @override
   StringState convertToString() {
     if (value == null) {
       return StringState.UNKNOWN_VALUE;
@@ -4113,6 +4267,7 @@
     return new StringState(value);
   }
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (value == null) {
@@ -4130,14 +4285,19 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   bool operator ==(Object object) => object is SymbolState && (value == object.value);
 
+  @override
   String get typeName => "Symbol";
 
+  @override
   bool get hasExactValue => true;
 
+  @override
   int get hashCode => value == null ? 0 : value.hashCode;
 
+  @override
   String toString() => value == null ? "-unknown-" : "#${value}";
 }
 
@@ -4159,6 +4319,7 @@
     this._element = element;
   }
 
+  @override
   StringState convertToString() {
     if (_element == null) {
       return StringState.UNKNOWN_VALUE;
@@ -4166,8 +4327,10 @@
     return new StringState(_element.name);
   }
 
+  @override
   bool operator ==(Object object) => object is TypeState && (_element == object._element);
 
+  @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
     if (_element == null) {
@@ -4185,9 +4348,12 @@
     return BoolState.FALSE_STATE;
   }
 
+  @override
   String get typeName => "Type";
 
+  @override
   int get hashCode => _element == null ? 0 : _element.hashCode;
 
+  @override
   String toString() => _element == null ? "-unknown-" : _element.name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9e13d86..9f273be 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -129,6 +129,7 @@
    *
    * @return the resolved [ClassDeclaration], not `null`.
    */
+  @override
   ClassDeclaration get node;
 
   /**
@@ -203,6 +204,13 @@
   bool get hasReferenceToSuper;
 
   /**
+   * Return `true` if this class declares a static member.
+   *
+   * @return `true` if this class declares a static member
+   */
+  bool get hasStaticMember;
+
+  /**
    * Return `true` if this class is abstract. A class is abstract if it has an explicit
    * `abstract` modifier. Note, that this definition of <i>abstract</i> is different from
    * <i>has unimplemented members</i>.
@@ -315,6 +323,7 @@
    *
    * @return the type in which this member is defined
    */
+  @override
   ClassElement get enclosingElement;
 
   /**
@@ -353,6 +362,7 @@
    *
    * @return the library in which this compilation unit is defined
    */
+  @override
   LibraryElement get enclosingElement;
 
   /**
@@ -377,6 +387,7 @@
    *
    * @return the resolved [CompilationUnit], not `null`.
    */
+  @override
   CompilationUnit get node;
 
   /**
@@ -417,6 +428,7 @@
    *
    * @return the resolved [ConstructorDeclaration], not `null`.
    */
+  @override
   ConstructorDeclaration get node;
 
   /**
@@ -976,7 +988,7 @@
    *
    * @return the return type defined by this executable element
    */
-  Type2 get returnType;
+  DartType get returnType;
 
   /**
    * Return the type of function defined by this executable element.
@@ -1078,6 +1090,7 @@
    *
    * @return the resolved [FunctionDeclaration], not `null`.
    */
+  @override
   FunctionDeclaration get node;
 }
 
@@ -1091,6 +1104,7 @@
    *
    * @return the compilation unit in which this type alias is defined
    */
+  @override
   CompilationUnitElement get enclosingElement;
 
   /**
@@ -1102,6 +1116,7 @@
    *
    * @return the resolved [FunctionTypeAlias], not `null`.
    */
+  @override
   FunctionTypeAlias get node;
 
   /**
@@ -1116,7 +1131,7 @@
    *
    * @return the return type defined by this type alias
    */
-  Type2 get returnType;
+  DartType get returnType;
 
   /**
    * Return the type of function defined by this type alias.
@@ -1218,14 +1233,6 @@
    * @return the offset of the prefix of this import
    */
   int get prefixOffset;
-
-  /**
-   * Return the offset of the character immediately following the last character of this node's URI,
-   * or `-1` for synthetic import.
-   *
-   * @return the offset of the character just past the node's URI
-   */
-  int get uriEnd;
 }
 
 /**
@@ -1238,6 +1245,7 @@
    *
    * @return the executable element in which this label is defined
    */
+  @override
   ExecutableElement get enclosingElement;
 }
 
@@ -1426,6 +1434,7 @@
    *
    * @return the resolved [MethodDeclaration], not `null`.
    */
+  @override
   MethodDeclaration get node;
 
   /**
@@ -1458,7 +1467,7 @@
    *
    * @return the type of this element as the dynamic type
    */
-  Type2 get type;
+  DartType get type;
 }
 
 /**
@@ -1533,6 +1542,7 @@
    *
    * @return the library into which other libraries are imported using this prefix
    */
+  @override
   LibraryElement get enclosingElement;
 
   /**
@@ -1707,7 +1717,7 @@
    *
    * @return the type representing the bound associated with this parameter
    */
-  Type2 get bound;
+  DartType get bound;
 
   /**
    * Return the type defined by this type parameter.
@@ -1732,6 +1742,21 @@
  */
 abstract class UriReferencedElement implements Element {
   /**
+   * Return the offset of the character immediately following the last character of this node's URI,
+   * or `-1` for synthetic import.
+   *
+   * @return the offset of the character just past the node's URI
+   */
+  int get uriEnd;
+
+  /**
+   * Return the offset of the URU in the file, or `-1` if this element is synthetic.
+   *
+   * @return the offset of the URI
+   */
+  int get uriOffset;
+
+  /**
    * Return the URI that is used to include this element into the enclosing library, or `null`
    * if this is the defining compilation unit of a library.
    *
@@ -1763,6 +1788,7 @@
    *
    * @return the resolved [VariableDeclaration], not `null`.
    */
+  @override
   VariableDeclaration get node;
 
   /**
@@ -1771,7 +1797,7 @@
    *
    * @return the declared type of this variable
    */
-  Type2 get type;
+  DartType get type;
 
   /**
    * Return `true` if this variable was declared with the 'const' modifier.
@@ -2003,6 +2029,7 @@
 class AngularPropertyKind_TWO_WAY extends AngularPropertyKind {
   AngularPropertyKind_TWO_WAY(String name, int ordinal) : super(name, ordinal);
 
+  @override
   bool callsGetter() => true;
 }
 
@@ -2021,7 +2048,7 @@
    *
    * @return the type of this property.
    */
-  Type2 get type;
+  DartType get type;
 }
 
 /**
@@ -2113,30 +2140,41 @@
  * to not be visited.
  */
 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+  @override
   R visitAngularComponentElement(AngularComponentElement element) => visitAngularHasSelectorElement(element);
 
+  @override
   R visitAngularControllerElement(AngularControllerElement element) => visitAngularHasSelectorElement(element);
 
+  @override
   R visitAngularDirectiveElement(AngularDirectiveElement element) => visitAngularHasSelectorElement(element);
 
   R visitAngularElement(AngularElement element) => visitToolkitObjectElement(element);
 
+  @override
   R visitAngularFilterElement(AngularFilterElement element) => visitAngularElement(element);
 
   R visitAngularHasSelectorElement(AngularHasSelectorElement element) => visitAngularElement(element);
 
+  @override
   R visitAngularPropertyElement(AngularPropertyElement element) => visitAngularElement(element);
 
+  @override
   R visitAngularScopePropertyElement(AngularScopePropertyElement element) => visitAngularElement(element);
 
+  @override
   R visitAngularSelectorElement(AngularSelectorElement element) => visitAngularElement(element);
 
+  @override
   R visitAngularViewElement(AngularViewElement element) => visitAngularElement(element);
 
+  @override
   R visitClassElement(ClassElement element) => visitElement(element);
 
+  @override
   R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(element);
 
+  @override
   R visitConstructorElement(ConstructorElement element) => visitExecutableElement(element);
 
   R visitElement(Element element) {
@@ -2144,30 +2182,41 @@
     return null;
   }
 
+  @override
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHtmlScriptElement(element);
 
   R visitExecutableElement(ExecutableElement element) => visitElement(element);
 
+  @override
   R visitExportElement(ExportElement element) => visitElement(element);
 
+  @override
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHtmlScriptElement(element);
 
+  @override
   R visitFieldElement(FieldElement element) => visitPropertyInducingElement(element);
 
+  @override
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) => visitParameterElement(element);
 
+  @override
   R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
 
+  @override
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElement(element);
 
+  @override
   R visitHtmlElement(HtmlElement element) => visitElement(element);
 
   R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
 
+  @override
   R visitImportElement(ImportElement element) => visitElement(element);
 
+  @override
   R visitLabelElement(LabelElement element) => visitElement(element);
 
+  @override
   R visitLibraryElement(LibraryElement element) => visitElement(element);
 
   R visitLocalElement(LocalElement element) {
@@ -2181,24 +2230,32 @@
     return null;
   }
 
+  @override
   R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement(element);
 
+  @override
   R visitMethodElement(MethodElement element) => visitExecutableElement(element);
 
+  @override
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(element);
 
+  @override
   R visitParameterElement(ParameterElement element) => visitLocalElement(element);
 
+  @override
   R visitPrefixElement(PrefixElement element) => visitElement(element);
 
+  @override
   R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecutableElement(element);
 
   R visitPropertyInducingElement(PropertyInducingElement element) => visitVariableElement(element);
 
   R visitToolkitObjectElement(ToolkitObjectElement element) => visitElement(element);
 
+  @override
   R visitTopLevelVariableElement(TopLevelVariableElement element) => visitPropertyInducingElement(element);
 
+  @override
   R visitTypeParameterElement(TypeParameterElement element) => visitElement(element);
 
   R visitVariableElement(VariableElement element) => visitElement(element);
@@ -2215,151 +2272,181 @@
  * children of the visited element to not be visited.
  */
 class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+  @override
   R visitAngularComponentElement(AngularComponentElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularControllerElement(AngularControllerElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularDirectiveElement(AngularDirectiveElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularFilterElement(AngularFilterElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularPropertyElement(AngularPropertyElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularScopePropertyElement(AngularScopePropertyElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularSelectorElement(AngularSelectorElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitAngularViewElement(AngularViewElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitClassElement(ClassElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitCompilationUnitElement(CompilationUnitElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitConstructorElement(ConstructorElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExportElement(ExportElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFieldElement(FieldElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionElement(FunctionElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitHtmlElement(HtmlElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitImportElement(ImportElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLabelElement(LabelElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLibraryElement(LibraryElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitLocalVariableElement(LocalVariableElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMethodElement(MethodElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitParameterElement(ParameterElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPrefixElement(PrefixElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitPropertyAccessorElement(PropertyAccessorElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTopLevelVariableElement(TopLevelVariableElement element) {
     element.visitChildren(this);
     return null;
   }
 
+  @override
   R visitTypeParameterElement(TypeParameterElement element) {
     element.visitChildren(this);
     return null;
@@ -2373,64 +2460,94 @@
  * whole structure) and that only need to visit a small number of element types.
  */
 class SimpleElementVisitor<R> implements ElementVisitor<R> {
+  @override
   R visitAngularComponentElement(AngularComponentElement element) => null;
 
+  @override
   R visitAngularControllerElement(AngularControllerElement element) => null;
 
+  @override
   R visitAngularDirectiveElement(AngularDirectiveElement element) => null;
 
+  @override
   R visitAngularFilterElement(AngularFilterElement element) => null;
 
+  @override
   R visitAngularPropertyElement(AngularPropertyElement element) => null;
 
+  @override
   R visitAngularScopePropertyElement(AngularScopePropertyElement element) => null;
 
+  @override
   R visitAngularSelectorElement(AngularSelectorElement element) => null;
 
+  @override
   R visitAngularViewElement(AngularViewElement element) => null;
 
+  @override
   R visitClassElement(ClassElement element) => null;
 
+  @override
   R visitCompilationUnitElement(CompilationUnitElement element) => null;
 
+  @override
   R visitConstructorElement(ConstructorElement element) => null;
 
+  @override
   R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
 
+  @override
   R visitExportElement(ExportElement element) => null;
 
+  @override
   R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
 
+  @override
   R visitFieldElement(FieldElement element) => null;
 
+  @override
   R visitFieldFormalParameterElement(FieldFormalParameterElement element) => null;
 
+  @override
   R visitFunctionElement(FunctionElement element) => null;
 
+  @override
   R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
 
+  @override
   R visitHtmlElement(HtmlElement element) => null;
 
+  @override
   R visitImportElement(ImportElement element) => null;
 
+  @override
   R visitLabelElement(LabelElement element) => null;
 
+  @override
   R visitLibraryElement(LibraryElement element) => null;
 
+  @override
   R visitLocalVariableElement(LocalVariableElement element) => null;
 
+  @override
   R visitMethodElement(MethodElement element) => null;
 
+  @override
   R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
 
+  @override
   R visitParameterElement(ParameterElement element) => null;
 
+  @override
   R visitPrefixElement(PrefixElement element) => null;
 
+  @override
   R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
 
+  @override
   R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
 
+  @override
   R visitTypeParameterElement(TypeParameterElement element) => null;
 }
 
@@ -2528,18 +2645,22 @@
    *
    * @param name the name of this element
    */
-  ClassElementImpl(Identifier name) : super.con1(name);
+  ClassElementImpl(Identifier name) : super.forNode(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
 
+  @override
   List<PropertyAccessorElement> get accessors => _accessors;
 
+  @override
   List<InterfaceType> get allSupertypes {
     List<InterfaceType> list = new List<InterfaceType>();
-    collectAllSupertypes(list);
+    _collectAllSupertypes(list);
     return new List.from(list);
   }
 
+  @override
   ElementImpl getChild(String identifier) {
     //
     // The casts in this method are safe because the set methods would have thrown a CCE if any of
@@ -2573,8 +2694,10 @@
     return null;
   }
 
+  @override
   List<ConstructorElement> get constructors => _constructors;
 
+  @override
   FieldElement getField(String name) {
     for (FieldElement fieldElement in _fields) {
       if (name == fieldElement.name) {
@@ -2584,8 +2707,10 @@
     return null;
   }
 
+  @override
   List<FieldElement> get fields => _fields;
 
+  @override
   PropertyAccessorElement getGetter(String getterName) {
     for (PropertyAccessorElement accessor in _accessors) {
       if (accessor.isGetter && accessor.name == getterName) {
@@ -2595,8 +2720,10 @@
     return null;
   }
 
+  @override
   ElementKind get kind => ElementKind.CLASS;
 
+  @override
   MethodElement getMethod(String methodName) {
     for (MethodElement method in _methods) {
       if (method.name == methodName) {
@@ -2606,8 +2733,10 @@
     return null;
   }
 
+  @override
   List<MethodElement> get methods => _methods;
 
+  @override
   ConstructorElement getNamedConstructor(String name) {
     for (ConstructorElement element in constructors) {
       String elementName = element.name;
@@ -2618,8 +2747,10 @@
     return null;
   }
 
+  @override
   ClassDeclaration get node => getNodeMatching((node) => node is ClassDeclaration);
 
+  @override
   PropertyAccessorElement getSetter(String setterName) {
     // TODO (jwren) revisit- should we append '=' here or require clients to include it?
     // Do we need the check for isSetter below?
@@ -2634,10 +2765,13 @@
     return null;
   }
 
+  @override
   List<ToolkitObjectElement> get toolkitObjects => _toolkitObjects;
 
+  @override
   List<TypeParameterElement> get typeParameters => _typeParameters;
 
+  @override
   ConstructorElement get unnamedConstructor {
     for (ConstructorElement element in constructors) {
       String name = element.displayName;
@@ -2648,6 +2782,7 @@
     return null;
   }
 
+  @override
   bool get hasNonFinalField {
     List<ClassElement> classesToVisit = new List<ClassElement>();
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
@@ -2680,12 +2815,31 @@
     return false;
   }
 
+  @override
   bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
 
+  @override
+  bool get hasStaticMember {
+    for (MethodElement method in _methods) {
+      if (method.isStatic) {
+        return true;
+      }
+    }
+    for (PropertyAccessorElement accessor in _accessors) {
+      if (accessor.isStatic) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
-  bool get isOrInheritsProxy => safeIsOrInheritsProxy(this, new Set<ClassElement>());
+  @override
+  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new Set<ClassElement>());
 
+  @override
   bool get isProxy {
     for (ElementAnnotation annotation in metadata) {
       if (annotation.isProxy) {
@@ -2695,10 +2849,13 @@
     return false;
   }
 
+  @override
   bool get isTypedef => hasModifier(Modifier.TYPEDEF);
 
+  @override
   bool get isValidMixin => hasModifier(Modifier.MIXIN);
 
+  @override
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -2726,6 +2883,7 @@
     return null;
   }
 
+  @override
   MethodElement lookUpMethod(String methodName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -2753,6 +2911,7 @@
     return null;
   }
 
+  @override
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -2888,6 +3047,7 @@
     setModifier(Modifier.MIXIN, isValidMixin);
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
@@ -2898,6 +3058,7 @@
     safelyVisitChildren(_typeParameters, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     String name = displayName;
     if (name == null) {
@@ -2918,7 +3079,7 @@
     }
   }
 
-  void collectAllSupertypes(List<InterfaceType> supertypes) {
+  void _collectAllSupertypes(List<InterfaceType> supertypes) {
     List<InterfaceType> typesToVisit = new List<InterfaceType>();
     List<ClassElement> visitedClasses = new List<ClassElement>();
     typesToVisit.add(this.type);
@@ -2947,25 +3108,25 @@
     }
   }
 
-  bool safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
+  bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
     }
     visitedClassElts.add(classElt);
     if (classElt.isProxy) {
       return true;
-    } else if (classElt.supertype != null && safeIsOrInheritsProxy(classElt.supertype.element, visitedClassElts)) {
+    } else if (classElt.supertype != null && _safeIsOrInheritsProxy(classElt.supertype.element, visitedClassElts)) {
       return true;
     }
     List<InterfaceType> supertypes = classElt.interfaces;
     for (int i = 0; i < supertypes.length; i++) {
-      if (safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
+      if (_safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
         return true;
       }
     }
     supertypes = classElt.mixins;
     for (int i = 0; i < supertypes.length; i++) {
-      if (safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
+      if (_safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
         return true;
       }
     }
@@ -2977,7 +3138,7 @@
  * Instances of the class `CompilationUnitElementImpl` implement a
  * [CompilationUnitElement].
  */
-class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
+class CompilationUnitElementImpl extends UriReferencedElementImpl implements CompilationUnitElement {
   /**
    * An empty array of compilation unit elements.
    */
@@ -3020,12 +3181,6 @@
   List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_ARRAY;
 
   /**
-   * The URI that is specified by the "part" directive in the enclosing library, or `null` if
-   * this is the defining compilation unit of a library.
-   */
-  String uri;
-
-  /**
    * An array containing all of the Angular views contained in this compilation unit.
    */
   List<AngularViewElement> _angularViews = AngularViewElement.EMPTY_ARRAY;
@@ -3035,16 +3190,21 @@
    *
    * @param name the name of this element
    */
-  CompilationUnitElementImpl(String name) : super.con2(name, -1);
+  CompilationUnitElementImpl(String name) : super(name, -1);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
 
+  @override
   bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && source == (object as CompilationUnitElementImpl).source;
 
+  @override
   List<PropertyAccessorElement> get accessors => _accessors;
 
+  @override
   List<AngularViewElement> get angularViews => _angularViews;
 
+  @override
   ElementImpl getChild(String identifier) {
     //
     // The casts in this method are safe because the set methods would have thrown a CCE if any of
@@ -3078,18 +3238,25 @@
     return null;
   }
 
+  @override
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
 
+  @override
   List<FunctionElement> get functions => _functions;
 
+  @override
   List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases;
 
+  @override
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
 
+  @override
   CompilationUnit get node => unit;
 
+  @override
   List<TopLevelVariableElement> get topLevelVariables => _variables;
 
+  @override
   ClassElement getType(String className) {
     for (ClassElement type in _types) {
       if (type.name == className) {
@@ -3099,8 +3266,10 @@
     return null;
   }
 
+  @override
   List<ClassElement> get types => _types;
 
+  @override
   int get hashCode => source.hashCode;
 
   /**
@@ -3176,6 +3345,7 @@
     this._types = types;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
@@ -3186,6 +3356,7 @@
     safelyVisitChildren(_angularViews, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     if (source == null) {
       builder.append("{compilation unit}");
@@ -3194,6 +3365,7 @@
     }
   }
 
+  @override
   String get identifier => source.encoding;
 
   /**
@@ -3202,7 +3374,7 @@
    * @param element the [Element] to get toolkit objects for
    * @return the associated toolkit objects, may be empty, but not `null`
    */
-  List<ToolkitObjectElement> getToolkitObjects(Element element) {
+  List<ToolkitObjectElement> _getToolkitObjects(Element element) {
     List<ToolkitObjectElement> objects = _toolkitObjects[element];
     if (objects != null) {
       return objects;
@@ -3216,7 +3388,7 @@
    * @param element the [Element] to associate toolkit objects with
    * @param objects the toolkit objects to associate
    */
-  void setToolkitObjects(Element element, List<ToolkitObjectElement> objects) {
+  void _setToolkitObjects(Element element, List<ToolkitObjectElement> objects) {
     _toolkitObjects[element] = objects;
   }
 }
@@ -3238,8 +3410,10 @@
    */
   ConstFieldElementImpl(Identifier name) : super.con1(name);
 
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
+  @override
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
@@ -3262,8 +3436,10 @@
    */
   ConstLocalVariableElementImpl(Identifier name) : super(name);
 
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
+  @override
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
@@ -3286,8 +3462,10 @@
    */
   ConstTopLevelVariableElementImpl(Identifier name) : super.con1(name);
 
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
+  @override
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
@@ -3323,16 +3501,22 @@
    */
   ConstructorElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
 
+  @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
+  @override
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
+  @override
   ConstructorDeclaration get node => getNodeMatching((node) => node is ConstructorDeclaration);
 
+  @override
   bool get isConst => hasModifier(Modifier.CONST);
 
+  @override
   bool get isDefaultConstructor {
     // unnamed
     String name = this.name;
@@ -3349,8 +3533,10 @@
     return true;
   }
 
+  @override
   bool get isFactory => hasModifier(Modifier.FACTORY);
 
+  @override
   bool get isStatic => false;
 
   /**
@@ -3371,6 +3557,7 @@
     setModifier(Modifier.FACTORY, isFactory);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(enclosingElement.displayName);
     String name = displayName;
@@ -3399,8 +3586,10 @@
    */
   DefaultFieldFormalParameterElementImpl(Identifier name) : super(name);
 
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
+  @override
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
@@ -3423,8 +3612,10 @@
    */
   DefaultParameterElementImpl(Identifier name) : super.con1(name);
 
+  @override
   EvaluationResultImpl get evaluationResult => _result;
 
+  @override
   void set evaluationResult(EvaluationResultImpl result) {
     this._result = result;
   }
@@ -3452,12 +3643,14 @@
    * created except as part of creating the type associated with this element. The single instance
    * of this class should be accessed through the method [getInstance].
    */
-  DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) {
+  DynamicElementImpl() : super(Keyword.DYNAMIC.syntax, -1) {
     setModifier(Modifier.SYNTHETIC, true);
   }
 
+  @override
   accept(ElementVisitor visitor) => null;
 
+  @override
   ElementKind get kind => ElementKind.DYNAMIC;
 }
 
@@ -3504,6 +3697,7 @@
    */
   ElementAnnotationImpl(this.element);
 
+  @override
   bool get isDeprecated {
     if (element != null) {
       LibraryElement library = element.library;
@@ -3521,6 +3715,7 @@
     return false;
   }
 
+  @override
   bool get isOverride {
     if (element != null) {
       LibraryElement library = element.library;
@@ -3533,6 +3728,7 @@
     return false;
   }
 
+  @override
   bool get isProxy {
     if (element != null) {
       LibraryElement library = element.library;
@@ -3545,6 +3741,7 @@
     return false;
   }
 
+  @override
   String toString() => "@${element.toString()}";
 }
 
@@ -3590,7 +3787,7 @@
    *
    * @param name the name of this element
    */
-  ElementImpl.con1(Identifier name) : this.con2(name == null ? "" : name.name, name == null ? -1 : name.offset);
+  ElementImpl.forNode(Identifier name) : this(name == null ? "" : name.name, name == null ? -1 : name.offset);
 
   /**
    * Initialize a newly created element to have the given name.
@@ -3599,10 +3796,11 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ElementImpl.con2(String name, this.nameOffset) {
+  ElementImpl(String name, this.nameOffset) {
     this._name = StringUtilities.intern(name);
   }
 
+  @override
   String computeDocumentationComment() {
     AnalysisContext context = this.context;
     if (context == null) {
@@ -3611,6 +3809,7 @@
     return context.computeDocumentationComment(this);
   }
 
+  @override
   bool operator ==(Object object) {
     if (identical(this, object)) {
       return true;
@@ -3621,6 +3820,7 @@
     return object.runtimeType == runtimeType && (object as Element).location == location;
   }
 
+  @override
   Element getAncestor(Predicate<Element> predicate) {
     Element ancestor = _enclosingElement;
     while (ancestor != null && !predicate(ancestor)) {
@@ -3638,6 +3838,7 @@
    */
   ElementImpl getChild(String identifier) => null;
 
+  @override
   AnalysisContext get context {
     if (_enclosingElement == null) {
       return null;
@@ -3645,18 +3846,25 @@
     return _enclosingElement.context;
   }
 
+  @override
   String get displayName => _name;
 
+  @override
   Element get enclosingElement => _enclosingElement;
 
+  @override
   LibraryElement get library => getAncestor((element) => element is LibraryElement);
 
+  @override
   ElementLocation get location => new ElementLocationImpl.con1(this);
 
+  @override
   String get name => _name;
 
+  @override
   AstNode get node => getNodeMatching((node) => node is AstNode);
 
+  @override
   Source get source {
     if (_enclosingElement == null) {
       return null;
@@ -3664,8 +3872,10 @@
     return _enclosingElement.source;
   }
 
+  @override
   CompilationUnit get unit => context.resolveCompilationUnit(source, library);
 
+  @override
   int get hashCode {
     // TODO: We might want to re-visit this optimization in the future.
     // We cache the hash code value as this is a very frequently called method.
@@ -3675,6 +3885,7 @@
     return _cachedHashCode;
   }
 
+  @override
   bool isAccessibleIn(LibraryElement library) {
     if (Identifier.isPrivateName(_name)) {
       return library == this.library;
@@ -3682,6 +3893,7 @@
     return true;
   }
 
+  @override
   bool get isDeprecated {
     for (ElementAnnotation annotation in metadata) {
       if (annotation.isDeprecated) {
@@ -3691,6 +3903,7 @@
     return false;
   }
 
+  @override
   bool get isOverride {
     for (ElementAnnotation annotation in metadata) {
       if (annotation.isOverride) {
@@ -3700,6 +3913,7 @@
     return false;
   }
 
+  @override
   bool get isPrivate {
     String name = displayName;
     if (name == null) {
@@ -3708,8 +3922,10 @@
     return Identifier.isPrivateName(name);
   }
 
+  @override
   bool get isPublic => !isPrivate;
 
+  @override
   bool get isSynthetic => hasModifier(Modifier.SYNTHETIC);
 
   /**
@@ -3721,12 +3937,14 @@
     setModifier(Modifier.SYNTHETIC, isSynthetic);
   }
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
     return builder.toString();
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
   }
 
@@ -3868,9 +4086,10 @@
    * @param encoding the encoded form of a location
    */
   ElementLocationImpl.con2(String encoding) {
-    this._components = decode(encoding);
+    this._components = _decode(encoding);
   }
 
+  @override
   bool operator ==(Object object) {
     if (identical(this, object)) {
       return true;
@@ -3889,10 +4108,10 @@
         return false;
       }
     }
-    if (length > 1 && !equalSourceComponents(_components[1], otherComponents[1])) {
+    if (length > 1 && !_equalSourceComponents(_components[1], otherComponents[1])) {
       return false;
     }
-    if (length > 0 && !equalSourceComponents(_components[0], otherComponents[0])) {
+    if (length > 0 && !_equalSourceComponents(_components[0], otherComponents[0])) {
       return false;
     }
     return true;
@@ -3905,6 +4124,7 @@
    */
   List<String> get components => _components;
 
+  @override
   String get encoding {
     JavaStringBuilder builder = new JavaStringBuilder();
     int length = _components.length;
@@ -3912,18 +4132,19 @@
       if (i > 0) {
         builder.appendChar(_SEPARATOR_CHAR);
       }
-      encode(builder, _components[i]);
+      _encode(builder, _components[i]);
     }
     return builder.toString();
   }
 
+  @override
   int get hashCode {
     int result = 1;
     for (int i = 0; i < _components.length; i++) {
       String component = _components[i];
       int componentHash;
       if (i <= 1) {
-        componentHash = hashSourceComponent(component);
+        componentHash = _hashSourceComponent(component);
       } else {
         componentHash = component.hashCode;
       }
@@ -3932,6 +4153,7 @@
     return result;
   }
 
+  @override
   String toString() => encoding;
 
   /**
@@ -3940,7 +4162,7 @@
    * @param encoding the encoded form of a location
    * @return the components that were encoded
    */
-  List<String> decode(String encoding) {
+  List<String> _decode(String encoding) {
     List<String> components = new List<String>();
     JavaStringBuilder builder = new JavaStringBuilder();
     int index = 0;
@@ -3973,7 +4195,7 @@
    * @param builder the builder to which the encoded component is to be appended
    * @param component the component to be appended to the builder
    */
-  void encode(JavaStringBuilder builder, String component) {
+  void _encode(JavaStringBuilder builder, String component) {
     int length = component.length;
     for (int i = 0; i < length; i++) {
       int currentChar = component.codeUnitAt(i);
@@ -3992,7 +4214,7 @@
    * @param right the right component being compared
    * @return `true` if the given components are equal when the source type's are ignored
    */
-  bool equalSourceComponents(String left, String right) {
+  bool _equalSourceComponents(String left, String right) {
     // TODO(brianwilkerson) This method can go away when sources no longer have a URI kind.
     if (left == null) {
       return right == null;
@@ -4015,7 +4237,7 @@
    * @param sourceComponent the component to compute a hash code
    * @return the hash code of the given encoded source component
    */
-  int hashSourceComponent(String sourceComponent) {
+  int _hashSourceComponent(String sourceComponent) {
     // TODO(brianwilkerson) This method can go away when sources no longer have a URI kind.
     if (sourceComponent.length <= 1) {
       return sourceComponent.hashCode;
@@ -4050,6 +4272,7 @@
     this._second = second;
   }
 
+  @override
   bool operator ==(Object object) {
     if (identical(object, this)) {
       return true;
@@ -4075,6 +4298,7 @@
    */
   Element get secondElt => _second;
 
+  @override
   int get hashCode => ObjectUtilities.combineHashCodes(_first.hashCode, _second.hashCode);
 }
 
@@ -4095,10 +4319,13 @@
    */
   EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this);
 
+  @override
   ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
 
+  @override
   LibraryElement get scriptLibrary => _scriptLibrary;
 
   /**
@@ -4111,6 +4338,7 @@
     this._scriptLibrary = scriptLibrary;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     safelyVisitChild(_scriptLibrary, visitor);
   }
@@ -4144,7 +4372,7 @@
   /**
    * The return type defined by this executable element.
    */
-  Type2 returnType;
+  DartType returnType;
 
   /**
    * The type of function defined by this executable element.
@@ -4161,7 +4389,7 @@
    *
    * @param name the name of this element
    */
-  ExecutableElementImpl.con1(Identifier name) : super.con1(name);
+  ExecutableElementImpl.con1(Identifier name) : super.forNode(name);
 
   /**
    * Initialize a newly created executable element to have the given name.
@@ -4170,8 +4398,9 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
+  ExecutableElementImpl.con2(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   ElementImpl getChild(String identifier) {
     for (ExecutableElement function in _functions) {
       if ((function as ExecutableElementImpl).identifier == identifier) {
@@ -4196,14 +4425,19 @@
     return null;
   }
 
+  @override
   List<FunctionElement> get functions => _functions;
 
+  @override
   List<LabelElement> get labels => _labels;
 
+  @override
   List<LocalVariableElement> get localVariables => _localVariables;
 
+  @override
   List<ParameterElement> get parameters => _parameters;
 
+  @override
   bool get isOperator => false;
 
   /**
@@ -4254,6 +4488,7 @@
     this._parameters = parameters;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_functions, visitor);
@@ -4262,6 +4497,7 @@
     safelyVisitChildren(_parameters, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     if (this.kind != ElementKind.GETTER) {
       builder.append("(");
@@ -4306,12 +4542,7 @@
 /**
  * Instances of the class `ExportElementImpl` implement an [ExportElement].
  */
-class ExportElementImpl extends ElementImpl implements ExportElement {
-  /**
-   * The URI that is specified by this directive.
-   */
-  String uri;
-
+class ExportElementImpl extends UriReferencedElementImpl implements ExportElement {
   /**
    * The library that is exported from this library by this export directive.
    */
@@ -4326,17 +4557,21 @@
   /**
    * Initialize a newly created export element.
    */
-  ExportElementImpl() : super.con1(null);
+  ExportElementImpl() : super(null, -1);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitExportElement(this);
 
+  @override
   ElementKind get kind => ElementKind.EXPORT;
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append("export ");
     (exportedLibrary as LibraryElementImpl).appendTo(builder);
   }
 
+  @override
   String get identifier => exportedLibrary.name;
 }
 
@@ -4357,8 +4592,10 @@
    */
   ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this);
 
+  @override
   ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
 }
 
@@ -4385,12 +4622,16 @@
    */
   FieldElementImpl.con2(String name) : super.con2(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
 
+  @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
+  @override
   ElementKind get kind => ElementKind.FIELD;
 
+  @override
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -4421,8 +4662,10 @@
    */
   FieldFormalParameterElementImpl(Identifier name) : super.con1(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
 
+  @override
   bool get isInitializingFormal => true;
 }
 
@@ -4462,12 +4705,16 @@
    */
   FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
 
+  @override
   ElementKind get kind => ElementKind.FUNCTION;
 
+  @override
   FunctionDeclaration get node => getNodeMatching((node) => node is FunctionDeclaration);
 
+  @override
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
@@ -4475,6 +4722,7 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
 
+  @override
   bool get isStatic => enclosingElement is CompilationUnitElement;
 
   /**
@@ -4490,6 +4738,7 @@
     _visibleRangeLength = length;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     String name = displayName;
     if (name != null) {
@@ -4498,6 +4747,7 @@
     super.appendTo(builder);
   }
 
+  @override
   String get identifier => "${name}@${nameOffset}";
 }
 
@@ -4514,7 +4764,7 @@
   /**
    * The return type defined by this type alias.
    */
-  Type2 returnType;
+  DartType returnType;
 
   /**
    * The type of function defined by this type alias.
@@ -4536,10 +4786,12 @@
    *
    * @param name the name of this element
    */
-  FunctionTypeAliasElementImpl(Identifier name) : super.con1(name);
+  FunctionTypeAliasElementImpl(Identifier name) : super.forNode(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFunctionTypeAliasElement(this);
 
+  @override
   ElementImpl getChild(String identifier) {
     for (VariableElement parameter in _parameters) {
       if ((parameter as VariableElementImpl).identifier == identifier) {
@@ -4554,14 +4806,19 @@
     return null;
   }
 
+  @override
   CompilationUnitElement get enclosingElement => super.enclosingElement as CompilationUnitElement;
 
+  @override
   ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
 
+  @override
   FunctionTypeAlias get node => getNodeMatching((node) => node is FunctionTypeAlias);
 
+  @override
   List<ParameterElement> get parameters => _parameters;
 
+  @override
   List<TypeParameterElement> get typeParameters => _typeParameters;
 
   /**
@@ -4612,12 +4869,14 @@
     this._typeParameters = typeParameters;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
     safelyVisitChildren(_typeParameters, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append("typedef ");
     builder.append(displayName);
@@ -4659,6 +4918,7 @@
    */
   List<String> hiddenNames = StringUtilities.EMPTY_ARRAY;
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("show ");
@@ -4709,10 +4969,12 @@
    * @param context the analysis context in which the HTML file is defined
    * @param name the name of this element
    */
-  HtmlElementImpl(this.context, String name) : super.con2(name, -1);
+  HtmlElementImpl(this.context, String name) : super(name, -1);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
 
+  @override
   bool operator ==(Object object) {
     if (identical(object, this)) {
       return true;
@@ -4723,10 +4985,13 @@
     return runtimeType == object.runtimeType && source == (object as HtmlElementImpl).source;
   }
 
+  @override
   ElementKind get kind => ElementKind.HTML;
 
+  @override
   List<HtmlScriptElement> get scripts => _scripts;
 
+  @override
   int get hashCode => source.hashCode;
 
   /**
@@ -4744,11 +5009,13 @@
     this._scripts = scripts;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_scripts, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     if (source == null) {
       builder.append("{HTML file}");
@@ -4772,19 +5039,13 @@
    *
    * @param node the XML node from which this element is derived (not `null`)
    */
-  HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag, node.tagToken.offset);
+  HtmlScriptElementImpl(XmlTagNode node) : super(node.tag, node.tagToken.offset);
 }
 
 /**
  * Instances of the class `ImportElementImpl` implement an [ImportElement].
  */
-class ImportElementImpl extends ElementImpl implements ImportElement {
-  /**
-   * The offset of the character immediately following the last character of this node's URI, may be
-   * `-1` if synthetic.
-   */
-  int uriEnd = -1;
-
+class ImportElementImpl extends UriReferencedElementImpl implements ImportElement {
   /**
    * The offset of the prefix of this import in the file that contains the this import directive, or
    * `-1` if this import is synthetic.
@@ -4792,11 +5053,6 @@
   int prefixOffset = 0;
 
   /**
-   * The URI that is specified by this directive.
-   */
-  String uri;
-
-  /**
    * The library that is imported into this library by this import directive.
    */
   LibraryElement importedLibrary;
@@ -4818,22 +5074,27 @@
    *
    * @param offset the directive offset, may be `-1` if synthetic.
    */
-  ImportElementImpl(int offset) : super.con2(null, offset);
+  ImportElementImpl(int offset) : super(null, offset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitImportElement(this);
 
+  @override
   ElementKind get kind => ElementKind.IMPORT;
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(prefix, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append("import ");
     (importedLibrary as LibraryElementImpl).appendTo(builder);
   }
 
+  @override
   String get identifier => "${(importedLibrary as LibraryElementImpl).identifier}@${nameOffset}";
 }
 
@@ -4865,15 +5126,18 @@
    *          statement
    * @param onSwitchMember `true` if this label is associated with a `switch` member
    */
-  LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember) : super.con1(name) {
+  LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember) : super.forNode(name) {
     this._onSwitchStatement = onSwitchStatement;
     this._onSwitchMember = onSwitchMember;
   }
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
 
+  @override
   ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
 
+  @override
   ElementKind get kind => ElementKind.LABEL;
 
   /**
@@ -4908,7 +5172,7 @@
    * @param timeStamp the time stamp to check against
    * @param visitedLibraries the set of visited libraries
    */
-  static bool safeIsUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
+  static bool _safeIsUpToDate(LibraryElement library, int timeStamp, Set<LibraryElement> visitedLibraries) {
     if (!visitedLibraries.contains(library)) {
       visitedLibraries.add(library);
       AnalysisContext context = library.context;
@@ -4924,13 +5188,13 @@
       }
       // Check the imported libraries.
       for (LibraryElement importedLibrary in library.importedLibraries) {
-        if (!safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
+        if (!_safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
           return false;
         }
       }
       // Check the exported libraries.
       for (LibraryElement exportedLibrary in library.exportedLibraries) {
-        if (!safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
+        if (!_safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
           return false;
         }
       }
@@ -4972,7 +5236,7 @@
   /**
    * Is `true` if this library is created for Angular analysis.
    */
-  bool _isAngularHtml2 = false;
+  bool _isAngularHtml = false;
 
   /**
    * Initialize a newly created library element to have the given name.
@@ -4980,12 +5244,15 @@
    * @param context the analysis context in which the library is defined
    * @param name the name of this element
    */
-  LibraryElementImpl(this.context, LibraryIdentifier name) : super.con1(name);
+  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
 
+  @override
   bool operator ==(Object object) => object != null && runtimeType == object.runtimeType && _definingCompilationUnit == (object as LibraryElementImpl).definingCompilationUnit;
 
+  @override
   ElementImpl getChild(String identifier) {
     if ((_definingCompilationUnit as CompilationUnitElementImpl).identifier == identifier) {
       return _definingCompilationUnit as CompilationUnitElementImpl;
@@ -5008,8 +5275,10 @@
     return null;
   }
 
+  @override
   CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit;
 
+  @override
   List<LibraryElement> get exportedLibraries {
     Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ExportElement element in _exports) {
@@ -5021,8 +5290,10 @@
     return new List.from(libraries);
   }
 
+  @override
   List<ExportElement> get exports => _exports;
 
+  @override
   List<LibraryElement> get importedLibraries {
     Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ImportElement element in _imports) {
@@ -5034,14 +5305,19 @@
     return new List.from(libraries);
   }
 
+  @override
   List<ImportElement> get imports => _imports;
 
+  @override
   ElementKind get kind => ElementKind.LIBRARY;
 
+  @override
   LibraryElement get library => this;
 
+  @override
   List<CompilationUnitElement> get parts => _parts;
 
+  @override
   List<PrefixElement> get prefixes {
     Set<PrefixElement> prefixes = new Set<PrefixElement>();
     for (ImportElement element in _imports) {
@@ -5053,6 +5329,7 @@
     return new List.from(prefixes);
   }
 
+  @override
   Source get source {
     if (_definingCompilationUnit == null) {
       return null;
@@ -5060,6 +5337,7 @@
     return _definingCompilationUnit.source;
   }
 
+  @override
   ClassElement getType(String className) {
     ClassElement type = _definingCompilationUnit.getType(className);
     if (type != null) {
@@ -5074,6 +5352,7 @@
     return null;
   }
 
+  @override
   List<CompilationUnitElement> get units {
     List<CompilationUnitElement> units = new List<CompilationUnitElement>(1 + _parts.length);
     units[0] = _definingCompilationUnit;
@@ -5081,34 +5360,42 @@
     return units;
   }
 
+  @override
   List<LibraryElement> get visibleLibraries {
     Set<LibraryElement> visibleLibraries = new Set();
-    addVisibleLibraries(visibleLibraries, false);
+    _addVisibleLibraries(visibleLibraries, false);
     return new List.from(visibleLibraries);
   }
 
+  @override
   bool get hasExtUri => hasModifier(Modifier.HAS_EXT_URI);
 
+  @override
   int get hashCode => _definingCompilationUnit.hashCode;
 
-  bool get isAngularHtml => _isAngularHtml2;
+  @override
+  bool get isAngularHtml => _isAngularHtml;
 
+  @override
   bool get isBrowserApplication => entryPoint != null && isOrImportsBrowserLibrary;
 
+  @override
   bool get isDartCore => name == "dart.core";
 
+  @override
   bool get isInSdk => StringUtilities.startsWith5(name, 0, 0x64, 0x61, 0x72, 0x74, 0x2E);
 
+  @override
   bool isUpToDate(int timeStamp) {
     Set<LibraryElement> visitedLibraries = new Set();
-    return safeIsUpToDate(this, timeStamp, visitedLibraries);
+    return _safeIsUpToDate(this, timeStamp, visitedLibraries);
   }
 
   /**
    * Specifies if this library is created for Angular analysis.
    */
   void set angularHtml(bool isAngularHtml) {
-    this._isAngularHtml2 = isAngularHtml;
+    this._isAngularHtml = isAngularHtml;
   }
 
   /**
@@ -5171,6 +5458,7 @@
     this._parts = parts;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_definingCompilationUnit, visitor);
@@ -5179,12 +5467,13 @@
     safelyVisitChildren(_parts, visitor);
   }
 
+  @override
   String get identifier => _definingCompilationUnit.source.encoding;
 
   /**
    * Recursively fills set of visible libraries for [getVisibleElementsLibraries].
    */
-  void addVisibleLibraries(Set<LibraryElement> visibleLibraries, bool includeExports) {
+  void _addVisibleLibraries(Set<LibraryElement> visibleLibraries, bool includeExports) {
     // maybe already processed
     if (!visibleLibraries.add(this)) {
       return;
@@ -5193,7 +5482,7 @@
     for (ImportElement importElement in _imports) {
       LibraryElement importedLibrary = importElement.importedLibrary;
       if (importedLibrary != null) {
-        (importedLibrary as LibraryElementImpl).addVisibleLibraries(visibleLibraries, true);
+        (importedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
       }
     }
     // add exported libraries
@@ -5201,7 +5490,7 @@
       for (ExportElement exportElement in _exports) {
         LibraryElement exportedLibrary = exportElement.exportedLibrary;
         if (exportedLibrary != null) {
-          (exportedLibrary as LibraryElementImpl).addVisibleLibraries(visibleLibraries, true);
+          (exportedLibrary as LibraryElementImpl)._addVisibleLibraries(visibleLibraries, true);
         }
       }
     }
@@ -5274,18 +5563,22 @@
    */
   LocalVariableElementImpl(Identifier name) : super.con1(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
 
+  @override
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
+  @override
   List<ToolkitObjectElement> get toolkitObjects {
     CompilationUnitElementImpl unit = getAncestor((element) => element is CompilationUnitElementImpl);
     if (unit == null) {
       return ToolkitObjectElement.EMPTY_ARRAY;
     }
-    return unit.getToolkitObjects(this);
+    return unit._getToolkitObjects(this);
   }
 
+  @override
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
@@ -5293,8 +5586,10 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
 
+  @override
   bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
 
+  @override
   bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
 
   /**
@@ -5321,7 +5616,7 @@
     if (unit == null) {
       return;
     }
-    unit.setToolkitObjects(this, toolkitObjects);
+    unit._setToolkitObjects(this, toolkitObjects);
   }
 
   /**
@@ -5337,12 +5632,14 @@
     _visibleRangeLength = length;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
     builder.append(displayName);
   }
 
+  @override
   String get identifier => "${super.identifier}@${nameOffset}";
 }
 
@@ -5371,12 +5668,16 @@
    */
   MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
 
+  @override
   ClassElement get enclosingElement => super.enclosingElement as ClassElement;
 
+  @override
   ElementKind get kind => ElementKind.METHOD;
 
+  @override
   String get name {
     String name = super.name;
     if (isOperator && name == "-") {
@@ -5387,10 +5688,13 @@
     return super.name;
   }
 
+  @override
   MethodDeclaration get node => getNodeMatching((node) => node is MethodDeclaration);
 
+  @override
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
+  @override
   bool get isOperator {
     String name = displayName;
     if (name.isEmpty) {
@@ -5400,6 +5704,7 @@
     return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
   }
 
+  @override
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -5420,6 +5725,7 @@
     setModifier(Modifier.STATIC, isStatic);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(enclosingElement.displayName);
     builder.append(".");
@@ -5517,7 +5823,7 @@
    * @param secondElement the second element that conflicts
    */
   static Element fromElements(AnalysisContext context, Element firstElement, Element secondElement) {
-    List<Element> conflictingElements = computeConflictingElements(firstElement, secondElement);
+    List<Element> conflictingElements = _computeConflictingElements(firstElement, secondElement);
     int length = conflictingElements.length;
     if (length == 0) {
       return null;
@@ -5534,7 +5840,7 @@
    * @param elements the list to which the element(s) are to be added
    * @param element the element(s) to be added
    */
-  static void add(Set<Element> elements, Element element) {
+  static void _add(Set<Element> elements, Element element) {
     if (element is MultiplyDefinedElementImpl) {
       for (Element conflictingElement in element.conflictingElements) {
         elements.add(conflictingElement);
@@ -5553,10 +5859,10 @@
    * @param secondElement the second element to be included
    * @return an array containing all of the conflicting elements
    */
-  static List<Element> computeConflictingElements(Element firstElement, Element secondElement) {
+  static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
     Set<Element> elements = new Set<Element>();
-    add(elements, firstElement);
-    add(elements, secondElement);
+    _add(elements, firstElement);
+    _add(elements, secondElement);
     return new List.from(elements);
   }
 
@@ -5585,36 +5891,52 @@
     _name = conflictingElements[0].name;
   }
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
 
+  @override
   String computeDocumentationComment() => null;
 
+  @override
   Element getAncestor(Predicate<Element> predicate) => null;
 
+  @override
   String get displayName => _name;
 
+  @override
   Element get enclosingElement => null;
 
+  @override
   ElementKind get kind => ElementKind.ERROR;
 
+  @override
   LibraryElement get library => null;
 
+  @override
   ElementLocation get location => null;
 
+  @override
   List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY;
 
+  @override
   String get name => _name;
 
+  @override
   int get nameOffset => -1;
 
+  @override
   AstNode get node => null;
 
+  @override
   Source get source => null;
 
-  Type2 get type => DynamicTypeImpl.instance;
+  @override
+  DartType get type => DynamicTypeImpl.instance;
 
+  @override
   CompilationUnit get unit => null;
 
+  @override
   bool isAccessibleIn(LibraryElement library) {
     for (Element element in conflictingElements) {
       if (element.isAccessibleIn(library)) {
@@ -5624,10 +5946,13 @@
     return false;
   }
 
+  @override
   bool get isDeprecated => false;
 
+  @override
   bool get isOverride => false;
 
+  @override
   bool get isPrivate {
     String name = displayName;
     if (name == null) {
@@ -5636,10 +5961,13 @@
     return Identifier.isPrivateName(name);
   }
 
+  @override
   bool get isPublic => !isPrivate;
 
+  @override
   bool get isSynthetic => true;
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("[");
@@ -5654,6 +5982,7 @@
     return builder.toString();
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
   }
 }
@@ -5673,6 +6002,7 @@
     synthetic = true;
   }
 
+  @override
   List<ExecutableElement> get inheritedElements => _elements;
 
   void set inheritedElements(List<ExecutableElement> elements) {
@@ -5695,6 +6025,7 @@
     synthetic = true;
   }
 
+  @override
   List<ExecutableElement> get inheritedElements => _elements;
 
   void set inheritedElements(List<ExecutableElement> elements) {
@@ -5770,8 +6101,10 @@
    */
   ParameterElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
 
+  @override
   SourceRange get defaultValueRange {
     if (_defaultValueRangeLength < 0) {
       return null;
@@ -5779,10 +6112,13 @@
     return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
   }
 
+  @override
   ElementKind get kind => ElementKind.PARAMETER;
 
+  @override
   List<ParameterElement> get parameters => _parameters;
 
+  @override
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
       return null;
@@ -5790,10 +6126,13 @@
     return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
   }
 
+  @override
   bool get isInitializingFormal => false;
 
+  @override
   bool get isPotentiallyMutatedInClosure => _potentiallyMutatedInClosure;
 
+  @override
   bool get isPotentiallyMutatedInScope => _potentiallyMutatedInScope;
 
   /**
@@ -5848,11 +6187,13 @@
     _visibleRangeLength = length;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     String left = "";
     String right = "";
@@ -5903,14 +6244,18 @@
    *
    * @param name the name of this element
    */
-  PrefixElementImpl(Identifier name) : super.con1(name);
+  PrefixElementImpl(Identifier name) : super.forNode(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
 
+  @override
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
 
+  @override
   List<LibraryElement> get importedLibraries => _importedLibraries;
 
+  @override
   ElementKind get kind => ElementKind.PREFIX;
 
   /**
@@ -5925,11 +6270,13 @@
     this._importedLibraries = importedLibraries;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append("as ");
     super.appendTo(builder);
   }
 
+  @override
   String get identifier => "_${super.identifier}";
 }
 
@@ -5966,10 +6313,13 @@
     synthetic = true;
   }
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
 
+  @override
   bool operator ==(Object object) => super == object && identical(isGetter, (object as PropertyAccessorElement).isGetter);
 
+  @override
   PropertyAccessorElement get correspondingGetter {
     if (isGetter || variable == null) {
       return null;
@@ -5977,6 +6327,7 @@
     return variable.getter;
   }
 
+  @override
   PropertyAccessorElement get correspondingSetter {
     if (isSetter || variable == null) {
       return null;
@@ -5984,6 +6335,7 @@
     return variable.setter;
   }
 
+  @override
   ElementKind get kind {
     if (isGetter) {
       return ElementKind.GETTER;
@@ -5991,6 +6343,7 @@
     return ElementKind.SETTER;
   }
 
+  @override
   String get name {
     if (isSetter) {
       return "${super.name}=";
@@ -5998,6 +6351,7 @@
     return super.name;
   }
 
+  @override
   AstNode get node {
     if (isSynthetic) {
       return null;
@@ -6011,14 +6365,19 @@
     return null;
   }
 
+  @override
   int get hashCode => ObjectUtilities.combineHashCodes(super.hashCode, isGetter ? 1 : 2);
 
+  @override
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
+  @override
   bool get isGetter => hasModifier(Modifier.GETTER);
 
+  @override
   bool get isSetter => hasModifier(Modifier.SETTER);
 
+  @override
   bool get isStatic => hasModifier(Modifier.STATIC);
 
   /**
@@ -6057,6 +6416,7 @@
     setModifier(Modifier.STATIC, isStatic);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(isGetter ? "get " : "set ");
     builder.append(variable.displayName);
@@ -6123,6 +6483,7 @@
    */
   int offset = 0;
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("show ");
@@ -6148,7 +6509,7 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ToolkitObjectElementImpl(String name, int nameOffset) : super.con2(name, nameOffset);
+  ToolkitObjectElementImpl(String name, int nameOffset) : super(name, nameOffset);
 }
 
 /**
@@ -6175,10 +6536,13 @@
    */
   TopLevelVariableElementImpl.con2(String name) : super.con2(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
 
+  @override
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
 
+  @override
   bool get isStatic => true;
 }
 
@@ -6195,7 +6559,7 @@
    * The type representing the bound associated with this parameter, or `null` if this
    * parameter does not have an explicit bound.
    */
-  Type2 bound;
+  DartType bound;
 
   /**
    * An empty array of type parameter elements.
@@ -6207,12 +6571,15 @@
    *
    * @param name the name of this element
    */
-  TypeParameterElementImpl(Identifier name) : super.con1(name);
+  TypeParameterElementImpl(Identifier name) : super.forNode(name);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this);
 
+  @override
   ElementKind get kind => ElementKind.TYPE_PARAMETER;
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(displayName);
     if (bound != null) {
@@ -6223,13 +6590,43 @@
 }
 
 /**
+ * Instances of the class `UriReferencedElementImpl` implement an [UriReferencedElement]
+ * .
+ */
+abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
+  /**
+   * The offset of the URU in the file, may be `-1` if synthetic.
+   */
+  int uriOffset = -1;
+
+  /**
+   * The offset of the character immediately following the last character of this node's URI, may be
+   * `-1` if synthetic.
+   */
+  int uriEnd = -1;
+
+  /**
+   * The URI that is specified by this directive.
+   */
+  String uri;
+
+  /**
+   * Initialize a newly created import element.
+   *
+   * @param name the name of this element
+   * @param offset the directive offset, may be `-1` if synthetic.
+   */
+  UriReferencedElementImpl(String name, int offset) : super(name, offset);
+}
+
+/**
  * Instances of the class `VariableElementImpl` implement a `VariableElement`.
  */
 abstract class VariableElementImpl extends ElementImpl implements VariableElement {
   /**
    * The declared type of this variable.
    */
-  Type2 type;
+  DartType type;
 
   /**
    * A synthetic function representing this variable's initializer, or `null` if this variable
@@ -6247,7 +6644,7 @@
    *
    * @param name the name of this element
    */
-  VariableElementImpl.con1(Identifier name) : super.con1(name);
+  VariableElementImpl.con1(Identifier name) : super.forNode(name);
 
   /**
    * Initialize a newly created variable element to have the given name.
@@ -6256,7 +6653,7 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset);
+  VariableElementImpl.con2(String name, int nameOffset) : super(name, nameOffset);
 
   /**
    * Return the result of evaluating this variable's initializer as a compile-time constant
@@ -6267,12 +6664,16 @@
    */
   EvaluationResultImpl get evaluationResult => null;
 
+  @override
   FunctionElement get initializer => _initializer;
 
+  @override
   VariableDeclaration get node => getNodeMatching((node) => node is VariableDeclaration);
 
+  @override
   bool get isConst => hasModifier(Modifier.CONST);
 
+  @override
   bool get isFinal => hasModifier(Modifier.FINAL);
 
   /**
@@ -6333,11 +6734,13 @@
     this._initializer = initializer;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_initializer, visitor);
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(type);
     builder.append(" ");
@@ -6422,12 +6825,16 @@
     this._annotationOffset = annotationOffset;
   }
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularComponentElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_COMPONENT;
 
+  @override
   List<AngularPropertyElement> get properties => _properties;
 
+  @override
   List<AngularScopePropertyElement> get scopeProperties => _scopeProperties;
 
   /**
@@ -6454,12 +6861,14 @@
     this._scopeProperties = properties;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     safelyVisitChildren(_properties, visitor);
     safelyVisitChildren(_scopeProperties, visitor);
     super.visitChildren(visitor);
   }
 
+  @override
   String get identifier => "AngularComponent@${_annotationOffset}";
 }
 
@@ -6476,8 +6885,10 @@
    */
   AngularControllerElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularControllerElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_CONTROLLER;
 }
 
@@ -6504,14 +6915,19 @@
     this._offset = offset;
   }
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularDirectiveElement(this);
 
+  @override
   String get displayName => selector.displayName;
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_DIRECTIVE;
 
+  @override
   List<AngularPropertyElement> get properties => _properties;
 
+  @override
   bool isClass(String name) {
     Element enclosing = enclosingElement;
     return enclosing is ClassElement && enclosing.name == name;
@@ -6529,11 +6945,13 @@
     this._properties = properties;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     safelyVisitChildren(_properties, visitor);
     super.visitChildren(visitor);
   }
 
+  @override
   String get identifier => "NgDirective@${_offset}";
 }
 
@@ -6555,6 +6973,7 @@
    */
   AngularElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   AngularApplication get application => _application;
 
   /**
@@ -6578,8 +6997,10 @@
    */
   AngularFilterElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularFilterElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_FILTER;
 }
 
@@ -6589,6 +7010,7 @@
 class AngularHasClassSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasClassSelectorElement {
   AngularHasClassSelectorElementImpl(String name, int offset) : super(name, offset);
 
+  @override
   bool apply(XmlTagNode node) {
     XmlAttributeNode attribute = node.getAttribute("class");
     if (attribute != null) {
@@ -6605,6 +7027,7 @@
     return false;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(".");
     builder.append(name);
@@ -6629,6 +7052,7 @@
    */
   AngularHasSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   AngularSelectorElement get selector => _selector;
 
   /**
@@ -6641,6 +7065,7 @@
     this._selector = selector;
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     safelyVisitChild(_selector, visitor);
     super.visitChildren(visitor);
@@ -6672,8 +7097,10 @@
    */
   AngularPropertyElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularPropertyElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_PROPERTY;
 }
 
@@ -6684,7 +7111,7 @@
   /**
    * The type of the property
    */
-  final Type2 type;
+  final DartType type;
 
   /**
    * Initialize a newly created Angular scope property to have the given name.
@@ -6695,8 +7122,10 @@
    */
   AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_SCOPE_PROPERTY;
 }
 
@@ -6713,8 +7142,10 @@
    */
   AngularSelectorElementImpl(String name, int nameOffset) : super(name, nameOffset);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularSelectorElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_SELECTOR;
 }
 
@@ -6724,11 +7155,13 @@
 class AngularTagSelectorElementImpl extends AngularSelectorElementImpl implements AngularTagSelectorElement {
   AngularTagSelectorElementImpl(String name, int offset) : super(name, offset);
 
+  @override
   bool apply(XmlTagNode node) {
     String tagName = name;
     return node.tag == tagName;
   }
 
+  @override
   AngularApplication get application => (enclosingElement as AngularElementImpl).application;
 }
 
@@ -6756,10 +7189,13 @@
    */
   AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
 
+  @override
   ElementKind get kind => ElementKind.ANGULAR_VIEW;
 
+  @override
   String get identifier => "AngularView@${templateUriOffset}";
 }
 
@@ -6769,11 +7205,13 @@
 class HasAttributeSelectorElementImpl extends AngularSelectorElementImpl implements AngularHasAttributeSelectorElement {
   HasAttributeSelectorElementImpl(String attributeName, int offset) : super(attributeName, offset);
 
+  @override
   bool apply(XmlTagNode node) {
     String attributeName = name;
     return node.getAttribute(attributeName) != null;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append("[");
     builder.append(name);
@@ -6791,6 +7229,7 @@
 
   IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
 
+  @override
   bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
 }
 
@@ -6819,8 +7258,8 @@
       // TODO(brianwilkerson) We need to understand when this can happen.
       return baseConstructor;
     }
-    List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseConstructor;
@@ -6838,22 +7277,31 @@
    */
   ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
 
+  @override
   ConstructorElement get baseElement => super.baseElement as ConstructorElement;
 
+  @override
   ClassElement get enclosingElement => baseElement.enclosingElement;
 
+  @override
   ConstructorDeclaration get node => baseElement.node;
 
+  @override
   ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
 
+  @override
   bool get isConst => baseElement.isConst;
 
+  @override
   bool get isDefaultConstructor => baseElement.isDefaultConstructor;
 
+  @override
   bool get isFactory => baseElement.isFactory;
 
+  @override
   String toString() {
     ConstructorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -6881,6 +7329,7 @@
     return builder.toString();
   }
 
+  @override
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 
@@ -6899,8 +7348,10 @@
    */
   ExecutableMember(ExecutableElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
 
+  @override
   ExecutableElement get baseElement => super.baseElement as ExecutableElement;
 
+  @override
   List<FunctionElement> get functions {
     //
     // Elements within this element should have type parameters substituted, just like this element.
@@ -6908,8 +7359,10 @@
     throw new UnsupportedOperationException();
   }
 
+  @override
   List<LabelElement> get labels => baseElement.labels;
 
+  @override
   List<LocalVariableElement> get localVariables {
     //
     // Elements within this element should have type parameters substituted, just like this element.
@@ -6917,6 +7370,7 @@
     throw new UnsupportedOperationException();
   }
 
+  @override
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = baseElement.parameters;
     int parameterCount = baseParameters.length;
@@ -6930,14 +7384,19 @@
     return parameterizedParameters;
   }
 
-  Type2 get returnType => substituteFor(baseElement.returnType);
+  @override
+  DartType get returnType => substituteFor(baseElement.returnType);
 
+  @override
   FunctionType get type => substituteFor(baseElement.type);
 
+  @override
   bool get isOperator => baseElement.isOperator;
 
+  @override
   bool get isStatic => baseElement.isStatic;
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
     // safely invoke them.
@@ -6962,8 +7421,10 @@
    */
   FieldFormalParameterMember(FieldFormalParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
 
+  @override
   FieldElement get field => (baseElement as FieldFormalParameterElement).field;
 }
 
@@ -6987,13 +7448,13 @@
     if (baseField == null || definingType.typeArguments.length == 0) {
       return baseField;
     }
-    Type2 baseType = baseField.type;
+    DartType baseType = baseField.type;
     if (baseType == null) {
       return baseField;
     }
-    List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
-    Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseField;
     }
@@ -7010,18 +7471,25 @@
    */
   FieldMember(FieldElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
 
+  @override
   FieldElement get baseElement => super.baseElement as FieldElement;
 
+  @override
   ClassElement get enclosingElement => baseElement.enclosingElement;
 
+  @override
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
 
+  @override
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
 
+  @override
   bool get isStatic => baseElement.isStatic;
 
+  @override
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 
@@ -7051,8 +7519,10 @@
     this._definingType = definingType;
   }
 
+  @override
   String computeDocumentationComment() => _baseElement.computeDocumentationComment();
 
+  @override
   Element getAncestor(Predicate<Element> predicate) => baseElement.getAncestor(predicate);
 
   /**
@@ -7062,40 +7532,58 @@
    */
   Element get baseElement => _baseElement;
 
+  @override
   AnalysisContext get context => _baseElement.context;
 
+  @override
   String get displayName => _baseElement.displayName;
 
+  @override
   ElementKind get kind => _baseElement.kind;
 
+  @override
   LibraryElement get library => _baseElement.library;
 
+  @override
   ElementLocation get location => _baseElement.location;
 
+  @override
   List<ElementAnnotation> get metadata => _baseElement.metadata;
 
+  @override
   String get name => _baseElement.name;
 
+  @override
   int get nameOffset => _baseElement.nameOffset;
 
+  @override
   AstNode get node => _baseElement.node;
 
+  @override
   Source get source => _baseElement.source;
 
+  @override
   CompilationUnit get unit => _baseElement.unit;
 
+  @override
   bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
 
+  @override
   bool get isDeprecated => _baseElement.isDeprecated;
 
+  @override
   bool get isOverride => _baseElement.isOverride;
 
+  @override
   bool get isPrivate => _baseElement.isPrivate;
 
+  @override
   bool get isPublic => _baseElement.isPublic;
 
+  @override
   bool get isSynthetic => _baseElement.isSynthetic;
 
+  @override
   void visitChildren(ElementVisitor visitor) {
   }
 
@@ -7139,9 +7627,9 @@
    * @param type the type to be transformed
    * @return the result of transforming the type
    */
-  Type2 substituteFor(Type2 type) {
-    List<Type2> argumentTypes = _definingType.typeArguments;
-    List<Type2> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
+  DartType substituteFor(DartType type) {
+    List<DartType> argumentTypes = _definingType.typeArguments;
+    List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
     return type.substitute2(argumentTypes, parameterTypes);
   }
 
@@ -7183,8 +7671,8 @@
       return baseMethod;
     }
     FunctionType baseType = baseMethod.type;
-    List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseMethod;
@@ -7202,16 +7690,22 @@
    */
   MethodMember(MethodElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
 
+  @override
   MethodElement get baseElement => super.baseElement as MethodElement;
 
+  @override
   ClassElement get enclosingElement => baseElement.enclosingElement;
 
+  @override
   MethodDeclaration get node => baseElement.node;
 
+  @override
   bool get isAbstract => baseElement.isAbstract;
 
+  @override
   String toString() {
     MethodElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -7261,10 +7755,10 @@
     // It is possible that we did not resolve field formal parameter yet, so skip this check for it.
     bool isFieldFormal = baseParameter is FieldFormalParameterElement;
     if (!isFieldFormal) {
-      Type2 baseType = baseParameter.type;
-      List<Type2> argumentTypes = definingType.typeArguments;
-      List<Type2> parameterTypes = TypeParameterTypeImpl.getTypes(definingType.typeParameters);
-      Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+      DartType baseType = baseParameter.type;
+      List<DartType> argumentTypes = definingType.typeArguments;
+      List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(definingType.typeParameters);
+      DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
       if (baseType == substitutedType) {
         return baseParameter;
       }
@@ -7285,8 +7779,10 @@
    */
   ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
 
+  @override
   Element getAncestor(Predicate<Element> predicate) {
     Element element = baseElement.getAncestor(predicate);
     ParameterizedType definingType = this.definingType;
@@ -7303,14 +7799,19 @@
     return element;
   }
 
+  @override
   ParameterElement get baseElement => super.baseElement as ParameterElement;
 
+  @override
   SourceRange get defaultValueRange => baseElement.defaultValueRange;
 
+  @override
   Element get enclosingElement => baseElement.enclosingElement;
 
+  @override
   ParameterKind get parameterKind => baseElement.parameterKind;
 
+  @override
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = baseElement.parameters;
     int parameterCount = baseParameters.length;
@@ -7324,10 +7825,13 @@
     return parameterizedParameters;
   }
 
+  @override
   SourceRange get visibleRange => baseElement.visibleRange;
 
+  @override
   bool get isInitializingFormal => baseElement.isInitializingFormal;
 
+  @override
   String toString() {
     ParameterElement baseElement = this.baseElement;
     String left = "";
@@ -7352,6 +7856,7 @@
     return builder.toString();
   }
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(parameters, visitor);
@@ -7379,8 +7884,8 @@
       return baseAccessor;
     }
     FunctionType baseType = baseAccessor.type;
-    List<Type2> argumentTypes = definingType.typeArguments;
-    List<Type2> parameterTypes = definingType.element.type.typeArguments;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
     if (baseType == substitutedType) {
       return baseAccessor;
@@ -7399,16 +7904,22 @@
    */
   PropertyAccessorMember(PropertyAccessorElement baseElement, InterfaceType definingType) : super(baseElement, definingType);
 
+  @override
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
 
+  @override
   PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
 
+  @override
   PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
 
+  @override
   PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
 
+  @override
   Element get enclosingElement => baseElement.enclosingElement;
 
+  @override
   PropertyInducingElement get variable {
     PropertyInducingElement variable = baseElement.variable;
     if (variable is FieldElement) {
@@ -7417,12 +7928,16 @@
     return variable;
   }
 
+  @override
   bool get isAbstract => baseElement.isAbstract;
 
+  @override
   bool get isGetter => baseElement.isGetter;
 
+  @override
   bool get isSetter => baseElement.isSetter;
 
+  @override
   String toString() {
     PropertyAccessorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
@@ -7452,6 +7967,7 @@
     return builder.toString();
   }
 
+  @override
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 
@@ -7470,8 +7986,10 @@
    */
   VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType);
 
+  @override
   VariableElement get baseElement => super.baseElement as VariableElement;
 
+  @override
   FunctionElement get initializer {
     //
     // Elements within this element should have type parameters substituted, just like this element.
@@ -7479,14 +7997,19 @@
     throw new UnsupportedOperationException();
   }
 
+  @override
   VariableDeclaration get node => baseElement.node;
 
-  Type2 get type => substituteFor(baseElement.type);
+  @override
+  DartType get type => substituteFor(baseElement.type);
 
+  @override
   bool get isConst => baseElement.isConst;
 
+  @override
   bool get isFinal => baseElement.isFinal;
 
+  @override
   void visitChildren(ElementVisitor visitor) {
     // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
     // safely invoke them.
@@ -7516,21 +8039,29 @@
    */
   BottomTypeImpl() : super(null, "<bottom>");
 
+  @override
   bool operator ==(Object object) => identical(object, this);
 
+  @override
   int get hashCode => 0;
 
+  @override
   bool get isBottom => true;
 
-  bool isSupertypeOf(Type2 type) => false;
+  @override
+  bool isSupertypeOf(DartType type) => false;
 
-  BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
+  @override
+  BottomTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) => this;
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => true;
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
 }
 
 /**
@@ -7556,15 +8087,20 @@
     (element as DynamicElementImpl).type = this;
   }
 
+  @override
   bool operator ==(Object object) => identical(object, this);
 
+  @override
   int get hashCode => 1;
 
+  @override
   bool get isDynamic => true;
 
-  bool isSupertypeOf(Type2 type) => true;
+  @override
+  bool isSupertypeOf(DartType type) => true;
 
-  Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  @override
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
       if (parameterTypes[i] == this) {
@@ -7574,9 +8110,11 @@
     return this;
   }
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     // T is S
     if (identical(this, type)) {
       return true;
@@ -7585,7 +8123,8 @@
     return withDynamic;
   }
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => true;
 }
 
 /**
@@ -7604,15 +8143,15 @@
    * @return `true` if all of the name/type pairs in the first map are equal to the
    *         corresponding name/type pairs in the second map
    */
-  static bool equals2(Map<String, Type2> firstTypes, Map<String, Type2> secondTypes, Set<ElementPair> visitedElementPairs) {
+  static bool _equals(Map<String, DartType> firstTypes, Map<String, DartType> secondTypes, Set<ElementPair> visitedElementPairs) {
     if (secondTypes.length != firstTypes.length) {
       return false;
     }
-    JavaIterator<MapEntry<String, Type2>> firstIterator = new JavaIterator(getMapEntrySet(firstTypes));
-    JavaIterator<MapEntry<String, Type2>> secondIterator = new JavaIterator(getMapEntrySet(secondTypes));
+    JavaIterator<MapEntry<String, DartType>> firstIterator = new JavaIterator(getMapEntrySet(firstTypes));
+    JavaIterator<MapEntry<String, DartType>> secondIterator = new JavaIterator(getMapEntrySet(secondTypes));
     while (firstIterator.hasNext) {
-      MapEntry<String, Type2> firstEntry = firstIterator.next();
-      MapEntry<String, Type2> secondEntry = secondIterator.next();
+      MapEntry<String, DartType> firstEntry = firstIterator.next();
+      MapEntry<String, DartType> secondEntry = secondIterator.next();
       if (firstEntry.getKey() != secondEntry.getKey() || !(firstEntry.getValue() as TypeImpl).internalEquals(secondEntry.getValue(), visitedElementPairs)) {
         return false;
       }
@@ -7623,7 +8162,7 @@
   /**
    * An array containing the actual types of the type arguments.
    */
-  List<Type2> typeArguments = TypeImpl.EMPTY_ARRAY;
+  List<DartType> typeArguments = TypeImpl.EMPTY_ARRAY;
 
   /**
    * Initialize a newly created function type to be declared by the given element and to have the
@@ -7641,21 +8180,23 @@
    */
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name);
 
+  @override
   bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
 
+  @override
   String get displayName {
     String name = this.name;
     if (name == null || name.length == 0) {
       // TODO(brianwilkerson) Determine whether function types should ever have an empty name.
-      List<Type2> normalParameterTypes = this.normalParameterTypes;
-      List<Type2> optionalParameterTypes = this.optionalParameterTypes;
-      Map<String, Type2> namedParameterTypes = this.namedParameterTypes;
-      Type2 returnType = this.returnType;
+      List<DartType> normalParameterTypes = this.normalParameterTypes;
+      List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+      Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
+      DartType returnType = this.returnType;
       JavaStringBuilder builder = new JavaStringBuilder();
       builder.append("(");
       bool needsComma = false;
       if (normalParameterTypes.length > 0) {
-        for (Type2 type in normalParameterTypes) {
+        for (DartType type in normalParameterTypes) {
           if (needsComma) {
             builder.append(", ");
           } else {
@@ -7670,7 +8211,7 @@
           needsComma = false;
         }
         builder.append("[");
-        for (Type2 type in optionalParameterTypes) {
+        for (DartType type in optionalParameterTypes) {
           if (needsComma) {
             builder.append(", ");
           } else {
@@ -7687,7 +8228,7 @@
           needsComma = false;
         }
         builder.append("{");
-        for (MapEntry<String, Type2> entry in getMapEntrySet(namedParameterTypes)) {
+        for (MapEntry<String, DartType> entry in getMapEntrySet(namedParameterTypes)) {
           if (needsComma) {
             builder.append(", ");
           } else {
@@ -7712,13 +8253,14 @@
     return name;
   }
 
-  Map<String, Type2> get namedParameterTypes {
-    LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String, Type2>();
+  @override
+  Map<String, DartType> get namedParameterTypes {
+    LinkedHashMap<String, DartType> namedParameterTypes = new LinkedHashMap<String, DartType>();
     List<ParameterElement> parameters = baseParameters;
     if (parameters.length == 0) {
       return namedParameterTypes;
     }
-    List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
+    List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
     for (ParameterElement parameter in parameters) {
       if (identical(parameter.parameterKind, ParameterKind.NAMED)) {
         namedParameterTypes[parameter.name] = parameter.type.substitute2(typeArguments, typeParameters);
@@ -7727,13 +8269,14 @@
     return namedParameterTypes;
   }
 
-  List<Type2> get normalParameterTypes {
+  @override
+  List<DartType> get normalParameterTypes {
     List<ParameterElement> parameters = baseParameters;
     if (parameters.length == 0) {
       return TypeImpl.EMPTY_ARRAY;
     }
-    List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
-    List<Type2> types = new List<Type2>();
+    List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
+    List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
       if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) {
         types.add(parameter.type.substitute2(typeArguments, typeParameters));
@@ -7742,13 +8285,14 @@
     return new List.from(types);
   }
 
-  List<Type2> get optionalParameterTypes {
+  @override
+  List<DartType> get optionalParameterTypes {
     List<ParameterElement> parameters = baseParameters;
     if (parameters.length == 0) {
       return TypeImpl.EMPTY_ARRAY;
     }
-    List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
-    List<Type2> types = new List<Type2>();
+    List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
+    List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
       if (identical(parameter.parameterKind, ParameterKind.POSITIONAL)) {
         types.add(parameter.type.substitute2(typeArguments, typeParameters));
@@ -7757,6 +8301,7 @@
     return new List.from(types);
   }
 
+  @override
   List<ParameterElement> get parameters {
     List<ParameterElement> baseParameters = this.baseParameters;
     // no parameters, quick return
@@ -7772,8 +8317,9 @@
     return specializedParameters;
   }
 
-  Type2 get returnType {
-    Type2 baseReturnType = this.baseReturnType;
+  @override
+  DartType get returnType {
+    DartType baseReturnType = this.baseReturnType;
     if (baseReturnType == null) {
       // TODO(brianwilkerson) This is a patch. The return type should never be null and we need to
       // understand why it is and fix it.
@@ -7782,6 +8328,7 @@
     return baseReturnType.substitute2(typeArguments, TypeParameterTypeImpl.getTypes(typeParameters));
   }
 
+  @override
   List<TypeParameterElement> get typeParameters {
     Element element = this.element;
     if (element is FunctionTypeAliasElement) {
@@ -7794,14 +8341,15 @@
     return TypeParameterElementImpl.EMPTY_ARRAY;
   }
 
+  @override
   int get hashCode {
     if (element == null) {
       return 0;
     }
     // Reference the arrays of parameters
-    List<Type2> normalParameterTypes = this.normalParameterTypes;
-    List<Type2> optionalParameterTypes = this.optionalParameterTypes;
-    Iterable<Type2> namedParameterTypes = this.namedParameterTypes.values;
+    List<DartType> normalParameterTypes = this.normalParameterTypes;
+    List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+    Iterable<DartType> namedParameterTypes = this.namedParameterTypes.values;
     // Generate the hashCode
     int hashCode = returnType.hashCode;
     for (int i = 0; i < normalParameterTypes.length; i++) {
@@ -7810,13 +8358,14 @@
     for (int i = 0; i < optionalParameterTypes.length; i++) {
       hashCode = (hashCode << 1) + optionalParameterTypes[i].hashCode;
     }
-    for (Type2 type in namedParameterTypes) {
+    for (DartType type in namedParameterTypes) {
       hashCode = (hashCode << 1) + type.hashCode;
     }
     return hashCode;
   }
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     // trivial base cases
     if (type == null) {
       return false;
@@ -7829,10 +8378,10 @@
     }
     FunctionType t = this;
     FunctionType s = type as FunctionType;
-    List<Type2> tTypes = t.normalParameterTypes;
-    List<Type2> tOpTypes = t.optionalParameterTypes;
-    List<Type2> sTypes = s.normalParameterTypes;
-    List<Type2> sOpTypes = s.optionalParameterTypes;
+    List<DartType> tTypes = t.normalParameterTypes;
+    List<DartType> tOpTypes = t.optionalParameterTypes;
+    List<DartType> sTypes = s.normalParameterTypes;
+    List<DartType> sOpTypes = s.optionalParameterTypes;
     // If one function has positional and the other has named parameters, return false.
     if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) || (tOpTypes.length > 0 && s.namedParameterTypes.length > 0)) {
       return false;
@@ -7845,27 +8394,27 @@
         return false;
       } else if (t.normalParameterTypes.length > 0) {
         for (int i = 0; i < tTypes.length; i++) {
-          if (!(tTypes[i] as TypeImpl).isMoreSpecificThan3(sTypes[i], withDynamic, visitedTypePairs)) {
+          if (!(tTypes[i] as TypeImpl).isMoreSpecificThan2(sTypes[i], withDynamic, visitedTypePairs)) {
             return false;
           }
         }
       }
-      Map<String, Type2> namedTypesT = t.namedParameterTypes;
-      Map<String, Type2> namedTypesS = s.namedParameterTypes;
+      Map<String, DartType> namedTypesT = t.namedParameterTypes;
+      Map<String, DartType> namedTypesS = s.namedParameterTypes;
       // if k >= m is false, return false: the passed function type has more named parameter types than this
       if (namedTypesT.length < namedTypesS.length) {
         return false;
       }
       // Loop through each element in S verifying that T has a matching parameter name and that the
       // corresponding type is more specific then the type in S.
-      JavaIterator<MapEntry<String, Type2>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
+      JavaIterator<MapEntry<String, DartType>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
       while (iteratorS.hasNext) {
-        MapEntry<String, Type2> entryS = iteratorS.next();
-        Type2 typeT = namedTypesT[entryS.getKey()];
+        MapEntry<String, DartType> entryS = iteratorS.next();
+        DartType typeT = namedTypesT[entryS.getKey()];
         if (typeT == null) {
           return false;
         }
-        if (!(typeT as TypeImpl).isMoreSpecificThan3(entryS.getValue(), withDynamic, visitedTypePairs)) {
+        if (!(typeT as TypeImpl).isMoreSpecificThan2(entryS.getValue(), withDynamic, visitedTypePairs)) {
           return false;
         }
       }
@@ -7884,21 +8433,21 @@
       if (tOpTypes.length == 0 && sOpTypes.length == 0) {
         // No positional arguments, don't copy contents to new array
         for (int i = 0; i < sTypes.length; i++) {
-          if (!(tTypes[i] as TypeImpl).isMoreSpecificThan3(sTypes[i], withDynamic, visitedTypePairs)) {
+          if (!(tTypes[i] as TypeImpl).isMoreSpecificThan2(sTypes[i], withDynamic, visitedTypePairs)) {
             return false;
           }
         }
       } else {
         // Else, we do have positional parameters, copy required and positional parameter types into
         // arrays to do the compare (for loop below).
-        List<Type2> tAllTypes = new List<Type2>(sArgLength);
+        List<DartType> tAllTypes = new List<DartType>(sArgLength);
         for (int i = 0; i < tTypes.length; i++) {
           tAllTypes[i] = tTypes[i];
         }
         for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) {
           tAllTypes[i] = tOpTypes[j];
         }
-        List<Type2> sAllTypes = new List<Type2>(sArgLength);
+        List<DartType> sAllTypes = new List<DartType>(sArgLength);
         for (int i = 0; i < sTypes.length; i++) {
           sAllTypes[i] = sTypes[i];
         }
@@ -7906,22 +8455,25 @@
           sAllTypes[i] = sOpTypes[j];
         }
         for (int i = 0; i < sAllTypes.length; i++) {
-          if (!(tAllTypes[i] as TypeImpl).isMoreSpecificThan3(sAllTypes[i], withDynamic, visitedTypePairs)) {
+          if (!(tAllTypes[i] as TypeImpl).isMoreSpecificThan2(sAllTypes[i], withDynamic, visitedTypePairs)) {
             return false;
           }
         }
       }
     }
-    Type2 tRetType = t.returnType;
-    Type2 sRetType = s.returnType;
-    return sRetType.isVoid || (tRetType as TypeImpl).isMoreSpecificThan3(sRetType, withDynamic, visitedTypePairs);
+    DartType tRetType = t.returnType;
+    DartType sRetType = s.returnType;
+    return sRetType.isVoid || (tRetType as TypeImpl).isMoreSpecificThan2(sRetType, withDynamic, visitedTypePairs);
   }
 
-  bool isAssignableTo(Type2 type) => isSubtypeOf3(type, new Set<TypeImpl_TypePair>());
+  @override
+  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
 
-  FunctionTypeImpl substitute3(List<Type2> argumentTypes) => substitute2(argumentTypes, typeArguments);
+  @override
+  FunctionTypeImpl substitute3(List<DartType> argumentTypes) => substitute2(argumentTypes, typeArguments);
 
-  FunctionTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  @override
+  FunctionTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
     if (argumentTypes.length != parameterTypes.length) {
       throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
     }
@@ -7934,15 +8486,16 @@
     return newType;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
-    List<Type2> normalParameterTypes = this.normalParameterTypes;
-    List<Type2> optionalParameterTypes = this.optionalParameterTypes;
-    Map<String, Type2> namedParameterTypes = this.namedParameterTypes;
-    Type2 returnType = this.returnType;
+    List<DartType> normalParameterTypes = this.normalParameterTypes;
+    List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+    Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
+    DartType returnType = this.returnType;
     builder.append("(");
     bool needsComma = false;
     if (normalParameterTypes.length > 0) {
-      for (Type2 type in normalParameterTypes) {
+      for (DartType type in normalParameterTypes) {
         if (needsComma) {
           builder.append(", ");
         } else {
@@ -7957,7 +8510,7 @@
         needsComma = false;
       }
       builder.append("[");
-      for (Type2 type in optionalParameterTypes) {
+      for (DartType type in optionalParameterTypes) {
         if (needsComma) {
           builder.append(", ");
         } else {
@@ -7974,7 +8527,7 @@
         needsComma = false;
       }
       builder.append("{");
-      for (MapEntry<String, Type2> entry in getMapEntrySet(namedParameterTypes)) {
+      for (MapEntry<String, DartType> entry in getMapEntrySet(namedParameterTypes)) {
         if (needsComma) {
           builder.append(", ");
         } else {
@@ -8008,6 +8561,7 @@
     }
   }
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) {
     if (object is! FunctionTypeImpl) {
       return false;
@@ -8019,14 +8573,15 @@
       return elementPair.firstElt == elementPair.secondElt;
     }
     // Compute the result
-    bool result = TypeImpl.equalArrays(normalParameterTypes, otherType.normalParameterTypes, visitedElementPairs) && TypeImpl.equalArrays(optionalParameterTypes, otherType.optionalParameterTypes, visitedElementPairs) && equals2(namedParameterTypes, otherType.namedParameterTypes, visitedElementPairs) && (returnType as TypeImpl).internalEquals(otherType.returnType, visitedElementPairs);
+    bool result = TypeImpl.equalArrays(normalParameterTypes, otherType.normalParameterTypes, visitedElementPairs) && TypeImpl.equalArrays(optionalParameterTypes, otherType.optionalParameterTypes, visitedElementPairs) && _equals(namedParameterTypes, otherType.namedParameterTypes, visitedElementPairs) && (returnType as TypeImpl).internalEquals(otherType.returnType, visitedElementPairs);
     // Remove the pair from our visited pairs list
     visitedElementPairs.remove(elementPair);
     // Return the result
     return result;
   }
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
     // trivial base cases
     if (type == null) {
       return false;
@@ -8039,10 +8594,10 @@
     }
     FunctionType t = this;
     FunctionType s = type as FunctionType;
-    List<Type2> tTypes = t.normalParameterTypes;
-    List<Type2> tOpTypes = t.optionalParameterTypes;
-    List<Type2> sTypes = s.normalParameterTypes;
-    List<Type2> sOpTypes = s.optionalParameterTypes;
+    List<DartType> tTypes = t.normalParameterTypes;
+    List<DartType> tOpTypes = t.optionalParameterTypes;
+    List<DartType> sTypes = s.normalParameterTypes;
+    List<DartType> sOpTypes = s.optionalParameterTypes;
     // If one function has positional and the other has named parameters, return false.
     if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) || (tOpTypes.length > 0 && s.namedParameterTypes.length > 0)) {
       return false;
@@ -8060,18 +8615,18 @@
           }
         }
       }
-      Map<String, Type2> namedTypesT = t.namedParameterTypes;
-      Map<String, Type2> namedTypesS = s.namedParameterTypes;
+      Map<String, DartType> namedTypesT = t.namedParameterTypes;
+      Map<String, DartType> namedTypesS = s.namedParameterTypes;
       // if k >= m is false, return false: the passed function type has more named parameter types than this
       if (namedTypesT.length < namedTypesS.length) {
         return false;
       }
       // Loop through each element in S verifying that T has a matching parameter name and that the
       // corresponding type is assignable to the type in S.
-      JavaIterator<MapEntry<String, Type2>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
+      JavaIterator<MapEntry<String, DartType>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
       while (iteratorS.hasNext) {
-        MapEntry<String, Type2> entryS = iteratorS.next();
-        Type2 typeT = namedTypesT[entryS.getKey()];
+        MapEntry<String, DartType> entryS = iteratorS.next();
+        DartType typeT = namedTypesT[entryS.getKey()];
         if (typeT == null) {
           return false;
         }
@@ -8101,14 +8656,14 @@
       } else {
         // Else, we do have positional parameters, copy required and positional parameter types into
         // arrays to do the compare (for loop below).
-        List<Type2> tAllTypes = new List<Type2>(sArgLength);
+        List<DartType> tAllTypes = new List<DartType>(sArgLength);
         for (int i = 0; i < tTypes.length; i++) {
           tAllTypes[i] = tTypes[i];
         }
         for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) {
           tAllTypes[i] = tOpTypes[j];
         }
-        List<Type2> sAllTypes = new List<Type2>(sArgLength);
+        List<DartType> sAllTypes = new List<DartType>(sArgLength);
         for (int i = 0; i < sTypes.length; i++) {
           sAllTypes[i] = sTypes[i];
         }
@@ -8122,8 +8677,8 @@
         }
       }
     }
-    Type2 tRetType = t.returnType;
-    Type2 sRetType = s.returnType;
+    DartType tRetType = t.returnType;
+    DartType sRetType = s.returnType;
     return sRetType.isVoid || (tRetType as TypeImpl).isAssignableTo2(sRetType, visitedTypePairs);
   }
 
@@ -8132,7 +8687,7 @@
    *
    * @return the return type defined by this function's element
    */
-  Type2 get baseReturnType {
+  DartType get baseReturnType {
     Element element = this.element;
     if (element is ExecutableElement) {
       return element.returnType;
@@ -8161,7 +8716,7 @@
    * @return the computed longest inheritance path to Object
    * @see InterfaceType#getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0, new Set<ClassElement>());
+  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new Set<ClassElement>());
 
   /**
    * Returns the set of all superinterfaces of the passed [Type].
@@ -8170,7 +8725,7 @@
    * @return the [Set] of superinterfaces of the passed [Type]
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => computeSuperinterfaceSet2(type, new Set<InterfaceType>());
+  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new Set<InterfaceType>());
 
   /**
    * This method computes the longest inheritance path from some passed [Type] to Object. This
@@ -8185,7 +8740,7 @@
    * @see #computeLongestInheritancePathToObject(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject2(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
+  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
     ClassElement classElement = type.element;
     // Object case
     if (classElement.supertype == null || visitedClasses.contains(classElement)) {
@@ -8200,7 +8755,7 @@
         // loop through each of the superinterfaces recursively calling this method and keeping track
         // of the longest path to return
         for (InterfaceType superinterface in superinterfaces) {
-          pathLength = computeLongestInheritancePathToObject2(superinterface, depth + 1, visitedClasses);
+          pathLength = _computeLongestInheritancePathToObject(superinterface, depth + 1, visitedClasses);
           if (pathLength > longestPath) {
             longestPath = pathLength;
           }
@@ -8209,7 +8764,7 @@
       // finally, perform this same check on the super type
       // TODO(brianwilkerson) Does this also need to add in the number of mixin classes?
       InterfaceType supertype = classElement.supertype;
-      pathLength = computeLongestInheritancePathToObject2(supertype, depth + 1, visitedClasses);
+      pathLength = _computeLongestInheritancePathToObject(supertype, depth + 1, visitedClasses);
       if (pathLength > longestPath) {
         longestPath = pathLength;
       }
@@ -8229,20 +8784,20 @@
    * @see #computeSuperinterfaceSet(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> computeSuperinterfaceSet2(InterfaceType type, Set<InterfaceType> set) {
+  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, Set<InterfaceType> set) {
     Element element = type.element;
     if (element != null && element is ClassElement) {
       ClassElement classElement = element;
       List<InterfaceType> superinterfaces = classElement.interfaces;
       for (InterfaceType superinterface in superinterfaces) {
         if (set.add(superinterface)) {
-          computeSuperinterfaceSet2(superinterface, set);
+          _computeSuperinterfaceSet(superinterface, set);
         }
       }
       InterfaceType supertype = classElement.supertype;
       if (supertype != null) {
         if (set.add(supertype)) {
-          computeSuperinterfaceSet2(supertype, set);
+          _computeSuperinterfaceSet(supertype, set);
         }
       }
     }
@@ -8260,7 +8815,7 @@
    * @param second the second set of types to be intersected
    * @return the intersection of the given sets of types
    */
-  static List<InterfaceType> intersection(Set<InterfaceType> first, Set<InterfaceType> second) {
+  static List<InterfaceType> _intersection(Set<InterfaceType> first, Set<InterfaceType> second) {
     Map<ClassElement, InterfaceType> firstMap = new Map<ClassElement, InterfaceType>();
     for (InterfaceType firstType in first) {
       firstMap[firstType.element] = firstType;
@@ -8269,7 +8824,7 @@
     for (InterfaceType secondType in second) {
       InterfaceType firstType = firstMap[secondType.element];
       if (firstType != null) {
-        result.add(leastUpperBound(firstType, secondType));
+        result.add(_leastUpperBound(firstType, secondType));
       }
     }
     return new List.from(result);
@@ -8285,17 +8840,17 @@
    * @param secondType the second type
    * @return the "least upper bound" of the given types
    */
-  static InterfaceType leastUpperBound(InterfaceType firstType, InterfaceType secondType) {
+  static InterfaceType _leastUpperBound(InterfaceType firstType, InterfaceType secondType) {
     if (firstType == secondType) {
       return firstType;
     }
-    List<Type2> firstArguments = firstType.typeArguments;
-    List<Type2> secondArguments = secondType.typeArguments;
+    List<DartType> firstArguments = firstType.typeArguments;
+    List<DartType> secondArguments = secondType.typeArguments;
     int argumentCount = firstArguments.length;
     if (argumentCount == 0) {
       return firstType;
     }
-    List<Type2> lubArguments = new List<Type2>(argumentCount);
+    List<DartType> lubArguments = new List<DartType>(argumentCount);
     for (int i = 0; i < argumentCount; i++) {
       //
       // Ideally we would take the least upper bound of the two argument types, but this can cause
@@ -8316,7 +8871,7 @@
   /**
    * An array containing the actual types of the type arguments.
    */
-  List<Type2> typeArguments = TypeImpl.EMPTY_ARRAY;
+  List<DartType> typeArguments = TypeImpl.EMPTY_ARRAY;
 
   /**
    * Initialize a newly created type to be declared by the given element.
@@ -8333,8 +8888,10 @@
    */
   InterfaceTypeImpl.con2(String name) : super(null, name);
 
+  @override
   bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
 
+  @override
   List<PropertyAccessorElement> get accessors {
     List<PropertyAccessorElement> accessors = element.accessors;
     List<PropertyAccessorElement> members = new List<PropertyAccessorElement>(accessors.length);
@@ -8344,11 +8901,12 @@
     return members;
   }
 
+  @override
   String get displayName {
     String name = this.name;
-    List<Type2> typeArguments = this.typeArguments;
+    List<DartType> typeArguments = this.typeArguments;
     bool allDynamic = true;
-    for (Type2 type in typeArguments) {
+    for (DartType type in typeArguments) {
       if (type != null && !type.isDynamic) {
         allDynamic = false;
         break;
@@ -8363,7 +8921,7 @@
         if (i != 0) {
           builder.append(", ");
         }
-        Type2 typeArg = typeArguments[i];
+        DartType typeArg = typeArguments[i];
         builder.append(typeArg.displayName);
       }
       builder.append(">");
@@ -8372,15 +8930,18 @@
     return name;
   }
 
+  @override
   ClassElement get element => super.element as ClassElement;
 
+  @override
   PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember.from((element as ClassElementImpl).getGetter(getterName), this);
 
+  @override
   List<InterfaceType> get interfaces {
     ClassElement classElement = element;
     List<InterfaceType> interfaces = classElement.interfaces;
     List<TypeParameterElement> typeParameters = classElement.typeParameters;
-    List<Type2> parameterTypes = classElement.type.typeArguments;
+    List<DartType> parameterTypes = classElement.type.typeArguments;
     if (typeParameters.length == 0) {
       return interfaces;
     }
@@ -8392,13 +8953,14 @@
     return typedInterfaces;
   }
 
-  Type2 getLeastUpperBound(Type2 type) {
+  @override
+  DartType getLeastUpperBound(DartType type) {
     // quick check for self
     if (identical(type, this)) {
       return this;
     }
     // dynamic
-    Type2 dynamicType = DynamicTypeImpl.instance;
+    DartType dynamicType = DynamicTypeImpl.instance;
     if (identical(this, dynamicType) || identical(type, dynamicType)) {
       return dynamicType;
     }
@@ -8416,7 +8978,7 @@
     si.add(i);
     sj.add(j);
     // compute intersection, reference as set 's'
-    List<InterfaceType> s = intersection(si, sj);
+    List<InterfaceType> s = _intersection(si, sj);
     // for each element in Set s, compute the largest inheritance path to Object
     List<int> depths = new List<int>.filled(s.length, 0);
     int maxDepth = 0;
@@ -8447,8 +9009,10 @@
     return null;
   }
 
+  @override
   MethodElement getMethod(String methodName) => MethodMember.from((element as ClassElementImpl).getMethod(methodName), this);
 
+  @override
   List<MethodElement> get methods {
     List<MethodElement> methods = element.methods;
     List<MethodElement> members = new List<MethodElement>(methods.length);
@@ -8458,11 +9022,12 @@
     return members;
   }
 
+  @override
   List<InterfaceType> get mixins {
     ClassElement classElement = element;
     List<InterfaceType> mixins = classElement.mixins;
     List<TypeParameterElement> typeParameters = classElement.typeParameters;
-    List<Type2> parameterTypes = classElement.type.typeArguments;
+    List<DartType> parameterTypes = classElement.type.typeArguments;
     if (typeParameters.length == 0) {
       return mixins;
     }
@@ -8474,8 +9039,10 @@
     return typedMixins;
   }
 
+  @override
   PropertyAccessorElement getSetter(String setterName) => PropertyAccessorMember.from((element as ClassElementImpl).getSetter(setterName), this);
 
+  @override
   InterfaceType get superclass {
     ClassElement classElement = element;
     InterfaceType supertype = classElement.supertype;
@@ -8485,8 +9052,10 @@
     return supertype.substitute2(typeArguments, classElement.type.typeArguments);
   }
 
+  @override
   List<TypeParameterElement> get typeParameters => element.typeParameters;
 
+  @override
   int get hashCode {
     ClassElement element = this.element;
     if (element == null) {
@@ -8495,6 +9064,7 @@
     return element.hashCode;
   }
 
+  @override
   bool get isDartCoreFunction {
     ClassElement element = this.element;
     if (element == null) {
@@ -8503,6 +9073,7 @@
     return element.name == "Function" && element.library.isDartCore;
   }
 
+  @override
   bool isDirectSupertypeOf(InterfaceType type) {
     InterfaceType i = this;
     InterfaceType j = type;
@@ -8517,8 +9088,8 @@
     //
     // I is listed in the extends clause of J.
     //
-    List<Type2> jArgs = j.typeArguments;
-    List<Type2> jVars = jElement.type.typeArguments;
+    List<DartType> jArgs = j.typeArguments;
+    List<DartType> jVars = jElement.type.typeArguments;
     supertype = supertype.substitute2(jArgs, jVars);
     if (supertype == i) {
       return true;
@@ -8549,8 +9120,10 @@
     return false;
   }
 
+  @override
   bool get isObject => element.supertype == null;
 
+  @override
   ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
     // prepare base ConstructorElement
     ConstructorElement constructorElement;
@@ -8567,6 +9140,7 @@
     return ConstructorMember.from(constructorElement, this);
   }
 
+  @override
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
     PropertyAccessorElement element = getGetter(getterName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -8575,6 +9149,7 @@
     return lookUpGetterInSuperclass(getterName, library);
   }
 
+  @override
   PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       PropertyAccessorElement element = mixin.getGetter(getterName);
@@ -8603,6 +9178,7 @@
     return null;
   }
 
+  @override
   MethodElement lookUpMethod(String methodName, LibraryElement library) {
     MethodElement element = getMethod(methodName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -8611,6 +9187,7 @@
     return lookUpMethodInSuperclass(methodName, library);
   }
 
+  @override
   MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       MethodElement element = mixin.getMethod(methodName);
@@ -8639,6 +9216,7 @@
     return null;
   }
 
+  @override
   PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
     PropertyAccessorElement element = getSetter(setterName);
     if (element != null && element.isAccessibleIn(library)) {
@@ -8647,6 +9225,7 @@
     return lookUpSetterInSuperclass(setterName, library);
   }
 
+  @override
   PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library) {
     for (InterfaceType mixin in mixins) {
       PropertyAccessorElement element = mixin.getSetter(setterName);
@@ -8675,16 +9254,18 @@
     return null;
   }
 
-  InterfaceTypeImpl substitute4(List<Type2> argumentTypes) => substitute2(argumentTypes, typeArguments);
+  @override
+  InterfaceTypeImpl substitute4(List<DartType> argumentTypes) => substitute2(argumentTypes, typeArguments);
 
-  InterfaceTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  @override
+  InterfaceTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
     if (argumentTypes.length != parameterTypes.length) {
       throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
     }
     if (argumentTypes.length == 0 || typeArguments.length == 0) {
       return this;
     }
-    List<Type2> newTypeArguments = TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
+    List<DartType> newTypeArguments = TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
     if (JavaArrays.equals(newTypeArguments, typeArguments)) {
       return this;
     }
@@ -8693,6 +9274,7 @@
     return newType;
   }
 
+  @override
   void appendTo(JavaStringBuilder builder) {
     builder.append(name);
     int argumentCount = typeArguments.length;
@@ -8708,6 +9290,7 @@
     }
   }
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) {
     if (object is! InterfaceTypeImpl) {
       return false;
@@ -8716,7 +9299,8 @@
     return (element == otherType.element) && TypeImpl.equalArrays(typeArguments, otherType.typeArguments, visitedElementPairs);
   }
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // S is dynamic.
     // The test to determine whether S is dynamic is done here because dynamic is not an instance of
@@ -8727,10 +9311,11 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(type as InterfaceType, new Set<ClassElement>(), withDynamic, visitedTypePairs);
   }
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // T is a subtype of S, written T <: S, iff [bottom/dynamic]T << S
     //
@@ -8750,10 +9335,10 @@
     } else if (this == type) {
       return true;
     }
-    return isSubtypeOf2(type as InterfaceType, new Set<ClassElement>(), visitedTypePairs);
+    return _isSubtypeOf(type as InterfaceType, new Set<ClassElement>(), visitedTypePairs);
   }
 
-  bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isMoreSpecificThan(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // A type T is more specific than a type S, written T << S,  if one of the following conditions
     // is met:
@@ -8777,13 +9362,13 @@
     ClassElement tElement = this.element;
     ClassElement sElement = s.element;
     if (tElement == sElement) {
-      List<Type2> tArguments = typeArguments;
-      List<Type2> sArguments = s.typeArguments;
+      List<DartType> tArguments = typeArguments;
+      List<DartType> sArguments = s.typeArguments;
       if (tArguments.length != sArguments.length) {
         return false;
       }
       for (int i = 0; i < tArguments.length; i++) {
-        if (!(tArguments[i] as TypeImpl).isMoreSpecificThan3(sArguments[i], withDynamic, visitedTypePairs)) {
+        if (!(tArguments[i] as TypeImpl).isMoreSpecificThan2(sArguments[i], withDynamic, visitedTypePairs)) {
           return false;
         }
       }
@@ -8801,23 +9386,23 @@
     // Iterate over all of the types U that are more specific than T because they are direct
     // supertypes of T and return true if any of them are more specific than S.
     InterfaceType supertype = superclass;
-    if (supertype != null && (supertype as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic, visitedTypePairs)) {
+    if (supertype != null && (supertype as InterfaceTypeImpl)._isMoreSpecificThan(s, visitedClasses, withDynamic, visitedTypePairs)) {
       return true;
     }
     for (InterfaceType interfaceType in interfaces) {
-      if ((interfaceType as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic, visitedTypePairs)) {
+      if ((interfaceType as InterfaceTypeImpl)._isMoreSpecificThan(s, visitedClasses, withDynamic, visitedTypePairs)) {
         return true;
       }
     }
     for (InterfaceType mixinType in mixins) {
-      if ((mixinType as InterfaceTypeImpl).isMoreSpecificThan2(s, visitedClasses, withDynamic, visitedTypePairs)) {
+      if ((mixinType as InterfaceTypeImpl)._isMoreSpecificThan(s, visitedClasses, withDynamic, visitedTypePairs)) {
         return true;
       }
     }
     return false;
   }
 
-  bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isSubtypeOf(InterfaceType type, Set<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
     InterfaceType typeT = this;
     InterfaceType typeS = type;
     ClassElement elementT = element;
@@ -8830,8 +9415,8 @@
     } else if (elementT == typeS.element) {
       // For each of the type arguments return true if all type args from T is a subtype of all
       // types from S.
-      List<Type2> typeTArgs = typeT.typeArguments;
-      List<Type2> typeSArgs = typeS.typeArguments;
+      List<DartType> typeTArgs = typeT.typeArguments;
+      List<DartType> typeSArgs = typeS.typeArguments;
       if (typeTArgs.length != typeSArgs.length) {
         // This case covers the case where two objects are being compared that have a different
         // number of parameterized types.
@@ -8840,7 +9425,7 @@
       for (int i = 0; i < typeTArgs.length; i++) {
         // Recursively call isSubtypeOf the type arguments and return false if the T argument is not
         // a subtype of the S argument.
-        if (!(typeTArgs[i] as TypeImpl).isSubtypeOf3(typeSArgs[i], visitedTypePairs)) {
+        if (!(typeTArgs[i] as TypeImpl).isSubtypeOf2(typeSArgs[i], visitedTypePairs)) {
           return false;
         }
       }
@@ -8850,18 +9435,18 @@
     }
     InterfaceType supertype = superclass;
     // The type is Object, return false.
-    if (supertype != null && (supertype as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses, visitedTypePairs)) {
+    if (supertype != null && (supertype as InterfaceTypeImpl)._isSubtypeOf(typeS, visitedClasses, visitedTypePairs)) {
       return true;
     }
     List<InterfaceType> interfaceTypes = interfaces;
     for (InterfaceType interfaceType in interfaceTypes) {
-      if ((interfaceType as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses, visitedTypePairs)) {
+      if ((interfaceType as InterfaceTypeImpl)._isSubtypeOf(typeS, visitedClasses, visitedTypePairs)) {
         return true;
       }
     }
     List<InterfaceType> mixinTypes = mixins;
     for (InterfaceType mixinType in mixinTypes) {
-      if ((mixinType as InterfaceTypeImpl).isSubtypeOf2(typeS, visitedClasses, visitedTypePairs)) {
+      if ((mixinType as InterfaceTypeImpl)._isSubtypeOf(typeS, visitedClasses, visitedTypePairs)) {
         return true;
       }
     }
@@ -8873,8 +9458,8 @@
  * The abstract class `TypeImpl` implements the behavior common to objects representing the
  * declared type of elements in the element model.
  */
-abstract class TypeImpl implements Type2 {
-  static bool equalArrays(List<Type2> typeArgs1, List<Type2> typeArgs2, Set<ElementPair> visitedElementPairs) {
+abstract class TypeImpl implements DartType {
+  static bool equalArrays(List<DartType> typeArgs1, List<DartType> typeArgs2, Set<ElementPair> visitedElementPairs) {
     if (typeArgs1.length != typeArgs2.length) {
       return false;
     }
@@ -8895,12 +9480,12 @@
    * @param parameterTypes the parameter types for the substitution
    * @return the result of performing the substitution on each of the types
    */
-  static List<Type2> substitute(List<Type2> types, List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  static List<DartType> substitute(List<DartType> types, List<DartType> argumentTypes, List<DartType> parameterTypes) {
     int length = types.length;
     if (length == 0) {
       return types;
     }
-    List<Type2> newTypes = new List<Type2>(length);
+    List<DartType> newTypes = new List<DartType>(length);
     for (int i = 0; i < length; i++) {
       newTypes[i] = types[i].substitute2(argumentTypes, parameterTypes);
     }
@@ -8921,7 +9506,7 @@
   /**
    * An empty array of types.
    */
-  static List<Type2> EMPTY_ARRAY = new List<Type2>(0);
+  static List<DartType> EMPTY_ARRAY = new List<DartType>(0);
 
   /**
    * Initialize a newly created type to be declared by the given element and to have the given name.
@@ -8933,13 +9518,17 @@
     this._element = element;
   }
 
+  @override
   String get displayName => name;
 
+  @override
   Element get element => _element;
 
-  Type2 getLeastUpperBound(Type2 type) => null;
+  @override
+  DartType getLeastUpperBound(DartType type) => null;
 
-  bool isAssignableTo(Type2 type) => isAssignableTo2(type, new Set<TypeImpl_TypePair>());
+  @override
+  bool isAssignableTo(DartType type) => isAssignableTo2(type, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
@@ -8954,15 +9543,19 @@
    * @param visitedPairs the set of pairs of types used to prevent infinite loops
    * @return `true` if this type is assignable to the given type
    */
-  bool isAssignableTo2(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) => isSubtypeOf3(type, visitedTypePairs) || (type as TypeImpl).isSubtypeOf3(this, visitedTypePairs);
+  bool isAssignableTo2(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isSubtypeOf2(type, visitedTypePairs) || (type as TypeImpl).isSubtypeOf2(this, visitedTypePairs);
 
+  @override
   bool get isBottom => false;
 
+  @override
   bool get isDartCoreFunction => false;
 
+  @override
   bool get isDynamic => false;
 
-  bool isMoreSpecificThan(Type2 type) => isMoreSpecificThan3(type, false, new Set<TypeImpl_TypePair>());
+  @override
+  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is more specific than the given type.
@@ -8976,7 +9569,7 @@
    * @param visitedPairs the set of pairs of types used to prevent infinite loops
    * @return `true` if this type is more specific than the given type
    */
-  bool isMoreSpecificThan3(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool isMoreSpecificThan2(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     // If the visitedTypePairs already has the pair (this, type), return false
     TypeImpl_TypePair typePair = new TypeImpl_TypePair(this, type);
     if (!visitedTypePairs.add(typePair)) {
@@ -8987,9 +9580,11 @@
     return result;
   }
 
+  @override
   bool get isObject => false;
 
-  bool isSubtypeOf(Type2 type) => isSubtypeOf3(type, new Set<TypeImpl_TypePair>());
+  @override
+  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is a subtype of the given type.
@@ -9002,7 +9597,7 @@
    * @param visitedPairs the set of pairs of types used to prevent infinite loops
    * @return `true` if this type is a subtype of the given type
    */
-  bool isSubtypeOf3(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool isSubtypeOf2(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
     // If the visitedTypePairs already has the pair (this, type), return false
     TypeImpl_TypePair typePair = new TypeImpl_TypePair(this, type);
     if (!visitedTypePairs.add(typePair)) {
@@ -9013,10 +9608,13 @@
     return result;
   }
 
-  bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
+  @override
+  bool isSupertypeOf(DartType type) => type.isSubtypeOf(this);
 
+  @override
   bool get isVoid => false;
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     appendTo(builder);
@@ -9038,21 +9636,22 @@
 
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs);
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs);
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs);
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs);
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs);
 }
 
 class TypeImpl_TypePair {
-  Type2 _firstType;
+  DartType _firstType;
 
-  Type2 _secondType;
+  DartType _secondType;
 
-  TypeImpl_TypePair(Type2 firstType, Type2 secondType) {
+  TypeImpl_TypePair(DartType firstType, DartType secondType) {
     this._firstType = firstType;
     this._secondType = secondType;
   }
 
+  @override
   bool operator ==(Object object) {
     if (identical(object, this)) {
       return true;
@@ -9064,6 +9663,7 @@
     return false;
   }
 
+  @override
   int get hashCode {
     int firstHashCode = 0;
     if (_firstType != null) {
@@ -9115,13 +9715,17 @@
    */
   TypeParameterTypeImpl(TypeParameterElement element) : super(element, element.name);
 
+  @override
   bool operator ==(Object object) => object is TypeParameterTypeImpl && (element == object.element);
 
+  @override
   TypeParameterElement get element => super.element as TypeParameterElement;
 
+  @override
   int get hashCode => element.hashCode;
 
-  Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
+  @override
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
       if (parameterTypes[i] == this) {
@@ -9131,9 +9735,11 @@
     return this;
   }
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => this == object;
 
-  bool internalIsMoreSpecificThan(Type2 s, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  @override
+  bool internalIsMoreSpecificThan(DartType s, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // A type T is more specific than a type S, written T << S,  if one of the following conditions
     // is met:
@@ -9153,15 +9759,16 @@
     if (s.isDynamic) {
       return true;
     }
-    return isMoreSpecificThan4(s, new Set<Type2>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(s, new Set<DartType>(), withDynamic, visitedTypePairs);
   }
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan3(type, true, new Set<TypeImpl_TypePair>());
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<TypeImpl_TypePair>());
 
-  bool isMoreSpecificThan4(Type2 s, Set<Type2> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isMoreSpecificThan(DartType s, Set<DartType> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     // T is a type parameter and S is the upper bound of T.
     //
-    Type2 bound = element.bound;
+    DartType bound = element.bound;
     if (s == bound) {
       return true;
     }
@@ -9185,10 +9792,10 @@
       }
       visitedTypes.add(bound);
       // Then check upper bound.
-      return boundTypeParameter.isMoreSpecificThan4(s, visitedTypes, withDynamic, visitedTypePairs);
+      return boundTypeParameter._isMoreSpecificThan(s, visitedTypes, withDynamic, visitedTypePairs);
     }
     // Check interface type.
-    return (bound as TypeImpl).isMoreSpecificThan3(s, withDynamic, visitedTypePairs);
+    return (bound as TypeImpl).isMoreSpecificThan2(s, withDynamic, visitedTypePairs);
   }
 }
 
@@ -9213,19 +9820,26 @@
    */
   VoidTypeImpl() : super(null, Keyword.VOID.syntax);
 
+  @override
   bool operator ==(Object object) => identical(object, this);
 
+  @override
   int get hashCode => 2;
 
+  @override
   bool get isVoid => true;
 
-  VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
+  @override
+  VoidTypeImpl substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) => this;
 
+  @override
   bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => identical(object, this);
 
-  bool internalIsMoreSpecificThan(Type2 type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => isSubtypeOf(type);
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => isSubtypeOf(type);
 
-  bool internalIsSubtypeOf(Type2 type, Set<TypeImpl_TypePair> visitedTypePairs) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
 }
 
 /**
@@ -9250,7 +9864,7 @@
    *
    * @return a map from the name to the types of the named parameters of this type of function
    */
-  Map<String, Type2> get namedParameterTypes;
+  Map<String, DartType> get namedParameterTypes;
 
   /**
    * Return an array containing the types of the normal parameters of this type of function. The
@@ -9258,7 +9872,7 @@
    *
    * @return the types of the normal parameters of this type of function
    */
-  List<Type2> get normalParameterTypes;
+  List<DartType> get normalParameterTypes;
 
   /**
    * Return a map from the names of optional (positional) parameters to the types of the optional
@@ -9268,7 +9882,7 @@
    *
    * @return a map from the name to the types of the optional parameters of this type of function
    */
-  List<Type2> get optionalParameterTypes;
+  List<DartType> get optionalParameterTypes;
 
   /**
    * Return an array containing the parameters elements of this type of function. The parameter
@@ -9283,7 +9897,7 @@
    *
    * @return the type of object returned by this type of function
    */
-  Type2 get returnType;
+  DartType get returnType;
 
   /**
    * Return `true` if this type is a subtype of the given type.
@@ -9338,7 +9952,8 @@
    * @param type the type being compared with this type
    * @return `true` if this type is a subtype of the given type
    */
-  bool isSubtypeOf(Type2 type);
+  @override
+  bool isSubtypeOf(DartType type);
 
   /**
    * Return the type resulting from substituting the given arguments for this type's parameters.
@@ -9347,9 +9962,10 @@
    * @param argumentTypes the actual type arguments being substituted for the type parameters
    * @return the result of performing the substitution
    */
-  FunctionType substitute3(List<Type2> argumentTypes);
+  FunctionType substitute3(List<DartType> argumentTypes);
 
-  FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
+  @override
+  FunctionType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
 
 /**
@@ -9364,6 +9980,7 @@
    */
   List<PropertyAccessorElement> get accessors;
 
+  @override
   ClassElement get element;
 
   /**
@@ -9400,7 +10017,8 @@
    * @param type the other type used to compute the least upper bound
    * @return the least upper bound of this type and the given type
    */
-  Type2 getLeastUpperBound(Type2 type);
+  @override
+  DartType getLeastUpperBound(DartType type);
 
   /**
    * Return the element representing the method with the given name that is declared in this class,
@@ -9479,7 +10097,8 @@
    * @param type the type being compared with this type
    * @return `true` if this type is more specific than the given type
    */
-  bool isMoreSpecificThan(Type2 type);
+  @override
+  bool isMoreSpecificThan(DartType type);
 
   /**
    * Return `true` if this type is a subtype of the given type. An interface type <i>T</i> is
@@ -9491,7 +10110,8 @@
    * @param type the type being compared with this type
    * @return `true` if this type is a subtype of the given type
    */
-  bool isSubtypeOf(Type2 type);
+  @override
+  bool isSubtypeOf(DartType type);
 
   /**
    * Return the element representing the constructor that results from looking up the given
@@ -9633,16 +10253,17 @@
    * @param argumentTypes the actual type arguments being substituted for the type parameters
    * @return the result of performing the substitution
    */
-  InterfaceType substitute4(List<Type2> argumentTypes);
+  InterfaceType substitute4(List<DartType> argumentTypes);
 
-  InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
+  @override
+  InterfaceType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
 
 /**
  * The interface `ParameterizedType` defines the behavior common to objects representing a
  * type with type parameters, such as a class or function type alias.
  */
-abstract class ParameterizedType implements Type2 {
+abstract class ParameterizedType implements DartType {
   /**
    * Return an array containing the actual types of the type arguments. If this type's element does
    * not have type parameters, then the array should be empty (although it is possible for type
@@ -9652,7 +10273,7 @@
    *
    * @return the actual types of the type arguments
    */
-  List<Type2> get typeArguments;
+  List<DartType> get typeArguments;
 
   /**
    * Return an array containing all of the type parameters declared for this type.
@@ -9666,7 +10287,7 @@
  * The interface `Type` defines the behavior of objects representing the declared type of
  * elements in the element model.
  */
-abstract class Type2 {
+abstract class DartType {
   /**
    * Return the name of this type as it should appear when presented to users in contexts such as
    * error messages.
@@ -9691,7 +10312,7 @@
    * @param type the other type used to compute the least upper bound
    * @return the least upper bound of this type and the given type
    */
-  Type2 getLeastUpperBound(Type2 type);
+  DartType getLeastUpperBound(DartType type);
 
   /**
    * Return the name of this type, or `null` if the type does not have a name, such as when
@@ -9709,7 +10330,7 @@
    * @param type the type being compared with this type
    * @return `true` if this type is assignable to the given type
    */
-  bool isAssignableTo(Type2 type);
+  bool isAssignableTo(DartType type);
 
   /**
    * Return `true` if this type represents the bottom type.
@@ -9740,7 +10361,7 @@
    * @param type the type being compared with this type
    * @return `true` if this type is more specific than the given type
    */
-  bool isMoreSpecificThan(Type2 type);
+  bool isMoreSpecificThan(DartType type);
 
   /**
    * Return `true` if this type represents the type 'Object'.
@@ -9755,7 +10376,7 @@
    * @param type the type being compared with this type
    * @return `true` if this type is a subtype of the given type
    */
-  bool isSubtypeOf(Type2 type);
+  bool isSubtypeOf(DartType type);
 
   /**
    * Return `true` if this type is a supertype of the given type. A type <i>S</i> is a
@@ -9764,7 +10385,7 @@
    * @param type the type being compared with this type
    * @return `true` if this type is a supertype of the given type
    */
-  bool isSupertypeOf(Type2 type);
+  bool isSupertypeOf(DartType type);
 
   /**
    * Return `true` if this type represents the type 'void'.
@@ -9786,14 +10407,15 @@
    * @param parameterTypes the parameters to be replaced
    * @return the result of performing the substitution
    */
-  Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
 
 /**
  * The interface `TypeParameterType` defines the behavior of objects representing the type
  * introduced by a type parameter.
  */
-abstract class TypeParameterType implements Type2 {
+abstract class TypeParameterType implements DartType {
+  @override
   TypeParameterElement get element;
 }
 
@@ -9801,6 +10423,7 @@
  * The interface `VoidType` defines the behavior of the unique object representing the type
  * `void`.
  */
-abstract class VoidType implements Type2 {
-  VoidType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
+abstract class VoidType implements DartType {
+  @override
+  VoidType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index d536acb..9fa7af5 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -294,6 +294,11 @@
   LineInfo computeLineInfo(Source source);
 
   /**
+   * Notifies the context that the client is going to stop using this context.
+   */
+  void dispose();
+
+  /**
    * Return `true` if the given source exists.
    *
    * This method should be used rather than the method [Source#exists] because contexts can
@@ -349,19 +354,6 @@
   TimestampedData<String> getContents(Source source);
 
   /**
-   * Get the contents of the given source and pass it to the given content receiver.
-   *
-   * This method should be used rather than the method
-   * [Source#getContentsToReceiver] because contexts can have local overrides
-   * of the content of a source that the source is not aware of.
-   *
-   * @param source the source whose content is to be returned
-   * @param receiver the content receiver to which the content of the source will be passed
-   * @throws Exception if the contents of the source could not be accessed
-   */
-  void getContentsToReceiver(Source source, Source_ContentReceiver receiver);
-
-  /**
    * Return the element referenced by the given location, or `null` if the element is not
    * immediately available or if there is no element with the given location. The latter condition
    * can occur, for example, if the location describes an element from a different context or if the
@@ -577,6 +569,13 @@
   bool isClientLibrary(Source librarySource);
 
   /**
+   * Returns `true` if this context was disposed using [dispose].
+   *
+   * @return `true` if this context was disposed
+   */
+  bool get isDisposed;
+
+  /**
    * Return `true` if the given source is known to be the defining compilation unit of a
    * library that can be run on the server (does not reference 'dart:html', either directly or
    * indirectly).
@@ -887,6 +886,13 @@
    * @return the change notices associated with this result
    */
   List<ChangeNotice> get changeNotices => _notices;
+
+  /**
+   * Return `true` if there is more to be performed after the task that was performed.
+   *
+   * @return `true` if there is more to be performed after the task that was performed
+   */
+  bool get hasMoreWork => _notices != null;
 }
 
 /**
@@ -1013,11 +1019,12 @@
     }
   }
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSeparator = appendSources(builder, _added, false, "added");
-    needsSeparator = appendSources(builder, _changed, needsSeparator, "changed");
-    appendSources(builder, _removed, needsSeparator, "removed");
+    bool needsSeparator = _appendSources(builder, _added, false, "added");
+    needsSeparator = _appendSources(builder, _changed, needsSeparator, "changed");
+    _appendSources(builder, _removed, needsSeparator, "removed");
     int count = removedContainers.length;
     if (count > 0) {
       if (_removed.isEmpty) {
@@ -1046,7 +1053,7 @@
    * @param label the label used to prefix the sources
    * @return `true` if future lists of sources will need a separator
    */
-  bool appendSources(JavaStringBuilder builder, List<Source> sources, bool needsSeparator, String label) {
+  bool _appendSources(JavaStringBuilder builder, List<Source> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
@@ -1145,7 +1152,7 @@
       return;
     }
     while (_recentlyUsed.length >= _maxCacheSize) {
-      if (!flushAstFromCache()) {
+      if (!_flushAstFromCache()) {
         break;
       }
     }
@@ -1206,7 +1213,7 @@
   void set maxCacheSize(int size) {
     _maxCacheSize = size;
     while (_recentlyUsed.length > _maxCacheSize) {
-      if (!flushAstFromCache()) {
+      if (!_flushAstFromCache()) {
         break;
       }
     }
@@ -1229,7 +1236,7 @@
       return;
     }
     while (_recentlyUsed.length >= _maxCacheSize) {
-      if (!flushAstFromCache()) {
+      if (!_flushAstFromCache()) {
         break;
       }
     }
@@ -1241,8 +1248,8 @@
    *
    * @return `true` if a structure was flushed
    */
-  bool flushAstFromCache() {
-    Source removedSource = removeAstToFlush();
+  bool _flushAstFromCache() {
+    Source removedSource = _removeAstToFlush();
     if (removedSource == null) {
       return false;
     }
@@ -1266,7 +1273,7 @@
    *
    * @return the source that was removed
    */
-  Source removeAstToFlush() {
+  Source _removeAstToFlush() {
     int sourceToRemove = -1;
     for (int i = 0; i < _recentlyUsed.length; i++) {
       Source source = _recentlyUsed[i];
@@ -1370,6 +1377,11 @@
   static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
 
   /**
+   * The data descriptor representing the errors reported during the resolution of directives.
+   */
+  static final DataDescriptor<List<AnalysisError>> DIRECTIVE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.DIRECTIVE_ERRORS");
+
+  /**
    * The data descriptor representing the library element for the library. This data is only
    * available for Dart files that are the defining compilation unit of a library.
    */
@@ -1502,6 +1514,7 @@
    */
   Object getValueInLibrary(DataDescriptor descriptor, Source librarySource);
 
+  @override
   DartEntryImpl get writableCopy;
 
   /**
@@ -1540,8 +1553,8 @@
   CacheState _scanErrorsState = CacheState.INVALID;
 
   /**
-   * The errors produced while scanning the compilation unit, or `null` if the errors are not
-   * currently cached.
+   * The errors produced while scanning the compilation unit, or an empty array if the errors are
+   * not currently cached.
    */
   List<AnalysisError> _scanErrors = AnalysisError.NO_ERRORS;
 
@@ -1578,7 +1591,7 @@
   CacheState _parseErrorsState = CacheState.INVALID;
 
   /**
-   * The errors produced while parsing the compilation unit, or `null` if the errors are not
+   * The errors produced while parsing the compilation unit, or an empty array if the errors are not
    * currently cached.
    */
   List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
@@ -1617,6 +1630,17 @@
   List<Source> _includedParts = Source.EMPTY_ARRAY;
 
   /**
+   * The state of the cached directive errors.
+   */
+  CacheState _directiveErrorsState = CacheState.INVALID;
+
+  /**
+   * The errors produced while resolving the directives, or an empty array if the errors are not
+   * currently cached.
+   */
+  List<AnalysisError> _directiveErrors = AnalysisError.NO_ERRORS;
+
+  /**
    * The list of libraries that contain this compilation unit. The list will be empty if there are
    * no known libraries that contain this compilation unit.
    */
@@ -1708,10 +1732,12 @@
     _resolutionState.flushAstStructures();
   }
 
+  @override
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     ListUtilities.addAll(errors, _scanErrors);
     ListUtilities.addAll(errors, _parseErrors);
+    ListUtilities.addAll(errors, _directiveErrors);
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       ListUtilities.addAll(errors, state._resolutionErrors);
@@ -1726,6 +1752,7 @@
     return new List.from(errors);
   }
 
+  @override
   CompilationUnit get anyParsedCompilationUnit {
     if (identical(_parsedUnitState, CacheState.VALID)) {
       _parsedUnitAccessed = true;
@@ -1734,6 +1761,7 @@
     return anyResolvedCompilationUnit;
   }
 
+  @override
   CompilationUnit get anyResolvedCompilationUnit {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1746,6 +1774,7 @@
     return null;
   }
 
+  @override
   SourceKind get kind => _sourceKind;
 
   /**
@@ -1791,8 +1820,11 @@
     return null;
   }
 
+  @override
   CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
+      return _directiveErrorsState;
+    } else if (identical(descriptor, DartEntry.ELEMENT)) {
       return _elementState;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return _exportedLibrariesState;
@@ -1821,6 +1853,7 @@
     }
   }
 
+  @override
   CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1847,11 +1880,14 @@
     }
   }
 
+  @override
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
       return _angularErrors;
     } else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
       return new List.from(_containingLibraries);
+    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
+      return _directiveErrors;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       return _element;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -1881,6 +1917,7 @@
     return super.getValue(descriptor);
   }
 
+  @override
   Object getValueInLibrary(DataDescriptor descriptor, Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -1909,14 +1946,18 @@
     }
   }
 
+  @override
   DartEntryImpl get writableCopy {
     DartEntryImpl copy = new DartEntryImpl();
     copy.copyFrom(this);
     return copy;
   }
 
+  @override
   bool hasInvalidData(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
+      return identical(_directiveErrorsState, CacheState.INVALID);
+    } else if (identical(descriptor, DartEntry.ELEMENT)) {
       return identical(_elementState, CacheState.INVALID);
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return identical(_exportedLibrariesState, CacheState.INVALID);
@@ -1959,6 +2000,7 @@
     }
   }
 
+  @override
   void invalidateAllInformation() {
     super.invalidateAllInformation();
     _scanErrors = AnalysisError.NO_ERRORS;
@@ -1972,7 +2014,7 @@
     _parsedUnit = null;
     _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.INVALID;
-    discardCachedResolutionInformation();
+    _discardCachedResolutionInformation();
   }
 
   /**
@@ -1991,9 +2033,10 @@
         state = state._nextState;
       }
     }
-    discardCachedResolutionInformation();
+    _discardCachedResolutionInformation();
   }
 
+  @override
   bool get isRefactoringSafe {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
@@ -2006,6 +2049,7 @@
     return true;
   }
 
+  @override
   void recordContentError() {
     super.recordContentError();
     recordScanError();
@@ -2022,6 +2066,8 @@
     _importedLibrariesState = CacheState.ERROR;
     _includedParts = Source.EMPTY_ARRAY;
     _includedPartsState = CacheState.ERROR;
+    _directiveErrors = AnalysisError.NO_ERRORS;
+    _directiveErrorsState = CacheState.ERROR;
   }
 
   /**
@@ -2038,6 +2084,9 @@
     if (_includedPartsState != CacheState.VALID) {
       _includedPartsState = CacheState.IN_PROCESS;
     }
+    if (_directiveErrorsState != CacheState.VALID) {
+      _directiveErrorsState = CacheState.IN_PROCESS;
+    }
   }
 
   /**
@@ -2054,6 +2103,9 @@
     if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
       _includedPartsState = CacheState.INVALID;
     }
+    if (identical(_directiveErrorsState, CacheState.IN_PROCESS)) {
+      _directiveErrorsState = CacheState.INVALID;
+    }
   }
 
   /**
@@ -2241,8 +2293,12 @@
     _containingLibraries.add(librarySource);
   }
 
+  @override
   void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
+      _directiveErrors = updatedValue(state, _directiveErrors, null);
+      _directiveErrorsState = state;
+    } else if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
       _elementState = state;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -2255,10 +2311,10 @@
       _includedParts = updatedValue(state, _includedParts, Source.EMPTY_ARRAY);
       _includedPartsState = state;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _bitmask = updatedValueOfFlag(state, _bitmask, _CLIENT_CODE_INDEX);
+      _bitmask = _updatedValueOfFlag(state, _bitmask, _CLIENT_CODE_INDEX);
       _clientServerState = state;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _bitmask = updatedValueOfFlag(state, _bitmask, _LAUNCHABLE_INDEX);
+      _bitmask = _updatedValueOfFlag(state, _bitmask, _LAUNCHABLE_INDEX);
       _launchableState = state;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
@@ -2297,7 +2353,7 @@
    * @param cacheState the new state of the data represented by the given descriptor
    */
   void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
-    DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
       state._resolutionErrorsState = cacheState;
@@ -2315,9 +2371,13 @@
     }
   }
 
+  @override
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
       _angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
+    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
+      _directiveErrors = value as List<AnalysisError>;
+      _directiveErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = value as LibraryElement;
       _elementState = CacheState.VALID;
@@ -2370,7 +2430,7 @@
    * @param value the new value of the data represented by the given descriptor and library
    */
   void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) {
-    DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
+    DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
       state._resolutionErrorsState = CacheState.VALID;
@@ -2386,6 +2446,7 @@
     }
   }
 
+  @override
   void copyFrom(SourceEntryImpl entry) {
     super.copyFrom(entry);
     DartEntryImpl other = entry as DartEntryImpl;
@@ -2406,6 +2467,8 @@
     _exportedLibraries = other._exportedLibraries;
     _importedLibrariesState = other._importedLibrariesState;
     _importedLibraries = other._importedLibraries;
+    _directiveErrorsState = other._directiveErrorsState;
+    _directiveErrors = other._directiveErrors;
     _containingLibraries = new List<Source>.from(other._containingLibraries);
     _resolutionState.copyFrom(other._resolutionState);
     _elementState = other._elementState;
@@ -2418,8 +2481,10 @@
     _angularErrors = other._angularErrors;
   }
 
-  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
+  @override
+  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_directiveErrorsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
 
+  @override
   void writeOn(JavaStringBuilder builder) {
     builder.append("Dart: ");
     super.writeOn(builder);
@@ -2441,6 +2506,8 @@
     builder.append(_importedLibrariesState);
     builder.append("; includedParts = ");
     builder.append(_includedPartsState);
+    builder.append("; directiveErrors = ");
+    builder.append(_directiveErrorsState);
     builder.append("; element = ");
     builder.append(_elementState);
     builder.append("; publicNamespace = ");
@@ -2456,7 +2523,7 @@
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
-  void discardCachedResolutionInformation() {
+  void _discardCachedResolutionInformation() {
     _element = null;
     _elementState = CacheState.INVALID;
     _includedParts = Source.EMPTY_ARRAY;
@@ -2465,6 +2532,8 @@
     _exportedLibrariesState = CacheState.INVALID;
     _importedLibraries = Source.EMPTY_ARRAY;
     _importedLibrariesState = CacheState.INVALID;
+    _directiveErrors = AnalysisError.NO_ERRORS;
+    _directiveErrorsState = CacheState.INVALID;
     _bitmask = 0;
     _clientServerState = CacheState.INVALID;
     _launchableState = CacheState.INVALID;
@@ -2479,7 +2548,7 @@
    * @param librarySource the library source (not `null`)
    * @return the resolution state (not `null`)
    */
-  DartEntryImpl_ResolutionState getOrCreateResolutionState(Source librarySource) {
+  DartEntryImpl_ResolutionState _getOrCreateResolutionState(Source librarySource) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     if (state._librarySource == null) {
       state._librarySource = librarySource;
@@ -2506,7 +2575,7 @@
    * @param bitMask the mask used to access the bit whose state is being set
    * @return the value of the data that should be kept in the cache
    */
-  int updatedValueOfFlag(CacheState state, int currentValue, int bitIndex) {
+  int _updatedValueOfFlag(CacheState state, int currentValue, int bitIndex) {
     if (identical(state, CacheState.VALID)) {
       throw new IllegalArgumentException("Use setValue() to set the state to VALID");
     } else if (identical(state, CacheState.IN_PROCESS)) {
@@ -2716,6 +2785,7 @@
     this._name = name;
   }
 
+  @override
   String toString() => _name;
 }
 
@@ -2797,6 +2867,7 @@
    */
   ht.HtmlUnit get anyParsedUnit;
 
+  @override
   HtmlEntryImpl get writableCopy;
 }
 
@@ -2933,6 +3004,7 @@
     }
   }
 
+  @override
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     if (_parseErrors != null) {
@@ -2961,6 +3033,7 @@
     return new List.from(errors);
   }
 
+  @override
   ht.HtmlUnit get anyParsedUnit {
     if (identical(_parsedUnitState, CacheState.VALID)) {
       //      parsedUnitAccessed = true;
@@ -2973,8 +3046,10 @@
     return null;
   }
 
+  @override
   SourceKind get kind => SourceKind.HTML;
 
+  @override
   CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
       return _angularApplicationState;
@@ -3002,6 +3077,7 @@
     return super.getState(descriptor);
   }
 
+  @override
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
       return _angularApplication;
@@ -3029,12 +3105,14 @@
     return super.getValue(descriptor);
   }
 
+  @override
   HtmlEntryImpl get writableCopy {
     HtmlEntryImpl copy = new HtmlEntryImpl();
     copy.copyFrom(this);
     return copy;
   }
 
+  @override
   void invalidateAllInformation() {
     super.invalidateAllInformation();
     _parseErrors = AnalysisError.NO_ERRORS;
@@ -3064,6 +3142,7 @@
     _hintsState = CacheState.INVALID;
   }
 
+  @override
   void recordContentError() {
     super.recordContentError();
     recordParseError();
@@ -3093,6 +3172,7 @@
     setState(HtmlEntry.HINTS, CacheState.ERROR);
   }
 
+  @override
   void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
       _angularApplication = updatedValue(state, _angularApplication, null);
@@ -3132,6 +3212,7 @@
     }
   }
 
+  @override
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, HtmlEntry.ANGULAR_APPLICATION)) {
       _angularApplication = value as AngularApplication;
@@ -3171,6 +3252,7 @@
     }
   }
 
+  @override
   void copyFrom(SourceEntryImpl entry) {
     super.copyFrom(entry);
     HtmlEntryImpl other = entry as HtmlEntryImpl;
@@ -3198,8 +3280,10 @@
     _hintsState = other._hintsState;
   }
 
+  @override
   bool get hasErrorState => super.hasErrorState || identical(_parsedUnitState, CacheState.ERROR) || identical(_resolvedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_referencedLibrariesState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_angularErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR);
 
+  @override
   void writeOn(JavaStringBuilder builder) {
     builder.append("Html: ");
     super.writeOn(builder);
@@ -3376,8 +3460,10 @@
     }
   }
 
+  @override
   int get modificationTime => _modificationTime;
 
+  @override
   CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, SourceEntry.CONTENT)) {
       return _contentState;
@@ -3388,6 +3474,7 @@
     }
   }
 
+  @override
   Object getValue(DataDescriptor descriptor) {
     if (identical(descriptor, SourceEntry.CONTENT)) {
       return _content;
@@ -3464,6 +3551,7 @@
     }
   }
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     writeOn(builder);
@@ -3542,31 +3630,34 @@
     _sources.add(source);
   }
 
+  @override
   List<AnalysisContentStatistics_CacheRow> get cacheRows {
     Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
     return new List.from(items);
   }
 
+  @override
   List<AnalysisException> get exceptions => new List.from(_exceptions);
 
+  @override
   List<Source> get sources => new List.from(_sources);
 
   void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
-    internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
   }
 
   void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
-    internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
+    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
   }
 
-  void internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
     String rowName = rowDesc.toString();
     AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
     if (row == null) {
       row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
       _dataMap[rowName] = row;
     }
-    row.incState(state);
+    row._incState(state);
     if (identical(state, CacheState.ERROR)) {
       AnalysisException exception = dartEntry.exception;
       if (exception != null) {
@@ -3591,21 +3682,28 @@
 
   AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
 
+  @override
   bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
 
+  @override
   int get errorCount => _errorCount;
 
+  @override
   int get flushedCount => _flushedCount;
 
+  @override
   int get inProcessCount => _inProcessCount;
 
+  @override
   int get invalidCount => _invalidCount;
 
+  @override
   int get validCount => _validCount;
 
+  @override
   int get hashCode => name.hashCode;
 
-  void incState(CacheState state) {
+  void _incState(CacheState state) {
     if (identical(state, CacheState.ERROR)) {
       _errorCount++;
     }
@@ -3642,6 +3740,11 @@
   AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
 
   /**
+   * A flag indicating whether this context is disposed.
+   */
+  bool _disposed = false;
+
+  /**
    * A cache of content used to override the default content of a source.
    */
   ContentCache _contentCache = new ContentCache();
@@ -3712,12 +3815,14 @@
     _cache = new AnalysisCache(AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this));
   }
 
+  @override
   void addSourceInfo(Source source, SourceEntry info) {
     // This implementation assumes that the access to the cache does not need to be synchronized
     // because no other object can have access to this context while this method is being invoked.
     _cache.put(source, info);
   }
 
+  @override
   void applyChanges(ChangeSet changeSet) {
     if (changeSet.isEmpty) {
       return;
@@ -3728,36 +3833,36 @@
     //
     List<Source> removedSources = new List<Source>.from(changeSet.removedSources);
     for (SourceContainer container in changeSet.removedContainers) {
-      addSourcesInContainer(removedSources, container);
+      _addSourcesInContainer(removedSources, container);
     }
     //
     // Then determine which cached results are no longer valid.
     //
     bool addedDartSource = false;
     for (Source source in changeSet.addedSources) {
-      if (sourceAvailable(source)) {
+      if (_sourceAvailable(source)) {
         addedDartSource = true;
       }
     }
     for (Source source in changeSet.changedSources) {
-      sourceChanged(source);
+      _sourceChanged(source);
     }
     for (Source source in removedSources) {
-      sourceRemoved(source);
+      _sourceRemoved(source);
     }
     if (addedDartSource) {
       // TODO(brianwilkerson) This is hugely inefficient, but we need to re-analyze any libraries
       // that might have been referencing the not-yet-existing source that was just added. Longer
       // term we need to keep track of which libraries are referencing non-existing sources and
       // only re-analyze those libraries.
-      logInformation("Added Dart sources, invalidating all resolution information");
+      _logInformation("Added Dart sources, invalidating all resolution information");
       for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
         Source source = mapEntry.getKey();
         SourceEntry sourceEntry = mapEntry.getValue();
         if (!source.isInSystemLibrary && sourceEntry is DartEntry) {
           DartEntry dartEntry = sourceEntry;
           DartEntryImpl dartCopy = dartEntry.writableCopy;
-          removeFromParts(source, dartEntry);
+          _removeFromParts(source, dartEntry);
           dartCopy.invalidateAllResolutionInformation();
           mapEntry.setValue(dartCopy);
           SourcePriority priority = SourcePriority.UNKNOWN;
@@ -3773,6 +3878,7 @@
     }
   }
 
+  @override
   String computeDocumentationComment(Element element) {
     if (element == null) {
       return null;
@@ -3808,39 +3914,40 @@
     return null;
   }
 
+  @override
   List<AnalysisError> computeErrors(Source source) {
     bool enableHints = _options.hint;
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
     if (sourceEntry is DartEntry) {
       List<AnalysisError> errors = new List<AnalysisError>();
       try {
         DartEntry dartEntry = sourceEntry;
-        ListUtilities.addAll(errors, getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS));
-        dartEntry = getReadableDartEntry(source);
-        ListUtilities.addAll(errors, getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
-        dartEntry = getReadableDartEntry(source);
+        ListUtilities.addAll(errors, _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS));
+        dartEntry = _getReadableDartEntry(source);
+        ListUtilities.addAll(errors, _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
+        dartEntry = _getReadableDartEntry(source);
         if (identical(dartEntry.getValue(DartEntry.SOURCE_KIND), SourceKind.LIBRARY)) {
-          ListUtilities.addAll(errors, getDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
-          dartEntry = getReadableDartEntry(source);
-          ListUtilities.addAll(errors, getDartVerificationData(source, source, dartEntry, DartEntry.VERIFICATION_ERRORS));
+          ListUtilities.addAll(errors, _getDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
+          dartEntry = _getReadableDartEntry(source);
+          ListUtilities.addAll(errors, _getDartVerificationData(source, source, dartEntry, DartEntry.VERIFICATION_ERRORS));
           if (enableHints) {
-            dartEntry = getReadableDartEntry(source);
-            ListUtilities.addAll(errors, getDartHintData(source, source, dartEntry, DartEntry.HINTS));
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(errors, _getDartHintData(source, source, dartEntry, DartEntry.HINTS));
           }
         } else {
           List<Source> libraries = getLibrariesContaining(source);
           for (Source librarySource in libraries) {
-            ListUtilities.addAll(errors, getDartResolutionData(source, librarySource, dartEntry, DartEntry.RESOLUTION_ERRORS));
-            dartEntry = getReadableDartEntry(source);
-            ListUtilities.addAll(errors, getDartVerificationData(source, librarySource, dartEntry, DartEntry.VERIFICATION_ERRORS));
+            ListUtilities.addAll(errors, _getDartResolutionData(source, librarySource, dartEntry, DartEntry.RESOLUTION_ERRORS));
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(errors, _getDartVerificationData(source, librarySource, dartEntry, DartEntry.VERIFICATION_ERRORS));
             if (enableHints) {
-              dartEntry = getReadableDartEntry(source);
-              ListUtilities.addAll(errors, getDartHintData(source, librarySource, dartEntry, DartEntry.HINTS));
+              dartEntry = _getReadableDartEntry(source);
+              ListUtilities.addAll(errors, _getDartHintData(source, librarySource, dartEntry, DartEntry.HINTS));
             }
           }
         }
       } on ObsoleteSourceAnalysisException catch (exception) {
-        AnalysisEngine.instance.logger.logInformation3("Could not compute errors", exception);
+        AnalysisEngine.instance.logger.logInformation2("Could not compute errors", exception);
       }
       if (errors.isEmpty) {
         return AnalysisError.NO_ERRORS;
@@ -3849,27 +3956,31 @@
     } else if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       try {
-        return getHtmlResolutionData2(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
+        return _getHtmlResolutionData2(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
       } on ObsoleteSourceAnalysisException catch (exception) {
-        AnalysisEngine.instance.logger.logInformation3("Could not compute errors", exception);
+        AnalysisEngine.instance.logger.logInformation2("Could not compute errors", exception);
       }
     }
     return AnalysisError.NO_ERRORS;
   }
 
-  List<Source> computeExportedLibraries(Source source) => getDartDependencyData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  @override
+  List<Source> computeExportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
-  HtmlElement computeHtmlElement(Source source) => getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
+  @override
+  HtmlElement computeHtmlElement(Source source) => _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
 
-  List<Source> computeImportedLibraries(Source source) => getDartDependencyData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  @override
+  List<Source> computeImportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
+  @override
   SourceKind computeKindOf(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
     if (sourceEntry == null) {
       return SourceKind.UNKNOWN;
     } else if (sourceEntry is DartEntry) {
       try {
-        return getDartParseData(source, sourceEntry, DartEntry.SOURCE_KIND);
+        return _getDartParseData(source, sourceEntry, DartEntry.SOURCE_KIND);
       } on AnalysisException catch (exception) {
         return SourceKind.UNKNOWN;
       }
@@ -3877,28 +3988,31 @@
     return sourceEntry.kind;
   }
 
-  LibraryElement computeLibraryElement(Source source) => getDartResolutionData2(source, source, DartEntry.ELEMENT, null);
+  @override
+  LibraryElement computeLibraryElement(Source source) => _getDartResolutionData2(source, source, DartEntry.ELEMENT, null);
 
+  @override
   LineInfo computeLineInfo(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
     try {
       if (sourceEntry is HtmlEntry) {
-        return getHtmlParseData(source, SourceEntry.LINE_INFO, null);
+        return _getHtmlParseData(source, SourceEntry.LINE_INFO, null);
       } else if (sourceEntry is DartEntry) {
-        return getDartScanData2(source, SourceEntry.LINE_INFO, null);
+        return _getDartScanData2(source, SourceEntry.LINE_INFO, null);
       }
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${SourceEntry.LINE_INFO.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${SourceEntry.LINE_INFO.toString()}", exception);
     }
     return null;
   }
 
+  @override
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
-    DartEntry dartEntry = getReadableDartEntry(source);
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       throw new AnalysisException.con1("computeResolvableCompilationUnit for non-Dart: ${source.fullName}");
     }
-    dartEntry = cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
+    dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
     DartEntryImpl dartCopy = dartEntry.writableCopy;
     CompilationUnit unit = dartCopy.resolvableCompilationUnit;
     if (unit == null) {
@@ -3908,6 +4022,12 @@
     return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
   }
 
+  @override
+  void dispose() {
+    _disposed = true;
+  }
+
+  @override
   bool exists(Source source) {
     if (source == null) {
       return false;
@@ -3918,8 +4038,10 @@
     return source.exists();
   }
 
+  @override
   AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext);
 
+  @override
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) {
     List<Source> sourcesToRemove = new List<Source>();
     // Move sources in the specified directory to the new context
@@ -3933,8 +4055,10 @@
     return newContext;
   }
 
+  @override
   AnalysisOptions get analysisOptions => _options;
 
+  @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource, Source librarySource) {
     LibraryElement libraryElement = getLibraryElement(librarySource);
     if (libraryElement != null) {
@@ -3953,6 +4077,7 @@
     return null;
   }
 
+  @override
   TimestampedData<String> getContents(Source source) {
     String contents = _contentCache.getContents(source);
     if (contents != null) {
@@ -3961,20 +4086,12 @@
     return source.contents;
   }
 
-  void getContentsToReceiver(Source source, Source_ContentReceiver receiver) {
-    String contents = _contentCache.getContents(source);
-    if (contents != null) {
-      receiver.accept(contents, _contentCache.getModificationStamp(source));
-      return;
-    }
-    source.getContentsToReceiver(receiver);
-  }
-
+  @override
   Element getElement(ElementLocation location) {
     // TODO(brianwilkerson) This should not be a "get" method.
     try {
       List<String> components = (location as ElementLocationImpl).components;
-      Source librarySource = computeSourceFromEncoding(components[0]);
+      Source librarySource = _computeSourceFromEncoding(components[0]);
       ElementImpl element = computeLibraryElement(librarySource) as ElementImpl;
       for (int i = 1; i < components.length; i++) {
         if (element == null) {
@@ -3988,8 +4105,9 @@
     }
   }
 
+  @override
   AnalysisErrorInfo getErrors(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
@@ -4000,14 +4118,16 @@
     return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
   }
 
+  @override
   HtmlElement getHtmlElement(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
     if (sourceEntry is HtmlEntry) {
       return sourceEntry.getValue(HtmlEntry.ELEMENT);
     }
     return null;
   }
 
+  @override
   List<Source> getHtmlFilesReferencing(Source source) {
     SourceKind sourceKind = getKindOf(source);
     if (sourceKind == null) {
@@ -4022,7 +4142,7 @@
           SourceEntry sourceEntry = entry.getValue();
           if (identical(sourceEntry.kind, SourceKind.HTML)) {
             List<Source> referencedLibraries = (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES);
-            if (containsAny(referencedLibraries, librarySources)) {
+            if (_containsAny(referencedLibraries, librarySources)) {
               htmlSources.add(entry.getKey());
             }
           }
@@ -4036,16 +4156,19 @@
     return new List.from(htmlSources);
   }
 
-  List<Source> get htmlSources => getSources(SourceKind.HTML);
+  @override
+  List<Source> get htmlSources => _getSources(SourceKind.HTML);
 
+  @override
   SourceKind getKindOf(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
     if (sourceEntry == null) {
       return SourceKind.UNKNOWN;
     }
     return sourceEntry.kind;
   }
 
+  @override
   List<Source> get launchableClientLibrarySources {
     // TODO(brianwilkerson) This needs to filter out libraries that do not reference dart:html,
     // either directly or indirectly.
@@ -4062,6 +4185,7 @@
     return new List.from(sources);
   }
 
+  @override
   List<Source> get launchableServerLibrarySources {
     // TODO(brianwilkerson) This needs to filter out libraries that reference dart:html, either
     // directly or indirectly.
@@ -4078,23 +4202,25 @@
     return new List.from(sources);
   }
 
+  @override
   List<Source> getLibrariesContaining(Source source) {
-    DartEntry dartEntry = getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return Source.EMPTY_ARRAY;
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
+    if (sourceEntry is DartEntry) {
+      return sourceEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
     }
-    return dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
+    return Source.EMPTY_ARRAY;
   }
 
+  @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
     List<Source> dependentLibraries = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       SourceEntry sourceEntry = entry.getValue();
       if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
-        if (contains((sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
+        if (_contains((sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
           dependentLibraries.add(entry.getKey());
         }
-        if (contains((sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
+        if (_contains((sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
           dependentLibraries.add(entry.getKey());
         }
       }
@@ -4105,24 +4231,28 @@
     return new List.from(dependentLibraries);
   }
 
+  @override
   LibraryElement getLibraryElement(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
     if (sourceEntry is DartEntry) {
       return sourceEntry.getValue(DartEntry.ELEMENT);
     }
     return null;
   }
 
-  List<Source> get librarySources => getSources(SourceKind.LIBRARY);
+  @override
+  List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
 
+  @override
   LineInfo getLineInfo(Source source) {
-    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
     if (sourceEntry != null) {
       return sourceEntry.getValue(SourceEntry.LINE_INFO);
     }
     return null;
   }
 
+  @override
   int getModificationStamp(Source source) {
     int stamp = _contentCache.getModificationStamp(source);
     if (stamp != null) {
@@ -4131,11 +4261,12 @@
     return source.modificationStamp;
   }
 
+  @override
   Namespace getPublicNamespace(LibraryElement library) {
     // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
     // API of the interface.
     Source source = library.definingCompilationUnit.source;
-    DartEntry dartEntry = getReadableDartEntry(source);
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       return null;
     }
@@ -4146,13 +4277,13 @@
     if (namespace == null) {
       NamespaceBuilder builder = new NamespaceBuilder();
       namespace = builder.createPublicNamespaceForLibrary(library);
-      dartEntry = getReadableDartEntry(source);
+      dartEntry = _getReadableDartEntry(source);
       if (dartEntry == null) {
         AnalysisEngine.instance.logger.logError2("Could not compute the public namespace for ${library.source.fullName}", new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}"));
         return null;
       }
       if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
-        DartEntryImpl dartCopy = getReadableDartEntry(source).writableCopy;
+        DartEntryImpl dartCopy = _getReadableDartEntry(source).writableCopy;
         dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
         _cache.put(source, dartCopy);
       }
@@ -4160,10 +4291,11 @@
     return namespace;
   }
 
+  @override
   Namespace getPublicNamespace2(Source source) {
     // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
     // API of the interface.
-    DartEntry dartEntry = getReadableDartEntry(source);
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       return null;
     }
@@ -4175,12 +4307,12 @@
       }
       NamespaceBuilder builder = new NamespaceBuilder();
       namespace = builder.createPublicNamespaceForLibrary(library);
-      dartEntry = getReadableDartEntry(source);
+      dartEntry = _getReadableDartEntry(source);
       if (dartEntry == null) {
         throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
       }
       if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
-        DartEntryImpl dartCopy = getReadableDartEntry(source).writableCopy;
+        DartEntryImpl dartCopy = _getReadableDartEntry(source).writableCopy;
         dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
         _cache.put(source, dartCopy);
       }
@@ -4188,6 +4320,7 @@
     return namespace;
   }
 
+  @override
   List<Source> get refactoringUnsafeSources {
     List<Source> sources = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
@@ -4201,6 +4334,7 @@
     return new List.from(sources);
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (library == null) {
       return null;
@@ -4208,16 +4342,18 @@
     return getResolvedCompilationUnit2(unitSource, library.source);
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
-    SourceEntry sourceEntry = getReadableSourceEntry(unitSource);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(unitSource);
     if (sourceEntry is DartEntry) {
       return sourceEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     }
     return null;
   }
 
+  @override
   ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
-    SourceEntry sourceEntry = getReadableSourceEntry(htmlSource);
+    SourceEntry sourceEntry = _getReadableSourceEntryOrNull(htmlSource);
     if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       return htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
@@ -4225,6 +4361,7 @@
     return null;
   }
 
+  @override
   SourceFactory get sourceFactory => _sourceFactory;
 
   /**
@@ -4241,17 +4378,18 @@
     // Look for priority sources that need to be analyzed.
     //
     for (Source source in _priorityOrder) {
-      getSourcesNeedingProcessing2(source, _cache.get(source), true, hintsEnabled, sources);
+      _getSourcesNeedingProcessing(source, _cache.get(source), true, hintsEnabled, sources);
     }
     //
     // Look for non-priority sources that need to be analyzed.
     //
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
-      getSourcesNeedingProcessing2(entry.getKey(), entry.getValue(), false, hintsEnabled, sources);
+      _getSourcesNeedingProcessing(entry.getKey(), entry.getValue(), false, hintsEnabled, sources);
     }
     return new List<Source>.from(sources);
   }
 
+  @override
   AnalysisContentStatistics get statistics {
     AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl();
     for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
@@ -4294,23 +4432,26 @@
     return statistics;
   }
 
+  @override
   TypeProvider get typeProvider {
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
     return new TypeProviderImpl(computeLibraryElement(coreSource));
   }
 
+  @override
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) {
-    DartEntry dartEntry = getReadableDartEntry(unitSource);
+    DartEntry dartEntry = _getReadableDartEntry(unitSource);
     if (dartEntry == null) {
       throw new AnalysisException.con1("internalResolveCompilationUnit invoked for non-Dart file: ${unitSource.fullName}");
     }
     Source librarySource = libraryElement.source;
-    dartEntry = cacheDartResolutionData(unitSource, librarySource, dartEntry, DartEntry.RESOLVED_UNIT);
+    dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, DartEntry.RESOLVED_UNIT);
     return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
   }
 
+  @override
   bool isClientLibrary(Source librarySource) {
-    SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
+    SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
@@ -4318,8 +4459,12 @@
     return false;
   }
 
+  @override
+  bool get isDisposed => _disposed;
+
+  @override
   bool isServerLibrary(Source librarySource) {
-    SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
+    SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       return !dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
@@ -4327,6 +4472,7 @@
     return false;
   }
 
+  @override
   void mergeContext(AnalysisContext context) {
     if (context is InstrumentedAnalysisContextImpl) {
       context = (context as InstrumentedAnalysisContextImpl).basis;
@@ -4337,7 +4483,7 @@
     // TODO(brianwilkerson) This does not lock against the other context's cacheLock.
     for (MapEntry<Source, SourceEntry> entry in (context as AnalysisContextImpl)._cache.entrySet()) {
       Source newSource = entry.getKey();
-      SourceEntry existingEntry = getReadableSourceEntry(newSource);
+      SourceEntry existingEntry = _getReadableSourceEntry(newSource);
       if (existingEntry == null) {
         // TODO(brianwilkerson) Decide whether we really need to copy the info.
         _cache.put(newSource, entry.getValue().writableCopy);
@@ -4346,40 +4492,44 @@
     }
   }
 
-  CompilationUnit parseCompilationUnit(Source source) => getDartParseData2(source, DartEntry.PARSED_UNIT, null);
+  @override
+  CompilationUnit parseCompilationUnit(Source source) => _getDartParseData2(source, DartEntry.PARSED_UNIT, null);
 
-  ht.HtmlUnit parseHtmlUnit(Source source) => getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null);
+  @override
+  ht.HtmlUnit parseHtmlUnit(Source source) => _getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null);
 
+  @override
   AnalysisResult performAnalysisTask() {
     int getStart = JavaSystem.currentTimeMillis();
     AnalysisTask task = nextAnalysisTask;
     int getEnd = JavaSystem.currentTimeMillis();
-    if (task == null && validateCacheConsistency()) {
+    if (task == null && _validateCacheConsistency()) {
       task = nextAnalysisTask;
     }
     if (task == null) {
-      return new AnalysisResult(getChangeNotices(true), getEnd - getStart, null, -1);
+      return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null, -1);
     }
     String taskDescriptor = task.toString();
     if (_recentTasks.add(taskDescriptor)) {
-      logInformation("Performing task: ${taskDescriptor}");
+      _logInformation("Performing task: ${taskDescriptor}");
     } else {
-      logInformation("*** Performing repeated task: ${taskDescriptor}");
+      _logInformation("*** Performing repeated task: ${taskDescriptor}");
     }
     int performStart = JavaSystem.currentTimeMillis();
     try {
       task.perform(_resultRecorder);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not perform analysis task: ${taskDescriptor}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescriptor}", exception);
     } on AnalysisException catch (exception) {
       if (exception.cause is! JavaIOException) {
         AnalysisEngine.instance.logger.logError2("Internal error while performing the task: ${task}", exception);
       }
     }
     int performEnd = JavaSystem.currentTimeMillis();
-    return new AnalysisResult(getChangeNotices(false), getEnd - getStart, task.runtimeType.toString(), performEnd - performStart);
+    return new AnalysisResult(_getChangeNotices(false), getEnd - getStart, task.runtimeType.toString(), performEnd - performStart);
   }
 
+  @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
     for (MapEntry<Source, LibraryElement> entry in getMapEntrySet(elementMap)) {
@@ -4388,15 +4538,16 @@
       //
       // Cache the element in the library's info.
       //
-      DartEntry dartEntry = getReadableDartEntry(librarySource);
+      DartEntry dartEntry = _getReadableDartEntry(librarySource);
       if (dartEntry != null) {
         DartEntryImpl dartCopy = dartEntry.writableCopy;
-        recordElementData(dartEntry, dartCopy, library, library.source, htmlSource);
+        _recordElementData(dartEntry, dartCopy, library, library.source, htmlSource);
         _cache.put(librarySource, dartCopy);
       }
     }
   }
 
+  @override
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     if (library == null) {
       return null;
@@ -4404,13 +4555,16 @@
     return resolveCompilationUnit2(unitSource, library.source);
   }
 
-  CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) => getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT, null);
+  @override
+  CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) => _getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT, null);
 
+  @override
   ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
     computeHtmlElement(htmlSource);
     return parseHtmlUnit(htmlSource);
   }
 
+  @override
   void set analysisOptions(AnalysisOptions options) {
     bool needsRecompute = this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
     int cacheSize = options.cacheSize;
@@ -4435,10 +4589,11 @@
     this._options.incremental = options.incremental;
     this._options.preserveComments = options.preserveComments;
     if (needsRecompute) {
-      invalidateAllResolutionInformation();
+      _invalidateAllResolutionInformation();
     }
   }
 
+  @override
   void set analysisPriorityOrder(List<Source> sources) {
     if (sources == null || sources.isEmpty) {
       _priorityOrder = Source.EMPTY_ARRAY;
@@ -4461,15 +4616,16 @@
     }
   }
 
+  @override
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     _recentTasks.clear();
     String originalContents = _contentCache.setContents(source, contents);
     if (contents != null) {
       if (contents != originalContents) {
         if (_options.incremental) {
-          _incrementalAnalysisCache = IncrementalAnalysisCache.update(_incrementalAnalysisCache, source, originalContents, contents, offset, oldLength, newLength, getReadableSourceEntry(source));
+          _incrementalAnalysisCache = IncrementalAnalysisCache.update(_incrementalAnalysisCache, source, originalContents, contents, offset, oldLength, newLength, _getReadableSourceEntry(source));
         }
-        sourceChanged(source);
+        _sourceChanged(source);
         SourceEntry sourceEntry = _cache.get(source);
         if (sourceEntry != null) {
           SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
@@ -4480,17 +4636,18 @@
       }
     } else if (originalContents != null) {
       _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-      sourceChanged(source);
+      _sourceChanged(source);
     }
   }
 
+  @override
   void setContents(Source source, String contents) {
     _recentTasks.clear();
     String originalContents = _contentCache.setContents(source, contents);
     if (contents != null) {
       if (contents != originalContents) {
         _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-        sourceChanged(source);
+        _sourceChanged(source);
         SourceEntry sourceEntry = _cache.get(source);
         if (sourceEntry != null) {
           SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
@@ -4501,10 +4658,11 @@
       }
     } else if (originalContents != null) {
       _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
-      sourceChanged(source);
+      _sourceChanged(source);
     }
   }
 
+  @override
   void set sourceFactory(SourceFactory factory) {
     if (identical(_sourceFactory, factory)) {
       return;
@@ -4516,7 +4674,7 @@
     }
     factory.context = this;
     _sourceFactory = factory;
-    invalidateAllResolutionInformation();
+    _invalidateAllResolutionInformation();
   }
 
   /**
@@ -4542,7 +4700,7 @@
         //
         // The resolved libraries should only be null if an exception was thrown during resolution.
         //
-        unitEntry = getReadableDartEntry(unitSource);
+        unitEntry = _getReadableDartEntry(unitSource);
         if (unitEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
@@ -4556,7 +4714,7 @@
         }
         return dartCopy;
       }
-      if (allModificationTimesMatch(resolvedLibraries)) {
+      if (_allModificationTimesMatch(resolvedLibraries)) {
         Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
         RecordingErrorListener errorListener = resolver.errorListener;
         for (Library library in resolvedLibraries) {
@@ -4569,8 +4727,8 @@
             int sourceTime = getModificationStamp(source);
             if (dartEntry.modificationTime != sourceTime) {
               // The source has changed without the context being notified. Simulate notification.
-              sourceChanged(source);
-              dartEntry = getReadableDartEntry(source);
+              _sourceChanged(source);
+              dartEntry = _getReadableDartEntry(source);
               if (dartEntry == null) {
                 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
               }
@@ -4582,7 +4740,7 @@
               dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
               dartCopy.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
               if (source == librarySource) {
-                recordElementData(dartEntry, dartCopy, library.libraryElement, librarySource, htmlSource);
+                _recordElementData(dartEntry, dartCopy, library.libraryElement, librarySource, htmlSource);
               }
               _cache.storedAst(source);
             } else {
@@ -4597,7 +4755,7 @@
             if (source == unitSource) {
               unitEntry = dartCopy;
             }
-            ChangeNoticeImpl notice = getNotice(source);
+            ChangeNoticeImpl notice = _getNotice(source);
             notice.compilationUnit = unit;
             notice.setErrors(dartCopy.allErrors, lineInfo);
           }
@@ -4607,10 +4765,10 @@
         writer.println("Library resolution results discarded for");
         for (Library library in resolvedLibraries) {
           for (Source source in library.compilationUnitSources) {
-            DartEntry dartEntry = getReadableDartEntry(source);
+            DartEntry dartEntry = _getReadableDartEntry(source);
             if (dartEntry != null) {
               int resultTime = library.getModificationTime(source);
-              writer.println("  ${debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}");
+              writer.println("  ${_debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}");
               DartEntryImpl dartCopy = dartEntry.writableCopy;
               if (thrownException == null || resultTime >= 0) {
                 //
@@ -4633,18 +4791,18 @@
                 unitEntry = dartCopy;
               }
             } else {
-              writer.println("  ${debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, no entry");
+              writer.println("  ${_debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, no entry");
             }
           }
         }
-        logInformation(writer.toString());
+        _logInformation(writer.toString());
       }
     }
     if (thrownException != null) {
       throw thrownException;
     }
     if (unitEntry == null) {
-      unitEntry = getReadableDartEntry(unitSource);
+      unitEntry = _getReadableDartEntry(unitSource);
       if (unitEntry == null) {
         throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
       }
@@ -4658,7 +4816,7 @@
    *
    * @param source the source whose AST structure was accessed
    */
-  void accessedAst(Source source) {
+  void _accessedAst(Source source) {
     _cache.accessedAst(source);
   }
 
@@ -4670,7 +4828,7 @@
    * @param sources the list to which sources are to be added
    * @param container the source container containing the sources to be added to the list
    */
-  void addSourcesInContainer(List<Source> sources, SourceContainer container) {
+  void _addSourcesInContainer(List<Source> sources, SourceContainer container) {
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       Source source = entry.getKey();
       if (container.contains(source)) {
@@ -4688,11 +4846,11 @@
    * @throws AnalysisException if any of the modification times could not be determined (this should
    *           not happen)
    */
-  bool allModificationTimesMatch(Set<Library> resolvedLibraries) {
+  bool _allModificationTimesMatch(Set<Library> resolvedLibraries) {
     bool allTimesMatch = true;
     for (Library library in resolvedLibraries) {
       for (Source source in library.compilationUnitSources) {
-        DartEntry dartEntry = getReadableDartEntry(source);
+        DartEntry dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
           // This shouldn't be possible because we should never have performed the task if the
           // source didn't represent a Dart file, but check to be safe.
@@ -4702,7 +4860,7 @@
         int resultTime = library.getModificationTime(source);
         if (sourceTime != resultTime) {
           // The source has changed without the context being notified. Simulate notification.
-          sourceChanged(source);
+          _sourceChanged(source);
           allTimesMatch = false;
         }
       }
@@ -4725,7 +4883,7 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  DartEntry cacheDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4735,8 +4893,12 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      dartEntry = cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
-      dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, dartEntry.anyParsedCompilationUnit).perform(_resultRecorder) as DartEntry;
+      dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
+      CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
+      if (unit == null) {
+        throw new AnalysisException.con2("Could not cache Dart dependency data: no parse unit", dartEntry.exception);
+      }
+      dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, unit).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
     return dartEntry;
@@ -4755,7 +4917,7 @@
    * @return a cache entry containing the required data
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  DartEntry cacheDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4784,7 +4946,7 @@
    * @return a cache entry containing the required data
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  DartEntry cacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.PARSED_UNIT)) {
       CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
       if (unit != null) {
@@ -4800,7 +4962,7 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      dartEntry = cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
+      dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
       dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM)).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
@@ -4820,7 +4982,7 @@
    * @return a cache entry containing the required data
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  DartEntry cacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4852,7 +5014,7 @@
    * @return a cache entry containing the required data
    * @throws AnalysisException if data could not be returned because the source could not be scanned
    */
-  DartEntry cacheDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4890,7 +5052,7 @@
    * @return a cache entry containing the required data
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  DartEntry cacheDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+  DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4921,7 +5083,7 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  HtmlEntry cacheHtmlParseData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+  HtmlEntry _cacheHtmlParseData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
       ht.HtmlUnit unit = htmlEntry.anyParsedUnit;
       if (unit != null) {
@@ -4967,7 +5129,7 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  HtmlEntry cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+  HtmlEntry _cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
     //
     // Check to see whether we already have the information being requested.
     //
@@ -4977,7 +5139,7 @@
       // If not, compute the information. Unless the modification date of the source continues to
       // change, this loop will eventually terminate.
       //
-      htmlEntry = cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT);
+      htmlEntry = _cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT);
       htmlEntry = new ResolveHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(HtmlEntry.PARSED_UNIT)).perform(_resultRecorder) as HtmlEntry;
       state = htmlEntry.getState(descriptor);
     }
@@ -4990,7 +5152,7 @@
    * @param encoding the encoded form of a source
    * @return the source represented by the encoding
    */
-  Source computeSourceFromEncoding(String encoding) => _sourceFactory.fromEncoding(encoding);
+  Source _computeSourceFromEncoding(String encoding) => _sourceFactory.fromEncoding(encoding);
 
   /**
    * Return `true` if the given array of sources contains the given source.
@@ -4999,7 +5161,7 @@
    * @param targetSource the source being searched for
    * @return `true` if the given source is in the array
    */
-  bool contains(List<Source> sources, Source targetSource) {
+  bool _contains(List<Source> sources, Source targetSource) {
     for (Source source in sources) {
       if (source == targetSource) {
         return true;
@@ -5015,9 +5177,9 @@
    * @param targetSources the sources being searched for
    * @return `true` if any of the given target sources are in the array
    */
-  bool containsAny(List<Source> sources, List<Source> targetSources) {
+  bool _containsAny(List<Source> sources, List<Source> targetSources) {
     for (Source targetSource in targetSources) {
-      if (contains(sources, targetSource)) {
+      if (_contains(sources, targetSource)) {
         return true;
       }
     }
@@ -5031,7 +5193,7 @@
    * @param sourceEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createGetContentTask(Source source, SourceEntry sourceEntry) {
+  AnalysisContextImpl_TaskData _createGetContentTask(Source source, SourceEntry sourceEntry) {
     SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
     sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS);
     _cache.put(source, sourceCopy);
@@ -5046,9 +5208,9 @@
    * @param dartEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createParseDartTask(Source source, DartEntry dartEntry) {
+  AnalysisContextImpl_TaskData _createParseDartTask(Source source, DartEntry dartEntry) {
     if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID) {
-      return createScanDartTask(source, dartEntry);
+      return _createScanDartTask(source, dartEntry);
     }
     Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
     DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -5066,9 +5228,9 @@
    * @param htmlEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createParseHtmlTask(Source source, HtmlEntry htmlEntry) {
+  AnalysisContextImpl_TaskData _createParseHtmlTask(Source source, HtmlEntry htmlEntry) {
     if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
-      return createGetContentTask(source, htmlEntry);
+      return _createGetContentTask(source, htmlEntry);
     }
     String content = htmlEntry.getValue(SourceEntry.CONTENT);
     HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
@@ -5086,10 +5248,10 @@
    * @param dartEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createResolveDartDependenciesTask(Source source, DartEntry dartEntry) {
+  AnalysisContextImpl_TaskData _createResolveDartDependenciesTask(Source source, DartEntry dartEntry) {
     CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
     if (unit == null) {
-      return createParseDartTask(source, dartEntry);
+      return _createParseDartTask(source, dartEntry);
     }
     DartEntryImpl dartCopy = dartEntry.writableCopy;
     dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.IN_PROCESS);
@@ -5105,9 +5267,9 @@
    * @param htmlEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createResolveHtmlTask(Source source, HtmlEntry htmlEntry) {
+  AnalysisContextImpl_TaskData _createResolveHtmlTask(Source source, HtmlEntry htmlEntry) {
     if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) {
-      return createParseHtmlTask(source, htmlEntry);
+      return _createParseHtmlTask(source, htmlEntry);
     }
     HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
     htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS);
@@ -5123,9 +5285,9 @@
    * @param dartEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData createScanDartTask(Source source, DartEntry dartEntry) {
+  AnalysisContextImpl_TaskData _createScanDartTask(Source source, DartEntry dartEntry) {
     if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
-      return createGetContentTask(source, dartEntry);
+      return _createGetContentTask(source, dartEntry);
     }
     String content = dartEntry.getValue(SourceEntry.CONTENT);
     DartEntryImpl dartCopy = dartEntry.writableCopy;
@@ -5142,7 +5304,7 @@
    * @param source the source for which an information object is being created
    * @return the source information object that was created
    */
-  SourceEntry createSourceEntry(Source source) {
+  SourceEntry _createSourceEntry(Source source) {
     String name = source.shortName;
     if (AnalysisEngine.isHtmlFileName(name)) {
       HtmlEntryImpl htmlEntry = new HtmlEntryImpl();
@@ -5164,7 +5326,7 @@
    * @param source the source for which a debugging string is to be produced
    * @return debugging information about the given source
    */
-  String debuggingString(Source source) => "'${source.fullName}' [${getModificationStamp(source)}]";
+  String _debuggingString(Source source) => "'${source.fullName}' [${getModificationStamp(source)}]";
 
   /**
    * Return an array containing all of the change notices that are waiting to be returned. If there
@@ -5174,7 +5336,7 @@
    * @param nullIfEmpty `true` if `null` should be returned when there are no notices
    * @return the change notices that are waiting to be returned
    */
-  List<ChangeNotice> getChangeNotices(bool nullIfEmpty) {
+  List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) {
     if (_pendingNotices.isEmpty) {
       if (nullIfEmpty) {
         return null;
@@ -5197,8 +5359,8 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object getDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartDependencyData(source, dartEntry, descriptor);
+  Object _getDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartDependencyData(source, dartEntry, descriptor);
     return dartEntry.getValue(descriptor);
   }
 
@@ -5214,15 +5376,15 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object getDartDependencyData2(Source source, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = getReadableDartEntry(source);
+  Object _getDartDependencyData2(Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       return defaultValue;
     }
     try {
-      return getDartDependencyData(source, dartEntry, descriptor);
+      return _getDartDependencyData(source, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
       return defaultValue;
     }
   }
@@ -5240,8 +5402,8 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartHintData(unitSource, librarySource, dartEntry, descriptor);
+  Object _getDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartHintData(unitSource, librarySource, dartEntry, descriptor);
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return dartEntry.getValue(descriptor);
     }
@@ -5261,10 +5423,10 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object getDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartParseData(source, dartEntry, descriptor);
+  Object _getDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartParseData(source, dartEntry, descriptor);
     if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      accessedAst(source);
+      _accessedAst(source);
       return dartEntry.anyParsedCompilationUnit;
     }
     return dartEntry.getValue(descriptor);
@@ -5283,15 +5445,15 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object getDartParseData2(Source source, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = getReadableDartEntry(source);
+  Object _getDartParseData2(Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       return defaultValue;
     }
     try {
-      return getDartParseData(source, dartEntry, descriptor);
+      return _getDartParseData(source, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
       return defaultValue;
     }
   }
@@ -5309,12 +5471,12 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
+  Object _getDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return dartEntry.getValue(descriptor);
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-      accessedAst(unitSource);
+      _accessedAst(unitSource);
     }
     return dartEntry.getValueInLibrary(descriptor, librarySource);
   }
@@ -5333,15 +5495,15 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getDartResolutionData2(Source unitSource, Source librarySource, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = getReadableDartEntry(unitSource);
+  Object _getDartResolutionData2(Source unitSource, Source librarySource, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(unitSource);
     if (dartEntry == null) {
       return defaultValue;
     }
     try {
-      return getDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
+      return _getDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
       return defaultValue;
     }
   }
@@ -5359,8 +5521,8 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be scanned
    */
-  Object getDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartScanData(source, dartEntry, descriptor);
+  Object _getDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartScanData(source, dartEntry, descriptor);
     return dartEntry.getValue(descriptor);
   }
 
@@ -5378,15 +5540,15 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be scanned
    */
-  Object getDartScanData2(Source source, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = getReadableDartEntry(source);
+  Object _getDartScanData2(Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
     if (dartEntry == null) {
       return defaultValue;
     }
     try {
-      return getDartScanData(source, dartEntry, descriptor);
+      return _getDartScanData(source, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
       return defaultValue;
     }
   }
@@ -5404,8 +5566,8 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor);
+  Object _getDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor);
     return dartEntry.getValueInLibrary(descriptor, librarySource);
   }
 
@@ -5422,14 +5584,14 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object getHtmlParseData(Source source, DataDescriptor descriptor, Object defaultValue) {
-    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
+  Object _getHtmlParseData(Source source, DataDescriptor descriptor, Object defaultValue) {
+    HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
     if (htmlEntry == null) {
       return defaultValue;
     }
-    htmlEntry = cacheHtmlParseData(source, htmlEntry, descriptor);
+    htmlEntry = _cacheHtmlParseData(source, htmlEntry, descriptor);
     if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
-      accessedAst(source);
+      _accessedAst(source);
       return htmlEntry.anyParsedUnit;
     }
     return htmlEntry.getValue(descriptor);
@@ -5450,15 +5612,15 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getHtmlResolutionData(Source source, DataDescriptor descriptor, Object defaultValue) {
-    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
+  Object _getHtmlResolutionData(Source source, DataDescriptor descriptor, Object defaultValue) {
+    HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
     if (htmlEntry == null) {
       return defaultValue;
     }
     try {
-      return getHtmlResolutionData2(source, htmlEntry, descriptor);
+      return _getHtmlResolutionData2(source, htmlEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation3("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
       return defaultValue;
     }
   }
@@ -5477,10 +5639,10 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  Object getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
-    htmlEntry = cacheHtmlResolutionData(source, htmlEntry, descriptor);
+  Object _getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+    htmlEntry = _cacheHtmlResolutionData(source, htmlEntry, descriptor);
     if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
-      accessedAst(source);
+      _accessedAst(source);
     }
     return htmlEntry.getValue(descriptor);
   }
@@ -5507,7 +5669,7 @@
     // Look for a priority source that needs to be analyzed.
     //
     for (Source source in _priorityOrder) {
-      AnalysisContextImpl_TaskData taskData = getNextNondependentAnalysisTask(source, true, hintsEnabled, sdkErrorsEnabled);
+      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, true, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
@@ -5520,7 +5682,7 @@
     //
     Source source = _workManager.nextSource;
     while (source != null) {
-      AnalysisContextImpl_TaskData taskData = getNextNondependentAnalysisTask(source, false, hintsEnabled, sdkErrorsEnabled);
+      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, false, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
@@ -5564,13 +5726,13 @@
    *          sources in the SDK
    * @return the next task that needs to be performed for the given source
    */
-  AnalysisContextImpl_TaskData getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
+  AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
     if (sourceEntry == null) {
       return new AnalysisContextImpl_TaskData(null, false, null);
     }
     CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
     if (identical(contentState, CacheState.INVALID)) {
-      return createGetContentTask(source, sourceEntry);
+      return _createGetContentTask(source, sourceEntry);
     } else if (identical(contentState, CacheState.IN_PROCESS)) {
       // We are already in the process of getting the content. There's nothing else we can do with
       // this source until that's complete.
@@ -5580,21 +5742,21 @@
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
       if (identical(scanErrorsState, CacheState.INVALID) || (isPriority && identical(scanErrorsState, CacheState.FLUSHED))) {
-        return createScanDartTask(source, dartEntry);
+        return _createScanDartTask(source, dartEntry);
       }
       CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
       if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
-        return createParseDartTask(source, dartEntry);
+        return _createParseDartTask(source, dartEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
         CompilationUnit parseUnit = dartEntry.anyParsedCompilationUnit;
         if (parseUnit == null) {
-          return createParseDartTask(source, dartEntry);
+          return _createParseDartTask(source, dartEntry);
         }
       }
       CacheState exportState = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
       if (identical(exportState, CacheState.INVALID) || (isPriority && identical(exportState, CacheState.FLUSHED))) {
-        return createResolveDartDependenciesTask(source, dartEntry);
+        return _createResolveDartDependenciesTask(source, dartEntry);
       }
       List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
       for (Source librarySource in librariesContaining) {
@@ -5652,17 +5814,17 @@
       HtmlEntry htmlEntry = sourceEntry;
       CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS);
       if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
-        return createParseHtmlTask(source, htmlEntry);
+        return _createParseHtmlTask(source, htmlEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
         ht.HtmlUnit parsedUnit = htmlEntry.anyParsedUnit;
         if (parsedUnit == null) {
-          return createParseHtmlTask(source, htmlEntry);
+          return _createParseHtmlTask(source, htmlEntry);
         }
       }
       CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
       if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
-        return createResolveHtmlTask(source, htmlEntry);
+        return _createResolveHtmlTask(source, htmlEntry);
       }
       // Angular support
       if (_options.analyzeAngular) {
@@ -5670,7 +5832,7 @@
         CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
         if (identical(angularEntryState, CacheState.INVALID)) {
           if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return createResolveHtmlTask(source, htmlEntry);
+            return _createResolveHtmlTask(source, htmlEntry);
           }
           HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
           htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
@@ -5681,7 +5843,7 @@
         CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
         if (identical(angularErrorsState, CacheState.INVALID)) {
           if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return createResolveHtmlTask(source, htmlEntry);
+            return _createResolveHtmlTask(source, htmlEntry);
           }
           AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
           // try to resolve as an Angular template
@@ -5696,13 +5858,13 @@
     return new AnalysisContextImpl_TaskData(null, false, null);
   }
 
-  AnalysisContextImpl_TaskData getNextNondependentAnalysisTask(Source source, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
-    AnalysisContextImpl_TaskData taskData = getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
+  AnalysisContextImpl_TaskData _getNextNondependentAnalysisTask(Source source, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
+    AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
     if (taskData.task != null || taskData.isBlocked) {
       return taskData;
     }
     while (taskData.dependentSource != null) {
-      taskData = getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
+      taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
       if (taskData.task != null || taskData.isBlocked) {
         return taskData;
       }
@@ -5716,7 +5878,7 @@
    * @param source the source for which changes are being reported
    * @return a change notice for the given source
    */
-  ChangeNoticeImpl getNotice(Source source) {
+  ChangeNoticeImpl _getNotice(Source source) {
     ChangeNoticeImpl notice = _pendingNotices[source];
     if (notice == null) {
       notice = new ChangeNoticeImpl(source);
@@ -5732,10 +5894,10 @@
    * @param source the source for which a cache entry is being sought
    * @return the source cache entry associated with the given source
    */
-  DartEntry getReadableDartEntry(Source source) {
+  DartEntry _getReadableDartEntry(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source);
     }
     if (sourceEntry is DartEntry) {
       return sourceEntry as DartEntry;
@@ -5750,10 +5912,10 @@
    * @param source the source for which a cache entry is being sought
    * @return the source cache entry associated with the given source
    */
-  HtmlEntry getReadableHtmlEntry(Source source) {
+  HtmlEntry _getReadableHtmlEntry(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source);
     }
     if (sourceEntry is HtmlEntry) {
       return sourceEntry as HtmlEntry;
@@ -5762,19 +5924,27 @@
   }
 
   /**
+   * Return the cache entry associated with the given source, creating it if necessary.
+   *
+   * @param source the source for which a cache entry is being sought
+   * @return the source cache entry associated with the given source
+   */
+  SourceEntry _getReadableSourceEntry(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      sourceEntry = _createSourceEntry(source);
+    }
+    return sourceEntry;
+  }
+
+  /**
    * Return the cache entry associated with the given source, or `null` if there is no entry
    * associated with the source.
    *
    * @param source the source for which a cache entry is being sought
    * @return the source cache entry associated with the given source
    */
-  SourceEntry getReadableSourceEntry(Source source) {
-    SourceEntry sourceEntry = _cache.get(source);
-    if (sourceEntry == null) {
-      sourceEntry = createSourceEntry(source);
-    }
-    return sourceEntry;
-  }
+  SourceEntry _getReadableSourceEntryOrNull(Source source) => _cache.get(source);
 
   /**
    * Return an array containing all of the sources known to this context that have the given kind.
@@ -5782,7 +5952,7 @@
    * @param kind the kind of sources to be returned
    * @return all of the sources known to this context that have the given kind
    */
-  List<Source> getSources(SourceKind kind) {
+  List<Source> _getSources(SourceKind kind) {
     List<Source> sources = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       if (identical(entry.getValue().kind, kind)) {
@@ -5807,7 +5977,7 @@
    * @param hintsEnabled `true` if hints are currently enabled
    * @param sources the set to which sources should be added
    */
-  void getSourcesNeedingProcessing2(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, Set<Source> sources) {
+  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, Set<Source> sources) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
@@ -5902,7 +6072,7 @@
    *
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    */
-  void invalidateAllResolutionInformation() {
+  void _invalidateAllResolutionInformation() {
     for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
       Source source = mapEntry.getKey();
       SourceEntry sourceEntry = mapEntry.getValue();
@@ -5912,7 +6082,7 @@
         mapEntry.setValue(htmlCopy);
       } else if (sourceEntry is DartEntry) {
         DartEntry dartEntry = sourceEntry;
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         dartCopy.invalidateAllResolutionInformation();
         mapEntry.setValue(dartCopy);
@@ -5932,7 +6102,7 @@
    *
    * @param entryCopy the [HtmlEntryImpl] of the (maybe) Angular entry point being invalidated
    */
-  void invalidateAngularResolution(HtmlEntryImpl entryCopy) {
+  void _invalidateAngularResolution(HtmlEntryImpl entryCopy) {
     AngularApplication application = entryCopy.getValue(HtmlEntry.ANGULAR_ENTRY);
     if (application == null) {
       return;
@@ -5947,7 +6117,7 @@
         AngularHasTemplateElement hasTemplate = angularElement;
         Source templateSource = hasTemplate.templateSource;
         if (templateSource != null) {
-          HtmlEntry htmlEntry = getReadableHtmlEntry(templateSource);
+          HtmlEntry htmlEntry = _getReadableHtmlEntry(templateSource);
           HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
           htmlCopy.setValue(HtmlEntry.ANGULAR_APPLICATION, null);
           htmlCopy.setValue(HtmlEntry.ANGULAR_COMPONENT, null);
@@ -5960,12 +6130,12 @@
     // reset Dart sources
     List<Source> oldElementSources = application.elementSources;
     for (Source elementSource in oldElementSources) {
-      DartEntry dartEntry = getReadableDartEntry(elementSource);
+      DartEntry dartEntry = _getReadableDartEntry(elementSource);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
       _cache.put(elementSource, dartCopy);
       // notify about (disappeared) Angular errors
-      ChangeNoticeImpl notice = getNotice(elementSource);
+      ChangeNoticeImpl notice = _getNotice(elementSource);
       notice.setErrors(dartCopy.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
     }
   }
@@ -5982,11 +6152,11 @@
    * @param librarySource the source of the library being invalidated
    * @param writer the writer to which debugging information should be written
    */
-  void invalidateLibraryResolution(Source librarySource, PrintStringWriter writer) {
+  void _invalidateLibraryResolution(Source librarySource, PrintStringWriter writer) {
     // TODO(brianwilkerson) This could be optimized. There's no need to flush all of these caches if
     // the public namespace hasn't changed, which will be a fairly common case. The question is
     // whether we can afford the time to compute the namespace to look for differences.
-    DartEntry libraryEntry = getReadableDartEntry(librarySource);
+    DartEntry libraryEntry = _getReadableDartEntry(librarySource);
     if (libraryEntry != null) {
       List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PARTS);
       DartEntryImpl libraryCopy = libraryEntry.writableCopy;
@@ -5995,7 +6165,7 @@
       _cache.put(librarySource, libraryCopy);
       _workManager.add(librarySource, SourcePriority.LIBRARY);
       if (writer != null) {
-        writer.println("  Invalidated library source: ${debuggingString(librarySource)} (previously modified at ${oldTime})");
+        writer.println("  Invalidated library source: ${_debuggingString(librarySource)} (previously modified at ${oldTime})");
       }
       for (Source partSource in includedParts) {
         SourceEntry partEntry = _cache.get(partSource);
@@ -6009,7 +6179,7 @@
           partCopy.invalidateAllResolutionInformation();
           _cache.put(partSource, partCopy);
           if (writer != null) {
-            writer.println("  Invalidated part source: ${debuggingString(partSource)} (previously modified at ${oldTime})");
+            writer.println("  Invalidated part source: ${_debuggingString(partSource)} (previously modified at ${oldTime})");
           }
         }
       }
@@ -6019,9 +6189,9 @@
     for (AngularApplication application in angularApplicationsCopy) {
       if (application.dependsOn(librarySource)) {
         Source entryPointSource = application.entryPoint;
-        HtmlEntry entry = getReadableHtmlEntry(entryPointSource);
+        HtmlEntry entry = _getReadableHtmlEntry(entryPointSource);
         HtmlEntryImpl entryCopy = entry.writableCopy;
-        invalidateAngularResolution(entryCopy);
+        _invalidateAngularResolution(entryCopy);
         _cache.put(entryPointSource, entryCopy);
         _workManager.add(entryPointSource, SourcePriority.HTML);
       }
@@ -6036,7 +6206,7 @@
    *          infinite recursion
    * @return `true` if this library is, or depends on, dart:html
    */
-  bool isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
+  bool _isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
     if (visitedLibraries.contains(library)) {
       return false;
     }
@@ -6045,12 +6215,12 @@
     }
     visitedLibraries.add(library);
     for (LibraryElement imported in library.importedLibraries) {
-      if (isClient(imported, htmlSource, visitedLibraries)) {
+      if (_isClient(imported, htmlSource, visitedLibraries)) {
         return true;
       }
     }
     for (LibraryElement exported in library.exportedLibraries) {
-      if (isClient(exported, htmlSource, visitedLibraries)) {
+      if (_isClient(exported, htmlSource, visitedLibraries)) {
         return true;
       }
     }
@@ -6062,7 +6232,7 @@
    *
    * @param message the message to be added to the log
    */
-  void logInformation(String message) {
+  void _logInformation(String message) {
     AnalysisEngine.instance.logger.logInformation(message);
   }
 
@@ -6072,11 +6242,11 @@
    * @param message the message to be added to the log
    * @param exception the exception to be included in the log entry
    */
-  void logInformation2(String message, Exception exception) {
+  void _logInformation2(String message, Exception exception) {
     if (exception == null) {
       AnalysisEngine.instance.logger.logInformation(message);
     } else {
-      AnalysisEngine.instance.logger.logInformation3(message, exception);
+      AnalysisEngine.instance.logger.logInformation2(message, exception);
     }
   }
 
@@ -6084,7 +6254,7 @@
    * Updates [HtmlEntry]s that correspond to the previously known and new Angular application
    * information.
    */
-  void recordAngularEntryPoint(HtmlEntryImpl entry, ResolveAngularEntryHtmlTask task) {
+  void _recordAngularEntryPoint(HtmlEntryImpl entry, ResolveAngularEntryHtmlTask task) {
     AngularApplication application = task.application;
     if (application != null) {
       _angularApplications.add(application);
@@ -6097,7 +6267,7 @@
           AngularHasTemplateElement hasTemplate = angularElement;
           Source templateSource = hasTemplate.templateSource;
           if (templateSource != null) {
-            HtmlEntry htmlEntry = getReadableHtmlEntry(templateSource);
+            HtmlEntry htmlEntry = _getReadableHtmlEntry(templateSource);
             HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
             htmlCopy.setValue(HtmlEntry.ANGULAR_APPLICATION, application);
             if (hasTemplate is AngularComponentElement) {
@@ -6113,12 +6283,12 @@
       // update Dart sources errors
       List<Source> newElementSources = application.elementSources;
       for (Source elementSource in newElementSources) {
-        DartEntry dartEntry = getReadableDartEntry(elementSource);
+        DartEntry dartEntry = _getReadableDartEntry(elementSource);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         dartCopy.setValue(DartEntry.ANGULAR_ERRORS, task.getErrors(elementSource));
         _cache.put(elementSource, dartCopy);
         // notify about Dart errors
-        ChangeNoticeImpl notice = getNotice(elementSource);
+        ChangeNoticeImpl notice = _getNotice(elementSource);
         notice.setErrors(dartCopy.allErrors, computeLineInfo(elementSource));
       }
     }
@@ -6136,14 +6306,14 @@
    * @param librarySource the source for the library used to record information
    * @param htmlSource the source for the HTML library
    */
-  void recordElementData(DartEntry dartEntry, DartEntryImpl dartCopy, LibraryElement library, Source librarySource, Source htmlSource) {
+  void _recordElementData(DartEntry dartEntry, DartEntryImpl dartCopy, LibraryElement library, Source librarySource, Source htmlSource) {
     dartCopy.setValue(DartEntry.ELEMENT, library);
     dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
-    dartCopy.setValue(DartEntry.IS_CLIENT, isClient(library, htmlSource, new Set<LibraryElement>()));
+    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Set<LibraryElement>()));
     // TODO(brianwilkerson) Understand why we're doing this both here and in
     // ResolveDartDependenciesTask and whether we should also be capturing the imported and exported
     // sources here.
-    removeFromParts(librarySource, dartEntry);
+    _removeFromParts(librarySource, dartEntry);
     List<CompilationUnitElement> parts = library.parts;
     int count = parts.length;
     List<Source> unitSources = new List<Source>(count + 1);
@@ -6151,7 +6321,7 @@
     for (int i = 0; i < count; i++) {
       Source unitSource = parts[i].source;
       unitSources[i + 1] = unitSource;
-      DartEntry unitEntry = getReadableDartEntry(unitSource);
+      DartEntry unitEntry = _getReadableDartEntry(unitSource);
       if (unitSource != null) {
         DartEntryImpl unitCopy = unitEntry.writableCopy;
         unitCopy.addContainingLibrary(librarySource);
@@ -6169,7 +6339,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordGenerateDartErrorsTask(GenerateDartErrorsTask task) {
+  DartEntry _recordGenerateDartErrorsTask(GenerateDartErrorsTask task) {
     Source source = task.source;
     Source librarySource = task.libraryElement.source;
     AnalysisException thrownException = task.exception;
@@ -6188,8 +6358,8 @@
     if (sourceTime == resultTime) {
       if (dartEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        dartEntry = getReadableDartEntry(source);
+        _sourceChanged(source);
+        dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
@@ -6197,7 +6367,7 @@
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
         dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
       } else {
         dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
@@ -6206,7 +6376,7 @@
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
-      logInformation2("Generated errors discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+      _logInformation2("Generated errors discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6214,7 +6384,7 @@
         // will be re-verified using the up-to-date sources.
         //
         //          dartCopy.setState(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.INVALID);
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.invalidateAllInformation();
         dartCopy.modificationTime = sourceTime;
         _cache.removedAst(source);
@@ -6245,7 +6415,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordGenerateDartHintsTask(GenerateDartHintsTask task) {
+  DartEntry _recordGenerateDartHintsTask(GenerateDartHintsTask task) {
     Source librarySource = task.libraryElement.source;
     AnalysisException thrownException = task.exception;
     DartEntry libraryEntry = null;
@@ -6288,8 +6458,8 @@
       if (sourceTime == resultTime) {
         if (dartEntry.modificationTime != sourceTime) {
           // The source has changed without the context being notified. Simulate notification.
-          sourceChanged(unitSource);
-          dartEntry = getReadableDartEntry(unitSource);
+          _sourceChanged(unitSource);
+          dartEntry = _getReadableDartEntry(unitSource);
           if (dartEntry == null) {
             throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
           }
@@ -6297,7 +6467,7 @@
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null) {
           dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, results.data);
-          ChangeNoticeImpl notice = getNotice(unitSource);
+          ChangeNoticeImpl notice = _getNotice(unitSource);
           notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
         } else {
           dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
@@ -6306,7 +6476,7 @@
         _cache.put(unitSource, dartCopy);
         dartEntry = dartCopy;
       } else {
-        logInformation2("Generated hints discarded for ${debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+        _logInformation2("Generated hints discarded for ${_debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
         if (identical(dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource), CacheState.IN_PROCESS)) {
           DartEntryImpl dartCopy = dartEntry.writableCopy;
           if (thrownException == null || resultTime >= 0) {
@@ -6315,7 +6485,7 @@
             // will be re-analyzed using the up-to-date sources.
             //
             //              dartCopy.setState(DartEntry.HINTS, librarySource, CacheState.INVALID);
-            removeFromParts(unitSource, dartEntry);
+            _removeFromParts(unitSource, dartEntry);
             dartCopy.invalidateAllInformation();
             dartCopy.modificationTime = sourceTime;
             _cache.removedAst(unitSource);
@@ -6347,7 +6517,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  SourceEntry recordGetContentsTask(GetContentTask task) {
+  SourceEntry _recordGetContentsTask(GetContentTask task) {
     if (!task.isComplete) {
       return null;
     }
@@ -6382,10 +6552,10 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) {
+  DartEntry _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) {
     CompilationUnit unit = task.compilationUnit;
     if (unit != null) {
-      ChangeNoticeImpl notice = getNotice(task.source);
+      ChangeNoticeImpl notice = _getNotice(task.source);
       notice.compilationUnit = unit;
       _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cache, unit);
     }
@@ -6400,7 +6570,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordParseDartTaskResults(ParseDartTask task) {
+  DartEntry _recordParseDartTaskResults(ParseDartTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     DartEntry dartEntry = null;
@@ -6418,8 +6588,8 @@
     if (sourceTime == resultTime) {
       if (dartEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        dartEntry = getReadableDartEntry(source);
+        _sourceChanged(source);
+        dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
@@ -6438,13 +6608,13 @@
         dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
         dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors);
         _cache.storedAst(source);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
         // Verify that the incrementally parsed and resolved unit in the incremental cache
         // is structurally equivalent to the fully parsed unit
         _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
       } else {
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.recordParseError();
         _cache.removedAst(source);
       }
@@ -6452,7 +6622,7 @@
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
-      logInformation2("Parse results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+      _logInformation2("Parse results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6460,7 +6630,7 @@
         // will be re-analyzed using the up-to-date sources.
         //
         //          dartCopy.recordParseNotInProcess();
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.invalidateAllInformation();
         dartCopy.modificationTime = sourceTime;
         _cache.removedAst(source);
@@ -6491,7 +6661,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  HtmlEntry recordParseHtmlTaskResults(ParseHtmlTask task) {
+  HtmlEntry _recordParseHtmlTaskResults(ParseHtmlTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
@@ -6509,8 +6679,8 @@
     if (sourceTime == resultTime) {
       if (htmlEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        htmlEntry = getReadableHtmlEntry(source);
+        _sourceChanged(source);
+        htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
           throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
         }
@@ -6524,7 +6694,7 @@
         htmlCopy.setValue(HtmlEntry.PARSE_ERRORS, task.errors);
         htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibraries);
         _cache.storedAst(source);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(htmlCopy.allErrors, lineInfo);
       } else {
         htmlCopy.recordParseError();
@@ -6534,7 +6704,7 @@
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
-      logInformation2("Parse results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
+      _logInformation2("Parse results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
       HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6581,7 +6751,7 @@
    * @param task the task that was performed
    * @throws AnalysisException if the results could not be recorded
    */
-  HtmlEntry recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) {
+  HtmlEntry _recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
@@ -6599,8 +6769,8 @@
     if (sourceTime == resultTime) {
       if (htmlEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        htmlEntry = getReadableHtmlEntry(source);
+        _sourceChanged(source);
+        htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
           throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
         }
@@ -6609,7 +6779,7 @@
       if (thrownException == null) {
         htmlCopy.setValue(HtmlEntry.ANGULAR_ERRORS, task.resolutionErrors);
         // notify about errors
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
@@ -6662,7 +6832,7 @@
    * @param task the task that was performed
    * @throws AnalysisException if the results could not be recorded
    */
-  HtmlEntry recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) {
+  HtmlEntry _recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
@@ -6680,8 +6850,8 @@
     if (sourceTime == resultTime) {
       if (htmlEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        htmlEntry = getReadableHtmlEntry(source);
+        _sourceChanged(source);
+        htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
           throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
         }
@@ -6689,9 +6859,9 @@
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
       if (thrownException == null) {
         htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
-        recordAngularEntryPoint(htmlCopy, task);
+        _recordAngularEntryPoint(htmlCopy, task);
         _cache.storedAst(source);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
@@ -6745,7 +6915,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordResolveDartDependenciesTaskResults(ResolveDartDependenciesTask task) {
+  DartEntry _recordResolveDartDependenciesTaskResults(ResolveDartDependenciesTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     DartEntry dartEntry = null;
@@ -6763,19 +6933,19 @@
     if (sourceTime == resultTime) {
       if (dartEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        dartEntry = getReadableDartEntry(source);
+        _sourceChanged(source);
+        dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
-      removeFromParts(source, dartEntry);
+      _removeFromParts(source, dartEntry);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
         List<Source> newParts = task.includedSources;
         for (int i = 0; i < newParts.length; i++) {
           Source partSource = newParts[i];
-          DartEntry partEntry = getReadableDartEntry(partSource);
+          DartEntry partEntry = _getReadableDartEntry(partSource);
           if (partEntry != null && partEntry != dartEntry) {
             DartEntryImpl partCopy = partEntry.writableCopy;
             partCopy.addContainingLibrary(source);
@@ -6785,6 +6955,7 @@
         dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
         dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
         dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
+        dartCopy.setValue(DartEntry.DIRECTIVE_ERRORS, task.errors);
       } else {
         dartCopy.recordDependencyError();
       }
@@ -6792,7 +6963,7 @@
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
-      logInformation2("Dependency resolution results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+      _logInformation2("Dependency resolution results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6800,7 +6971,7 @@
         // will be re-analyzed using the up-to-date sources.
         //
         //          dartCopy.recordDependencyNotInProcess();
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.invalidateAllInformation();
         dartCopy.modificationTime = sourceTime;
         _cache.removedAst(source);
@@ -6833,7 +7004,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordResolveDartUnitTaskResults(ResolveDartUnitTask task) {
+  DartEntry _recordResolveDartUnitTaskResults(ResolveDartUnitTask task) {
     Source unitSource = task.source;
     Source librarySource = task.librarySource;
     AnalysisException thrownException = task.exception;
@@ -6852,8 +7023,8 @@
     if (sourceTime == resultTime) {
       if (dartEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(unitSource);
-        dartEntry = getReadableDartEntry(unitSource);
+        _sourceChanged(unitSource);
+        dartEntry = _getReadableDartEntry(unitSource);
         if (dartEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
         }
@@ -6870,7 +7041,7 @@
       _cache.put(unitSource, dartCopy);
       dartEntry = dartCopy;
     } else {
-      logInformation2("Resolution results discarded for ${debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+      _logInformation2("Resolution results discarded for ${_debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6880,7 +7051,7 @@
         //          if (dartCopy.getState(DartEntry.RESOLVED_UNIT) == CacheState.IN_PROCESS) {
         //            dartCopy.setState(DartEntry.RESOLVED_UNIT, librarySource, CacheState.INVALID);
         //          }
-        removeFromParts(unitSource, dartEntry);
+        _removeFromParts(unitSource, dartEntry);
         dartCopy.invalidateAllInformation();
         dartCopy.modificationTime = sourceTime;
         _cache.removedAst(unitSource);
@@ -6911,7 +7082,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  HtmlEntry recordResolveHtmlTaskResults(ResolveHtmlTask task) {
+  HtmlEntry _recordResolveHtmlTaskResults(ResolveHtmlTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     HtmlEntry htmlEntry = null;
@@ -6929,8 +7100,8 @@
     if (sourceTime == resultTime) {
       if (htmlEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        htmlEntry = getReadableHtmlEntry(source);
+        _sourceChanged(source);
+        htmlEntry = _getReadableHtmlEntry(source);
         if (htmlEntry == null) {
           throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
         }
@@ -6942,7 +7113,7 @@
         htmlCopy.setValue(HtmlEntry.ELEMENT, task.element);
         htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors);
         _cache.storedAst(source);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.htmlUnit = task.resolvedUnit;
         notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
@@ -6953,7 +7124,7 @@
       _cache.put(source, htmlCopy);
       htmlEntry = htmlCopy;
     } else {
-      logInformation2("Resolution results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
+      _logInformation2("Resolution results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry.modificationTime}", thrownException);
       HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -6995,7 +7166,7 @@
    * @return an entry containing the computed results
    * @throws AnalysisException if the results could not be recorded
    */
-  DartEntry recordScanDartTaskResults(ScanDartTask task) {
+  DartEntry _recordScanDartTaskResults(ScanDartTask task) {
     Source source = task.source;
     AnalysisException thrownException = task.exception;
     DartEntry dartEntry = null;
@@ -7013,8 +7184,8 @@
     if (sourceTime == resultTime) {
       if (dartEntry.modificationTime != sourceTime) {
         // The source has changed without the context being notified. Simulate notification.
-        sourceChanged(source);
-        dartEntry = getReadableDartEntry(source);
+        _sourceChanged(source);
+        dartEntry = _getReadableDartEntry(source);
         if (dartEntry == null) {
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
@@ -7027,10 +7198,10 @@
         dartCopy.setValue(DartEntry.SCAN_ERRORS, task.errors);
         _cache.storedAst(source);
         _workManager.add(source, SourcePriority.NORMAL_PART);
-        ChangeNoticeImpl notice = getNotice(source);
+        ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartEntry.allErrors, lineInfo);
       } else {
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.recordScanError();
         _cache.removedAst(source);
       }
@@ -7038,7 +7209,7 @@
       _cache.put(source, dartCopy);
       dartEntry = dartCopy;
     } else {
-      logInformation2("Scan results discarded for ${debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
+      _logInformation2("Scan results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null || resultTime >= 0) {
         //
@@ -7046,7 +7217,7 @@
         // will be re-analyzed using the up-to-date sources.
         //
         //          dartCopy.recordScanNotInProcess();
-        removeFromParts(source, dartEntry);
+        _removeFromParts(source, dartEntry);
         dartCopy.invalidateAllInformation();
         dartCopy.modificationTime = sourceTime;
         _cache.removedAst(source);
@@ -7078,11 +7249,11 @@
    * @param librarySource the library to be removed
    * @param dartEntry the entry containing the list of included parts
    */
-  void removeFromParts(Source librarySource, DartEntry dartEntry) {
+  void _removeFromParts(Source librarySource, DartEntry dartEntry) {
     List<Source> oldParts = dartEntry.getValue(DartEntry.INCLUDED_PARTS);
     for (int i = 0; i < oldParts.length; i++) {
       Source partSource = oldParts[i];
-      DartEntry partEntry = getReadableDartEntry(partSource);
+      DartEntry partEntry = _getReadableDartEntry(partSource);
       if (partEntry != null && partEntry != dartEntry) {
         DartEntryImpl partCopy = partEntry.writableCopy;
         partCopy.removeContainingLibrary(librarySource);
@@ -7100,7 +7271,7 @@
    *
    * @param source the source to be removed
    */
-  void removeFromPriorityOrder(Source source) {
+  void _removeFromPriorityOrder(Source source) {
     int count = _priorityOrder.length;
     List<Source> newOrder = new List<Source>();
     for (int i = 0; i < count; i++) {
@@ -7122,18 +7293,18 @@
    * @param source the source that has been added
    * @return `true` if the new source is a Dart file
    */
-  bool sourceAvailable(Source source) {
+  bool _sourceAvailable(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = createSourceEntry(source);
-      logInformation("Added new source: ${debuggingString(source)}");
+      sourceEntry = _createSourceEntry(source);
+      _logInformation("Added new source: ${_debuggingString(source)}");
     } else {
       SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
       int oldTime = sourceCopy.modificationTime;
       sourceCopy.modificationTime = getModificationStamp(source);
       // TODO(brianwilkerson) Understand why we're not invalidating the cache.
       _cache.put(source, sourceCopy);
-      logInformation("Added new source: ${debuggingString(source)} (previously modified at ${oldTime})");
+      _logInformation("Added new source: ${_debuggingString(source)} (previously modified at ${oldTime})");
     }
     if (sourceEntry is HtmlEntry) {
       _workManager.add(source, SourcePriority.HTML);
@@ -7148,15 +7319,15 @@
    *
    * @param source the source that has been changed
    */
-  void sourceChanged(Source source) {
+  void _sourceChanged(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null || sourceEntry.modificationTime == getModificationStamp(source)) {
       // Either we have removed this source, in which case we don't care that it is changed, or we
       // have already invalidated the cache and don't need to invalidate it again.
       if (sourceEntry == null) {
-        logInformation("Modified source, but there is no entry: ${debuggingString(source)}");
+        _logInformation("Modified source, but there is no entry: ${_debuggingString(source)}");
       } else {
-        logInformation("Modified source, but modification time matches: ${debuggingString(source)}");
+        _logInformation("Modified source, but modification time matches: ${_debuggingString(source)}");
       }
       return;
     }
@@ -7164,12 +7335,12 @@
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       int oldTime = htmlCopy.modificationTime;
       htmlCopy.modificationTime = getModificationStamp(source);
-      invalidateAngularResolution(htmlCopy);
+      _invalidateAngularResolution(htmlCopy);
       htmlCopy.invalidateAllInformation();
       _cache.put(source, htmlCopy);
       _cache.removedAst(source);
       _workManager.add(source, SourcePriority.HTML);
-      logInformation("Modified HTML source: ${debuggingString(source)} (previously modified at ${oldTime})");
+      _logInformation("Modified HTML source: ${_debuggingString(source)} (previously modified at ${oldTime})");
     } else if (sourceEntry is DartEntry) {
       List<Source> containingLibraries = getLibrariesContaining(source);
       Set<Source> librariesToInvalidate = new Set<Source>();
@@ -7181,19 +7352,19 @@
       }
       PrintStringWriter writer = new PrintStringWriter();
       int oldTime = sourceEntry.modificationTime;
-      writer.println("Modified Dart source: ${debuggingString(source)} (previously modified at ${oldTime})");
+      writer.println("Modified Dart source: ${_debuggingString(source)} (previously modified at ${oldTime})");
       for (Source library in librariesToInvalidate) {
         //    for (Source library : containingLibraries) {
-        invalidateLibraryResolution(library, writer);
+        _invalidateLibraryResolution(library, writer);
       }
-      removeFromParts(source, _cache.get(source) as DartEntry);
+      _removeFromParts(source, _cache.get(source) as DartEntry);
       DartEntryImpl dartCopy = (_cache.get(source) as DartEntry).writableCopy;
       dartCopy.modificationTime = getModificationStamp(source);
       dartCopy.invalidateAllInformation();
       _cache.put(source, dartCopy);
       _cache.removedAst(source);
       _workManager.add(source, SourcePriority.UNKNOWN);
-      logInformation(writer.toString());
+      _logInformation(writer.toString());
     }
   }
 
@@ -7202,13 +7373,13 @@
    *
    * @param source the source that has been deleted
    */
-  void sourceRemoved(Source source) {
+  void _sourceRemoved(Source source) {
     PrintStringWriter writer = new PrintStringWriter();
-    writer.println("Removed source: ${debuggingString(source)}");
+    writer.println("Removed source: ${_debuggingString(source)}");
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
-      invalidateAngularResolution(htmlCopy);
+      _invalidateAngularResolution(htmlCopy);
     } else if (sourceEntry is DartEntry) {
       Set<Source> libraries = new Set<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
@@ -7218,13 +7389,13 @@
         }
       }
       for (Source librarySource in libraries) {
-        invalidateLibraryResolution(librarySource, writer);
+        _invalidateLibraryResolution(librarySource, writer);
       }
     }
     _cache.remove(source);
     _workManager.remove(source);
-    removeFromPriorityOrder(source);
-    logInformation(writer.toString());
+    _removeFromPriorityOrder(source);
+    _logInformation(writer.toString());
   }
 
   /**
@@ -7236,7 +7407,7 @@
    *
    * @return `true` if at least one entry was invalid
    */
-  bool validateCacheConsistency() {
+  bool _validateCacheConsistency() {
     int consistencyCheckStart = JavaSystem.nanoTime();
     List<Source> missingSources = new List<Source>();
     int inconsistentCount = 0;
@@ -7245,7 +7416,7 @@
       SourceEntry sourceEntry = entry.getValue();
       int sourceTime = getModificationStamp(source);
       if (sourceTime != sourceEntry.modificationTime) {
-        sourceChanged(source);
+        _sourceChanged(source);
         inconsistentCount++;
       }
       if (sourceEntry.exception != null) {
@@ -7269,7 +7440,7 @@
       writer.print("    ");
       writer.println(source.fullName);
     }
-    logInformation(writer.toString());
+    _logInformation(writer.toString());
     return inconsistentCount > 0;
   }
 }
@@ -7283,31 +7454,44 @@
 
   AnalysisContextImpl_AnalysisTaskResultRecorder(this.AnalysisContextImpl_this);
 
-  DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => AnalysisContextImpl_this.recordGenerateDartErrorsTask(task);
+  @override
+  DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => AnalysisContextImpl_this._recordGenerateDartErrorsTask(task);
 
-  DartEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) => AnalysisContextImpl_this.recordGenerateDartHintsTask(task);
+  @override
+  DartEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) => AnalysisContextImpl_this._recordGenerateDartHintsTask(task);
 
-  SourceEntry visitGetContentTask(GetContentTask task) => AnalysisContextImpl_this.recordGetContentsTask(task);
+  @override
+  SourceEntry visitGetContentTask(GetContentTask task) => AnalysisContextImpl_this._recordGetContentsTask(task);
 
-  DartEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) => AnalysisContextImpl_this.recordIncrementalAnalysisTaskResults(task);
+  @override
+  DartEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) => AnalysisContextImpl_this._recordIncrementalAnalysisTaskResults(task);
 
-  DartEntry visitParseDartTask(ParseDartTask task) => AnalysisContextImpl_this.recordParseDartTaskResults(task);
+  @override
+  DartEntry visitParseDartTask(ParseDartTask task) => AnalysisContextImpl_this._recordParseDartTaskResults(task);
 
-  HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => AnalysisContextImpl_this.recordParseHtmlTaskResults(task);
+  @override
+  HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => AnalysisContextImpl_this._recordParseHtmlTaskResults(task);
 
-  HtmlEntry visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) => AnalysisContextImpl_this.recordResolveAngularComponentTemplateTaskResults(task);
+  @override
+  HtmlEntry visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) => AnalysisContextImpl_this._recordResolveAngularComponentTemplateTaskResults(task);
 
-  HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => AnalysisContextImpl_this.recordResolveAngularEntryHtmlTaskResults(task);
+  @override
+  HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
 
-  DartEntry visitResolveDartDependenciesTask(ResolveDartDependenciesTask task) => AnalysisContextImpl_this.recordResolveDartDependenciesTaskResults(task);
+  @override
+  DartEntry visitResolveDartDependenciesTask(ResolveDartDependenciesTask task) => AnalysisContextImpl_this._recordResolveDartDependenciesTaskResults(task);
 
+  @override
   DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
 
-  DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => AnalysisContextImpl_this.recordResolveDartUnitTaskResults(task);
+  @override
+  DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => AnalysisContextImpl_this._recordResolveDartUnitTaskResults(task);
 
-  HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) => AnalysisContextImpl_this.recordResolveHtmlTaskResults(task);
+  @override
+  HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) => AnalysisContextImpl_this._recordResolveHtmlTaskResults(task);
 
-  DartEntry visitScanDartTask(ScanDartTask task) => AnalysisContextImpl_this.recordScanDartTaskResults(task);
+  @override
+  DartEntry visitScanDartTask(ScanDartTask task) => AnalysisContextImpl_this._recordScanDartTaskResults(task);
 }
 
 class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy {
@@ -7315,6 +7499,7 @@
 
   AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this);
 
+  @override
   RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
     for (Source prioritySource in AnalysisContextImpl_this._priorityOrder) {
       if (source == prioritySource) {
@@ -7323,14 +7508,14 @@
     }
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
-      if (astIsNeeded(dartEntry)) {
+      if (_astIsNeeded(dartEntry)) {
         return RetentionPriority.MEDIUM;
       }
     }
     return RetentionPriority.LOW;
   }
 
-  bool astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
+  bool _astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
 }
 
 /**
@@ -7478,6 +7663,7 @@
     incremental = options.incremental;
   }
 
+  @override
   bool get generateSdkErrors => _generateSdkErrors;
 
   /**
@@ -7537,8 +7723,10 @@
    */
   ChangeNoticeImpl(this.source);
 
+  @override
   List<AnalysisError> get errors => _errors;
 
+  @override
   LineInfo get lineInfo => _lineInfo;
 
   /**
@@ -7552,10 +7740,11 @@
     this._errors = errors;
     this._lineInfo = lineInfo;
     if (lineInfo == null) {
-      AnalysisEngine.instance.logger.logInformation3("No line info: ${source}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation2("No line info: ${source}", new JavaException());
     }
   }
 
+  @override
   String toString() => "Changes for ${source.fullName}";
 }
 
@@ -7574,6 +7763,7 @@
    */
   InternalAnalysisContext _sdkAnalysisContext;
 
+  @override
   void addSourceInfo(Source source, SourceEntry info) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.addSourceInfo(source, info);
@@ -7582,6 +7772,7 @@
     }
   }
 
+  @override
   List<AnalysisError> computeErrors(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeErrors(source);
@@ -7590,6 +7781,7 @@
     }
   }
 
+  @override
   List<Source> computeExportedLibraries(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeExportedLibraries(source);
@@ -7598,6 +7790,7 @@
     }
   }
 
+  @override
   HtmlElement computeHtmlElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeHtmlElement(source);
@@ -7606,6 +7799,7 @@
     }
   }
 
+  @override
   List<Source> computeImportedLibraries(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeImportedLibraries(source);
@@ -7614,6 +7808,7 @@
     }
   }
 
+  @override
   SourceKind computeKindOf(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeKindOf(source);
@@ -7622,6 +7817,7 @@
     }
   }
 
+  @override
   LibraryElement computeLibraryElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeLibraryElement(source);
@@ -7630,6 +7826,7 @@
     }
   }
 
+  @override
   LineInfo computeLineInfo(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeLineInfo(source);
@@ -7638,6 +7835,7 @@
     }
   }
 
+  @override
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeResolvableCompilationUnit(source);
@@ -7646,6 +7844,7 @@
     }
   }
 
+  @override
   AnalysisErrorInfo getErrors(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getErrors(source);
@@ -7654,6 +7853,7 @@
     }
   }
 
+  @override
   HtmlElement getHtmlElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getHtmlElement(source);
@@ -7662,6 +7862,7 @@
     }
   }
 
+  @override
   List<Source> getHtmlFilesReferencing(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getHtmlFilesReferencing(source);
@@ -7670,6 +7871,7 @@
     }
   }
 
+  @override
   SourceKind getKindOf(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getKindOf(source);
@@ -7678,6 +7880,7 @@
     }
   }
 
+  @override
   List<Source> getLibrariesContaining(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibrariesContaining(source);
@@ -7686,6 +7889,7 @@
     }
   }
 
+  @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibrariesDependingOn(librarySource);
@@ -7694,6 +7898,7 @@
     }
   }
 
+  @override
   LibraryElement getLibraryElement(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLibraryElement(source);
@@ -7702,8 +7907,10 @@
     }
   }
 
+  @override
   List<Source> get librarySources => ArrayUtils.addAll(super.librarySources, _sdkAnalysisContext.librarySources);
 
+  @override
   LineInfo getLineInfo(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getLineInfo(source);
@@ -7712,6 +7919,7 @@
     }
   }
 
+  @override
   Namespace getPublicNamespace(LibraryElement library) {
     Source source = library.source;
     if (source.isInSystemLibrary) {
@@ -7721,6 +7929,7 @@
     }
   }
 
+  @override
   Namespace getPublicNamespace2(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.getPublicNamespace2(source);
@@ -7729,6 +7938,7 @@
     }
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
@@ -7737,6 +7947,7 @@
     }
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit2(unitSource, librarySource);
@@ -7745,6 +7956,7 @@
     }
   }
 
+  @override
   bool isClientLibrary(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.isClientLibrary(librarySource);
@@ -7753,6 +7965,7 @@
     }
   }
 
+  @override
   bool isServerLibrary(Source librarySource) {
     if (librarySource.isInSystemLibrary) {
       return _sdkAnalysisContext.isServerLibrary(librarySource);
@@ -7761,6 +7974,7 @@
     }
   }
 
+  @override
   CompilationUnit parseCompilationUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.parseCompilationUnit(source);
@@ -7769,6 +7983,7 @@
     }
   }
 
+  @override
   ht.HtmlUnit parseHtmlUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.parseHtmlUnit(source);
@@ -7777,6 +7992,7 @@
     }
   }
 
+  @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     if (elementMap.isEmpty) {
       return;
@@ -7793,6 +8009,7 @@
     }
   }
 
+  @override
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveCompilationUnit(source, library);
@@ -7801,6 +8018,7 @@
     }
   }
 
+  @override
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveCompilationUnit2(unitSource, librarySource);
@@ -7809,6 +8027,7 @@
     }
   }
 
+  @override
   ht.HtmlUnit resolveHtmlUnit(Source unitSource) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.resolveHtmlUnit(unitSource);
@@ -7817,6 +8036,7 @@
     }
   }
 
+  @override
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.setChangedContents(source, contents, offset, oldLength, newLength);
@@ -7825,6 +8045,7 @@
     }
   }
 
+  @override
   void setContents(Source source, String contents) {
     if (source.isInSystemLibrary) {
       _sdkAnalysisContext.setContents(source, contents);
@@ -7833,6 +8054,7 @@
     }
   }
 
+  @override
   void set sourceFactory(SourceFactory factory) {
     super.sourceFactory = factory;
     DartSdk sdk = factory.dartSdk;
@@ -8027,12 +8249,21 @@
  */
 class InstrumentedAnalysisContextImpl implements InternalAnalysisContext {
   /**
+   * If the current thread is the UI thread, then note this in the specified instrumentation and
+   * append this information to the log.
+   *
+   * @param instrumentation the instrumentation, not `null`
+   */
+  static void _checkThread(InstrumentationBuilder instrumentation) {
+  }
+
+  /**
    * Record an exception that was thrown during analysis.
    *
    * @param instrumentation the instrumentation builder being used to record the exception
    * @param exception the exception being reported
    */
-  static void recordAnalysisException(InstrumentationBuilder instrumentation, AnalysisException exception) {
+  static void _recordAnalysisException(InstrumentationBuilder instrumentation, AnalysisException exception) {
     instrumentation.record(exception);
   }
 
@@ -8062,12 +8293,15 @@
     _basis = context;
   }
 
+  @override
   void addSourceInfo(Source source, SourceEntry info) {
     _basis.addSourceInfo(source, info);
   }
 
+  @override
   void applyChanges(ChangeSet changeSet) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-applyChanges");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.applyChanges(changeSet);
@@ -8076,8 +8310,10 @@
     }
   }
 
+  @override
   String computeDocumentationComment(Element element) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeDocumentationComment");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeDocumentationComment(element);
@@ -8086,8 +8322,10 @@
     }
   }
 
+  @override
   List<AnalysisError> computeErrors(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeErrors");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<AnalysisError> errors = _basis.computeErrors(source);
@@ -8098,25 +8336,31 @@
     }
   }
 
+  @override
   List<Source> computeExportedLibraries(Source source) => _basis.computeExportedLibraries(source);
 
+  @override
   HtmlElement computeHtmlElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeHtmlElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeHtmlElement(source);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   List<Source> computeImportedLibraries(Source source) => _basis.computeImportedLibraries(source);
 
+  @override
   SourceKind computeKindOf(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeKindOf");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeKindOf(source);
@@ -8125,36 +8369,55 @@
     }
   }
 
+  @override
   LibraryElement computeLibraryElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLibraryElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeLibraryElement(source);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   LineInfo computeLineInfo(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLineInfo");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.computeLineInfo(source);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) => _basis.computeResolvableCompilationUnit(source);
 
+  @override
+  void dispose() {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-dispose");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      _basis.dispose();
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   bool exists(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-exists");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.exists(source);
@@ -8163,8 +8426,10 @@
     }
   }
 
+  @override
   AnalysisContext extractContext(SourceContainer container) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-extractContext");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       InstrumentedAnalysisContextImpl newContext = new InstrumentedAnalysisContextImpl();
@@ -8175,10 +8440,13 @@
     }
   }
 
+  @override
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) => _basis.extractContextInto(container, newContext);
 
+  @override
   AnalysisOptions get analysisOptions {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getAnalysisOptions");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.analysisOptions;
@@ -8192,8 +8460,10 @@
    */
   AnalysisContext get basis => _basis;
 
+  @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource, Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getCompilationUnitElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getCompilationUnitElement(unitSource, librarySource);
@@ -8202,14 +8472,13 @@
     }
   }
 
+  @override
   TimestampedData<String> getContents(Source source) => _basis.getContents(source);
 
-  void getContentsToReceiver(Source source, Source_ContentReceiver receiver) {
-    _basis.getContentsToReceiver(source, receiver);
-  }
-
+  @override
   Element getElement(ElementLocation location) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getElement(location);
@@ -8218,8 +8487,10 @@
     }
   }
 
+  @override
   AnalysisErrorInfo getErrors(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getErrors");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       AnalysisErrorInfo ret = _basis.getErrors(source);
@@ -8232,8 +8503,10 @@
     }
   }
 
+  @override
   HtmlElement getHtmlElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getHtmlElement(source);
@@ -8242,8 +8515,10 @@
     }
   }
 
+  @override
   List<Source> getHtmlFilesReferencing(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlFilesReferencing");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.getHtmlFilesReferencing(source);
@@ -8256,8 +8531,10 @@
     }
   }
 
+  @override
   List<Source> get htmlSources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlSources");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.htmlSources;
@@ -8270,8 +8547,10 @@
     }
   }
 
+  @override
   SourceKind getKindOf(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getKindOf");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getKindOf(source);
@@ -8280,8 +8559,10 @@
     }
   }
 
+  @override
   List<Source> get launchableClientLibrarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableClientLibrarySources");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.launchableClientLibrarySources;
@@ -8294,8 +8575,10 @@
     }
   }
 
+  @override
   List<Source> get launchableServerLibrarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableServerLibrarySources");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.launchableServerLibrarySources;
@@ -8308,8 +8591,10 @@
     }
   }
 
+  @override
   List<Source> getLibrariesContaining(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesContaining");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.getLibrariesContaining(source);
@@ -8322,8 +8607,10 @@
     }
   }
 
+  @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesDependingOn");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.getLibrariesDependingOn(librarySource);
@@ -8336,8 +8623,10 @@
     }
   }
 
+  @override
   LibraryElement getLibraryElement(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibraryElement");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getLibraryElement(source);
@@ -8346,8 +8635,10 @@
     }
   }
 
+  @override
   List<Source> get librarySources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrarySources");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       List<Source> ret = _basis.librarySources;
@@ -8360,8 +8651,10 @@
     }
   }
 
+  @override
   LineInfo getLineInfo(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLineInfo");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getLineInfo(source);
@@ -8370,8 +8663,10 @@
     }
   }
 
+  @override
   int getModificationStamp(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getModificationStamp");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getModificationStamp(source);
@@ -8380,12 +8675,16 @@
     }
   }
 
+  @override
   Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
 
+  @override
   Namespace getPublicNamespace2(Source source) => _basis.getPublicNamespace2(source);
 
+  @override
   List<Source> get refactoringUnsafeSources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getRefactoringUnsafeSources");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.refactoringUnsafeSources;
@@ -8394,8 +8693,10 @@
     }
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getResolvedCompilationUnit(unitSource, library);
@@ -8404,8 +8705,10 @@
     }
   }
 
+  @override
   CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getResolvedCompilationUnit2(unitSource, librarySource);
@@ -8414,8 +8717,10 @@
     }
   }
 
+  @override
   ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedHtmlUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.getResolvedHtmlUnit(htmlSource);
@@ -8424,8 +8729,10 @@
     }
   }
 
+  @override
   SourceFactory get sourceFactory {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getSourceFactory");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.sourceFactory;
@@ -8434,14 +8741,19 @@
     }
   }
 
+  @override
   AnalysisContentStatistics get statistics => _basis.statistics;
 
+  @override
   TypeProvider get typeProvider => _basis.typeProvider;
 
+  @override
   TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSource, LibraryElement libraryElement) => _basis.internalResolveCompilationUnit(unitSource, libraryElement);
 
+  @override
   bool isClientLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isClientLibrary");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.isClientLibrary(librarySource);
@@ -8450,8 +8762,22 @@
     }
   }
 
+  @override
+  bool get isDisposed {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isDisposed");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      return _basis.isDisposed;
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   bool isServerLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isServerLibrary");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.isServerLibrary(librarySource);
@@ -8460,8 +8786,10 @@
     }
   }
 
+  @override
   void mergeContext(AnalysisContext context) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-mergeContext");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       if (context is InstrumentedAnalysisContextImpl) {
@@ -8473,34 +8801,40 @@
     }
   }
 
+  @override
   CompilationUnit parseCompilationUnit(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseCompilationUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.parseCompilationUnit(source);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   ht.HtmlUnit parseHtmlUnit(Source source) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseHtmlUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.parseHtmlUnit(source);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   AnalysisResult performAnalysisTask() {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-performAnalysisTask");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       AnalysisResult result = _basis.performAnalysisTask();
@@ -8513,51 +8847,60 @@
     }
   }
 
+  @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     _basis.recordLibraryElements(elementMap);
   }
 
+  @override
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveCompilationUnit(unitSource, library);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveCompilationUnit2(unitSource, librarySource);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveHtmlUnit");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       return _basis.resolveHtmlUnit(htmlSource);
     } on AnalysisException catch (e) {
-      recordAnalysisException(instrumentation, e);
+      _recordAnalysisException(instrumentation, e);
       throw e;
     } finally {
       instrumentation.log();
     }
   }
 
+  @override
   void set analysisOptions(AnalysisOptions options) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisOptions");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.analysisOptions = options;
@@ -8566,8 +8909,10 @@
     }
   }
 
+  @override
   void set analysisPriorityOrder(List<Source> sources) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisPriorityOrder");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.analysisPriorityOrder = sources;
@@ -8576,8 +8921,10 @@
     }
   }
 
+  @override
   void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setChangedContents");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.setChangedContents(source, contents, offset, oldLength, newLength);
@@ -8586,8 +8933,10 @@
     }
   }
 
+  @override
   void setContents(Source source, String contents) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setContents");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.setContents(source, contents);
@@ -8596,8 +8945,10 @@
     }
   }
 
+  @override
   void set sourceFactory(SourceFactory factory) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setSourceFactory");
+    _checkThread(instrumentation);
     try {
       instrumentation.metric3("contextId", _contextId);
       _basis.sourceFactory = factory;
@@ -8818,6 +9169,7 @@
     }
   }
 
+  @override
   void onError(AnalysisError error) {
     Source source = error.source;
     Set<AnalysisError> errorsForSource = _errors[source];
@@ -8834,89 +9186,105 @@
  * structure when used to visit that structure.
  */
 class ResolutionEraser extends GeneralizingAstVisitor<Object> {
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitAssignmentExpression(node);
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitBinaryExpression(node);
   }
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     node.element = null;
     return super.visitCompilationUnit(node);
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     node.element = null;
     return super.visitConstructorDeclaration(node);
   }
 
+  @override
   Object visitConstructorName(ConstructorName node) {
     node.staticElement = null;
     return super.visitConstructorName(node);
   }
 
+  @override
   Object visitDirective(Directive node) {
     node.element = null;
     return super.visitDirective(node);
   }
 
+  @override
   Object visitExpression(Expression node) {
     node.staticType = null;
     node.propagatedType = null;
     return super.visitExpression(node);
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     node.element = null;
     return super.visitFunctionExpression(node);
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitFunctionExpressionInvocation(node);
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitIndexExpression(node);
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.staticElement = null;
     return super.visitInstanceCreationExpression(node);
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitPostfixExpression(node);
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitPrefixExpression(node);
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     node.staticElement = null;
     return super.visitRedirectingConstructorInvocation(node);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     node.staticElement = null;
     node.propagatedElement = null;
     return super.visitSimpleIdentifier(node);
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.staticElement = null;
     return super.visitSuperConstructorInvocation(node);
@@ -9243,8 +9611,8 @@
     return false;
   }
 
-  static SimpleIdentifier createIdentifier(String name, int offset) {
-    StringToken token = createStringToken(name, offset);
+  static SimpleIdentifier _createIdentifier(String name, int offset) {
+    StringToken token = _createStringToken(name, offset);
     return new SimpleIdentifier(token);
   }
 
@@ -9254,7 +9622,7 @@
    * @param angularElements the list to fill with top-level [AngularElement]s
    * @param classElement the [ClassElement] to get [AngularElement]s from
    */
-  static void addAngularElementsFromClass(Set<AngularElement> angularElements, ClassElement classElement) {
+  static void _addAngularElementsFromClass(Set<AngularElement> angularElements, ClassElement classElement) {
     for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) {
       if (toolkitObject is AngularElement) {
         angularElements.add(toolkitObject);
@@ -9268,7 +9636,7 @@
    * @param libraryElement the [LibraryElement] to analyze
    * @return the array of all top-level Angular elements that could be used in this library
    */
-  static void addAngularElementsFromLibrary(Set<AngularElement> angularElements, LibraryElement library, Set<LibraryElement> visited) {
+  static void _addAngularElementsFromLibrary(Set<AngularElement> angularElements, LibraryElement library, Set<LibraryElement> visited) {
     if (library == null) {
       return;
     }
@@ -9279,17 +9647,17 @@
     for (CompilationUnitElement unit in library.units) {
       angularElements.addAll(unit.angularViews);
       for (ClassElement type in unit.types) {
-        addAngularElementsFromClass(angularElements, type);
+        _addAngularElementsFromClass(angularElements, type);
       }
     }
     // handle imports
     for (ImportElement importElement in library.imports) {
       LibraryElement importedLibrary = importElement.importedLibrary;
-      addAngularElementsFromLibrary(angularElements, importedLibrary, visited);
+      _addAngularElementsFromLibrary(angularElements, importedLibrary, visited);
     }
   }
 
-  static StringToken createStringToken(String name, int offset) => new StringToken(TokenType.IDENTIFIER, name, offset);
+  static StringToken _createStringToken(String name, int offset) => new StringToken(TokenType.IDENTIFIER, name, offset);
 
   /**
    * Returns the array of all top-level Angular elements that could be used in this library.
@@ -9297,16 +9665,16 @@
    * @param libraryElement the [LibraryElement] to analyze
    * @return the array of all top-level Angular elements that could be used in this library
    */
-  static List<AngularElement> getAngularElements(Set<LibraryElement> libraries, LibraryElement libraryElement) {
+  static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries, LibraryElement libraryElement) {
     Set<AngularElement> angularElements = new Set();
-    addAngularElementsFromLibrary(angularElements, libraryElement, libraries);
+    _addAngularElementsFromLibrary(angularElements, libraryElement, libraries);
     return new List.from(angularElements);
   }
 
   /**
    * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit].
    */
-  static CompilationUnit getDartUnit(AnalysisContext context, ht.HtmlUnit unit) {
+  static CompilationUnit _getDartUnit(AnalysisContext context, ht.HtmlUnit unit) {
     for (HtmlScriptElement script in unit.element.scripts) {
       if (script is ExternalHtmlScriptElement) {
         Source scriptSource = script.scriptSource;
@@ -9318,7 +9686,7 @@
     return null;
   }
 
-  static Set<Source> getLibrarySources(Set<LibraryElement> libraries) {
+  static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) {
     Set<Source> sources = new Set();
     for (LibraryElement library in libraries) {
       sources.add(library.source);
@@ -9379,14 +9747,14 @@
       return null;
     }
     // prepare resolved Dart unit
-    CompilationUnit dartUnit = getDartUnit(_context, _unit);
+    CompilationUnit dartUnit = _getDartUnit(_context, _unit);
     if (dartUnit == null) {
       return null;
     }
     // prepare accessible Angular elements
     LibraryElement libraryElement = dartUnit.element.library;
     Set<LibraryElement> libraries = new Set();
-    List<AngularElement> angularElements = getAngularElements(libraries, libraryElement);
+    List<AngularElement> angularElements = _getAngularElements(libraries, libraryElement);
     // resolve AngularComponentElement template URIs
     // TODO(scheglov) resolve to HtmlElement to allow F3 ?
     Set<Source> angularElementsSources = new Set();
@@ -9422,7 +9790,7 @@
       }
     }
     // create AngularApplication
-    AngularApplication application = new AngularApplication(_source, getLibrarySources(libraries), angularElements, new List.from(angularElementsSources));
+    AngularApplication application = new AngularApplication(_source, _getLibrarySources(libraries), angularElements, new List.from(angularElementsSources));
     // set AngularApplication for each AngularElement
     for (AngularElement angularElement in angularElements) {
       (angularElement as AngularElementImpl).application = application;
@@ -9439,38 +9807,40 @@
    */
   void resolveComponentTemplate(AngularApplication application, AngularComponentElement component) {
     _isAngular = true;
-    resolveInternal(application.elements, component);
+    _resolveInternal(application.elements, component);
   }
 
   /**
    * Resolves [source] as an Angular application entry point.
    */
   void resolveEntryPoint(AngularApplication application) {
-    resolveInternal(application.elements, null);
+    _resolveInternal(application.elements, null);
   }
 
+  @override
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    parseEmbeddedExpressionsInAttribute(node);
-    resolveExpressions(node.expressions);
+    _parseEmbeddedExpressionsInAttribute(node);
+    _resolveExpressions(node.expressions);
     return super.visitXmlAttributeNode(node);
   }
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
     bool wasAngular = _isAngular;
     try {
       // new Angular context
       if (node.getAttribute(_NG_APP) != null) {
         _isAngular = true;
-        visitModelDirectives(node);
+        _visitModelDirectives(node);
       }
       // not Angular
       if (!_isAngular) {
         return super.visitXmlTagNode(node);
       }
       // process node in separate name scope
-      pushNameScope();
+      _pushNameScope();
       try {
-        parseEmbeddedExpressionsInTag(node);
+        _parseEmbeddedExpressionsInTag(node);
         // apply processors
         for (NgProcessor processor in _processors) {
           if (processor.canApply(node)) {
@@ -9478,11 +9848,11 @@
           }
         }
         // resolve expressions
-        resolveExpressions(node.expressions);
+        _resolveExpressions(node.expressions);
         // process children
         return super.visitXmlTagNode(node);
       } finally {
-        popNameScope();
+        _popNameScope();
       }
     } finally {
       _isAngular = wasAngular;
@@ -9496,7 +9866,7 @@
    * @param identifier the identifier to create variable for
    * @return the new [LocalVariableElementImpl]
    */
-  LocalVariableElementImpl createLocalVariableFromIdentifier(Type2 type, SimpleIdentifier identifier) {
+  LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type, SimpleIdentifier identifier) {
     LocalVariableElementImpl variable = new LocalVariableElementImpl(identifier);
     _definedVariables.add(variable);
     variable.type = type;
@@ -9510,33 +9880,33 @@
    * @param name the name of the variable
    * @return the new [LocalVariableElementImpl]
    */
-  LocalVariableElementImpl createLocalVariableWithName(Type2 type, String name) {
-    SimpleIdentifier identifier = createIdentifier(name, 0);
-    return createLocalVariableFromIdentifier(type, identifier);
+  LocalVariableElementImpl _createLocalVariableWithName(DartType type, String name) {
+    SimpleIdentifier identifier = _createIdentifier(name, 0);
+    return _createLocalVariableFromIdentifier(type, identifier);
   }
 
   /**
    * Declares the given [LocalVariableElementImpl] in the [topNameScope].
    */
-  void defineTopVariable(LocalVariableElementImpl variable) {
-    recordDefinedVariable(variable);
+  void _defineTopVariable(LocalVariableElementImpl variable) {
+    _recordDefinedVariable(variable);
     _topNameScope.define(variable);
-    recordTypeLibraryInjected(variable);
+    _recordTypeLibraryInjected(variable);
   }
 
   /**
    * Declares the given [LocalVariableElementImpl] in the current [nameScope].
    */
-  void defineVariable(LocalVariableElementImpl variable) {
-    recordDefinedVariable(variable);
+  void _defineVariable(LocalVariableElementImpl variable) {
+    _recordDefinedVariable(variable);
     _nameScope.define(variable);
-    recordTypeLibraryInjected(variable);
+    _recordTypeLibraryInjected(variable);
   }
 
   /**
    * @return the [AngularElement] with the given name, maybe `null`.
    */
-  AngularElement findAngularElement(String name) {
+  AngularElement _findAngularElement(String name) {
     for (AngularElement element in _angularElements) {
       if (name == element.name) {
         return element;
@@ -9553,14 +9923,14 @@
   /**
    * Parses given [String] as an [AngularExpression] at the given offset.
    */
-  AngularExpression parseAngularExpression(String contents, int startIndex, int endIndex, int offset) {
-    Token token = scanDart(contents, startIndex, endIndex, offset);
-    return parseAngularExpressionInToken(token);
+  AngularExpression _parseAngularExpression(String contents, int startIndex, int endIndex, int offset) {
+    Token token = _scanDart(contents, startIndex, endIndex, offset);
+    return _parseAngularExpressionInToken(token);
   }
 
-  AngularExpression parseAngularExpressionInToken(Token token) {
-    List<Token> tokens = splitAtBar(token);
-    Expression mainExpression = parseDartExpressionInToken(tokens[0]);
+  AngularExpression _parseAngularExpressionInToken(Token token) {
+    List<Token> tokens = _splitAtBar(token);
+    Expression mainExpression = _parseDartExpressionInToken(tokens[0]);
     // parse filters
     List<AngularFilterNode> filters = [];
     for (int i = 1; i < tokens.length; i++) {
@@ -9568,7 +9938,7 @@
       Token barToken = filterToken;
       filterToken = filterToken.next;
       // TODO(scheglov) report missing identifier
-      SimpleIdentifier name = parseDartExpressionInToken(filterToken) as SimpleIdentifier;
+      SimpleIdentifier name = _parseDartExpressionInToken(filterToken) as SimpleIdentifier;
       filterToken = name.endToken.next;
       // parse arguments
       List<AngularFilterArgument> arguments = [];
@@ -9578,10 +9948,10 @@
         if (identical(colonToken.type, TokenType.COLON)) {
           filterToken = filterToken.next;
         } else {
-          reportErrorForToken(AngularCode.MISSING_FILTER_COLON, colonToken, []);
+          _reportErrorForToken(AngularCode.MISSING_FILTER_COLON, colonToken, []);
         }
         // parse argument
-        Expression argument = parseDartExpressionInToken(filterToken);
+        Expression argument = _parseDartExpressionInToken(filterToken);
         arguments.add(new AngularFilterArgument(colonToken, argument));
         // next token
         filterToken = argument.endToken.next;
@@ -9595,66 +9965,66 @@
   /**
    * Parses given [String] as an [Expression] at the given offset.
    */
-  Expression parseDartExpression(String contents, int startIndex, int endIndex, int offset) {
-    Token token = scanDart(contents, startIndex, endIndex, offset);
-    return parseDartExpressionInToken(token);
+  Expression _parseDartExpression(String contents, int startIndex, int endIndex, int offset) {
+    Token token = _scanDart(contents, startIndex, endIndex, offset);
+    return _parseDartExpressionInToken(token);
   }
 
-  Expression parseDartExpressionInToken(Token token) {
+  Expression _parseDartExpressionInToken(Token token) {
     Parser parser = new Parser(_source, _errorListener);
     return parser.parseExpression(token);
   }
 
-  void popNameScope() {
+  void _popNameScope() {
     _nameScope = _resolver.popNameScope();
   }
 
-  void pushNameScope() {
+  void _pushNameScope() {
     _nameScope = _resolver.pushNameScope();
   }
 
   /**
    * Reports given [ErrorCode] at the given [AstNode].
    */
-  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  void _reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _reportErrorForOffset(errorCode, node.offset, node.length, arguments);
   }
 
   /**
    * Reports given [ErrorCode] at the given position.
    */
-  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
   }
 
   /**
    * Reports given [ErrorCode] at the given [Token].
    */
-  void reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
-    reportErrorForOffset(errorCode, token.offset, token.length, arguments);
+  void _reportErrorForToken(ErrorCode errorCode, Token token, List<Object> arguments) {
+    _reportErrorForOffset(errorCode, token.offset, token.length, arguments);
   }
 
-  void resolveExpression(AngularExpression angularExpression) {
+  void _resolveExpression(AngularExpression angularExpression) {
     List<Expression> dartExpressions = angularExpression.expressions;
     for (Expression dartExpression in dartExpressions) {
-      resolveNode(dartExpression);
+      _resolveNode(dartExpression);
     }
   }
 
   /**
    * Resolves given [AstNode] using [resolver].
    */
-  void resolveNode(AstNode node) {
+  void _resolveNode(AstNode node) {
     node.accept(_resolver);
   }
 
-  Token scanDart(String contents, int startIndex, int endIndex, int offset) => ht.HtmlParser.scanDartSource(_source, _lineInfo, contents.substring(startIndex, endIndex), offset + startIndex, _errorListener);
+  Token _scanDart(String contents, int startIndex, int endIndex, int offset) => ht.HtmlParser.scanDartSource(_source, _lineInfo, contents.substring(startIndex, endIndex), offset + startIndex, _errorListener);
 
   /**
    * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML
    * [Source].
    */
-  void createLibraryElement() {
+  void _createLibraryElement() {
     // create CompilationUnitElementImpl
     String unitName = _source.shortName;
     _unitElement = new CompilationUnitElementImpl(unitName);
@@ -9673,7 +10043,7 @@
    * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not
    * supported.
    */
-  NgProcessor createProcessor(AngularElement element) {
+  NgProcessor _createProcessor(AngularElement element) {
     if (element is AngularComponentElement) {
       AngularComponentElement component = element;
       return new NgComponentElementProcessor(component);
@@ -9693,16 +10063,16 @@
    * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in
    * [source].
    */
-  void createResolver() {
+  void _createResolver() {
     InheritanceManager inheritanceManager = new InheritanceManager(_libraryElement);
     _resolver = new ResolverVisitor.con2(_libraryElement, _source, _typeProvider, inheritanceManager, _errorListener);
     _topNameScope = _resolver.pushNameScope();
     // add Scope variables - no type, no location, just to avoid warnings
     {
-      Type2 type = _typeProvider.dynamicType;
-      _topNameScope.define(createLocalVariableWithName(type, "\$id"));
-      _topNameScope.define(createLocalVariableWithName(type, "\$parent"));
-      _topNameScope.define(createLocalVariableWithName(type, "\$root"));
+      DartType type = _typeProvider.dynamicType;
+      _topNameScope.define(_createLocalVariableWithName(type, "\$id"));
+      _topNameScope.define(_createLocalVariableWithName(type, "\$parent"));
+      _topNameScope.define(_createLocalVariableWithName(type, "\$root"));
     }
   }
 
@@ -9710,21 +10080,21 @@
    * Defines variable for the given [AngularElement] with type of the enclosing
    * [ClassElement].
    */
-  void defineTopVariable_forClassElement(AngularElement element) {
+  void _defineTopVariable_forClassElement(AngularElement element) {
     ClassElement classElement = element.enclosingElement as ClassElement;
     InterfaceType type = classElement.type;
-    LocalVariableElementImpl variable = createLocalVariableWithName(type, element.name);
-    defineTopVariable(variable);
+    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
+    _defineTopVariable(variable);
     variable.toolkitObjects = <AngularElement> [element];
   }
 
   /**
    * Defines variable for the given [AngularScopePropertyElement].
    */
-  void defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
-    Type2 type = element.type;
-    LocalVariableElementImpl variable = createLocalVariableWithName(type, element.name);
-    defineTopVariable(variable);
+  void _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) {
+    DartType type = element.type;
+    LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name);
+    _defineTopVariable(variable);
     variable.toolkitObjects = <AngularElement> [element];
   }
 
@@ -9735,7 +10105,7 @@
    * @param expressions the list to which embedded expressions are to be added
    * @param token the token whose value is to be parsed
    */
-  void parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, ht.Token token) {
+  void _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, ht.Token token) {
     // prepare Token information
     String lexeme = token.lexeme;
     int offset = token.offset;
@@ -9748,22 +10118,22 @@
         return;
       } else if (startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < endIndex) {
         startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH;
-        AngularExpression expression = parseAngularExpression(lexeme, startIndex, endIndex, offset);
+        AngularExpression expression = _parseAngularExpression(lexeme, startIndex, endIndex, offset);
         expressions.add(new AngularMoustacheXmlExpression(startIndex, endIndex, expression));
       }
       startIndex = StringUtilities.indexOf2(lexeme, endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR);
     }
   }
 
-  void parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
+  void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
     List<AngularMoustacheXmlExpression> expressions = [];
-    parseEmbeddedExpressions(expressions, node.valueToken);
+    _parseEmbeddedExpressions(expressions, node.valueToken);
     if (!expressions.isEmpty) {
       node.expressions = new List.from(expressions);
     }
   }
 
-  void parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
+  void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
     List<AngularMoustacheXmlExpression> expressions = [];
     ht.Token token = node.attributeEnd;
     ht.Token endToken = node.endToken;
@@ -9780,14 +10150,14 @@
         }
       }
       if (!inChild && identical(token.type, ht.TokenType.TEXT)) {
-        parseEmbeddedExpressions(expressions, token);
+        _parseEmbeddedExpressions(expressions, token);
       }
       token = token.next;
     }
     node.expressions = new List.from(expressions);
   }
 
-  void recordDefinedVariable(LocalVariableElementImpl variable) {
+  void _recordDefinedVariable(LocalVariableElementImpl variable) {
     _definedVariables.add(variable);
     _functionElement.localVariables = new List.from(_definedVariables);
   }
@@ -9795,16 +10165,16 @@
   /**
    * When we inject variable, we give access to the library of its type.
    */
-  void recordTypeLibraryInjected(LocalVariableElementImpl variable) {
+  void _recordTypeLibraryInjected(LocalVariableElementImpl variable) {
     LibraryElement typeLibrary = variable.type.element.library;
     _injectedLibraries.add(typeLibrary);
   }
 
-  void resolveExpressions(List<ht.XmlExpression> expressions) {
+  void _resolveExpressions(List<ht.XmlExpression> expressions) {
     for (ht.XmlExpression xmlExpression in expressions) {
       if (xmlExpression is AngularXmlExpression) {
         AngularXmlExpression angularXmlExpression = xmlExpression;
-        resolveXmlExpression(angularXmlExpression);
+        _resolveXmlExpression(angularXmlExpression);
       }
     }
   }
@@ -9817,7 +10187,7 @@
    * @param component the [AngularComponentElement] to resolve template for, maybe
    *          `null` if not a component template
    */
-  void resolveInternal(List<AngularElement> angularElements, AngularComponentElement component) {
+  void _resolveInternal(List<AngularElement> angularElements, AngularComponentElement component) {
     this._angularElements = angularElements;
     // add built-in processors
     _processors.add(NgModelProcessor.INSTANCE);
@@ -9827,20 +10197,20 @@
       _injectedLibraries.add(angularElement.library);
     }
     // prepare Dart library
-    createLibraryElement();
+    _createLibraryElement();
     (_unit.element as HtmlElementImpl).angularCompilationUnit = _unitElement;
     // prepare Dart resolver
-    createResolver();
+    _createResolver();
     // maybe resolving component template
     if (component != null) {
-      defineTopVariable_forClassElement(component);
+      _defineTopVariable_forClassElement(component);
       for (AngularScopePropertyElement scopeProperty in component.scopeProperties) {
-        defineTopVariable_forScopeProperty(scopeProperty);
+        _defineTopVariable_forScopeProperty(scopeProperty);
       }
     }
     // add processors
     for (AngularElement angularElement in angularElements) {
-      NgProcessor processor = createProcessor(angularElement);
+      NgProcessor processor = _createProcessor(angularElement);
       if (processor != null) {
         _processors.add(processor);
       }
@@ -9848,7 +10218,7 @@
     // define filters
     for (AngularElement angularElement in angularElements) {
       if (angularElement is AngularFilterElement) {
-        defineTopVariable_forClassElement(angularElement);
+        _defineTopVariable_forClassElement(angularElement);
       }
     }
     // run this HTML visitor
@@ -9869,12 +10239,12 @@
     }
   }
 
-  void resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
+  void _resolveXmlExpression(AngularXmlExpression angularXmlExpression) {
     AngularExpression angularExpression = angularXmlExpression.expression;
-    resolveExpression(angularExpression);
+    _resolveExpression(angularExpression);
   }
 
-  List<Token> splitAtBar(Token token) {
+  List<Token> _splitAtBar(Token token) {
     List<Token> tokens = [];
     tokens.add(token);
     while (token.type != TokenType.EOF) {
@@ -9893,7 +10263,7 @@
    * can be used before actual "ng-model" attribute in HTML. So, we need to define them once we
    * found [NG_APP] context.
    */
-  void visitModelDirectives(ht.XmlTagNode appNode) {
+  void _visitModelDirectives(ht.XmlTagNode appNode) {
     appNode.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this));
   }
 }
@@ -9905,6 +10275,7 @@
     this._listener = listener;
   }
 
+  @override
   void onError(AnalysisError error) {
     ErrorCode errorCode = error.errorCode;
     if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) || identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) || identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) {
@@ -9918,6 +10289,7 @@
 }
 
 class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends ht.RecursiveXmlVisitor<Object> {
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
     if (node.getAttribute(AngularHtmlUnitResolver._NG_APP) != null) {
       throw new AngularHtmlUnitResolver_FoundAppError();
@@ -9931,10 +10303,11 @@
 
   RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this.AngularHtmlUnitResolver_this) : super();
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
     NgModelProcessor directive = NgModelProcessor.INSTANCE;
     if (directive.canApply(node)) {
-      directive.applyTopDeclarations(AngularHtmlUnitResolver_this, node);
+      directive._applyTopDeclarations(AngularHtmlUnitResolver_this, node);
     }
     return super.visitXmlTagNode(node);
   }
@@ -9972,10 +10345,13 @@
     this._closingOffset = closingOffset;
   }
 
+  @override
   int get end => _closingOffset + CLOSING_DELIMITER_LENGTH;
 
+  @override
   int get length => _closingOffset + CLOSING_DELIMITER_LENGTH - _openingOffset;
 
+  @override
   int get offset => _openingOffset;
 }
 
@@ -9986,10 +10362,13 @@
 class AngularRawXmlExpression extends AngularXmlExpression {
   AngularRawXmlExpression(AngularExpression expression) : super(expression);
 
+  @override
   int get end => expression.end;
 
+  @override
   int get length => expression.length;
 
+  @override
   int get offset => expression.offset;
 }
 
@@ -10004,22 +10383,23 @@
 
   AngularXmlExpression(this.expression);
 
+  @override
   ht.XmlExpression_Reference getReference(int offset) {
     // main expression
-    ht.XmlExpression_Reference reference = getReferenceAtNode(expression.expression, offset);
+    ht.XmlExpression_Reference reference = _getReferenceAtNode(expression.expression, offset);
     if (reference != null) {
       return reference;
     }
     // filters
     for (AngularFilterNode filter in expression.filters) {
       // filter name
-      reference = getReferenceAtNode(filter.name, offset);
+      reference = _getReferenceAtNode(filter.name, offset);
       if (reference != null) {
         return reference;
       }
       // filter arguments
       for (AngularFilterArgument filterArgument in filter.arguments) {
-        reference = getReferenceAtNode(filterArgument.expression, offset);
+        reference = _getReferenceAtNode(filterArgument.expression, offset);
         if (reference != null) {
           return reference;
         }
@@ -10032,7 +10412,7 @@
    * If the given [AstNode] has an [Element] at the given offset, then returns
    * [Reference] with this [Element].
    */
-  ht.XmlExpression_Reference getReferenceAtNode(AstNode root, int offset) {
+  ht.XmlExpression_Reference _getReferenceAtNode(AstNode root, int offset) {
     AstNode node = new NodeLocator.con1(offset).searchWithin(root);
     if (node != null) {
       Element element = ElementLocator.locate(node);
@@ -10053,20 +10433,22 @@
    */
   void visitExpression(Expression expression);
 
+  @override
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    visitExpressions(node.expressions);
+    _visitExpressions(node.expressions);
     return super.visitXmlAttributeNode(node);
   }
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
-    visitExpressions(node.expressions);
+    _visitExpressions(node.expressions);
     return super.visitXmlTagNode(node);
   }
 
   /**
    * Visits [Expression]s of the given [XmlExpression]s.
    */
-  void visitExpressions(List<ht.XmlExpression> expressions) {
+  void _visitExpressions(List<ht.XmlExpression> expressions) {
     for (ht.XmlExpression xmlExpression in expressions) {
       if (xmlExpression is AngularXmlExpression) {
         AngularXmlExpression angularXmlExpression = xmlExpression;
@@ -10094,6 +10476,7 @@
     this._element = element;
   }
 
+  @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     node.element = _element.selector;
     for (AngularPropertyElement property in _element.properties) {
@@ -10104,13 +10487,14 @@
         // resolve if binding
         if (property.propertyKind != AngularPropertyKind.ATTR) {
           AngularExpression expression = parseAngularExpression(resolver, attribute);
-          resolver.resolveExpression(expression);
+          resolver._resolveExpression(expression);
           setAngularExpression(attribute, expression);
         }
       }
     }
   }
 
+  @override
   bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
 }
 
@@ -10124,14 +10508,16 @@
     this._element = element;
   }
 
+  @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     InterfaceType type = (_element.enclosingElement as ClassElement).type;
     String name = _element.name;
-    LocalVariableElementImpl variable = resolver.createLocalVariableWithName(type, name);
-    resolver.defineVariable(variable);
+    LocalVariableElementImpl variable = resolver._createLocalVariableWithName(type, name);
+    resolver._defineVariable(variable);
     variable.toolkitObjects = <AngularElement> [_element];
   }
 
+  @override
   bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
 }
 
@@ -10146,6 +10532,7 @@
     this._element = element;
   }
 
+  @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     String selectorAttributeName = null;
     {
@@ -10175,29 +10562,30 @@
         }
         // resolve if binding
         if (property.propertyKind != AngularPropertyKind.ATTR) {
-          resolver.pushNameScope();
+          resolver._pushNameScope();
           try {
-            onNgEventDirective(resolver);
+            _onNgEventDirective(resolver);
             AngularExpression expression = parseAngularExpression(resolver, attribute);
-            resolver.resolveExpression(expression);
+            resolver._resolveExpression(expression);
             setAngularExpression(attribute, expression);
           } finally {
-            resolver.popNameScope();
+            resolver._popNameScope();
           }
         }
       }
     }
   }
 
+  @override
   bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
 
   /**
    * Support for <code>$event</code> variable in <code>NgEventDirective</code>.
    */
-  void onNgEventDirective(AngularHtmlUnitResolver resolver) {
+  void _onNgEventDirective(AngularHtmlUnitResolver resolver) {
     if (_element.isClass("NgEventDirective")) {
-      Type2 dynamicType = resolver.typeProvider.dynamicType;
-      resolver.defineVariable(resolver.createLocalVariableWithName(dynamicType, "\$event"));
+      DartType dynamicType = resolver.typeProvider.dynamicType;
+      resolver._defineVariable(resolver._createLocalVariableWithName(dynamicType, "\$event"));
     }
   }
 }
@@ -10211,40 +10599,40 @@
   static ht.RawXmlExpression newRawXmlExpression(Expression e) => new ht.RawXmlExpression(e);
 
   AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
-    Token token = scanAttribute(resolver, attribute);
-    return resolver.parseAngularExpressionInToken(token);
+    Token token = _scanAttribute(resolver, attribute);
+    return resolver._parseAngularExpressionInToken(token);
   }
 
   Expression parseDartExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
-    Token token = scanAttribute(resolver, attribute);
-    return resolver.parseDartExpressionInToken(token);
+    Token token = _scanAttribute(resolver, attribute);
+    return resolver._parseDartExpressionInToken(token);
   }
 
   /**
    * Sets single [AngularExpression] for [XmlAttributeNode].
    */
   void setAngularExpression(ht.XmlAttributeNode attribute, AngularExpression expression) {
-    setExpression2(attribute, newAngularRawXmlExpression(expression));
+    _setExpression(attribute, newAngularRawXmlExpression(expression));
   }
 
   /**
    * Sets single [Expression] for [XmlAttributeNode].
    */
   void setExpression(ht.XmlAttributeNode attribute, Expression expression) {
-    setExpression2(attribute, newRawXmlExpression(expression));
+    _setExpression(attribute, newRawXmlExpression(expression));
   }
 
   void setExpressions(ht.XmlAttributeNode attribute, List<ht.XmlExpression> xmlExpressions) {
     attribute.expressions = new List.from(xmlExpressions);
   }
 
-  Token scanAttribute(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
+  Token _scanAttribute(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) {
     int offset = attribute.valueToken.offset + 1;
     String value = attribute.text;
-    return resolver.scanDart(value, 0, value.length, offset);
+    return resolver._scanDart(value, 0, value.length, offset);
   }
 
-  void setExpression2(ht.XmlAttributeNode attribute, ht.XmlExpression xmlExpression) {
+  void _setExpression(ht.XmlAttributeNode attribute, ht.XmlExpression xmlExpression) {
     attribute.expressions = <ht.XmlExpression> [xmlExpression];
   }
 }
@@ -10257,6 +10645,7 @@
 
   static NgModelProcessor INSTANCE = new NgModelProcessor();
 
+  @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     ht.XmlAttributeNode attribute = node.getAttribute(_NG_MODEL);
     Expression expression = parseDartExpression(resolver, attribute);
@@ -10265,18 +10654,19 @@
       return;
     }
     // resolve
-    resolver.resolveNode(expression);
+    resolver._resolveNode(expression);
     // remember expression
     setExpression(attribute, expression);
   }
 
+  @override
   bool canApply(ht.XmlTagNode node) => node.getAttribute(_NG_MODEL) != null;
 
   /**
    * This method is used to define top-level [VariableElement]s for each "ng-model" with
    * simple identifier model.
    */
-  void applyTopDeclarations(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
+  void _applyTopDeclarations(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
     ht.XmlAttributeNode attribute = node.getAttribute(_NG_MODEL);
     Expression expression = parseDartExpression(resolver, attribute);
     // if not identifier, then not a top-level model, delay until "apply"
@@ -10286,8 +10676,8 @@
     SimpleIdentifier identifier = expression as SimpleIdentifier;
     // define variable Element
     InterfaceType type = resolver.typeProvider.stringType;
-    LocalVariableElementImpl element = resolver.createLocalVariableFromIdentifier(type, identifier);
-    resolver.defineTopVariable(element);
+    LocalVariableElementImpl element = resolver._createLocalVariableFromIdentifier(type, identifier);
+    resolver._defineTopVariable(element);
     // remember expression
     identifier.staticElement = element;
     identifier.staticType = type;
@@ -10365,14 +10755,15 @@
    */
   Object perform(AnalysisTaskVisitor visitor) {
     try {
-      safelyPerform();
+      _safelyPerform();
     } on AnalysisException catch (exception) {
       _thrownException = exception;
-      AnalysisEngine.instance.logger.logInformation3("Task failed: ${taskDescription}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", exception);
     }
     return accept(visitor);
   }
 
+  @override
   String toString() => taskDescription;
 
   /**
@@ -10395,7 +10786,7 @@
    *
    * @throws AnalysisException if any exception occurs while performing the task
    */
-  void safelyPerform() {
+  void _safelyPerform() {
     try {
       internalPerform();
     } on AnalysisException catch (exception) {
@@ -10564,6 +10955,7 @@
    */
   GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.libraryElement) : super(context);
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
 
   /**
@@ -10581,8 +10973,10 @@
    */
   int get modificationTime => _modificationTime;
 
+  @override
   String get taskDescription => "generate errors and warnings for ${source.fullName}";
 
+  @override
   void internalPerform() {
     InternalAnalysisContext context = this.context;
     TimestampedData<CompilationUnit> data = context.internalResolveCompilationUnit(source, libraryElement);
@@ -10634,6 +11028,7 @@
    */
   GenerateDartHintsTask(InternalAnalysisContext context, this.libraryElement) : super(context);
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
 
   /**
@@ -10646,6 +11041,7 @@
    */
   Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
 
+  @override
   String get taskDescription {
     Source librarySource = libraryElement.source;
     if (librarySource == null) {
@@ -10654,6 +11050,7 @@
     return "generate Dart hints for ${librarySource.fullName}";
   }
 
+  @override
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     List<CompilationUnitElement> parts = libraryElement.parts;
@@ -10664,7 +11061,7 @@
     // Get all of the (fully resolved) compilation units that will be analyzed.
     //
     Source unitSource = libraryElement.definingCompilationUnit.source;
-    TimestampedData<CompilationUnit> resolvedUnit = getCompilationUnit(unitSource);
+    TimestampedData<CompilationUnit> resolvedUnit = _getCompilationUnit(unitSource);
     timestampMap[unitSource] = resolvedUnit;
     CompilationUnit unit = resolvedUnit.data;
     if (unit == null) {
@@ -10673,7 +11070,7 @@
     compilationUnits[0] = unit;
     for (int i = 0; i < partCount; i++) {
       unitSource = parts[i].source;
-      resolvedUnit = getCompilationUnit(unitSource);
+      resolvedUnit = _getCompilationUnit(unitSource);
       timestampMap[unitSource] = resolvedUnit;
       unit = resolvedUnit.data;
       if (unit == null) {
@@ -10705,7 +11102,7 @@
    * @return the resolved compilation unit associated with the given source
    * @throws AnalysisException if the resolved compilation unit could not be computed
    */
-  TimestampedData<CompilationUnit> getCompilationUnit(Source unitSource) => context.internalResolveCompilationUnit(unitSource, libraryElement);
+  TimestampedData<CompilationUnit> _getCompilationUnit(Source unitSource) => context.internalResolveCompilationUnit(unitSource, libraryElement);
 }
 
 /**
@@ -10745,6 +11142,7 @@
     }
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this);
 
   /**
@@ -10774,8 +11172,10 @@
    */
   bool get isComplete => _complete;
 
+  @override
   String get taskDescription => "get contents of ${source.fullName}";
 
+  @override
   void internalPerform() {
     _complete = true;
     try {
@@ -10810,6 +11210,7 @@
    */
   IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
 
   /**
@@ -10828,8 +11229,10 @@
    */
   Source get source => cache != null ? cache.source : null;
 
+  @override
   String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
 
+  @override
   void internalPerform() {
     if (cache == null) {
       return;
@@ -10928,6 +11331,7 @@
     this._tokenStream = tokenStream;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
 
   /**
@@ -10939,8 +11343,8 @@
   CompilationUnit get compilationUnit => _unit;
 
   /**
-   * Return the errors that were produced by scanning and parsing the source, or `null` if the
-   * task has not yet been performed or if an exception occurred.
+   * Return the errors that were produced by scanning and parsing the source, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
    *
    * @return the errors that were produced by scanning and parsing the source
    */
@@ -10962,6 +11366,7 @@
    */
   bool get hasPartOfDirective => _containsPartOfDirective;
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "parse as dart null source";
@@ -10969,6 +11374,7 @@
     return "parse as dart ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     InternalAnalysisContext context = this.context;
@@ -11056,6 +11462,7 @@
     this._content = content;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
 
   /**
@@ -11088,6 +11495,7 @@
    */
   List<Source> get referencedLibraries => _referencedLibraries;
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "parse as html null source";
@@ -11095,6 +11503,7 @@
     return "parse as html ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     try {
       ht.AbstractScanner scanner = new ht.StringScanner(source, _content);
@@ -11132,6 +11541,7 @@
 
   RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources(this.ParseHtmlTask_this, this.libraries) : super();
 
+  @override
   Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
     ht.XmlAttributeNode scriptAttribute = null;
     for (ht.XmlAttributeNode attribute in node.attributes) {
@@ -11210,6 +11620,7 @@
     this._application = application;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularComponentTemplateTask(this);
 
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
@@ -11221,8 +11632,10 @@
    */
   ht.HtmlUnit get resolvedUnit => _resolvedUnit;
 
+  @override
   String get taskDescription => "resolving Angular template ${source}";
 
+  @override
   void internalPerform() {
     //
     // Prepare for resolution.
@@ -11296,6 +11709,7 @@
     this._unit = unit;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularEntryHtmlTask(this);
 
   /**
@@ -11323,6 +11737,7 @@
    */
   ht.HtmlUnit get resolvedUnit => _resolvedUnit;
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "resolve as Angular entry point null source";
@@ -11330,6 +11745,7 @@
     return "resolve as Angular entry point ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     //
     // Prepare for resolution.
@@ -11388,6 +11804,16 @@
   Set<Source> _includedSources = new Set<Source>();
 
   /**
+   * The errors that were produced by resolving the directives.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
    * Initialize a newly created task to perform analysis within the given context.
    *
    * @param context the context in which the task is to be performed
@@ -11399,15 +11825,24 @@
     this._unit = unit;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartDependenciesTask(this);
 
   /**
+   * Return the errors that were produced by resolving the directives, or an empty array if the task
+   * has not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by resolving the directives.
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
    * Return an array containing the sources referenced by 'export' directives, or an empty array if
    * the task has not yet been performed or if an exception occurred.
    *
    * @return an array containing the sources referenced by 'export' directives
    */
-  List<Source> get exportedSources => toArray(_exportedSources);
+  List<Source> get exportedSources => _toArray(_exportedSources);
 
   /**
    * Return an array containing the sources referenced by 'import' directives, or an empty array if
@@ -11415,7 +11850,7 @@
    *
    * @return an array containing the sources referenced by 'import' directives
    */
-  List<Source> get importedSources => toArray(_importedSources);
+  List<Source> get importedSources => _toArray(_importedSources);
 
   /**
    * Return an array containing the sources referenced by 'part' directives, or an empty array if
@@ -11423,8 +11858,9 @@
    *
    * @return an array containing the sources referenced by 'part' directives
    */
-  List<Source> get includedSources => toArray(_includedSources);
+  List<Source> get includedSources => _toArray(_includedSources);
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "resolve dart dependencies null source";
@@ -11432,27 +11868,30 @@
     return "resolve dart dependencies ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
     try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
       for (Directive directive in _unit.directives) {
         if (directive is ExportDirective) {
-          Source exportSource = resolveSource(source, directive);
+          Source exportSource = _resolveSource(source, directive, errorListener);
           if (exportSource != null) {
             _exportedSources.add(exportSource);
           }
         } else if (directive is ImportDirective) {
-          Source importSource = resolveSource(source, directive);
+          Source importSource = _resolveSource(source, directive, errorListener);
           if (importSource != null) {
             _importedSources.add(importSource);
           }
         } else if (directive is PartDirective) {
-          Source partSource = resolveSource(source, directive);
+          Source partSource = _resolveSource(source, directive, errorListener);
           if (partSource != null) {
             _includedSources.add(partSource);
           }
         }
       }
+      _errors = errorListener.errors;
     } finally {
       timeCounterParse.stop();
     }
@@ -11464,24 +11903,34 @@
    *
    * @param librarySource the source representing the library containing the directive
    * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
    * @return the result of resolving the URI against the URI of the library
    */
-  Source resolveSource(Source librarySource, UriBasedDirective directive) {
+  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
     StringLiteral uriLiteral = directive.uri;
     if (uriLiteral is StringInterpolation) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
       return null;
     }
     String uriContent = uriLiteral.stringValue.trim();
-    if (uriContent == null) {
+    directive.uriContent = uriContent;
+    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
       return null;
     }
-    uriContent = Uri.encodeFull(uriContent);
     try {
-      parseUriWithException(uriContent);
-      return context.sourceFactory.resolveUri(librarySource, uriContent);
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      parseUriWithException(encodedUriContent);
+      AnalysisContext analysisContext = context;
+      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      if (!analysisContext.exists(source)) {
+        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+      }
+      directive.source = source;
+      return source;
     } on URISyntaxException catch (exception) {
-      return null;
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
     }
+    return null;
   }
 
   /**
@@ -11490,7 +11939,7 @@
    * @param sources the set to be converted
    * @return an array containing all of the sources in the given set
    */
-  List<Source> toArray(Set<Source> sources) {
+  List<Source> _toArray(Set<Source> sources) {
     int size = sources.length;
     if (size == 0) {
       return Source.EMPTY_ARRAY;
@@ -11527,6 +11976,7 @@
    */
   ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context);
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
 
   /**
@@ -11536,6 +11986,7 @@
    */
   LibraryResolver get libraryResolver => _resolver;
 
+  @override
   String get taskDescription {
     if (librarySource == null) {
       return "resolve library null source";
@@ -11543,6 +11994,7 @@
     return "resolve library ${librarySource.fullName}";
   }
 
+  @override
   void internalPerform() {
     _resolver = new LibraryResolver(context);
     _resolver.resolveLibrary(librarySource, true);
@@ -11585,6 +12037,7 @@
     this._libraryElement = libraryElement;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this);
 
   /**
@@ -11609,6 +12062,7 @@
    */
   CompilationUnit get resolvedUnit => _resolvedUnit;
 
+  @override
   String get taskDescription {
     Source librarySource = _libraryElement.source;
     if (librarySource == null) {
@@ -11617,6 +12071,7 @@
     return "resolve unit ${librarySource.fullName}";
   }
 
+  @override
   void internalPerform() {
     TypeProvider typeProvider = (_libraryElement.context as InternalAnalysisContext).typeProvider;
     ResolvableCompilationUnit resolvableUnit = context.computeResolvableCompilationUnit(source);
@@ -11628,7 +12083,7 @@
     //
     // Resolve names in declarations.
     //
-    new DeclarationResolver().resolve(unit, find(_libraryElement, source));
+    new DeclarationResolver().resolve(unit, _find(_libraryElement, source));
     //
     // Resolve the type names.
     //
@@ -11675,7 +12130,7 @@
    * @param unitSource the source for the compilation unit whose element is to be returned
    * @return the element representing the compilation unit
    */
-  CompilationUnitElement find(LibraryElement libraryElement, Source unitSource) {
+  CompilationUnitElement _find(LibraryElement libraryElement, Source unitSource) {
     CompilationUnitElement element = libraryElement.definingCompilationUnit;
     if (element.source == unitSource) {
       return element;
@@ -11735,6 +12190,7 @@
     this._unit = unit;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this);
 
   HtmlElement get element => _element;
@@ -11748,6 +12204,7 @@
    */
   ht.HtmlUnit get resolvedUnit => _resolvedUnit;
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "resolve as html null source";
@@ -11755,6 +12212,7 @@
     return "resolve as html ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     //
     // Build the standard HTML element.
@@ -11819,6 +12277,7 @@
     this._content = content;
   }
 
+  @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this);
 
   /**
@@ -11845,6 +12304,7 @@
    */
   Token get tokenStream => _tokenStream;
 
+  @override
   String get taskDescription {
     if (source == null) {
       return "scan as dart null source";
@@ -11852,6 +12312,7 @@
     return "scan as dart ${source.fullName}";
   }
 
+  @override
   void internalPerform() {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     TimeCounter_TimeCounterHandle timeCounterScan = PerformanceStatistics.scan.start();
@@ -11892,10 +12353,13 @@
    */
   WaitForAsyncTask() : super(null);
 
+  @override
   accept(AnalysisTaskVisitor visitor) => null;
 
+  @override
   String get taskDescription => "Waiting for async analysis";
 
+  @override
   void internalPerform() {
   }
 }
@@ -11938,22 +12402,26 @@
    * @param message an explanation of why the error occurred or what it means
    * @param exception the exception being logged
    */
-  void logInformation3(String message, Exception exception);
+  void logInformation2(String message, Exception exception);
 }
 
 /**
  * Implementation of [Logger] that does nothing.
  */
 class Logger_NullLogger implements Logger {
+  @override
   void logError(String message) {
   }
 
+  @override
   void logError2(String message, Exception exception) {
   }
 
+  @override
   void logInformation(String message) {
   }
 
-  void logInformation3(String message, Exception exception) {
+  @override
+  void logInformation2(String message, Exception exception) {
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 8830651..3dc1b49 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -99,6 +99,7 @@
    */
   AnalysisErrorWithProperties.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) : super.con2(source, offset, length, errorCode, arguments);
 
+  @override
   Object getProperty(ErrorProperty property) => _propertyMap[property];
 
   /**
@@ -130,6 +131,7 @@
    */
   bool get errorReported => _errorReported;
 
+  @override
   void onError(AnalysisError error) {
     _errorReported = true;
   }
@@ -211,12 +213,16 @@
     this._severity = ErrorSeverity.INFO;
   }
 
+  @override
   String get correction => null;
 
+  @override
   ErrorSeverity get errorSeverity => _severity;
 
+  @override
   String get message => _message;
 
+  @override
   ErrorType get type => ErrorType.ANGULAR;
 }
 
@@ -436,6 +442,7 @@
     }
   }
 
+  @override
   bool operator ==(Object obj) {
     if (identical(obj, this)) {
       return true;
@@ -507,6 +514,7 @@
    */
   Object getProperty(ErrorProperty property) => null;
 
+  @override
   int get hashCode {
     int hashCode = _offset;
     hashCode ^= (_message != null) ? _message.hashCode : 0;
@@ -514,6 +522,7 @@
     return hashCode;
   }
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append((source != null) ? source.fullName : "<unknown source>");
@@ -572,12 +581,16 @@
 
   TodoCode(String name, int ordinal) : super(name, ordinal);
 
+  @override
   String get correction => null;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
 
+  @override
   String get message => "%s";
 
+  @override
   ErrorType get type => ErrorType.TODO;
 }
 
@@ -825,10 +838,13 @@
     this.correction3 = correction;
   }
 
+  @override
   String get correction => correction3;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorType.HINT.severity;
 
+  @override
   ErrorType get type => ErrorType.HINT;
 }
 
@@ -2283,10 +2299,13 @@
     this.correction2 = correction;
   }
 
+  @override
   String get correction => correction2;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
 
+  @override
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
 }
 
@@ -2353,10 +2372,13 @@
     this.correction5 = correction;
   }
 
+  @override
   String get correction => correction5;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorType.PUB_SUGGESTION.severity;
 
+  @override
   ErrorType get type => ErrorType.PUB_SUGGESTION;
 }
 
@@ -3237,10 +3259,13 @@
     this.correction7 = correction;
   }
 
+  @override
   String get correction => correction7;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
 
+  @override
   ErrorType get type => ErrorType.STATIC_WARNING;
 }
 
@@ -3263,6 +3288,7 @@
 }
 
 class AnalysisErrorListener_NULL_LISTENER implements AnalysisErrorListener {
+  @override
   void onError(AnalysisError event) {
   }
 }
@@ -3320,10 +3346,13 @@
     this.correction4 = correction;
   }
 
+  @override
   String get correction => correction4;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
 
+  @override
   ErrorType get type => ErrorType.STATIC_WARNING;
 }
 
@@ -3645,9 +3674,12 @@
     this.correction6 = correction;
   }
 
+  @override
   String get correction => correction6;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
 
+  @override
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index c8b4c3b..534083b 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -135,6 +135,7 @@
     return token;
   }
 
+  @override
   String toString() => lexeme;
 }
 
@@ -147,12 +148,16 @@
 
   RawXmlExpression(this.expression);
 
+  @override
   int get end => expression.end;
 
+  @override
   int get length => expression.length;
 
+  @override
   int get offset => expression.offset;
 
+  @override
   XmlExpression_Reference getReference(int offset) {
     AstNode node = new NodeLocator.con1(offset).searchWithin(expression);
     if (node != null) {
@@ -174,21 +179,25 @@
  * of the visited node to not be visited.
  */
 class RecursiveXmlVisitor<R> implements XmlVisitor<R> {
+  @override
   R visitHtmlScriptTagNode(HtmlScriptTagNode node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitHtmlUnit(HtmlUnit node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitXmlAttributeNode(XmlAttributeNode node) {
     node.visitChildren(this);
     return null;
   }
 
+  @override
   R visitXmlTagNode(XmlTagNode node) {
     node.visitChildren(this);
     return null;
@@ -250,6 +259,23 @@
   }
 
   /**
+   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and encloses the
+   * given offset.
+   */
+  static XmlTagNode getEnclosingTagNode(HtmlUnit htmlUnit, int offset) {
+    if (htmlUnit == null) {
+      return null;
+    }
+    List<XmlTagNode> result = [null];
+    try {
+      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset, result));
+    } on HtmlUnitUtils_FoundTagNodeError catch (e) {
+      return result[0];
+    }
+    return null;
+  }
+
+  /**
    * Returns the [Expression] that is part of the given [HtmlUnit] and encloses the
    * given offset.
    */
@@ -268,19 +294,26 @@
   }
 
   /**
-   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and encloses the
-   * given offset.
+   * Returns the [XmlTagNode] that is part of the given [HtmlUnit] and its open or
+   * closing tag name encloses the given offset.
    */
   static XmlTagNode getTagNode(HtmlUnit htmlUnit, int offset) {
-    if (htmlUnit == null) {
+    XmlTagNode node = getEnclosingTagNode(htmlUnit, offset);
+    // do we have an enclosing tag at all?
+    if (node == null) {
       return null;
     }
-    List<XmlTagNode> result = [null];
-    try {
-      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getTagNode(offset, result));
-    } on HtmlUnitUtils_FoundTagNodeError catch (e) {
-      return result[0];
+    // is "offset" in the open tag?
+    Token openTag = node.tagToken;
+    if (openTag.offset <= offset && offset <= openTag.end) {
+      return node;
     }
+    // is "offset" in the open tag?
+    Token closeTag = node.closingTag;
+    if (closeTag != null && closeTag.offset <= offset && offset <= closeTag.end) {
+      return node;
+    }
+    // not on a tag name
     return null;
   }
 
@@ -288,8 +321,8 @@
    * Returns the [Expression] that is part of the given root [AstNode] and encloses the
    * given offset.
    */
-  static Expression getExpressionAt(AstNode root, int offset) {
-    if (root.offset <= offset && offset < root.end) {
+  static Expression _getExpressionAt(AstNode root, int offset) {
+    if (root.offset <= offset && offset <= root.end) {
       AstNode dartNode = new NodeLocator.con1(offset).searchWithin(root);
       if (dartNode is Expression) {
         return dartNode;
@@ -315,9 +348,10 @@
 
   RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset, this.result) : super();
 
+  @override
   Object visitXmlAttributeNode(XmlAttributeNode node) {
     Token nameToken = node.nameToken;
-    if (nameToken.offset <= offset && offset < nameToken.end) {
+    if (nameToken.offset <= offset && offset <= nameToken.end) {
       result[0] = node;
       throw new HtmlUnitUtils_FoundAttributeNodeError();
     }
@@ -325,6 +359,24 @@
   }
 }
 
+class RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode extends RecursiveXmlVisitor<Object> {
+  int offset = 0;
+
+  List<XmlTagNode> result;
+
+  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset, this.result) : super();
+
+  @override
+  Object visitXmlTagNode(XmlTagNode node) {
+    if (node.offset <= offset && offset < node.end) {
+      result[0] = node;
+      super.visitXmlTagNode(node);
+      throw new HtmlUnitUtils_FoundTagNodeError();
+    }
+    return null;
+  }
+}
+
 class ExpressionVisitor_HtmlUnitUtils_getExpression extends ExpressionVisitor {
   int offset = 0;
 
@@ -332,8 +384,9 @@
 
   ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset, this.result) : super();
 
+  @override
   void visitExpression(Expression expression) {
-    Expression at = HtmlUnitUtils.getExpressionAt(expression, offset);
+    Expression at = HtmlUnitUtils._getExpressionAt(expression, offset);
     if (at != null) {
       result[0] = at;
       throw new HtmlUnitUtils_FoundExpressionError();
@@ -341,24 +394,6 @@
   }
 }
 
-class RecursiveXmlVisitor_HtmlUnitUtils_getTagNode extends RecursiveXmlVisitor<Object> {
-  int offset = 0;
-
-  List<XmlTagNode> result;
-
-  RecursiveXmlVisitor_HtmlUnitUtils_getTagNode(this.offset, this.result) : super();
-
-  Object visitXmlTagNode(XmlTagNode node) {
-    super.visitXmlTagNode(node);
-    Token tagToken = node.tagToken;
-    if (tagToken.offset <= offset && offset < tagToken.end) {
-      result[0] = node;
-      throw new HtmlUnitUtils_FoundTagNodeError();
-    }
-    return null;
-  }
-}
-
 /**
  * Instances of the class `HtmlScriptTagNode` represent a script tag within an HTML file that
  * references a Dart script.
@@ -389,6 +424,7 @@
    */
   HtmlScriptTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) : super(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
 
+  @override
   accept(XmlVisitor visitor) => visitor.visitHtmlScriptTagNode(this);
 
   /**
@@ -509,6 +545,7 @@
     this._element = element;
   }
 
+  @override
   String toString() {
     PrintStringWriter writer = new PrintStringWriter();
     accept(new ToSourceVisitor(writer));
@@ -541,9 +578,15 @@
    * Make this node the parent of the given child nodes.
    *
    * @param children the nodes that will become the children of this node
+   * @param ifEmpty the (empty) nodes to return if "children" is empty
    * @return the nodes that were made children of this node
    */
-  List becomeParentOfAll(List children) {
+  List becomeParentOfAll(List children, {List ifEmpty}) {
+    if (children == null || children.isEmpty) {
+      if (ifEmpty != null) {
+        return ifEmpty;
+      }
+    }
     if (children != null) {
       for (JavaIterator iter = new JavaIterator(children); iter.hasNext;) {
         XmlNode node = iter.next();
@@ -558,7 +601,7 @@
   /**
    * This method exists for debugging purposes only.
    */
-  void appendIdentifier(JavaStringBuilder builder, XmlNode node) {
+  void _appendIdentifier(JavaStringBuilder builder, XmlNode node) {
     if (node is XmlTagNode) {
       builder.append(node.tag);
     } else if (node is XmlAttributeNode) {
@@ -571,7 +614,7 @@
   /**
    * This method exists for debugging purposes only.
    */
-  String buildRecursiveStructureMessage(XmlNode newParent) {
+  String _buildRecursiveStructureMessage(XmlNode newParent) {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("Attempt to create recursive structure: ");
     XmlNode current = newParent;
@@ -581,10 +624,10 @@
       }
       if (identical(current, this)) {
         builder.appendChar(0x2A);
-        appendIdentifier(builder, current);
+        _appendIdentifier(builder, current);
         builder.appendChar(0x2A);
       } else {
-        appendIdentifier(builder, current);
+        _appendIdentifier(builder, current);
       }
       current = current.parent;
     }
@@ -600,7 +643,7 @@
     XmlNode current = newParent;
     while (current != null) {
       if (identical(current, this)) {
-        AnalysisEngine.instance.logger.logError2("Circular structure while setting an XML node's parent", new IllegalArgumentException(buildRecursiveStructureMessage(newParent)));
+        AnalysisEngine.instance.logger.logError2("Circular structure while setting an XML node's parent", new IllegalArgumentException(_buildRecursiveStructureMessage(newParent)));
         return;
       }
       current = current.parent;
@@ -616,12 +659,16 @@
  * structure) and that only need to visit a small number of node types.
  */
 class SimpleXmlVisitor<R> implements XmlVisitor<R> {
+  @override
   R visitHtmlScriptTagNode(HtmlScriptTagNode node) => null;
 
+  @override
   R visitHtmlUnit(HtmlUnit htmlUnit) => null;
 
+  @override
   R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
 
+  @override
   R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
 }
 
@@ -698,9 +745,9 @@
    * @return the first token in the list of tokens that were produced
    */
   Token tokenize() {
-    scan();
-    appendEofToken();
-    return firstToken();
+    _scan();
+    _appendEofToken();
+    return _firstToken();
   }
 
   /**
@@ -736,26 +783,26 @@
     _lineStarts.add(offset);
   }
 
-  void appendEofToken() {
+  void _appendEofToken() {
     Token eofToken = new Token.con1(TokenType.EOF, offset);
     // The EOF token points to itself so that there is always infinite look-ahead.
     eofToken.setNext(eofToken);
     _tail = _tail.setNext(eofToken);
   }
 
-  Token emit(Token token) {
+  Token _emit(Token token) {
     _tail.setNext(token);
     _tail = token;
     return token;
   }
 
-  Token emitWithOffset(TokenType type, int start) => emit(new Token.con1(type, start));
+  Token _emitWithOffset(TokenType type, int start) => _emit(new Token.con1(type, start));
 
-  Token emitWithOffsetAndLength(TokenType type, int start, int count) => emit(new Token.con2(type, start, getString(start, count)));
+  Token _emitWithOffsetAndLength(TokenType type, int start, int count) => _emit(new Token.con2(type, start, getString(start, count)));
 
-  Token firstToken() => _tokens.next;
+  Token _firstToken() => _tokens.next;
 
-  int recordStartOfLineAndAdvance(int c) {
+  int _recordStartOfLineAndAdvance(int c) {
     if (c == 0xD) {
       c = advance();
       if (c == 0xA) {
@@ -771,7 +818,7 @@
     return c;
   }
 
-  void scan() {
+  void _scan() {
     bool inBrackets = false;
     String endPassThrough = null;
     int c = advance();
@@ -794,9 +841,9 @@
               } else {
                 dashCount = 0;
               }
-              c = recordStartOfLineAndAdvance(c);
+              c = _recordStartOfLineAndAdvance(c);
             }
-            emitWithOffsetAndLength(TokenType.COMMENT, start, -1);
+            _emitWithOffsetAndLength(TokenType.COMMENT, start, -1);
             // Capture <!--> and <!---> as tokens but report an error
             if (_tail.length < 7) {
             }
@@ -807,9 +854,9 @@
                 c = advance();
                 break;
               }
-              c = recordStartOfLineAndAdvance(c);
+              c = _recordStartOfLineAndAdvance(c);
             }
-            emitWithOffsetAndLength(TokenType.DECLARATION, start, -1);
+            _emitWithOffsetAndLength(TokenType.DECLARATION, start, -1);
             if (!StringUtilities.endsWithChar(_tail.lexeme, 0x3E)) {
             }
           }
@@ -823,22 +870,22 @@
                 break;
               }
             } else {
-              c = recordStartOfLineAndAdvance(c);
+              c = _recordStartOfLineAndAdvance(c);
             }
           }
-          emitWithOffsetAndLength(TokenType.DIRECTIVE, start, -1);
+          _emitWithOffsetAndLength(TokenType.DIRECTIVE, start, -1);
           if (_tail.length < 4) {
           }
         } else if (c == 0x2F) {
-          emitWithOffset(TokenType.LT_SLASH, start);
+          _emitWithOffset(TokenType.LT_SLASH, start);
           inBrackets = true;
           c = advance();
         } else {
           inBrackets = true;
-          emitWithOffset(TokenType.LT, start);
+          _emitWithOffset(TokenType.LT, start);
           // ignore whitespace in braces
           while (Character.isWhitespace(c)) {
-            c = recordStartOfLineAndAdvance(c);
+            c = _recordStartOfLineAndAdvance(c);
           }
           // get tag
           if (Character.isLetterOrDigit(c)) {
@@ -847,7 +894,7 @@
             while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
               c = advance();
             }
-            emitWithOffsetAndLength(TokenType.TAG, tagStart, -1);
+            _emitWithOffsetAndLength(TokenType.TAG, tagStart, -1);
             // check tag against passThrough elements
             String tag = _tail.lexeme;
             for (String str in _passThroughElements) {
@@ -859,7 +906,7 @@
           }
         }
       } else if (c == 0x3E) {
-        emitWithOffset(TokenType.GT, start);
+        _emitWithOffset(TokenType.GT, start);
         inBrackets = false;
         c = advance();
         // if passThrough != null, read until we match it
@@ -884,30 +931,30 @@
               index = 0;
               nextC = firstC;
             }
-            c = recordStartOfLineAndAdvance(c);
+            c = _recordStartOfLineAndAdvance(c);
           }
           if (start + 1 < offset) {
             if (endFound) {
-              emitWithOffsetAndLength(TokenType.TEXT, start + 1, -len);
-              emitWithOffset(TokenType.LT_SLASH, offset - len + 1);
-              emitWithOffsetAndLength(TokenType.TAG, offset - len + 3, -1);
+              _emitWithOffsetAndLength(TokenType.TEXT, start + 1, -len);
+              _emitWithOffset(TokenType.LT_SLASH, offset - len + 1);
+              _emitWithOffsetAndLength(TokenType.TAG, offset - len + 3, -1);
             } else {
-              emitWithOffsetAndLength(TokenType.TEXT, start + 1, -1);
+              _emitWithOffsetAndLength(TokenType.TEXT, start + 1, -1);
             }
           }
           endPassThrough = null;
         }
       } else if (c == 0x2F && peek() == 0x3E) {
         advance();
-        emitWithOffset(TokenType.SLASH_GT, start);
+        _emitWithOffset(TokenType.SLASH_GT, start);
         inBrackets = false;
         c = advance();
       } else if (!inBrackets) {
-        c = recordStartOfLineAndAdvance(c);
+        c = _recordStartOfLineAndAdvance(c);
         while (c != 0x3C && c >= 0) {
-          c = recordStartOfLineAndAdvance(c);
+          c = _recordStartOfLineAndAdvance(c);
         }
-        emitWithOffsetAndLength(TokenType.TEXT, start, -1);
+        _emitWithOffsetAndLength(TokenType.TEXT, start, -1);
       } else if (c == 0x22 || c == 0x27) {
         // read a string
         int endQuote = c;
@@ -917,27 +964,27 @@
             c = advance();
             break;
           }
-          c = recordStartOfLineAndAdvance(c);
+          c = _recordStartOfLineAndAdvance(c);
         }
-        emitWithOffsetAndLength(TokenType.STRING, start, -1);
+        _emitWithOffsetAndLength(TokenType.STRING, start, -1);
       } else if (c == 0x3D) {
         // a non-char token
-        emitWithOffset(TokenType.EQ, start);
+        _emitWithOffset(TokenType.EQ, start);
         c = advance();
       } else if (Character.isWhitespace(c)) {
         // ignore whitespace in braces
         do {
-          c = recordStartOfLineAndAdvance(c);
+          c = _recordStartOfLineAndAdvance(c);
         } while (Character.isWhitespace(c));
       } else if (Character.isLetterOrDigit(c)) {
         c = advance();
         while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
           c = advance();
         }
-        emitWithOffsetAndLength(TokenType.TAG, start, -1);
+        _emitWithOffsetAndLength(TokenType.TAG, start, -1);
       } else {
         // a non-char token
-        emitWithOffsetAndLength(TokenType.TEXT, start, 0);
+        _emitWithOffsetAndLength(TokenType.TEXT, start, 0);
         c = advance();
       }
     }
@@ -976,12 +1023,14 @@
     this._charOffset = -1;
   }
 
+  @override
   int get offset => _charOffset;
 
   void set offset(int offset) {
     _charOffset = offset;
   }
 
+  @override
   int advance() {
     if (++_charOffset < _stringLength) {
       return _string.codeUnitAt(_charOffset);
@@ -990,8 +1039,10 @@
     return -1;
   }
 
+  @override
   String getString(int start, int endDelta) => _string.substring(start, _charOffset + 1 + endDelta).toString();
 
+  @override
   int peek() {
     if (_charOffset + 1 < _stringLength) {
       return _string.codeUnitAt(_charOffset + 1);
@@ -1020,15 +1071,18 @@
     this._writer = writer;
   }
 
+  @override
   Object visitHtmlScriptTagNode(HtmlScriptTagNode node) => visitXmlTagNode(node);
 
+  @override
   Object visitHtmlUnit(HtmlUnit node) {
     for (XmlTagNode child in node.tagNodes) {
-      visit(child);
+      _visit(child);
     }
     return null;
   }
 
+  @override
   Object visitXmlAttributeNode(XmlAttributeNode node) {
     String name = node.name;
     Token value = node.valueToken;
@@ -1046,18 +1100,19 @@
     return null;
   }
 
+  @override
   Object visitXmlTagNode(XmlTagNode node) {
     _writer.print("<");
     String tagName = node.tag;
     _writer.print(tagName);
     for (XmlAttributeNode attribute in node.attributes) {
       _writer.print(" ");
-      visit(attribute);
+      _visit(attribute);
     }
     _writer.print(node.attributeEnd.lexeme);
     if (node.closingTag != null) {
       for (XmlTagNode child in node.tagNodes) {
-        visit(child);
+        _visit(child);
       }
       _writer.print("</");
       _writer.print(tagName);
@@ -1071,7 +1126,7 @@
    *
    * @param node the node to be visited
    */
-  void visit(XmlNode node) {
+  void _visit(XmlNode node) {
     if (node != null) {
       node.accept(this);
     }
@@ -1136,6 +1191,7 @@
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
 
+  @override
   String toString() => "-eof-";
 }
 
@@ -1164,10 +1220,13 @@
     this._value = value;
   }
 
+  @override
   accept(XmlVisitor visitor) => visitor.visitXmlAttributeNode(this);
 
+  @override
   Token get beginToken => _name;
 
+  @override
   Token get endToken => _value;
 
   /**
@@ -1223,6 +1282,7 @@
    */
   Token get valueToken => _value;
 
+  @override
   void visitChildren(XmlVisitor visitor) {
   }
 }
@@ -1368,12 +1428,12 @@
     TokenType type = _currentToken.type;
     while (type != TokenType.EOF) {
       if (identical(type, TokenType.LT)) {
-        tagNodes.add(parseTagNode());
+        tagNodes.add(_parseTagNode());
       } else if (identical(type, TokenType.DECLARATION) || identical(type, TokenType.DIRECTIVE) || identical(type, TokenType.COMMENT)) {
         // ignored tokens
         _currentToken = _currentToken.next;
       } else {
-        reportUnexpectedToken();
+        _reportUnexpectedToken();
         _currentToken = _currentToken.next;
       }
       type = _currentToken.type;
@@ -1394,7 +1454,7 @@
    * @param type the type of token to be inserted (not `null`)
    * @return the synthetic token that was inserted (not `null`)
    */
-  Token insertSyntheticToken(TokenType type) {
+  Token _insertSyntheticToken(TokenType type) {
     Token token = new Token.con2(type, _currentToken.offset, "");
     _currentToken.previous.setNext(token);
     token.setNext(_currentToken);
@@ -1407,7 +1467,7 @@
    *
    * @return the attribute (not `null`)
    */
-  XmlAttributeNode parseAttribute() {
+  XmlAttributeNode _parseAttribute() {
     // Assume the current token is a tag
     Token name = _currentToken;
     _currentToken = _currentToken.next;
@@ -1417,8 +1477,8 @@
       equals = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      equals = insertSyntheticToken(TokenType.EQ);
+      _reportUnexpectedToken();
+      equals = _insertSyntheticToken(TokenType.EQ);
     }
     // String value
     Token value;
@@ -1426,8 +1486,8 @@
       value = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      value = insertSyntheticToken(TokenType.STRING);
+      _reportUnexpectedToken();
+      value = _insertSyntheticToken(TokenType.STRING);
     }
     return createAttributeNode(name, equals, value);
   }
@@ -1438,7 +1498,7 @@
    *
    * @return a collection of zero or more attributes (not `null`, contains no `null`s)
    */
-  List<XmlAttributeNode> parseAttributes() {
+  List<XmlAttributeNode> _parseAttributes() {
     TokenType type = _currentToken.type;
     if (identical(type, TokenType.GT) || identical(type, TokenType.SLASH_GT) || identical(type, TokenType.EOF)) {
       return XmlTagNode.NO_ATTRIBUTES;
@@ -1446,9 +1506,9 @@
     List<XmlAttributeNode> attributes = new List<XmlAttributeNode>();
     while (type != TokenType.GT && type != TokenType.SLASH_GT && type != TokenType.EOF) {
       if (identical(type, TokenType.TAG)) {
-        attributes.add(parseAttribute());
+        attributes.add(_parseAttribute());
       } else {
-        reportUnexpectedToken();
+        _reportUnexpectedToken();
         _currentToken = _currentToken.next;
       }
       type = _currentToken.type;
@@ -1462,7 +1522,7 @@
    *
    * @return a list of nodes (not `null`, contains no `null`s)
    */
-  List<XmlTagNode> parseChildTagNodes() {
+  List<XmlTagNode> _parseChildTagNodes() {
     TokenType type = _currentToken.type;
     if (identical(type, TokenType.LT_SLASH) || identical(type, TokenType.EOF)) {
       return XmlTagNode.NO_TAG_NODES;
@@ -1470,12 +1530,12 @@
     List<XmlTagNode> nodes = new List<XmlTagNode>();
     while (type != TokenType.LT_SLASH && type != TokenType.EOF) {
       if (identical(type, TokenType.LT)) {
-        nodes.add(parseTagNode());
+        nodes.add(_parseTagNode());
       } else if (identical(type, TokenType.COMMENT)) {
         // ignored token
         _currentToken = _currentToken.next;
       } else {
-        reportUnexpectedToken();
+        _reportUnexpectedToken();
         _currentToken = _currentToken.next;
       }
       type = _currentToken.type;
@@ -1489,7 +1549,7 @@
    *
    * @return the tag node or `null` if none found
    */
-  XmlTagNode parseTagNode() {
+  XmlTagNode _parseTagNode() {
     // Assume that the current node is a tag node start TokenType#LT
     Token nodeStart = _currentToken;
     _currentToken = _currentToken.next;
@@ -1499,26 +1559,26 @@
       tag = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      tag = insertSyntheticToken(TokenType.TAG);
+      _reportUnexpectedToken();
+      tag = _insertSyntheticToken(TokenType.TAG);
     }
     // Parse the attributes
-    List<XmlAttributeNode> attributes = parseAttributes();
+    List<XmlAttributeNode> attributes = _parseAttributes();
     // Token ending attribute list
     Token attributeEnd;
     if (identical(_currentToken.type, TokenType.GT) || identical(_currentToken.type, TokenType.SLASH_GT)) {
       attributeEnd = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      attributeEnd = insertSyntheticToken(TokenType.SLASH_GT);
+      _reportUnexpectedToken();
+      attributeEnd = _insertSyntheticToken(TokenType.SLASH_GT);
     }
     // If the node has no children, then return the node
     if (identical(attributeEnd.type, TokenType.SLASH_GT) || isSelfClosing(tag)) {
       return createTagNode(nodeStart, tag, attributes, attributeEnd, XmlTagNode.NO_TAG_NODES, _currentToken, null, attributeEnd);
     }
     // Parse the child tag nodes
-    List<XmlTagNode> tagNodes = parseChildTagNodes();
+    List<XmlTagNode> tagNodes = _parseChildTagNodes();
     // Token ending child tag nodes
     Token contentEnd;
     if (identical(_currentToken.type, TokenType.LT_SLASH)) {
@@ -1527,8 +1587,8 @@
     } else {
       // TODO (danrubel): handle self closing HTML elements by inserting synthetic tokens
       // but not reporting an error
-      reportUnexpectedToken();
-      contentEnd = insertSyntheticToken(TokenType.LT_SLASH);
+      _reportUnexpectedToken();
+      contentEnd = _insertSyntheticToken(TokenType.LT_SLASH);
     }
     // Closing tag
     Token closingTag;
@@ -1536,8 +1596,8 @@
       closingTag = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      closingTag = insertSyntheticToken(TokenType.TAG);
+      _reportUnexpectedToken();
+      closingTag = _insertSyntheticToken(TokenType.TAG);
     }
     // Token ending node
     Token nodeEnd;
@@ -1545,8 +1605,8 @@
       nodeEnd = _currentToken;
       _currentToken = _currentToken.next;
     } else {
-      reportUnexpectedToken();
-      nodeEnd = insertSyntheticToken(TokenType.GT);
+      _reportUnexpectedToken();
+      nodeEnd = _insertSyntheticToken(TokenType.GT);
     }
     return createTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
   }
@@ -1554,7 +1614,7 @@
   /**
    * Report the current token as unexpected
    */
-  void reportUnexpectedToken() {
+  void _reportUnexpectedToken() {
   }
 }
 
@@ -1653,10 +1713,11 @@
    */
   XmlTagNode(this.nodeStart, Token tag, List<XmlAttributeNode> attributes, this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd, this.closingTag, this.nodeEnd) {
     this._tag = tag;
-    this._attributes = becomeParentOfEmpty(attributes, NO_ATTRIBUTES);
-    this._tagNodes = becomeParentOfEmpty(tagNodes, NO_TAG_NODES);
+    this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
+    this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
   }
 
+  @override
   accept(XmlVisitor visitor) => visitor.visitXmlTagNode(this);
 
   /**
@@ -1695,6 +1756,7 @@
     return attribute != null ? attribute.text : null;
   }
 
+  @override
   Token get beginToken => nodeStart;
 
   /**
@@ -1723,6 +1785,7 @@
     return buffer.toString();
   }
 
+  @override
   Token get endToken {
     if (nodeEnd != null) {
       return nodeEnd;
@@ -1767,6 +1830,7 @@
    */
   Token get tagToken => _tag;
 
+  @override
   void visitChildren(XmlVisitor visitor) {
     for (XmlAttributeNode node in _attributes) {
       node.accept(visitor);
@@ -1775,16 +1839,6 @@
       node.accept(visitor);
     }
   }
-
-  /**
-   * Same as [becomeParentOfAll], but returns given "ifEmpty" if "children" is empty
-   */
-  List becomeParentOfEmpty(List children, List ifEmpty) {
-    if (children != null && children.isEmpty) {
-      return ifEmpty;
-    }
-    return becomeParentOfAll(children);
-  }
 }
 
 /**
@@ -1867,10 +1921,12 @@
     return new HtmlUnit(token, tagNodes, currentToken);
   }
 
+  @override
   XmlAttributeNode createAttributeNode(Token name, Token equals, Token value) => new XmlAttributeNode(name, equals, value);
 
+  @override
   XmlTagNode createTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
-    if (isScriptNode(tag, attributes, tagNodes)) {
+    if (_isScriptNode(tag, attributes, tagNodes)) {
       HtmlScriptTagNode tagNode = new HtmlScriptTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
       String contents = tagNode.content;
       int contentOffset = attributeEnd.end;
@@ -1887,6 +1943,7 @@
     return new XmlTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
   }
 
+  @override
   bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
 
   /**
@@ -1895,7 +1952,7 @@
    * @param node the node to be tested (not `null`)
    * @return `true` if the node is a Dart script
    */
-  bool isScriptNode(Token tag, List<XmlAttributeNode> attributes, List<XmlTagNode> tagNodes) {
+  bool _isScriptNode(Token tag, List<XmlAttributeNode> attributes, List<XmlTagNode> tagNodes) {
     if (tagNodes.length != 0 || tag.lexeme != _SCRIPT) {
       return false;
     }
@@ -1946,6 +2003,7 @@
     this._tagNodes = becomeParentOfAll(tagNodes);
   }
 
+  @override
   accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
 
   /**
@@ -1953,6 +2011,7 @@
    *
    * @return the element or `null` if the receiver is not resolved
    */
+  @override
   HtmlElement get element => super.element as HtmlElement;
 
   /**
@@ -1963,6 +2022,7 @@
    */
   List<XmlTagNode> get tagNodes => _tagNodes;
 
+  @override
   void set element(Element element) {
     if (element != null && element is! HtmlElement) {
       throw new IllegalArgumentException("HtmlElement expected, but ${element.runtimeType} given");
@@ -1970,6 +2030,7 @@
     super.element = element;
   }
 
+  @override
   void visitChildren(XmlVisitor visitor) {
     for (XmlTagNode node in _tagNodes) {
       node.accept(visitor);
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index b95f79e..faeac7a 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -50,14 +50,18 @@
     this._context = context;
   }
 
+  @override
   bool get isQuery => false;
 
+  @override
   void performOperation() {
     _indexStore.removeSource(_context, source);
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => false;
 
+  @override
   String toString() => "RemoveSource(${source.fullName})";
 }
 
@@ -93,8 +97,6 @@
  * [IndexStore] which keeps full index in memory.
  */
 class MemoryIndexStoreImpl implements MemoryIndexStore {
-  static Object _WEAK_SET_VALUE = new Object();
-
   /**
    * When logging is on, [AnalysisEngine] actually creates
    * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
@@ -111,7 +113,7 @@
   /**
    * @return the [Source] of the enclosing [LibraryElement], may be `null`.
    */
-  static Source getLibrarySourceOrNull(Element element) {
+  static Source _getLibrarySourceOrNull(Element element) {
     LibraryElement library = element.library;
     if (library == null) {
       return null;
@@ -123,12 +125,6 @@
   }
 
   /**
-   * We add [AnalysisContext] to this weak set to ensure that we don't continue to add
-   * relationships after some context was removed using [removeContext].
-   */
-  Expando _removedContexts = new Expando();
-
-  /**
    * This map is used to canonicalize equal keys.
    */
   Map<MemoryIndexStoreImpl_ElementRelationKey, MemoryIndexStoreImpl_ElementRelationKey> _canonicalKeys = {};
@@ -168,10 +164,11 @@
 
   int _locationCount = 0;
 
+  @override
   bool aboutToIndexDart(AnalysisContext context, CompilationUnitElement unitElement) {
     context = unwrapContext(context);
-    // may be already removed in other thread
-    if (isRemovedContext(context)) {
+    // may be already disposed in other thread
+    if (context.isDisposed) {
       return false;
     }
     // validate unit
@@ -207,16 +204,16 @@
       if (oldParts != null) {
         Set<Source> noParts = oldParts.difference(newParts);
         for (Source noPart in noParts) {
-          removeLocations(context, library, noPart);
+          _removeLocations(context, library, noPart);
         }
       }
       // remember new parts
       libraryToUnits[library] = newParts;
     }
     // remember libraries in which unit is used
-    recordUnitInLibrary(context, library, unit);
+    _recordUnitInLibrary(context, library, unit);
     // remove locations
-    removeLocations(context, library, unit);
+    _removeLocations(context, library, unit);
     // remove keys
     {
       Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
@@ -232,15 +229,16 @@
     return true;
   }
 
+  @override
   bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
     context = unwrapContext(context);
-    // may be already removed in other thread
-    if (isRemovedContext(context)) {
+    // may be already disposed in other thread
+    if (context.isDisposed) {
       return false;
     }
     // remove locations
     Source source = htmlElement.source;
-    removeLocations(context, null, source);
+    _removeLocations(context, null, source);
     // remove keys
     {
       Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
@@ -253,11 +251,12 @@
       }
     }
     // remember libraries in which unit is used
-    recordUnitInLibrary(context, null, source);
+    _recordUnitInLibrary(context, null, source);
     // OK, we can index
     return true;
   }
 
+  @override
   List<Location> getRelationships(Element element, Relationship relationship) {
     MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
     Set<Location> locations = _keyToLocations[key];
@@ -267,6 +266,7 @@
     return Location.EMPTY_ARRAY;
   }
 
+  @override
   String get statistics => "${_locationCount} relationships in ${_keyCount} keys in ${_sourceCount} sources";
 
   int internalGetKeyCount() => _keyToLocations.length;
@@ -303,11 +303,12 @@
     return count;
   }
 
+  @override
   void recordRelationship(Element element, Relationship relationship, Location location) {
     if (element == null || location == null) {
       return;
     }
-    location = location.clone();
+    location = location.newClone();
     // at the index level we don't care about Member(s)
     if (element is Member) {
       element = (element as Member).baseElement;
@@ -318,8 +319,8 @@
     AnalysisContext locationContext = location.element.context;
     Source elementSource = element.source;
     Source locationSource = location.element.source;
-    Source elementLibrarySource = getLibrarySourceOrNull(element);
-    Source locationLibrarySource = getLibrarySourceOrNull(location.element);
+    Source elementLibrarySource = _getLibrarySourceOrNull(element);
+    Source locationLibrarySource = _getLibrarySourceOrNull(location.element);
     // sanity check
     if (locationContext == null) {
       return;
@@ -333,19 +334,19 @@
     if (elementSource == null && element is! NameElementImpl && element is! UniverseElementImpl) {
       return;
     }
-    // may be already removed in other thread
-    if (isRemovedContext(elementContext)) {
+    // may be already disposed in other thread
+    if (elementContext != null && elementContext.isDisposed) {
       return;
     }
-    if (isRemovedContext(locationContext)) {
+    if (locationContext.isDisposed) {
       return;
     }
     // record: key -> location(s)
-    MemoryIndexStoreImpl_ElementRelationKey key = getCanonicalKey(element, relationship);
+    MemoryIndexStoreImpl_ElementRelationKey key = _getCanonicalKey(element, relationship);
     {
       Set<Location> locations = _keyToLocations.remove(key);
       if (locations == null) {
-        locations = createLocationIdentitySet();
+        locations = _createLocationIdentitySet();
       } else {
         _keyCount--;
       }
@@ -391,13 +392,13 @@
     }
   }
 
+  @override
   void removeContext(AnalysisContext context) {
     context = unwrapContext(context);
     if (context == null) {
       return;
     }
-    // mark as removed
-    markRemovedContext(context);
+    // remove sources
     removeSources(context, null);
     // remove context
     _contextToSourceToKeys.remove(context);
@@ -406,6 +407,7 @@
     _contextToUnitToLibraries.remove(context);
   }
 
+  @override
   void removeSource(AnalysisContext context, Source unit) {
     context = unwrapContext(context);
     if (context == null) {
@@ -419,7 +421,7 @@
         for (Source library in libraries) {
           MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
           // remove locations defined in source
-          removeLocations(context, library, unit);
+          _removeLocations(context, library, unit);
           // remove keys for elements defined in source
           Map<MemoryIndexStoreImpl_Source2, Set<MemoryIndexStoreImpl_ElementRelationKey>> sourceToKeys = _contextToSourceToKeys[context];
           if (sourceToKeys != null) {
@@ -441,6 +443,7 @@
     }
   }
 
+  @override
   void removeSources(AnalysisContext context, SourceContainer container) {
     context = unwrapContext(context);
     if (context == null) {
@@ -473,13 +476,13 @@
   /**
    * Creates new [Set] that uses object identity instead of equals.
    */
-  Set<Location> createLocationIdentitySet() => new Set<Location>.identity();
+  Set<Location> _createLocationIdentitySet() => new Set<Location>.identity();
 
   /**
    * @return the canonical [ElementRelationKey] for given [Element] and
    *         [Relationship], i.e. unique instance for this combination.
    */
-  MemoryIndexStoreImpl_ElementRelationKey getCanonicalKey(Element element, Relationship relationship) {
+  MemoryIndexStoreImpl_ElementRelationKey _getCanonicalKey(Element element, Relationship relationship) {
     MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
     MemoryIndexStoreImpl_ElementRelationKey canonicalKey = _canonicalKeys[key];
     if (canonicalKey == null) {
@@ -489,19 +492,7 @@
     return canonicalKey;
   }
 
-  /**
-   * Checks if given [AnalysisContext] is marked as removed.
-   */
-  bool isRemovedContext(AnalysisContext context) => _removedContexts[context] != null;
-
-  /**
-   * Marks given [AnalysisContext] as removed.
-   */
-  void markRemovedContext(AnalysisContext context) {
-    _removedContexts[context] = true;
-  }
-
-  void recordUnitInLibrary(AnalysisContext context, Source library, Source unit) {
+  void _recordUnitInLibrary(AnalysisContext context, Source library, Source unit) {
     Map<Source, Set<Source>> unitToLibraries = _contextToUnitToLibraries[context];
     if (unitToLibraries == null) {
       unitToLibraries = {};
@@ -518,7 +509,7 @@
   /**
    * Removes locations recorded in the given library/unit pair.
    */
-  void removeLocations(AnalysisContext context, Source library, Source unit) {
+  void _removeLocations(AnalysisContext context, Source library, Source unit) {
     MemoryIndexStoreImpl_Source2 source2 = new MemoryIndexStoreImpl_Source2(library, unit);
     Map<MemoryIndexStoreImpl_Source2, List<Location>> sourceToLocations = _contextToSourceToLocations[context];
     if (sourceToLocations != null) {
@@ -553,12 +544,14 @@
     this._relationship = relationship;
   }
 
+  @override
   bool operator ==(Object obj) {
     MemoryIndexStoreImpl_ElementRelationKey other = obj as MemoryIndexStoreImpl_ElementRelationKey;
     Element otherElement = other._element;
     return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && identical(otherElement.kind, _element.kind) && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
   }
 
+  @override
   int get hashCode => JavaArrays.makeHashCode([
       _element.source,
       _element.nameOffset,
@@ -566,6 +559,7 @@
       _element.displayName,
       _relationship]);
 
+  @override
   String toString() => "${_element} ${_relationship}";
 }
 
@@ -579,6 +573,7 @@
     this._unitSource = unitSource;
   }
 
+  @override
   bool operator ==(Object obj) {
     if (identical(obj, this)) {
       return true;
@@ -590,8 +585,10 @@
     return other._librarySource == _librarySource && other._unitSource == _unitSource;
   }
 
+  @override
   int get hashCode => JavaArrays.makeHashCode([_librarySource, _unitSource]);
 
+  @override
   String toString() => "${_librarySource} ${_unitSource}";
 }
 
@@ -644,8 +641,10 @@
    */
   Source get source => _source;
 
+  @override
   bool get isQuery => false;
 
+  @override
   void performOperation() {
     try {
       bool mayIndex = _indexStore.aboutToIndexDart(_context, _unitElement);
@@ -659,8 +658,10 @@
     }
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => this._source == source;
 
+  @override
   String toString() => "IndexUnitOperation(${_source.fullName})";
 }
 
@@ -675,20 +676,22 @@
    */
   void visitExpression(Expression expression);
 
+  @override
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
-    visitExpressions(node.expressions);
+    _visitExpressions(node.expressions);
     return super.visitXmlAttributeNode(node);
   }
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
-    visitExpressions(node.expressions);
+    _visitExpressions(node.expressions);
     return super.visitXmlTagNode(node);
   }
 
   /**
    * Visits [Expression]s of the given [XmlExpression]s.
    */
-  void visitExpressions(List<ht.XmlExpression> expressions) {
+  void _visitExpressions(List<ht.XmlExpression> expressions) {
     for (ht.XmlExpression xmlExpression in expressions) {
       if (xmlExpression is AngularXmlExpression) {
         AngularXmlExpression angularXmlExpression = xmlExpression;
@@ -756,76 +759,11 @@
    */
   String get identifier => _uniqueId;
 
+  @override
   String toString() => _uniqueId;
 }
 
 /**
- * Implementation of [Index].
- */
-class IndexImpl implements Index {
-  IndexStore _store;
-
-  OperationQueue _queue;
-
-  OperationProcessor _processor;
-
-  IndexImpl(IndexStore store, OperationQueue queue, OperationProcessor processor) {
-    this._store = store;
-    this._queue = queue;
-    this._processor = processor;
-  }
-
-  void getRelationships(Element element, Relationship relationship, RelationshipCallback callback) {
-    _queue.enqueue(new GetRelationshipsOperation(_store, element, relationship, callback));
-  }
-
-  String get statistics => _store.statistics;
-
-  void indexHtmlUnit(AnalysisContext context, ht.HtmlUnit unit) {
-    if (unit == null) {
-      return;
-    }
-    if (unit.element == null) {
-      return;
-    }
-    if (unit.element.angularCompilationUnit == null) {
-      return;
-    }
-    _queue.enqueue(new IndexHtmlUnitOperation(_store, context, unit));
-  }
-
-  void indexUnit(AnalysisContext context, CompilationUnit unit) {
-    if (unit == null) {
-      return;
-    }
-    if (unit.element == null) {
-      return;
-    }
-    _queue.enqueue(new IndexUnitOperation(_store, context, unit));
-  }
-
-  void removeContext(AnalysisContext context) {
-    _queue.enqueue(new RemoveContextOperation(_store, context));
-  }
-
-  void removeSource(AnalysisContext context, Source source) {
-    _queue.enqueue(new RemoveSourceOperation(_store, context, source));
-  }
-
-  void removeSources(AnalysisContext context, SourceContainer container) {
-    _queue.enqueue(new RemoveSourcesOperation(_store, context, container));
-  }
-
-  void run() {
-    _processor.run();
-  }
-
-  void stop() {
-    _processor.stop(false);
-  }
-}
-
-/**
  * Instances of the [RemoveSourcesOperation] implement an operation that removes from the
  * index any data based on the content of source belonging to a [SourceContainer].
  */
@@ -857,14 +795,18 @@
     this._context = context;
   }
 
+  @override
   bool get isQuery => false;
 
+  @override
   void performOperation() {
     _indexStore.removeSources(_context, container);
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => false;
 
+  @override
   String toString() => "RemoveSources(${container})";
 }
 
@@ -877,139 +819,6 @@
 }
 
 /**
- * Instances of the [OperationProcessor] process the operations on a single
- * [OperationQueue]. Each processor can be run one time on a single thread.
- */
-class OperationProcessor {
-  /**
-   * The queue containing the operations to be processed.
-   */
-  OperationQueue _queue;
-
-  /**
-   * The current state of the processor.
-   */
-  ProcessorState _state = ProcessorState.READY;
-
-  /**
-   * The number of milliseconds for which the thread on which the processor is running will wait for
-   * an operation to become available if there are no operations ready to be processed.
-   */
-  static int _WAIT_DURATION = 100;
-
-  /**
-   * Initialize a newly created operation processor to process the operations on the given queue.
-   *
-   * @param queue the queue containing the operations to be processed
-   */
-  OperationProcessor(OperationQueue queue) {
-    this._queue = queue;
-  }
-
-  /**
-   * Start processing operations. If the processor is already running on a different thread, then
-   * this method will return immediately with no effect. Otherwise, this method will not return
-   * until after the processor has been stopped from a different thread or until the thread running
-   * the processor has been interrupted.
-   */
-  void run() {
-    // This processor is, or was, already running on a different thread.
-    if (_state != ProcessorState.READY) {
-      throw new IllegalStateException("Operation processors can only be run one time");
-    }
-    // OK, run.
-    _state = ProcessorState.RUNNING;
-    try {
-      while (isRunning) {
-        // wait for operation
-        IndexOperation operation = null;
-        {
-          operation = _queue.dequeue(_WAIT_DURATION);
-        }
-        // perform operation
-        if (operation != null) {
-          try {
-            operation.performOperation();
-          } catch (exception) {
-            AnalysisEngine.instance.logger.logError2("Exception in indexing operation: ${operation}", exception);
-          }
-        }
-      }
-    } finally {
-      _state = ProcessorState.STOPPED;
-    }
-  }
-
-  /**
-   * Stop processing operations after the current operation has completed. If the argument is
-   * `true` then this method will wait until the last operation has completed; otherwise this
-   * method might return before the last operation has completed.
-   *
-   * @param wait `true` if this method will wait until the last operation has completed before
-   *          returning
-   * @return the library files for the libraries that need to be analyzed when a new session is
-   *         started.
-   */
-  List<Source> stop(bool wait) {
-    if (identical(_state, ProcessorState.READY)) {
-      _state = ProcessorState.STOPPED;
-      return unanalyzedSources;
-    } else if (identical(_state, ProcessorState.STOPPED)) {
-      return unanalyzedSources;
-    } else if (identical(_state, ProcessorState.RUNNING)) {
-      _state = ProcessorState.STOP_REQESTED;
-    }
-    while (wait) {
-      if (identical(_state, ProcessorState.STOPPED)) {
-        return unanalyzedSources;
-      }
-      waitOneMs();
-    }
-    return unanalyzedSources;
-  }
-
-  /**
-   * Waits until processors will switch from "ready" to "running" state.
-   *
-   * @return `true` if processor is now actually in "running" state, e.g. not in "stopped"
-   *         state.
-   */
-  bool waitForRunning() {
-    while (identical(_state, ProcessorState.READY)) {
-      threadYield();
-    }
-    return identical(_state, ProcessorState.RUNNING);
-  }
-
-  /**
-   * @return the [Source]s that are not indexed yet.
-   */
-  List<Source> get unanalyzedSources {
-    Set<Source> sources = new Set();
-    for (IndexOperation operation in _queue.operations) {
-      if (operation is IndexUnitOperation) {
-        Source source = operation.source;
-        sources.add(source);
-      }
-    }
-    return new List.from(sources);
-  }
-
-  /**
-   * Return `true` if the current state is [ProcessorState#RUNNING].
-   *
-   * @return `true` if this processor is running
-   */
-  bool get isRunning => identical(_state, ProcessorState.RUNNING);
-
-  void threadYield() {
-  }
-
-  void waitOneMs() {
-  }
-}
-
-/**
  * The enumeration <code>ProcessorState</code> represents the possible states of an operation
  * processor.
  */
@@ -1210,13 +1019,14 @@
     _indexContributor = new IndexContributor_AngularHtmlIndexContributor(store, this);
   }
 
+  @override
   void visitExpression(Expression expression) {
     // NgFilter
     if (expression is SimpleIdentifier) {
       SimpleIdentifier identifier = expression;
       Element element = identifier.bestElement;
       if (element is AngularElement) {
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, createLocationForIdentifier(identifier));
+        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, _createLocationForIdentifier(identifier));
         return;
       }
     }
@@ -1224,6 +1034,7 @@
     expression.accept(_indexContributor);
   }
 
+  @override
   Object visitHtmlUnit(ht.HtmlUnit node) {
     _htmlUnitElement = node.element;
     CompilationUnitElement dartUnitElement = _htmlUnitElement.angularCompilationUnit;
@@ -1231,38 +1042,40 @@
     return super.visitHtmlUnit(node);
   }
 
+  @override
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) {
     Element element = node.element;
     if (element != null) {
       ht.Token nameToken = node.nameToken;
-      Location location = createLocationForToken(nameToken);
+      Location location = _createLocationForToken(nameToken);
       _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
     }
     return super.visitXmlAttributeNode(node);
   }
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
     Element element = node.element;
     if (element != null) {
       // tag
       {
         ht.Token tagToken = node.tagToken;
-        Location location = createLocationForToken(tagToken);
+        Location location = _createLocationForToken(tagToken);
         _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE, location);
       }
       // maybe add closing tag range
       ht.Token closingTag = node.closingTag;
       if (closingTag != null) {
-        Location location = createLocationForToken(closingTag);
+        Location location = _createLocationForToken(closingTag);
         _store.recordRelationship(element, IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
       }
     }
     return super.visitXmlTagNode(node);
   }
 
-  Location createLocationForIdentifier(SimpleIdentifier identifier) => new Location(_htmlUnitElement, identifier.offset, identifier.length);
+  Location _createLocationForIdentifier(SimpleIdentifier identifier) => new Location(_htmlUnitElement, identifier.offset, identifier.length);
 
-  Location createLocationForToken(ht.Token token) => new Location(_htmlUnitElement, token.offset, token.length);
+  Location _createLocationForToken(ht.Token token) => new Location(_htmlUnitElement, token.offset, token.length);
 }
 
 class IndexContributor_AngularHtmlIndexContributor extends IndexContributor {
@@ -1270,8 +1083,10 @@
 
   IndexContributor_AngularHtmlIndexContributor(IndexStore arg0, this.AngularHtmlIndexContributor_this) : super(arg0);
 
+  @override
   Element peekElement() => AngularHtmlIndexContributor_this._htmlUnitElement;
 
+  @override
   void recordRelationship(Element element, Relationship relationship, Location location) {
     AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(element);
     if (angularElement != null) {
@@ -1487,10 +1302,12 @@
 class UniverseElementImpl extends ElementImpl implements UniverseElement {
   static UniverseElementImpl INSTANCE = new UniverseElementImpl();
 
-  UniverseElementImpl() : super.con2("--universe--", -1);
+  UniverseElementImpl() : super("--universe--", -1);
 
+  @override
   accept(ElementVisitor visitor) => null;
 
+  @override
   ElementKind get kind => ElementKind.UNIVERSE;
 }
 
@@ -1552,7 +1369,7 @@
     // find ImportElement
     String prefix = prefixNode.name;
     Map<ImportElement, Set<Element>> importElementsMap = {};
-    info._element = internalGetImportElement(libraryElement, prefix, usedElement, importElementsMap);
+    info._element = _internalGetImportElement(libraryElement, prefix, usedElement, importElementsMap);
     if (info._element == null) {
       return null;
     }
@@ -1565,9 +1382,9 @@
    * @param location the base location
    * @param expression the expression assigned at the given location
    */
-  static Location getLocationWithExpressionType(Location location, Expression expression) {
+  static Location _getLocationWithExpressionType(Location location, Expression expression) {
     if (expression != null) {
-      return new LocationWithData<Type2>.con1(location, expression.bestType);
+      return new LocationWithData<DartType>.con1(location, expression.bestType);
     }
     return location;
   }
@@ -1576,11 +1393,11 @@
    * If the given node is the part of the [ConstructorFieldInitializer], returns location with
    * type of the initializer expression.
    */
-  static Location getLocationWithInitializerType(SimpleIdentifier node, Location location) {
+  static Location _getLocationWithInitializerType(SimpleIdentifier node, Location location) {
     if (node.parent is ConstructorFieldInitializer) {
       ConstructorFieldInitializer initializer = node.parent as ConstructorFieldInitializer;
       if (identical(initializer.fieldName, node)) {
-        location = getLocationWithExpressionType(location, initializer.expression);
+        location = _getLocationWithExpressionType(location, initializer.expression);
       }
     }
     return location;
@@ -1596,7 +1413,7 @@
    * @param location the raw location
    * @return the [Location] with the type of the assigned value
    */
-  static Location getLocationWithTypeAssignedToField(SimpleIdentifier identifier, Element element, Location location) {
+  static Location _getLocationWithTypeAssignedToField(SimpleIdentifier identifier, Element element, Location location) {
     // we need accessor
     if (element is! PropertyAccessorElement) {
       return location;
@@ -1636,7 +1453,7 @@
     if (parent is AssignmentExpression) {
       AssignmentExpression assignment = parent as AssignmentExpression;
       Expression rhs = assignment.rightHandSide;
-      location = getLocationWithExpressionType(location, rhs);
+      location = _getLocationWithExpressionType(location, rhs);
     }
     // done
     return location;
@@ -1646,7 +1463,7 @@
    * @return the [ImportElement] that declares given [PrefixElement] and imports library
    *         with given "usedElement".
    */
-  static ImportElement internalGetImportElement(LibraryElement libraryElement, String prefix, Element usedElement, Map<ImportElement, Set<Element>> importElementsMap) {
+  static ImportElement _internalGetImportElement(LibraryElement libraryElement, String prefix, Element usedElement, Map<ImportElement, Set<Element>> importElementsMap) {
     // validate Element
     if (usedElement == null) {
       return null;
@@ -1716,7 +1533,7 @@
   /**
    * @return `true` if given "node" is part of an import [Combinator].
    */
-  static bool isIdentifierInImportCombinator(SimpleIdentifier node) {
+  static bool _isIdentifierInImportCombinator(SimpleIdentifier node) {
     AstNode parent = node.parent;
     return parent is Combinator;
   }
@@ -1724,7 +1541,7 @@
   /**
    * @return `true` if given "node" is part of [PrefixedIdentifier] "prefix.node".
    */
-  static bool isIdentifierInPrefixedIdentifier(SimpleIdentifier node) {
+  static bool _isIdentifierInPrefixedIdentifier(SimpleIdentifier node) {
     AstNode parent = node.parent;
     return parent is PrefixedIdentifier && identical(parent.identifier, node);
   }
@@ -1733,7 +1550,7 @@
    * @return `true` if given [SimpleIdentifier] is "name" part of prefixed identifier or
    *         method invocation.
    */
-  static bool isQualified(SimpleIdentifier node) {
+  static bool _isQualified(SimpleIdentifier node) {
     AstNode parent = node.parent;
     if (parent is PrefixedIdentifier) {
       return identical(parent.identifier, node);
@@ -1783,31 +1600,34 @@
     return null;
   }
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
-    recordOperatorReference(node.operator, node.bestElement);
+    _recordOperatorReference(node.operator, node.bestElement);
     return super.visitAssignmentExpression(node);
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
-    recordOperatorReference(node.operator, node.bestElement);
+    _recordOperatorReference(node.operator, node.bestElement);
     return super.visitBinaryExpression(node);
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement element = node.element;
     enterScope(element);
     try {
-      recordElementDefinition(element, IndexConstants.DEFINES_CLASS);
+      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS);
       {
         ExtendsClause extendsClause = node.extendsClause;
         if (extendsClause != null) {
           TypeName superclassNode = extendsClause.superclass;
-          recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
+          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
         } else {
           InterfaceType superType = element.supertype;
           if (superType != null) {
             ClassElement objectElement = superType.element;
-            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY, createLocationFromOffset(node.name.offset, 0));
+            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY, _createLocationFromOffset(node.name.offset, 0));
           }
         }
       }
@@ -1815,7 +1635,7 @@
         WithClause withClause = node.withClause;
         if (withClause != null) {
           for (TypeName mixinNode in withClause.mixinTypes) {
-            recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
+            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
           }
         }
       }
@@ -1823,32 +1643,33 @@
         ImplementsClause implementsClause = node.implementsClause;
         if (implementsClause != null) {
           for (TypeName interfaceNode in implementsClause.interfaces) {
-            recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
+            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
           }
         }
       }
       return super.visitClassDeclaration(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement element = node.element;
     enterScope(element);
     try {
-      recordElementDefinition(element, IndexConstants.DEFINES_CLASS_ALIAS);
+      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS_ALIAS);
       {
         TypeName superclassNode = node.superclass;
         if (superclassNode != null) {
-          recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
+          _recordSuperType(superclassNode, IndexConstants.IS_EXTENDED_BY);
         }
       }
       {
         WithClause withClause = node.withClause;
         if (withClause != null) {
           for (TypeName mixinNode in withClause.mixinTypes) {
-            recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
+            _recordSuperType(mixinNode, IndexConstants.IS_MIXED_IN_BY);
           }
         }
       }
@@ -1856,16 +1677,17 @@
         ImplementsClause implementsClause = node.implementsClause;
         if (implementsClause != null) {
           for (TypeName interfaceNode in implementsClause.interfaces) {
-            recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
+            _recordSuperType(interfaceNode, IndexConstants.IS_IMPLEMENTED_BY);
           }
         }
       }
       return super.visitClassTypeAlias(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     CompilationUnitElement unitElement = node.element;
     if (unitElement != null) {
@@ -1878,6 +1700,7 @@
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorElement element = node.element;
     // define
@@ -1886,10 +1709,10 @@
       if (node.name != null) {
         int start = node.period.offset;
         int end = node.name.end;
-        location = createLocationFromOffset(start, end - start);
+        location = _createLocationFromOffset(start, end - start);
       } else {
         int start = node.returnType.end;
-        location = createLocationFromOffset(start, 0);
+        location = _createLocationFromOffset(start, 0);
       }
       recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
     }
@@ -1898,10 +1721,11 @@
     try {
       return super.visitConstructorDeclaration(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitConstructorName(ConstructorName node) {
     ConstructorElement element = node.staticElement;
     // in 'class B = A;' actually A constructors are invoked
@@ -1913,86 +1737,94 @@
     if (node.name != null) {
       int start = node.period.offset;
       int end = node.name.end;
-      location = createLocationFromOffset(start, end - start);
+      location = _createLocationFromOffset(start, end - start);
     } else {
       int start = node.type.end;
-      location = createLocationFromOffset(start, 0);
+      location = _createLocationFromOffset(start, 0);
     }
     // record relationship
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     return super.visitConstructorName(node);
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
     ExportElement element = node.element;
     if (element != null) {
       LibraryElement expLibrary = element.exportedLibrary;
-      recordLibraryReference(node, expLibrary);
+      _recordLibraryReference(node, expLibrary);
     }
     return super.visitExportDirective(node);
   }
 
+  @override
   Object visitFormalParameter(FormalParameter node) {
     ParameterElement element = node.element;
     enterScope(element);
     try {
       return super.visitFormalParameter(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     Element element = node.element;
-    recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION);
+    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION);
     enterScope(element);
     try {
       return super.visitFunctionDeclaration(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     Element element = node.element;
-    recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION_TYPE);
+    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION_TYPE);
     return super.visitFunctionTypeAlias(node);
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
     ImportElement element = node.element;
     if (element != null) {
       LibraryElement impLibrary = element.importedLibrary;
-      recordLibraryReference(node, impLibrary);
+      _recordLibraryReference(node, impLibrary);
     }
     return super.visitImportDirective(node);
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
     MethodElement element = node.bestElement;
     if (element is MethodElement) {
       Token operator = node.leftBracket;
-      Location location = createLocationFromToken(operator);
+      Location location = _createLocationFromToken(operator);
       recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
     }
     return super.visitIndexExpression(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement element = node.element;
     enterScope(element);
     try {
       return super.visitMethodDeclaration(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
     Element element = name.bestElement;
     if (element is MethodElement) {
-      Location location = createLocationFromNode(name);
+      Location location = _createLocationFromNode(name);
       Relationship relationship;
       if (node.target != null) {
         relationship = IndexConstants.IS_INVOKED_BY_QUALIFIED;
@@ -2002,39 +1834,44 @@
       recordRelationship(element, relationship, location);
     }
     if (element is FunctionElement) {
-      Location location = createLocationFromNode(name);
+      Location location = _createLocationFromNode(name);
       recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
     }
-    recordImportElementReferenceWithoutPrefix(name);
+    _recordImportElementReferenceWithoutPrefix(name);
     return super.visitMethodInvocation(node);
   }
 
+  @override
   Object visitPartDirective(PartDirective node) {
     Element element = node.element;
-    Location location = createLocationFromNode(node.uri);
+    Location location = _createLocationFromNode(node.uri);
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     return super.visitPartDirective(node);
   }
 
+  @override
   Object visitPartOfDirective(PartOfDirective node) {
-    Location location = createLocationFromNode(node.libraryName);
+    Location location = _createLocationFromNode(node.libraryName);
     recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
     return null;
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
-    recordOperatorReference(node.operator, node.bestElement);
+    _recordOperatorReference(node.operator, node.bestElement);
     return super.visitPostfixExpression(node);
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
-    recordOperatorReference(node.operator, node.bestElement);
+    _recordOperatorReference(node.operator, node.bestElement);
     return super.visitPrefixExpression(node);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element nameElement = new NameElementImpl(node.name);
-    Location location = createLocationFromNode(node);
+    Location location = _createLocationFromNode(node);
     // name in declaration
     if (node.inDeclarationContext()) {
       recordRelationship(nameElement, IndexConstants.IS_DEFINED_BY, location);
@@ -2043,26 +1880,26 @@
     // prepare information
     Element element = node.bestElement;
     // qualified name reference
-    recordQualifiedMemberReference(node, element, nameElement, location);
+    _recordQualifiedMemberReference(node, element, nameElement, location);
     // stop if already handled
-    if (isAlreadyHandledName(node)) {
+    if (_isAlreadyHandledName(node)) {
       return null;
     }
     // record specific relations
     if (element is ClassElement || element is FunctionElement || element is FunctionTypeAliasElement || element is LabelElement || element is TypeParameterElement) {
       recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     } else if (element is FieldElement) {
-      location = getLocationWithInitializerType(node, location);
+      location = _getLocationWithInitializerType(node, location);
       recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     } else if (element is FieldFormalParameterElement) {
       FieldFormalParameterElement fieldParameter = element;
       FieldElement field = fieldParameter.field;
       recordRelationship(field, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
     } else if (element is PrefixElement) {
-      recordImportElementReferenceWithPrefix(node);
+      _recordImportElementReferenceWithPrefix(node);
     } else if (element is PropertyAccessorElement || element is MethodElement) {
-      location = getLocationWithTypeAssignedToField(node, element, location);
-      if (isQualified(node)) {
+      location = _getLocationWithTypeAssignedToField(node, element, location);
+      if (_isQualified(node)) {
         recordRelationship(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
       } else {
         recordRelationship(element, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, location);
@@ -2080,51 +1917,55 @@
         recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
       }
     }
-    recordImportElementReferenceWithoutPrefix(node);
+    _recordImportElementReferenceWithoutPrefix(node);
     return super.visitSimpleIdentifier(node);
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ConstructorElement element = node.staticElement;
     Location location;
     if (node.constructorName != null) {
       int start = node.period.offset;
       int end = node.constructorName.end;
-      location = createLocationFromOffset(start, end - start);
+      location = _createLocationFromOffset(start, end - start);
     } else {
       int start = node.keyword.end;
-      location = createLocationFromOffset(start, 0);
+      location = _createLocationFromOffset(start, 0);
     }
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     return super.visitSuperConstructorInvocation(node);
   }
 
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     VariableDeclarationList variables = node.variables;
     for (VariableDeclaration variableDeclaration in variables.variables) {
       Element element = variableDeclaration.element;
-      recordElementDefinition(element, IndexConstants.DEFINES_VARIABLE);
+      _recordElementDefinition(element, IndexConstants.DEFINES_VARIABLE);
     }
     return super.visitTopLevelVariableDeclaration(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
     TypeParameterElement element = node.element;
     enterScope(element);
     try {
       return super.visitTypeParameter(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     VariableElement element = node.element;
     // record declaration
     {
       SimpleIdentifier name = node.name;
-      Location location = createLocationFromNode(name);
-      location = getLocationWithExpressionType(location, node.initializer);
+      Location location = _createLocationFromNode(name);
+      location = _getLocationWithExpressionType(location, node.initializer);
       recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
     }
     // visit
@@ -2132,10 +1973,11 @@
     try {
       return super.visitVariableDeclaration(node);
     } finally {
-      exitScope();
+      _exitScope();
     }
   }
 
+  @override
   Object visitVariableDeclarationList(VariableDeclarationList node) {
     NodeList<VariableDeclaration> variables = node.variables;
     if (variables != null) {
@@ -2148,7 +1990,7 @@
             try {
               type.accept(this);
             } finally {
-              exitScope();
+              _exitScope();
             }
             // only one iteration
             break;
@@ -2173,7 +2015,7 @@
   /**
    * @return the [Location] representing location of the [AstNode].
    */
-  Location createLocationFromNode(AstNode node) => createLocationFromOffset(node.offset, node.length);
+  Location _createLocationFromNode(AstNode node) => _createLocationFromOffset(node.offset, node.length);
 
   /**
    * @param offset the offset of the location within [Source]
@@ -2181,7 +2023,7 @@
    * @return the [Location] representing the given offset and length within the inner-most
    *         [Element].
    */
-  Location createLocationFromOffset(int offset, int length) {
+  Location _createLocationFromOffset(int offset, int length) {
     Element element = peekElement();
     return new Location(element, offset, length);
   }
@@ -2189,12 +2031,12 @@
   /**
    * @return the [Location] representing location of the [Token].
    */
-  Location createLocationFromToken(Token token) => createLocationFromOffset(token.offset, token.length);
+  Location _createLocationFromToken(Token token) => _createLocationFromOffset(token.offset, token.length);
 
   /**
    * Exit the current scope.
    */
-  void exitScope() {
+  void _exitScope() {
     _elementStack.removeFirst();
   }
 
@@ -2202,7 +2044,7 @@
    * @return `true` if given node already indexed as more interesting reference, so it should
    *         not be indexed again.
    */
-  bool isAlreadyHandledName(SimpleIdentifier node) {
+  bool _isAlreadyHandledName(SimpleIdentifier node) {
     AstNode parent = node.parent;
     if (parent is MethodInvocation) {
       Element element = node.staticElement;
@@ -2216,7 +2058,7 @@
   /**
    * Records the [Element] definition in the library and universe.
    */
-  void recordElementDefinition(Element element, Relationship relationship) {
+  void _recordElementDefinition(Element element, Relationship relationship) {
     Location location = createLocation(element);
     recordRelationship(_libraryElement, relationship, location);
     recordRelationship(IndexConstants.UNIVERSE, relationship, location);
@@ -2226,17 +2068,17 @@
    * Records [ImportElement] reference if given [SimpleIdentifier] references some
    * top-level element and not qualified with import prefix.
    */
-  void recordImportElementReferenceWithoutPrefix(SimpleIdentifier node) {
-    if (isIdentifierInImportCombinator(node)) {
+  void _recordImportElementReferenceWithoutPrefix(SimpleIdentifier node) {
+    if (_isIdentifierInImportCombinator(node)) {
       return;
     }
-    if (isIdentifierInPrefixedIdentifier(node)) {
+    if (_isIdentifierInPrefixedIdentifier(node)) {
       return;
     }
     Element element = node.staticElement;
-    ImportElement importElement = internalGetImportElement(_libraryElement, null, element, _importElementsMap);
+    ImportElement importElement = _internalGetImportElement(_libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
-      Location location = createLocationFromOffset(node.offset, 0);
+      Location location = _createLocationFromOffset(node.offset, 0);
       recordRelationship(importElement, IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -2245,12 +2087,12 @@
    * Records [ImportElement] that declares given prefix and imports library with element used
    * with given prefix node.
    */
-  void recordImportElementReferenceWithPrefix(SimpleIdentifier prefixNode) {
+  void _recordImportElementReferenceWithPrefix(SimpleIdentifier prefixNode) {
     IndexContributor_ImportElementInfo info = getImportElementInfo(prefixNode);
     if (info != null) {
       int offset = prefixNode.offset;
       int length = info._periodEnd - offset;
-      Location location = createLocationFromOffset(offset, length);
+      Location location = _createLocationFromOffset(offset, length);
       recordRelationship(info._element, IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -2259,9 +2101,9 @@
    * Records reference to defining [CompilationUnitElement] of the given
    * [LibraryElement].
    */
-  void recordLibraryReference(UriBasedDirective node, LibraryElement library) {
+  void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
     if (library != null) {
-      Location location = createLocationFromNode(node.uri);
+      Location location = _createLocationFromNode(node.uri);
       recordRelationship(library.definingCompilationUnit, IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -2269,9 +2111,9 @@
   /**
    * Record reference to the given operator [Element] and name.
    */
-  void recordOperatorReference(Token operator, Element element) {
+  void _recordOperatorReference(Token operator, Element element) {
     // prepare location
-    Location location = createLocationFromToken(operator);
+    Location location = _createLocationFromToken(operator);
     // record name reference
     {
       String name = operator.lexeme;
@@ -2298,8 +2140,8 @@
    * Records reference if the given [SimpleIdentifier] looks like a qualified property access
    * or method invocation.
    */
-  void recordQualifiedMemberReference(SimpleIdentifier node, Element element, Element nameElement, Location location) {
-    if (isQualified(node)) {
+  void _recordQualifiedMemberReference(SimpleIdentifier node, Element element, Element nameElement, Location location) {
+    if (_isQualified(node)) {
       Relationship relationship = element != null ? IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED : IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
       recordRelationship(nameElement, relationship, location);
     }
@@ -2309,12 +2151,12 @@
    * Records extends/implements relationships between given [ClassElement] and [Type] of
    * "superNode".
    */
-  void recordSuperType(TypeName superNode, Relationship relationship) {
+  void _recordSuperType(TypeName superNode, Relationship relationship) {
     if (superNode != null) {
       Identifier superName = superNode.name;
       if (superName != null) {
         Element superElement = superName.staticElement;
-        recordRelationship(superElement, relationship, createLocationFromNode(superNode));
+        recordRelationship(superElement, relationship, _createLocationFromNode(superNode));
       }
     }
   }
@@ -2331,162 +2173,16 @@
 }
 
 /**
- * Factory for [Index] and [IndexStore].
- */
-class IndexFactory {
-  /**
-   * @return the new instance of [Index] which uses given [IndexStore].
-   */
-  static Index newIndex(IndexStore store) {
-    OperationQueue queue = new OperationQueue();
-    OperationProcessor processor = new OperationProcessor(queue);
-    return new IndexImpl(store, queue, processor);
-  }
-
-  /**
-   * @return the new instance of [MemoryIndexStore].
-   */
-  static MemoryIndexStore newMemoryIndexStore() => new MemoryIndexStoreImpl();
-}
-
-/**
- * Instances of the [OperationQueue] represent a queue of operations against the index that
- * are waiting to be performed.
- */
-class OperationQueue {
-  /**
-   * The non-query operations that are waiting to be performed.
-   */
-  Queue<IndexOperation> _nonQueryOperations = new Queue();
-
-  /**
-   * The query operations that are waiting to be performed.
-   */
-  Queue<IndexOperation> _queryOperations = new Queue();
-
-  /**
-   * `true` if query operations should be returned by [dequeue] or {code false}
-   * if not.
-   */
-  bool _processQueries = true;
-
-  /**
-   * If this queue is not empty, then remove the next operation from the head of this queue and
-   * return it. If this queue is empty (see [setProcessQueries], then the behavior
-   * of this method depends on the value of the argument. If the argument is less than or equal to
-   * zero (<code>0</code>), then `null` will be returned immediately. If the argument is
-   * greater than zero, then this method will wait until at least one operation has been added to
-   * this queue or until the given amount of time has passed. If, at the end of that time, this
-   * queue is empty, then `null` will be returned. If this queue is not empty, then the first
-   * operation will be removed and returned.
-   *
-   * Note that `null` can be returned, even if a positive timeout is given.
-   *
-   * Note too that this method's timeout is not treated the same way as the timeout value used for
-   * [Object#wait]. In particular, it is not possible to cause this method to wait for
-   * an indefinite period of time.
-   *
-   * @param timeout the maximum number of milliseconds to wait for an operation to be available
-   *          before giving up and returning `null`
-   * @return the operation that was removed from the queue
-   * @throws InterruptedException if the thread on which this method is running was interrupted
-   *           while it was waiting for an operation to be added to the queue
-   */
-  IndexOperation dequeue(int timeout) {
-    if (_nonQueryOperations.isEmpty && (!_processQueries || _queryOperations.isEmpty)) {
-      if (timeout <= 0) {
-        return null;
-      }
-      waitForOperationAvailable(timeout);
-    }
-    if (!_nonQueryOperations.isEmpty) {
-      return _nonQueryOperations.removeFirst();
-    }
-    if (_processQueries && !_queryOperations.isEmpty) {
-      return _queryOperations.removeFirst();
-    }
-    return null;
-  }
-
-  /**
-   * Add the given operation to the tail of this queue.
-   *
-   * @param operation the operation to be added to the queue
-   */
-  void enqueue(IndexOperation operation) {
-    if (operation is RemoveSourceOperation) {
-      Source source = operation.source;
-      removeForSource(source, _nonQueryOperations);
-      removeForSource(source, _queryOperations);
-    }
-    if (operation.isQuery) {
-      _queryOperations.add(operation);
-    } else {
-      _nonQueryOperations.add(operation);
-    }
-    notifyOperationAvailable();
-  }
-
-  /**
-   * Return a list containing all of the operations that are currently on the queue. Modifying this
-   * list will not affect the state of the queue.
-   *
-   * @return all of the operations that are currently on the queue
-   */
-  List<IndexOperation> get operations {
-    List<IndexOperation> operations = [];
-    operations.addAll(_nonQueryOperations);
-    operations.addAll(_queryOperations);
-    return operations;
-  }
-
-  /**
-   * Set whether the receiver's [dequeue] method should return query operations.
-   *
-   * @param processQueries `true` if the receiver's [dequeue] method should
-   *          return query operations or `false` if query operations should be queued but not
-   *          returned by the receiver's [dequeue] method until this method is called
-   *          with a value of `true`.
-   */
-  void set processQueries(bool processQueries) {
-    if (this._processQueries != processQueries) {
-      this._processQueries = processQueries;
-      if (processQueries && !_queryOperations.isEmpty) {
-        notifyOperationAvailable();
-      }
-    }
-  }
-
-  /**
-   * Return the number of operations on the queue.
-   *
-   * @return the number of operations on the queue
-   */
-  int size() => _nonQueryOperations.length + _queryOperations.length;
-
-  void notifyOperationAvailable() {
-  }
-
-  /**
-   * Removes operations that should be removed when given [Source] is removed.
-   */
-  void removeForSource(Source source, Queue<IndexOperation> operations) {
-    operations.removeWhere((_) => _.removeWhenSourceRemoved(source));
-  }
-
-  void waitForOperationAvailable(int timeout) {
-  }
-}
-
-/**
  * Special [Element] which is used to index references to the name without specifying concrete
  * kind of this name - field, method or something else.
  */
 class NameElementImpl extends ElementImpl {
-  NameElementImpl(String name) : super.con2("name:${name}", -1);
+  NameElementImpl(String name) : super("name:${name}", -1);
 
+  @override
   accept(ElementVisitor visitor) => null;
 
+  @override
   ElementKind get kind => ElementKind.NAME;
 }
 
@@ -2501,17 +2197,18 @@
     this._store = store;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement classElement = node.element;
     if (classElement != null) {
       List<ToolkitObjectElement> toolkitObjects = classElement.toolkitObjects;
       for (ToolkitObjectElement object in toolkitObjects) {
         if (object is AngularComponentElement) {
-          indexComponent(object);
+          _indexComponent(object);
         }
         if (object is AngularDirectiveElement) {
           AngularDirectiveElement directive = object;
-          indexDirective(directive);
+          _indexDirective(directive);
         }
       }
     }
@@ -2519,20 +2216,21 @@
     return null;
   }
 
+  @override
   Object visitCompilationUnitMember(CompilationUnitMember node) => null;
 
-  void indexComponent(AngularComponentElement component) {
-    indexProperties(component.properties);
+  void _indexComponent(AngularComponentElement component) {
+    _indexProperties(component.properties);
   }
 
-  void indexDirective(AngularDirectiveElement directive) {
-    indexProperties(directive.properties);
+  void _indexDirective(AngularDirectiveElement directive) {
+    _indexProperties(directive.properties);
   }
 
   /**
    * Index [FieldElement] references from [AngularPropertyElement]s.
    */
-  void indexProperties(List<AngularPropertyElement> properties) {
+  void _indexProperties(List<AngularPropertyElement> properties) {
     for (AngularPropertyElement property in properties) {
       FieldElement field = property.field;
       if (field != null) {
@@ -2586,14 +2284,18 @@
     this._indexStore = indexStore;
   }
 
+  @override
   bool get isQuery => false;
 
+  @override
   void performOperation() {
     _indexStore.removeContext(context);
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => false;
 
+  @override
   String toString() => "RemoveContext(${context})";
 }
 
@@ -2646,8 +2348,10 @@
    */
   Source get source => _source;
 
+  @override
   bool get isQuery => false;
 
+  @override
   void performOperation() {
     try {
       bool mayIndex = _indexStore.aboutToIndexHtml(_context, _htmlElement);
@@ -2661,8 +2365,10 @@
     }
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => this._source == source;
 
+  @override
   String toString() => "IndexHtmlUnitOperation(${_source.fullName})";
 }
 
@@ -2711,8 +2417,12 @@
     }
   }
 
-  Location clone() => new Location(element, offset, length);
+  /**
+   * Returns a clone of this [Location].
+   */
+  Location newClone() => new Location(element, offset, length);
 
+  @override
   String toString() => "[${offset} - ${(offset + length)}) in ${element}";
 }
 
@@ -2744,16 +2454,20 @@
     this._indexStore = indexStore;
   }
 
+  @override
   bool get isQuery => true;
 
+  @override
   void performOperation() {
     List<Location> locations;
     locations = _indexStore.getRelationships(element, relationship);
     callback.hasRelationships(element, relationship, locations);
   }
 
+  @override
   bool removeWhenSourceRemoved(Source source) => false;
 
+  @override
   String toString() => "GetRelationships(${element}, ${relationship})";
 }
 
@@ -2767,7 +2481,8 @@
 
   LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
 
-  Location clone() => new LocationWithData<D>.con2(element, offset, length, data);
+  @override
+  Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/instrumentation.dart b/pkg/analyzer/lib/src/generated/instrumentation.dart
index ee22f0b..73d6214 100644
--- a/pkg/analyzer/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer/lib/src/generated/instrumentation.dart
@@ -102,34 +102,47 @@
 }
 
 class InstrumentationBuilder_Instrumentation_NULL_INSTRUMENTATION_BUILDER implements InstrumentationBuilder {
+  @override
   InstrumentationBuilder data(String name, bool value) => this;
 
+  @override
   InstrumentationBuilder data2(String name, int value) => this;
 
+  @override
   InstrumentationBuilder data3(String name, String value) => this;
 
+  @override
   InstrumentationBuilder data4(String name, List<String> value) => this;
 
+  @override
   InstrumentationLevel get instrumentationLevel => InstrumentationLevel.OFF;
 
+  @override
   void log() {
   }
 
+  @override
   void log2(int minTimeToLong) {
   }
 
+  @override
   InstrumentationBuilder metric(String name, bool value) => this;
 
+  @override
   InstrumentationBuilder metric2(String name, int value) => this;
 
+  @override
   InstrumentationBuilder metric3(String name, String value) => this;
 
+  @override
   InstrumentationBuilder metric4(String name, List<String> value) => this;
 
+  @override
   InstrumentationBuilder record(Exception exception) => this;
 }
 
 class InstrumentationLogger_Instrumentation_NULL_LOGGER implements InstrumentationLogger {
+  @override
   InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
 
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 42a5242..dd2d982 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -106,15 +106,16 @@
    */
   Token varKeyword;
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSpace = appendKeyword(builder, false, abstractKeyword);
-    needsSpace = appendKeyword(builder, needsSpace, constKeyword);
-    needsSpace = appendKeyword(builder, needsSpace, externalKeyword);
-    needsSpace = appendKeyword(builder, needsSpace, factoryKeyword);
-    needsSpace = appendKeyword(builder, needsSpace, finalKeyword);
-    needsSpace = appendKeyword(builder, needsSpace, staticKeyword);
-    appendKeyword(builder, needsSpace, varKeyword);
+    bool needsSpace = _appendKeyword(builder, false, abstractKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, constKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, externalKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, factoryKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, finalKeyword);
+    needsSpace = _appendKeyword(builder, needsSpace, staticKeyword);
+    _appendKeyword(builder, needsSpace, varKeyword);
     return builder.toString();
   }
 
@@ -127,7 +128,7 @@
    * @param keyword the keyword to be appended
    * @return `true` if subsequent keywords need to be prefixed with a space
    */
-  bool appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
+  bool _appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
     if (keyword != null) {
       if (needsSpace) {
         builder.appendChar(0x20);
@@ -168,13 +169,15 @@
     this._oldNode = oldNode;
   }
 
+  @override
   AstNode visitAdjacentStrings(AdjacentStrings node) {
     if (node.strings.contains(_oldNode)) {
       return _parser.parseStringLiteral();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitAnnotation(Annotation node) {
     if (identical(_oldNode, node.name)) {
       throw new InsufficientContextException();
@@ -183,39 +186,44 @@
     } else if (identical(_oldNode, node.arguments)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     if (identical(_oldNode, node.identifier)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitArgumentList(ArgumentList node) {
     if (node.arguments.contains(_oldNode)) {
       return _parser.parseArgument();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitAsExpression(AsExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseBitwiseOrExpression();
     } else if (identical(_oldNode, node.type)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitAssertStatement(AssertStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitAssignmentExpression(AssignmentExpression node) {
     if (identical(_oldNode, node.leftHandSide)) {
       // TODO(brianwilkerson) If the assignment is part of a cascade section, then we don't have a
@@ -224,55 +232,62 @@
       // return parser.parseConditionalExpression();
       throw new InsufficientContextException();
     } else if (identical(_oldNode, node.rightHandSide)) {
-      if (isCascadeAllowedInAssignment(node)) {
+      if (_isCascadeAllowedInAssignment(node)) {
         return _parser.parseExpression2();
       }
       return _parser.parseExpressionWithoutCascade();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitBinaryExpression(BinaryExpression node) {
     if (identical(_oldNode, node.leftOperand)) {
       throw new InsufficientContextException();
     } else if (identical(_oldNode, node.rightOperand)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitBlock(Block node) {
     if (node.statements.contains(_oldNode)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitBlockFunctionBody(BlockFunctionBody node) {
     if (identical(_oldNode, node.block)) {
       return _parser.parseBlock();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitBooleanLiteral(BooleanLiteral node) => notAChild(node);
+  @override
+  AstNode visitBooleanLiteral(BooleanLiteral node) => _notAChild(node);
 
+  @override
   AstNode visitBreakStatement(BreakStatement node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitCascadeExpression(CascadeExpression node) {
     if (identical(_oldNode, node.target)) {
       return _parser.parseConditionalExpression();
     } else if (node.cascadeSections.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitCatchClause(CatchClause node) {
     if (identical(_oldNode, node.exceptionType)) {
       return _parser.parseTypeName();
@@ -283,9 +298,10 @@
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseBlock();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitClassDeclaration(ClassDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -308,9 +324,10 @@
       }
       return member;
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitClassTypeAlias(ClassTypeAlias node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -327,24 +344,28 @@
     } else if (identical(_oldNode, node.implementsClause)) {
       return _parser.parseImplementsClause();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitComment(Comment node) {
     throw new InsufficientContextException();
   }
 
+  @override
   AstNode visitCommentReference(CommentReference node) {
     if (identical(_oldNode, node.identifier)) {
       return _parser.parsePrefixedIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitCompilationUnit(CompilationUnit node) {
     throw new InsufficientContextException();
   }
 
+  @override
   AstNode visitConditionalExpression(ConditionalExpression node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseLogicalOrExpression();
@@ -353,9 +374,10 @@
     } else if (identical(_oldNode, node.elseExpression)) {
       return _parser.parseExpressionWithoutCascade();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitConstructorDeclaration(ConstructorDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -374,34 +396,38 @@
     } else if (identical(_oldNode, node.body)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     if (identical(_oldNode, node.fieldName)) {
       return _parser.parseSimpleIdentifier();
     } else if (identical(_oldNode, node.expression)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitConstructorName(ConstructorName node) {
     if (identical(_oldNode, node.type)) {
       return _parser.parseTypeName();
     } else if (identical(_oldNode, node.name)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitContinueStatement(ContinueStatement node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitDeclaredIdentifier(DeclaredIdentifier node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -412,33 +438,39 @@
     } else if (identical(_oldNode, node.identifier)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitDefaultFormalParameter(DefaultFormalParameter node) {
     if (identical(_oldNode, node.parameter)) {
       return _parser.parseNormalFormalParameter();
     } else if (identical(_oldNode, node.defaultValue)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitDoStatement(DoStatement node) {
     if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
     } else if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitDoubleLiteral(DoubleLiteral node) => notAChild(node);
+  @override
+  AstNode visitDoubleLiteral(DoubleLiteral node) => _notAChild(node);
 
-  AstNode visitEmptyFunctionBody(EmptyFunctionBody node) => notAChild(node);
+  @override
+  AstNode visitEmptyFunctionBody(EmptyFunctionBody node) => _notAChild(node);
 
-  AstNode visitEmptyStatement(EmptyStatement node) => notAChild(node);
+  @override
+  AstNode visitEmptyStatement(EmptyStatement node) => _notAChild(node);
 
+  @override
   AstNode visitExportDirective(ExportDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -449,30 +481,34 @@
     } else if (node.combinators.contains(_oldNode)) {
       throw new IncrementalParseException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitExpressionFunctionBody(ExpressionFunctionBody node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitExpressionStatement(ExpressionStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitExtendsClause(ExtendsClause node) {
     if (identical(_oldNode, node.superclass)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFieldDeclaration(FieldDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -481,9 +517,10 @@
     } else if (identical(_oldNode, node.fields)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFieldFormalParameter(FieldFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -496,9 +533,10 @@
     } else if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitForEachStatement(ForEachStatement node) {
     if (identical(_oldNode, node.loopVariable)) {
       throw new InsufficientContextException();
@@ -507,14 +545,16 @@
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFormalParameterList(FormalParameterList node) {
     // We don't know which kind of parameter to parse.
     throw new InsufficientContextException();
   }
 
+  @override
   AstNode visitForStatement(ForStatement node) {
     if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
@@ -527,9 +567,10 @@
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionDeclaration(FunctionDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -542,34 +583,38 @@
     } else if (identical(_oldNode, node.functionExpression)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     if (identical(_oldNode, node.functionDeclaration)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionExpression(FunctionExpression node) {
     if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
     } else if (identical(_oldNode, node.body)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     if (identical(_oldNode, node.function)) {
       throw new InsufficientContextException();
     } else if (identical(_oldNode, node.argumentList)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionTypeAlias(FunctionTypeAlias node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -584,9 +629,10 @@
     } else if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -599,16 +645,18 @@
     } else if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitHideCombinator(HideCombinator node) {
     if (node.hiddenNames.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitIfStatement(IfStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
@@ -617,16 +665,18 @@
     } else if (identical(_oldNode, node.elseStatement)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitImplementsClause(ImplementsClause node) {
     if (node.interfaces.contains(node)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitImportDirective(ImportDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -639,29 +689,33 @@
     } else if (node.combinators.contains(_oldNode)) {
       throw new IncrementalParseException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitIndexExpression(IndexExpression node) {
     if (identical(_oldNode, node.target)) {
       throw new InsufficientContextException();
     } else if (identical(_oldNode, node.index)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseConstructorName();
     } else if (identical(_oldNode, node.argumentList)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitIntegerLiteral(IntegerLiteral node) => notAChild(node);
+  @override
+  AstNode visitIntegerLiteral(IntegerLiteral node) => _notAChild(node);
 
+  @override
   AstNode visitInterpolationExpression(InterpolationExpression node) {
     if (identical(_oldNode, node.expression)) {
       if (node.leftBracket == null) {
@@ -669,38 +723,43 @@
       }
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitInterpolationString(InterpolationString node) {
     throw new InsufficientContextException();
   }
 
+  @override
   AstNode visitIsExpression(IsExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseBitwiseOrExpression();
     } else if (identical(_oldNode, node.type)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitLabel(Label node) {
     if (identical(_oldNode, node.label)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitLabeledStatement(LabeledStatement node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
     } else if (identical(_oldNode, node.statement)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitLibraryDirective(LibraryDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -709,43 +768,48 @@
     } else if (identical(_oldNode, node.name)) {
       return _parser.parseLibraryIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitLibraryIdentifier(LibraryIdentifier node) {
     if (node.components.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitListLiteral(ListLiteral node) {
     if (identical(_oldNode, node.typeArguments)) {
       return _parser.parseTypeArgumentList();
     } else if (node.elements.contains(_oldNode)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitMapLiteral(MapLiteral node) {
     if (identical(_oldNode, node.typeArguments)) {
       return _parser.parseTypeArgumentList();
     } else if (node.entries.contains(_oldNode)) {
       return _parser.parseMapLiteralEntry();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitMapLiteralEntry(MapLiteralEntry node) {
     if (identical(_oldNode, node.key)) {
       return _parser.parseExpression2();
     } else if (identical(_oldNode, node.value)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitMethodDeclaration(MethodDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -762,9 +826,10 @@
       //return parser.parseFunctionBody();
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitMethodInvocation(MethodInvocation node) {
     if (identical(_oldNode, node.target)) {
       throw new IncrementalParseException();
@@ -773,41 +838,47 @@
     } else if (identical(_oldNode, node.argumentList)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitNamedExpression(NamedExpression node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parseLabel();
     } else if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitNativeClause(NativeClause node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parseStringLiteral();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitNativeFunctionBody(NativeFunctionBody node) {
     if (identical(_oldNode, node.stringLiteral)) {
       return _parser.parseStringLiteral();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitNullLiteral(NullLiteral node) => notAChild(node);
+  @override
+  AstNode visitNullLiteral(NullLiteral node) => _notAChild(node);
 
+  @override
   AstNode visitParenthesizedExpression(ParenthesizedExpression node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPartDirective(PartDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -816,9 +887,10 @@
     } else if (identical(_oldNode, node.uri)) {
       return _parser.parseStringLiteral();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPartOfDirective(PartOfDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -827,68 +899,78 @@
     } else if (identical(_oldNode, node.libraryName)) {
       return _parser.parseLibraryIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPostfixExpression(PostfixExpression node) {
     if (identical(_oldNode, node.operand)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (identical(_oldNode, node.prefix)) {
       return _parser.parseSimpleIdentifier();
     } else if (identical(_oldNode, node.identifier)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPrefixExpression(PrefixExpression node) {
     if (identical(_oldNode, node.operand)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitPropertyAccess(PropertyAccess node) {
     if (identical(_oldNode, node.target)) {
       throw new InsufficientContextException();
     } else if (identical(_oldNode, node.propertyName)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseSimpleIdentifier();
     } else if (identical(_oldNode, node.argumentList)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitRethrowExpression(RethrowExpression node) => notAChild(node);
+  @override
+  AstNode visitRethrowExpression(RethrowExpression node) => _notAChild(node);
 
+  @override
   AstNode visitReturnStatement(ReturnStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitScriptTag(ScriptTag node) => notAChild(node);
+  @override
+  AstNode visitScriptTag(ScriptTag node) => _notAChild(node);
 
+  @override
   AstNode visitShowCombinator(ShowCombinator node) {
     if (node.shownNames.contains(_oldNode)) {
       return _parser.parseSimpleIdentifier();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -899,31 +981,37 @@
     } else if (identical(_oldNode, node.identifier)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitSimpleIdentifier(SimpleIdentifier node) => notAChild(node);
+  @override
+  AstNode visitSimpleIdentifier(SimpleIdentifier node) => _notAChild(node);
 
-  AstNode visitSimpleStringLiteral(SimpleStringLiteral node) => notAChild(node);
+  @override
+  AstNode visitSimpleStringLiteral(SimpleStringLiteral node) => _notAChild(node);
 
+  @override
   AstNode visitStringInterpolation(StringInterpolation node) {
     if (node.elements.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     if (identical(_oldNode, node.constructorName)) {
       return _parser.parseSimpleIdentifier();
     } else if (identical(_oldNode, node.argumentList)) {
       return _parser.parseArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitSuperExpression(SuperExpression node) => notAChild(node);
+  @override
+  AstNode visitSuperExpression(SuperExpression node) => _notAChild(node);
 
+  @override
   AstNode visitSwitchCase(SwitchCase node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
@@ -932,41 +1020,47 @@
     } else if (node.statements.contains(_oldNode)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitSwitchDefault(SwitchDefault node) {
     if (node.labels.contains(_oldNode)) {
       return _parser.parseLabel();
     } else if (node.statements.contains(_oldNode)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitSwitchStatement(SwitchStatement node) {
     if (identical(_oldNode, node.expression)) {
       return _parser.parseExpression2();
     } else if (node.members.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
-  AstNode visitSymbolLiteral(SymbolLiteral node) => notAChild(node);
+  @override
+  AstNode visitSymbolLiteral(SymbolLiteral node) => _notAChild(node);
 
-  AstNode visitThisExpression(ThisExpression node) => notAChild(node);
+  @override
+  AstNode visitThisExpression(ThisExpression node) => _notAChild(node);
 
+  @override
   AstNode visitThrowExpression(ThrowExpression node) {
     if (identical(_oldNode, node.expression)) {
-      if (isCascadeAllowedInThrow(node)) {
+      if (_isCascadeAllowedInThrow(node)) {
         return _parser.parseExpression2();
       }
       return _parser.parseExpressionWithoutCascade();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -975,9 +1069,10 @@
     } else if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTryStatement(TryStatement node) {
     if (identical(_oldNode, node.body)) {
       return _parser.parseBlock();
@@ -986,25 +1081,28 @@
     } else if (identical(_oldNode, node.finallyBlock)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTypeArgumentList(TypeArgumentList node) {
     if (node.arguments.contains(_oldNode)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTypeName(TypeName node) {
     if (identical(_oldNode, node.name)) {
       return _parser.parsePrefixedIdentifier();
     } else if (identical(_oldNode, node.typeArguments)) {
       return _parser.parseTypeArgumentList();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTypeParameter(TypeParameter node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -1015,16 +1113,18 @@
     } else if (identical(_oldNode, node.bound)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitTypeParameterList(TypeParameterList node) {
     if (node.typeParameters.contains(node)) {
       return _parser.parseTypeParameter();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitVariableDeclaration(VariableDeclaration node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -1035,9 +1135,10 @@
     } else if (identical(_oldNode, node.initializer)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitVariableDeclarationList(VariableDeclarationList node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -1046,30 +1147,33 @@
     } else if (node.variables.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     if (identical(_oldNode, node.variables)) {
       throw new InsufficientContextException();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitWhileStatement(WhileStatement node) {
     if (identical(_oldNode, node.condition)) {
       return _parser.parseExpression2();
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
+  @override
   AstNode visitWithClause(WithClause node) {
     if (node.mixinTypes.contains(node)) {
       return _parser.parseTypeName();
     }
-    return notAChild(node);
+    return _notAChild(node);
   }
 
   /**
@@ -1079,7 +1183,7 @@
    * @param node the assignment expression being tested
    * @return `true` if the right-hand side can be a cascade expression
    */
-  bool isCascadeAllowedInAssignment(AssignmentExpression node) {
+  bool _isCascadeAllowedInAssignment(AssignmentExpression node) {
     // TODO(brianwilkerson) Implement this method.
     throw new InsufficientContextException();
   }
@@ -1090,7 +1194,7 @@
    * @param node the throw expression being tested
    * @return `true` if the expression can be a cascade expression
    */
-  bool isCascadeAllowedInThrow(ThrowExpression node) {
+  bool _isCascadeAllowedInThrow(ThrowExpression node) {
     // TODO(brianwilkerson) Implement this method.
     throw new InsufficientContextException();
   }
@@ -1101,7 +1205,7 @@
    *
    * @param visitedNode the visited node that should have been the parent of the node to be replaced
    */
-  AstNode notAChild(AstNode visitedNode) {
+  AstNode _notAChild(AstNode visitedNode) {
     throw new IncrementalParseException.con1("Internal error: the visited node (a ${visitedNode.runtimeType.toString()}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType.toString()})");
   }
 }
@@ -1213,7 +1317,7 @@
     // Find the token at which parsing is to begin.
     //
     int originalOffset = oldNode.offset;
-    Token parseToken = findTokenAt(firstToken, originalOffset);
+    Token parseToken = _findTokenAt(firstToken, originalOffset);
     if (parseToken == null) {
       return null;
     }
@@ -1225,7 +1329,7 @@
     while (newNode == null) {
       AstNode parent = oldNode.parent;
       if (parent == null) {
-        parseToken = findFirstToken(parseToken);
+        parseToken = _findFirstToken(parseToken);
         parser.currentToken = parseToken;
         return parser.parseCompilationUnit2();
       }
@@ -1249,7 +1353,7 @@
         newNode = null;
         oldNode = parent;
         originalOffset = oldNode.offset;
-        parseToken = findTokenAt(parseToken, originalOffset);
+        parseToken = _findTokenAt(parseToken, originalOffset);
         parser.currentToken = parseToken;
       }
     }
@@ -1273,7 +1377,7 @@
    * @param firstToken the token from which the search is to begin
    * @return the first token in the token stream containing the given token
    */
-  Token findFirstToken(Token firstToken) {
+  Token _findFirstToken(Token firstToken) {
     while (firstToken.type != TokenType.EOF) {
       firstToken = firstToken.previous;
     }
@@ -1288,7 +1392,7 @@
    * @param offset the offset of the token to be returned
    * @return the token with the given offset
    */
-  Token findTokenAt(Token firstToken, int offset) {
+  Token _findTokenAt(Token firstToken, int offset) {
     while (firstToken.offset > offset && firstToken.type != TokenType.EOF) {
       firstToken = firstToken.previous;
     }
@@ -1444,7 +1548,7 @@
     InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.Parser.parseStatements");
     try {
       _currentToken = token;
-      return parseStatementList();
+      return _parseStatementList();
     } finally {
       instrumentation.log();
     }
@@ -1470,16 +1574,16 @@
    * @return the annotation that was parsed
    */
   Annotation parseAnnotation() {
-    Token atSign = expect(TokenType.AT);
+    Token atSign = _expect(TokenType.AT);
     Identifier name = parsePrefixedIdentifier();
     Token period = null;
     SimpleIdentifier constructorName = null;
-    if (matches(TokenType.PERIOD)) {
+    if (_matches(TokenType.PERIOD)) {
       period = andAdvance;
       constructorName = parseSimpleIdentifier();
     }
     ArgumentList arguments = null;
-    if (matches(TokenType.OPEN_PAREN)) {
+    if (_matches(TokenType.OPEN_PAREN)) {
       arguments = parseArgumentList();
     }
     return new Annotation(atSign, name, period, constructorName, arguments);
@@ -1504,7 +1608,7 @@
     // Both namedArgument and expression can start with an identifier, but only namedArgument can
     // have an identifier followed by a colon.
     //
-    if (matchesIdentifier() && tokenMatches(peek(), TokenType.COLON)) {
+    if (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
       return new NamedExpression(parseLabel(), parseExpression2());
     } else {
       return parseExpression2();
@@ -1526,9 +1630,9 @@
    * @return the argument list that was parsed
    */
   ArgumentList parseArgumentList() {
-    Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
     List<Expression> arguments = new List<Expression>();
-    if (matches(TokenType.CLOSE_PAREN)) {
+    if (_matches(TokenType.CLOSE_PAREN)) {
       return new ArgumentList(leftParenthesis, arguments, andAdvance);
     }
     //
@@ -1539,13 +1643,13 @@
     arguments.add(argument);
     bool foundNamedArgument = argument is NamedExpression;
     bool generatedError = false;
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       argument = parseArgument();
       arguments.add(argument);
       if (foundNamedArgument) {
         if (!generatedError && argument is! NamedExpression) {
           // Report the error, once, but allow the arguments to be in any order in the AST.
-          reportErrorForCurrentToken(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          _reportErrorForCurrentToken(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
           generatedError = true;
         }
       } else if (argument is NamedExpression) {
@@ -1555,7 +1659,7 @@
     // TODO(brianwilkerson) Recovery: Look at the left parenthesis to see whether there is a
     // matching right parenthesis. If there is, then we're more likely missing a comma and should
     // go back to parsing arguments.
-    Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
     return new ArgumentList(leftParenthesis, arguments, rightParenthesis);
   }
 
@@ -1572,14 +1676,14 @@
    */
   Expression parseBitwiseOrExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && tokenMatches(peek(), TokenType.BAR)) {
+    if (_matchesKeyword(Keyword.SUPER) && _tokenMatches(_peek(), TokenType.BAR)) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseBitwiseXorExpression();
+      expression = _parseBitwiseXorExpression();
     }
-    while (matches(TokenType.BAR)) {
+    while (_matches(TokenType.BAR)) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseBitwiseXorExpression());
+      expression = new BinaryExpression(expression, operator, _parseBitwiseXorExpression());
     }
     return expression;
   }
@@ -1595,22 +1699,22 @@
    * @return the block that was parsed
    */
   Block parseBlock() {
-    Token leftBracket = expect(TokenType.OPEN_CURLY_BRACKET);
+    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
     List<Statement> statements = new List<Statement>();
     Token statementStart = _currentToken;
-    while (!matches(TokenType.EOF) && !matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
       Statement statement = parseStatement2();
       if (statement != null) {
         statements.add(statement);
       }
       if (identical(_currentToken, statementStart)) {
         // Ensure that we are making progress and report an error if we're not.
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
       }
       statementStart = _currentToken;
     }
-    Token rightBracket = expect(TokenType.CLOSE_CURLY_BRACKET);
+    Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
     return new Block(leftBracket, statements, rightBracket);
   }
 
@@ -1628,142 +1732,142 @@
    *         class member
    */
   ClassMember parseClassMember(String className) {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    Modifiers modifiers = parseModifiers();
-    if (matchesKeyword(Keyword.VOID)) {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    Modifiers modifiers = _parseModifiers();
+    if (_matchesKeyword(Keyword.VOID)) {
       TypeName returnType = parseReturnType();
-      if (matchesKeyword(Keyword.GET) && tokenMatchesIdentifier(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matchesKeyword(Keyword.SET) && tokenMatchesIdentifier(peek())) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
-      } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
-      } else if (matchesIdentifier() && matchesAny(peek(), [
+      if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (_matchesIdentifier() && _peek().matchesAny([
           TokenType.OPEN_PAREN,
           TokenType.OPEN_CURLY_BRACKET,
           TokenType.FUNCTION])) {
-        validateModifiersForGetterOrSetterOrMethod(modifiers);
-        return parseMethodDeclarationAfterReturnType(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseMethodDeclarationAfterReturnType(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, returnType);
       } else {
         //
         // We have found an error of some kind. Try to recover.
         //
-        if (matchesIdentifier()) {
-          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+        if (_matchesIdentifier()) {
+          if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
             //
             // We appear to have a variable declaration with a type of "void".
             //
-            reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
-            return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), returnType);
+            _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
+            return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), returnType);
           }
         }
-        if (isOperator(_currentToken)) {
+        if (_isOperator(_currentToken)) {
           //
           // We appear to have found an operator declaration without the 'operator' keyword.
           //
-          validateModifiersForOperator(modifiers);
-          return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
+          _validateModifiersForOperator(modifiers);
+          return _parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
         }
-        reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
-    } else if (matchesKeyword(Keyword.GET) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matchesKeyword(Keyword.SET) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
-    } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (!matchesIdentifier()) {
-      if (isOperator(_currentToken)) {
+    } else if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _validateModifiersForOperator(modifiers);
+      return _parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (!_matchesIdentifier()) {
+      if (_isOperator(_currentToken)) {
         //
         // We appear to have found an operator declaration without the 'operator' keyword.
         //
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
       }
-      reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       if (commentAndMetadata.comment != null || !commentAndMetadata.metadata.isEmpty) {
         //
         // We appear to have found an incomplete declaration at the end of the class. At this point
         // it consists of a metadata, which we don't want to loose, so we'll treat it as a method
         // declaration with a missing name, parameters and empty body.
         //
-        return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, null, null, null, null, null, createSyntheticIdentifier(), new FormalParameterList(null, new List<FormalParameter>(), null, null, null), new EmptyFunctionBody(createSyntheticToken(TokenType.SEMICOLON)));
+        return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, null, null, null, null, null, _createSyntheticIdentifier(), new FormalParameterList(null, new List<FormalParameter>(), null, null, null), new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON)));
       }
       return null;
-    } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peekAt(2)) && tokenMatches(peekAt(3), TokenType.OPEN_PAREN)) {
-      return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
-    } else if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+    } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatchesIdentifier(_peekAt(2)) && _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
+      return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       SimpleIdentifier methodName = parseSimpleIdentifier();
       FormalParameterList parameters = parseFormalParameterList();
-      if (matches(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+      if (_matches(TokenType.COLON) || modifiers.factoryKeyword != null || methodName.name == className) {
+        return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
       }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      return parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
-    } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _validateFormalParameterList(parameters);
+      return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
+    } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
-      return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
+      return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), null);
     }
     TypeName type = parseTypeName();
-    if (matchesKeyword(Keyword.GET) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matchesKeyword(Keyword.SET) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      return parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
-    } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-      validateModifiersForOperator(modifiers);
-      return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
-    } else if (!matchesIdentifier()) {
-      if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _validateModifiersForOperator(modifiers);
+      return _parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+    } else if (!_matchesIdentifier()) {
+      if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
         //
         // We appear to have found an incomplete declaration at the end of the class. At this point
         // it consists of a type name, so we'll treat it as a field declaration with a missing
         // field name and semicolon.
         //
-        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+        return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
       }
-      if (isOperator(_currentToken)) {
+      if (_isOperator(_currentToken)) {
         //
         // We appear to have found an operator declaration without the 'operator' keyword.
         //
-        validateModifiersForOperator(modifiers);
-        return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
       }
       //
       // We appear to have found an incomplete declaration before another declaration.
       // At this point it consists of a type name, so we'll treat it as a field declaration
       // with a missing field name and semicolon.
       //
-      reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       try {
-        lockErrorListener();
-        return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+        _lockErrorListener();
+        return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
       } finally {
-        unlockErrorListener();
+        _unlockErrorListener();
       }
-    } else if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       SimpleIdentifier methodName = parseSimpleIdentifier();
       FormalParameterList parameters = parseFormalParameterList();
       if (methodName.name == className) {
-        reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
-        return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
+        _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type, []);
+        return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodName, null, null, parameters);
       }
-      validateModifiersForGetterOrSetterOrMethod(modifiers);
-      validateFormalParameterList(parameters);
-      return parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _validateFormalParameterList(parameters);
+      return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, parameters);
     }
-    return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), type);
+    return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
   }
 
   /**
@@ -1791,7 +1895,7 @@
   CompilationUnit parseCompilationUnit2() {
     Token firstToken = _currentToken;
     ScriptTag scriptTag = null;
-    if (matches(TokenType.SCRIPT_TAG)) {
+    if (_matches(TokenType.SCRIPT_TAG)) {
       scriptTag = new ScriptTag(andAdvance);
     }
     //
@@ -1805,20 +1909,20 @@
     List<Directive> directives = new List<Directive>();
     List<CompilationUnitMember> declarations = new List<CompilationUnitMember>();
     Token memberStart = _currentToken;
-    while (!matches(TokenType.EOF)) {
-      CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-      if ((matchesKeyword(Keyword.IMPORT) || matchesKeyword(Keyword.EXPORT) || matchesKeyword(Keyword.LIBRARY) || matchesKeyword(Keyword.PART)) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT) && !tokenMatches(peek(), TokenType.OPEN_PAREN)) {
-        Directive directive = parseDirective(commentAndMetadata);
+    while (!_matches(TokenType.EOF)) {
+      CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+      if ((_matchesKeyword(Keyword.IMPORT) || _matchesKeyword(Keyword.EXPORT) || _matchesKeyword(Keyword.LIBRARY) || _matchesKeyword(Keyword.PART)) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT) && !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        Directive directive = _parseDirective(commentAndMetadata);
         if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportErrorForCurrentToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          _reportErrorForCurrentToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
           directiveFoundAfterDeclaration = true;
         }
         if (directive is LibraryDirective) {
           if (libraryDirectiveFound) {
-            reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+            _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
           } else {
             if (directives.length > 0) {
-              reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, directive.libraryToken, []);
+              _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, directive.libraryToken, []);
             }
             libraryDirectiveFound = true;
           }
@@ -1826,41 +1930,41 @@
           partDirectiveFound = true;
         } else if (partDirectiveFound) {
           if (directive is ExportDirective) {
-            reportErrorForToken(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, directive.keyword, []);
+            _reportErrorForToken(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, directive.keyword, []);
           } else if (directive is ImportDirective) {
-            reportErrorForToken(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, directive.keyword, []);
+            _reportErrorForToken(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, directive.keyword, []);
           }
         }
         if (directive is PartOfDirective) {
           if (partOfDirectiveFound) {
-            reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+            _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
           } else {
             int directiveCount = directives.length;
             for (int i = 0; i < directiveCount; i++) {
-              reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directives[i].keyword, []);
+              _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directives[i].keyword, []);
             }
             partOfDirectiveFound = true;
           }
         } else {
           if (partOfDirectiveFound) {
-            reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+            _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
           }
         }
         directives.add(directive);
-      } else if (matches(TokenType.SEMICOLON)) {
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
+      } else if (_matches(TokenType.SEMICOLON)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
       } else {
-        CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
+        CompilationUnitMember member = _parseCompilationUnitMember(commentAndMetadata);
         if (member != null) {
           declarations.add(member);
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
-        while (!matches(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
-          advance();
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
+        while (!_matches(TokenType.EOF) && !_couldBeStartOfCompilationUnitMember()) {
+          _advance();
         }
       }
       memberStart = _currentToken;
@@ -1880,12 +1984,12 @@
    */
   Expression parseConditionalExpression() {
     Expression condition = parseLogicalOrExpression();
-    if (!matches(TokenType.QUESTION)) {
+    if (!_matches(TokenType.QUESTION)) {
       return condition;
     }
     Token question = andAdvance;
     Expression thenExpression = parseExpressionWithoutCascade();
-    Token colon = expect(TokenType.COLON);
+    Token colon = _expect(TokenType.COLON);
     Expression elseExpression = parseExpressionWithoutCascade();
     return new ConditionalExpression(condition, question, thenExpression, colon, elseExpression);
   }
@@ -1904,7 +2008,7 @@
     TypeName type = parseTypeName();
     Token period = null;
     SimpleIdentifier name = null;
-    if (matches(TokenType.PERIOD)) {
+    if (_matches(TokenType.PERIOD)) {
       period = andAdvance;
       name = parseSimpleIdentifier();
     }
@@ -1924,10 +2028,10 @@
    * @return the expression that was parsed
    */
   Expression parseExpression2() {
-    if (matchesKeyword(Keyword.THROW)) {
-      return parseThrowExpression();
-    } else if (matchesKeyword(Keyword.RETHROW)) {
-      return parseRethrowExpression();
+    if (_matchesKeyword(Keyword.THROW)) {
+      return _parseThrowExpression();
+    } else if (_matchesKeyword(Keyword.RETHROW)) {
+      return _parseRethrowExpression();
     }
     //
     // assignableExpression is a subset of conditionalExpression, so we can parse a conditional
@@ -1939,7 +2043,7 @@
     if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
       List<Expression> cascadeSections = new List<Expression>();
       while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-        Expression section = parseCascadeSection();
+        Expression section = _parseCascadeSection();
         if (section != null) {
           cascadeSections.add(section);
         }
@@ -1948,7 +2052,7 @@
       return new CascadeExpression(expression, cascadeSections);
     } else if (tokenType.isAssignmentOperator) {
       Token operator = andAdvance;
-      ensureAssignable(expression);
+      _ensureAssignable(expression);
       return new AssignmentExpression(expression, operator, parseExpression2());
     }
     return expression;
@@ -1967,10 +2071,10 @@
    * @return the expression that was parsed
    */
   Expression parseExpressionWithoutCascade() {
-    if (matchesKeyword(Keyword.THROW)) {
-      return parseThrowExpressionWithoutCascade();
-    } else if (matchesKeyword(Keyword.RETHROW)) {
-      return parseRethrowExpression();
+    if (_matchesKeyword(Keyword.THROW)) {
+      return _parseThrowExpressionWithoutCascade();
+    } else if (_matchesKeyword(Keyword.RETHROW)) {
+      return _parseRethrowExpression();
     }
     //
     // assignableExpression is a subset of conditionalExpression, so we can parse a conditional
@@ -1980,7 +2084,7 @@
     Expression expression = parseConditionalExpression();
     if (_currentToken.type.isAssignmentOperator) {
       Token operator = andAdvance;
-      ensureAssignable(expression);
+      _ensureAssignable(expression);
       expression = new AssignmentExpression(expression, operator, parseExpressionWithoutCascade());
     }
     return expression;
@@ -1997,7 +2101,7 @@
    * @return the class extends clause that was parsed
    */
   ExtendsClause parseExtendsClause() {
-    Token keyword = expectKeyword(Keyword.EXTENDS);
+    Token keyword = _expectKeyword(Keyword.EXTENDS);
     TypeName superclass = parseTypeName();
     return new ExtendsClause(keyword, superclass);
   }
@@ -2028,8 +2132,8 @@
    * @return the formal parameters that were parsed
    */
   FormalParameterList parseFormalParameterList() {
-    Token leftParenthesis = expect(TokenType.OPEN_PAREN);
-    if (matches(TokenType.CLOSE_PAREN)) {
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+    if (_matches(TokenType.CLOSE_PAREN)) {
       return new FormalParameterList(leftParenthesis, null, null, null, andAdvance);
     }
     //
@@ -2056,12 +2160,12 @@
     do {
       if (firstParameter) {
         firstParameter = false;
-      } else if (!optional(TokenType.COMMA)) {
+      } else if (!_optional(TokenType.COMMA)) {
         // TODO(brianwilkerson) The token is wrong, we need to recover from this case.
-        if (getEndToken(leftParenthesis) != null) {
-          reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        if (_getEndToken(leftParenthesis) != null) {
+          _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
         } else {
-          reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
           break;
         }
       }
@@ -2069,27 +2173,27 @@
       //
       // Handle the beginning of parameter groups.
       //
-      if (matches(TokenType.OPEN_SQUARE_BRACKET)) {
+      if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
         wasOptionalParameter = true;
         if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
           reportedMuliplePositionalGroups = true;
         }
         if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftSquareBracket = andAdvance;
         currentParameters = positionalParameters;
         kind = ParameterKind.POSITIONAL;
-      } else if (matches(TokenType.OPEN_CURLY_BRACKET)) {
+      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
         wasOptionalParameter = true;
         if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
           reportedMulipleNamedGroups = true;
         }
         if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftCurlyBracket = andAdvance;
@@ -2099,53 +2203,53 @@
       //
       // Parse and record the parameter.
       //
-      FormalParameter parameter = parseFormalParameter(kind);
+      FormalParameter parameter = _parseFormalParameter(kind);
       parameters.add(parameter);
       currentParameters.add(parameter);
       if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
-        reportErrorForNode(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
+        _reportErrorForNode(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
       }
       //
       // Handle the end of parameter groups.
       //
       // TODO(brianwilkerson) Improve the detection and reporting of missing and mismatched delimiters.
-      if (matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+      if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
         rightSquareBracket = andAdvance;
         currentParameters = normalParameters;
         if (leftSquareBracket == null) {
           if (leftCurlyBracket != null) {
-            reportErrorForCurrentToken(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            _reportErrorForCurrentToken(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
             rightCurlyBracket = rightSquareBracket;
             rightSquareBracket = null;
           } else {
-            reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+            _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
           }
         }
         kind = ParameterKind.REQUIRED;
-      } else if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
         rightCurlyBracket = andAdvance;
         currentParameters = normalParameters;
         if (leftCurlyBracket == null) {
           if (leftSquareBracket != null) {
-            reportErrorForCurrentToken(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            _reportErrorForCurrentToken(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
             rightSquareBracket = rightCurlyBracket;
             rightCurlyBracket = null;
           } else {
-            reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+            _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
           }
         }
         kind = ParameterKind.REQUIRED;
       }
-    } while (!matches(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
-    Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+    } while (!_matches(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
     //
     // Check that the groups were closed correctly.
     //
     if (leftSquareBracket != null && rightSquareBracket == null) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
     }
     if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
     }
     //
     // Build the parameter list.
@@ -2171,8 +2275,8 @@
    */
   FunctionExpression parseFunctionExpression() {
     FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
+    _validateFormalParameterList(parameters);
+    FunctionBody body = _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
     return new FunctionExpression(parameters, body);
   }
 
@@ -2187,10 +2291,10 @@
    * @return the implements clause that was parsed
    */
   ImplementsClause parseImplementsClause() {
-    Token keyword = expectKeyword(Keyword.IMPLEMENTS);
+    Token keyword = _expectKeyword(Keyword.IMPLEMENTS);
     List<TypeName> interfaces = new List<TypeName>();
     interfaces.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       interfaces.add(parseTypeName());
     }
     return new ImplementsClause(keyword, interfaces);
@@ -2208,7 +2312,7 @@
    */
   Label parseLabel() {
     SimpleIdentifier label = parseSimpleIdentifier();
-    Token colon = expect(TokenType.COLON);
+    Token colon = _expect(TokenType.COLON);
     return new Label(label, colon);
   }
 
@@ -2225,8 +2329,8 @@
   LibraryIdentifier parseLibraryIdentifier() {
     List<SimpleIdentifier> components = new List<SimpleIdentifier>();
     components.add(parseSimpleIdentifier());
-    while (matches(TokenType.PERIOD)) {
-      advance();
+    while (_matches(TokenType.PERIOD)) {
+      _advance();
       components.add(parseSimpleIdentifier());
     }
     return new LibraryIdentifier(components);
@@ -2243,10 +2347,10 @@
    * @return the logical or expression that was parsed
    */
   Expression parseLogicalOrExpression() {
-    Expression expression = parseLogicalAndExpression();
-    while (matches(TokenType.BAR_BAR)) {
+    Expression expression = _parseLogicalAndExpression();
+    while (_matches(TokenType.BAR_BAR)) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseLogicalAndExpression());
+      expression = new BinaryExpression(expression, operator, _parseLogicalAndExpression());
     }
     return expression;
   }
@@ -2263,7 +2367,7 @@
    */
   MapLiteralEntry parseMapLiteralEntry() {
     Expression key = parseExpression2();
-    Token separator = expect(TokenType.COLON);
+    Token separator = _expect(TokenType.COLON);
     Expression value = parseExpression2();
     return new MapLiteralEntry(key, separator, value);
   }
@@ -2291,20 +2395,20 @@
    * @return the normal formal parameter that was parsed
    */
   NormalFormalParameter parseNormalFormalParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    FinalConstVarOrType holder = parseFinalConstVarOrType(true);
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    FinalConstVarOrType holder = _parseFinalConstVarOrType(true);
     Token thisKeyword = null;
     Token period = null;
-    if (matchesKeyword(Keyword.THIS)) {
+    if (_matchesKeyword(Keyword.THIS)) {
       thisKeyword = andAdvance;
-      period = expect(TokenType.PERIOD);
+      period = _expect(TokenType.PERIOD);
     }
     SimpleIdentifier identifier = parseSimpleIdentifier();
-    if (matches(TokenType.OPEN_PAREN)) {
+    if (_matches(TokenType.OPEN_PAREN)) {
       FormalParameterList parameters = parseFormalParameterList();
       if (thisKeyword == null) {
         if (holder.keyword != null) {
-          reportErrorForToken(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
+          _reportErrorForToken(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
         }
         return new FunctionTypedFormalParameter(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
       } else {
@@ -2313,10 +2417,10 @@
     }
     TypeName type = holder.type;
     if (type != null) {
-      if (tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) {
-        reportErrorForToken(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
-      } else if (holder.keyword != null && tokenMatchesKeyword(holder.keyword, Keyword.VAR)) {
-        reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
+      if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) {
+        _reportErrorForToken(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
+      } else if (holder.keyword != null && _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) {
+        _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
       }
     }
     if (thisKeyword != null) {
@@ -2337,7 +2441,7 @@
    */
   Identifier parsePrefixedIdentifier() {
     SimpleIdentifier qualifier = parseSimpleIdentifier();
-    if (!matches(TokenType.PERIOD)) {
+    if (!_matches(TokenType.PERIOD)) {
       return qualifier;
     }
     Token period = andAdvance;
@@ -2357,7 +2461,7 @@
    * @return the return type that was parsed
    */
   TypeName parseReturnType() {
-    if (matchesKeyword(Keyword.VOID)) {
+    if (_matchesKeyword(Keyword.VOID)) {
       return new TypeName(new SimpleIdentifier(andAdvance), null);
     } else {
       return parseTypeName();
@@ -2375,11 +2479,11 @@
    * @return the simple identifier that was parsed
    */
   SimpleIdentifier parseSimpleIdentifier() {
-    if (matchesIdentifier()) {
+    if (_matchesIdentifier()) {
       return new SimpleIdentifier(andAdvance);
     }
-    reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
-    return createSyntheticIdentifier();
+    _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+    return _createSyntheticIdentifier();
   }
 
   /**
@@ -2394,10 +2498,10 @@
    */
   Statement parseStatement2() {
     List<Label> labels = new List<Label>();
-    while (matchesIdentifier() && tokenMatches(peek(), TokenType.COLON)) {
+    while (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
       labels.add(parseLabel());
     }
-    Statement statement = parseNonLabeledStatement();
+    Statement statement = _parseNonLabeledStatement();
     if (labels.isEmpty) {
       return statement;
     }
@@ -2417,17 +2521,17 @@
    */
   StringLiteral parseStringLiteral() {
     List<StringLiteral> strings = new List<StringLiteral>();
-    while (matches(TokenType.STRING)) {
+    while (_matches(TokenType.STRING)) {
       Token string = andAdvance;
-      if (matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-        strings.add(parseStringInterpolation(string));
+      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+        strings.add(_parseStringInterpolation(string));
       } else {
-        strings.add(new SimpleStringLiteral(string, computeStringValue(string.lexeme, true, true)));
+        strings.add(new SimpleStringLiteral(string, _computeStringValue(string.lexeme, true, true)));
       }
     }
     if (strings.length < 1) {
-      reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
-      return createSyntheticStringLiteral();
+      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      return _createSyntheticStringLiteral();
     } else if (strings.length == 1) {
       return strings[0];
     } else {
@@ -2449,13 +2553,13 @@
    * @return the type argument list that was parsed
    */
   TypeArgumentList parseTypeArgumentList() {
-    Token leftBracket = expect(TokenType.LT);
+    Token leftBracket = _expect(TokenType.LT);
     List<TypeName> arguments = new List<TypeName>();
     arguments.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       arguments.add(parseTypeName());
     }
-    Token rightBracket = expect(TokenType.GT);
+    Token rightBracket = _expectGt();
     return new TypeArgumentList(leftBracket, arguments, rightBracket);
   }
 
@@ -2471,17 +2575,17 @@
    */
   TypeName parseTypeName() {
     Identifier typeName;
-    if (matchesKeyword(Keyword.VAR)) {
-      reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+    if (_matchesKeyword(Keyword.VAR)) {
+      _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME, []);
       typeName = new SimpleIdentifier(andAdvance);
-    } else if (matchesIdentifier()) {
+    } else if (_matchesIdentifier()) {
       typeName = parsePrefixedIdentifier();
     } else {
-      typeName = createSyntheticIdentifier();
-      reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+      typeName = _createSyntheticIdentifier();
+      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME, []);
     }
     TypeArgumentList typeArguments = null;
-    if (matches(TokenType.LT)) {
+    if (_matches(TokenType.LT)) {
       typeArguments = parseTypeArgumentList();
     }
     return new TypeName(typeName, typeArguments);
@@ -2498,9 +2602,9 @@
    * @return the type parameter that was parsed
    */
   TypeParameter parseTypeParameter() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     SimpleIdentifier name = parseSimpleIdentifier();
-    if (matchesKeyword(Keyword.EXTENDS)) {
+    if (_matchesKeyword(Keyword.EXTENDS)) {
       Token keyword = andAdvance;
       TypeName bound = parseTypeName();
       return new TypeParameter(commentAndMetadata.comment, commentAndMetadata.metadata, name, keyword, bound);
@@ -2519,13 +2623,13 @@
    * @return the list of type parameters that were parsed
    */
   TypeParameterList parseTypeParameterList() {
-    Token leftBracket = expect(TokenType.LT);
+    Token leftBracket = _expect(TokenType.LT);
     List<TypeParameter> typeParameters = new List<TypeParameter>();
     typeParameters.add(parseTypeParameter());
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       typeParameters.add(parseTypeParameter());
     }
-    Token rightBracket = expect(TokenType.GT);
+    Token rightBracket = _expectGt();
     return new TypeParameterList(leftBracket, typeParameters, rightBracket);
   }
 
@@ -2540,10 +2644,10 @@
    * @return the with clause that was parsed
    */
   WithClause parseWithClause() {
-    Token with2 = expectKeyword(Keyword.WITH);
+    Token with2 = _expectKeyword(Keyword.WITH);
     List<TypeName> types = new List<TypeName>();
     types.add(parseTypeName());
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       types.add(parseTypeName());
     }
     return new WithClause(with2, types);
@@ -2556,7 +2660,7 @@
   /**
    * Advance to the next token in the token stream.
    */
-  void advance() {
+  void _advance() {
     _currentToken = _currentToken.next;
   }
 
@@ -2571,9 +2675,9 @@
    * @param startIndex the index of the first character representing the scalar value
    * @param endIndex the index of the last character representing the scalar value
    */
-  void appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
+  void _appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
     if (scalarValue < 0 || scalarValue > Character.MAX_CODE_POINT || (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
-      reportErrorForCurrentToken(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
+      _reportErrorForCurrentToken(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
       return;
     }
     if (scalarValue < Character.MAX_VALUE) {
@@ -2591,7 +2695,7 @@
    * @param last `true` if this is the last token in a string literal
    * @return the actual value of the string
    */
-  String computeStringValue(String lexeme, bool first, bool last) {
+  String _computeStringValue(String lexeme, bool first, bool last) {
     bool isRaw = false;
     int start = 0;
     if (first) {
@@ -2625,7 +2729,7 @@
     JavaStringBuilder builder = new JavaStringBuilder();
     int index = start;
     while (index < end) {
-      index = translateCharacter(builder, lexeme, index);
+      index = _translateCharacter(builder, lexeme, index);
     }
     return builder.toString();
   }
@@ -2637,7 +2741,7 @@
    * @return the function declaration that most closely captures the components of the given method
    *         declaration
    */
-  FunctionDeclaration convertToFunctionDeclaration(MethodDeclaration method) => new FunctionDeclaration(method.documentationComment, method.metadata, method.externalKeyword, method.returnType, method.propertyKeyword, method.name, new FunctionExpression(method.parameters, method.body));
+  FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) => new FunctionDeclaration(method.documentationComment, method.metadata, method.externalKeyword, method.returnType, method.propertyKeyword, method.name, new FunctionExpression(method.parameters, method.body));
 
   /**
    * Return `true` if the current token could be the start of a compilation unit member. This
@@ -2646,29 +2750,29 @@
    *
    * @return `true` if the current token could be the start of a compilation unit member
    */
-  bool couldBeStartOfCompilationUnitMember() {
-    if ((matchesKeyword(Keyword.IMPORT) || matchesKeyword(Keyword.EXPORT) || matchesKeyword(Keyword.LIBRARY) || matchesKeyword(Keyword.PART)) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT)) {
+  bool _couldBeStartOfCompilationUnitMember() {
+    if ((_matchesKeyword(Keyword.IMPORT) || _matchesKeyword(Keyword.EXPORT) || _matchesKeyword(Keyword.LIBRARY) || _matchesKeyword(Keyword.PART)) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT)) {
       // This looks like the start of a directive
       return true;
-    } else if (matchesKeyword(Keyword.CLASS)) {
+    } else if (_matchesKeyword(Keyword.CLASS)) {
       // This looks like the start of a class definition
       return true;
-    } else if (matchesKeyword(Keyword.TYPEDEF) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT)) {
+    } else if (_matchesKeyword(Keyword.TYPEDEF) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT)) {
       // This looks like the start of a typedef
       return true;
-    } else if (matchesKeyword(Keyword.VOID) || ((matchesKeyword(Keyword.GET) || matchesKeyword(Keyword.SET)) && tokenMatchesIdentifier(peek())) || (matchesKeyword(Keyword.OPERATOR) && isOperator(peek()))) {
+    } else if (_matchesKeyword(Keyword.VOID) || ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tokenMatchesIdentifier(_peek())) || (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek()))) {
       // This looks like the start of a function
       return true;
-    } else if (matchesIdentifier()) {
-      if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+    } else if (_matchesIdentifier()) {
+      if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
         // This looks like the start of a function
         return true;
       }
-      Token token = skipReturnType(_currentToken);
+      Token token = _skipReturnType(_currentToken);
       if (token == null) {
         return false;
       }
-      if (matchesKeyword(Keyword.GET) || matchesKeyword(Keyword.SET) || (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) || matchesIdentifier()) {
+      if (_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET) || (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) || _matchesIdentifier()) {
         return true;
       }
     }
@@ -2680,16 +2784,16 @@
    *
    * @return the synthetic identifier that was created
    */
-  SimpleIdentifier createSyntheticIdentifier() {
+  SimpleIdentifier _createSyntheticIdentifier() {
     Token syntheticToken;
     if (identical(_currentToken.type, TokenType.KEYWORD)) {
       // Consider current keyword token as an identifier.
       // It is not always true, e.g. "^is T" where "^" is place the place for synthetic identifier.
       // By creating SyntheticStringToken we can distinguish a real identifier from synthetic.
       // In the code completion behavior will depend on a cursor position - before or on "is".
-      syntheticToken = injectToken(new SyntheticStringToken(TokenType.IDENTIFIER, _currentToken.lexeme, _currentToken.offset));
+      syntheticToken = _injectToken(new SyntheticStringToken(TokenType.IDENTIFIER, _currentToken.lexeme, _currentToken.offset));
     } else {
-      syntheticToken = createSyntheticToken(TokenType.IDENTIFIER);
+      syntheticToken = _createSyntheticToken(TokenType.IDENTIFIER);
     }
     return new SimpleIdentifier(syntheticToken);
   }
@@ -2699,21 +2803,21 @@
    *
    * @return the synthetic token that was created
    */
-  Token createSyntheticKeyword(Keyword keyword) => injectToken(new Parser_SyntheticKeywordToken(keyword, _currentToken.offset));
+  Token _createSyntheticKeyword(Keyword keyword) => _injectToken(new Parser_SyntheticKeywordToken(keyword, _currentToken.offset));
 
   /**
    * Create a synthetic string literal.
    *
    * @return the synthetic string literal that was created
    */
-  SimpleStringLiteral createSyntheticStringLiteral() => new SimpleStringLiteral(createSyntheticToken(TokenType.STRING), "");
+  SimpleStringLiteral _createSyntheticStringLiteral() => new SimpleStringLiteral(_createSyntheticToken(TokenType.STRING), "");
 
   /**
    * Create a synthetic token with the given type.
    *
    * @return the synthetic token that was created
    */
-  Token createSyntheticToken(TokenType type) => injectToken(new StringToken(type, "", _currentToken.offset));
+  Token _createSyntheticToken(TokenType type) => _injectToken(new StringToken(type, "", _currentToken.offset));
 
   /**
    * Check that the given expression is assignable and report an error if it isn't.
@@ -2731,47 +2835,63 @@
    *
    * @param expression the expression being checked
    */
-  void ensureAssignable(Expression expression) {
+  void _ensureAssignable(Expression expression) {
     if (expression != null && !expression.isAssignable) {
-      reportErrorForCurrentToken(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
     }
   }
 
   /**
    * If the current token has the expected type, return it after advancing to the next token.
-   * Otherwise report an error and return the current token without advancing.
+   * Otherwise report an error and return the current token without advancing. Note that the method
+   * [expectGt] should be used if the argument to this method would be [TokenType#GT]
+   * .
    *
    * @param type the type of token that is expected
    * @return the token that matched the given type
    */
-  Token expect(TokenType type) {
-    if (matches(type)) {
+  Token _expect(TokenType type) {
+    if (_matches(type)) {
       return andAdvance;
     }
     // Remove uses of this method in favor of matches?
     // Pass in the error code to use to report the error?
     if (identical(type, TokenType.SEMICOLON)) {
-      reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
+      _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
     } else {
-      reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
+      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
     }
     return _currentToken;
   }
 
   /**
+   * If the current token has the type [TokenType#GT], return it after advancing to the next
+   * token. Otherwise report an error and return the current token without advancing.
+   *
+   * @return the token that matched the given type
+   */
+  Token _expectGt() {
+    if (_matchesGt()) {
+      return andAdvance;
+    }
+    _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType.GT.lexeme]);
+    return _currentToken;
+  }
+
+  /**
    * If the current token is a keyword matching the given string, return it after advancing to the
    * next token. Otherwise report an error and return the current token without advancing.
    *
    * @param keyword the keyword that is expected
    * @return the token that matched the given type
    */
-  Token expectKeyword(Keyword keyword) {
-    if (matchesKeyword(keyword)) {
+  Token _expectKeyword(Keyword keyword) {
+    if (_matchesKeyword(keyword)) {
       return andAdvance;
     }
     // Remove uses of this method in favor of matches?
     // Pass in the error code to use to report the error?
-    reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
+    _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
     return _currentToken;
   }
 
@@ -2781,12 +2901,12 @@
    *
    * TODO(scheglov) consider pushing this into [expect]
    */
-  Token expectSemicolon() {
-    if (matches(TokenType.SEMICOLON)) {
+  Token _expectSemicolon() {
+    if (_matches(TokenType.SEMICOLON)) {
       return andAdvance;
     } else {
-      reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [";"]);
-      return createSyntheticToken(TokenType.SEMICOLON);
+      _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [";"]);
+      return _createSyntheticToken(TokenType.SEMICOLON);
     }
   }
 
@@ -2798,7 +2918,7 @@
    * @param index the index contained in the returned range
    * @return the range that was found
    */
-  List<int> findRange(List<List<int>> ranges, int index) {
+  List<int> _findRange(List<List<int>> ranges, int index) {
     int rangeCount = ranges.length;
     for (int i = 0; i < rangeCount; i++) {
       List<int> range = ranges[i];
@@ -2818,7 +2938,7 @@
    */
   Token get andAdvance {
     Token token = _currentToken;
-    advance();
+    _advance();
     return token;
   }
 
@@ -2829,7 +2949,7 @@
    * @param comment the comment being processed
    * @return the ranges of characters that should be treated as code blocks
    */
-  List<List<int>> getCodeBlockRanges(String comment) {
+  List<List<int>> _getCodeBlockRanges(String comment) {
     List<List<int>> ranges = new List<List<int>>();
     int length = comment.length;
     if (length < 3) {
@@ -2880,7 +3000,7 @@
    * @param beginToken the token that is expected to have an end token associated with it
    * @return the end token associated with the begin token
    */
-  Token getEndToken(Token beginToken) {
+  Token _getEndToken(Token beginToken) {
     if (beginToken is BeginToken) {
       return beginToken.endToken;
     }
@@ -2897,11 +3017,11 @@
    *         return type.
    */
   bool get hasReturnTypeInTypeAlias {
-    Token next = skipReturnType(_currentToken);
+    Token next = _skipReturnType(_currentToken);
     if (next == null) {
       return false;
     }
-    return tokenMatchesIdentifier(next);
+    return _tokenMatchesIdentifier(next);
   }
 
   /**
@@ -2910,7 +3030,7 @@
    * @param token the token to be added to the token stream
    * @return the token that was just added to the token stream
    */
-  Token injectToken(Token token) {
+  Token _injectToken(Token token) {
     Token previous = _currentToken.previous;
     token.setNext(_currentToken);
     previous.setNext(token);
@@ -2922,35 +3042,35 @@
    *
    * @return `true` if the current token appears to be the beginning of a function declaration
    */
-  bool isFunctionDeclaration() {
-    if (matchesKeyword(Keyword.VOID)) {
+  bool _isFunctionDeclaration() {
+    if (_matchesKeyword(Keyword.VOID)) {
       return true;
     }
-    Token afterReturnType = skipTypeName(_currentToken);
+    Token afterReturnType = _skipTypeName(_currentToken);
     if (afterReturnType == null) {
       // There was no return type, but it is optional, so go back to where we started.
       afterReturnType = _currentToken;
     }
-    Token afterIdentifier = skipSimpleIdentifier(afterReturnType);
+    Token afterIdentifier = _skipSimpleIdentifier(afterReturnType);
     if (afterIdentifier == null) {
       // It's possible that we parsed the function name as if it were a type name, so see whether
       // it makes sense if we assume that there is no type.
-      afterIdentifier = skipSimpleIdentifier(_currentToken);
+      afterIdentifier = _skipSimpleIdentifier(_currentToken);
     }
     if (afterIdentifier == null) {
       return false;
     }
-    if (isFunctionExpression(afterIdentifier)) {
+    if (_isFunctionExpression(afterIdentifier)) {
       return true;
     }
     // It's possible that we have found a getter. While this isn't valid at this point we test for
     // it in order to recover better.
-    if (matchesKeyword(Keyword.GET)) {
-      Token afterName = skipSimpleIdentifier(_currentToken.next);
+    if (_matchesKeyword(Keyword.GET)) {
+      Token afterName = _skipSimpleIdentifier(_currentToken.next);
       if (afterName == null) {
         return false;
       }
-      return tokenMatches(afterName, TokenType.FUNCTION) || tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
+      return _tokenMatches(afterName, TokenType.FUNCTION) || _tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
     }
     return false;
   }
@@ -2961,12 +3081,12 @@
    * @param startToken the token that might be the start of a function expression
    * @return `true` if the given token appears to be the beginning of a function expression
    */
-  bool isFunctionExpression(Token startToken) {
-    Token afterParameters = skipFormalParameterList(startToken);
+  bool _isFunctionExpression(Token startToken) {
+    Token afterParameters = _skipFormalParameterList(startToken);
     if (afterParameters == null) {
       return false;
     }
-    return matchesAny(afterParameters, [TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION]);
+    return afterParameters.matchesAny([TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION]);
   }
 
   /**
@@ -2975,7 +3095,7 @@
    * @param character the character being tested
    * @return `true` if the character is a valid hexadecimal digit
    */
-  bool isHexDigit(int character) => (0x30 <= character && character <= 0x39) || (0x41 <= character && character <= 0x46) || (0x61 <= character && character <= 0x66);
+  bool _isHexDigit(int character) => (0x30 <= character && character <= 0x39) || (0x41 <= character && character <= 0x46) || (0x61 <= character && character <= 0x66);
 
   /**
    * Return `true` if the current token is the first token in an initialized variable
@@ -3005,32 +3125,32 @@
    * @return `true` if the current token is the first token in an initialized variable
    *         declaration
    */
-  bool isInitializedVariableDeclaration() {
-    if (matchesKeyword(Keyword.FINAL) || matchesKeyword(Keyword.VAR)) {
+  bool _isInitializedVariableDeclaration() {
+    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.VAR)) {
       // An expression cannot start with a keyword other than 'const', 'rethrow', or 'throw'.
       return true;
     }
-    if (matchesKeyword(Keyword.CONST)) {
+    if (_matchesKeyword(Keyword.CONST)) {
       // Look to see whether we might be at the start of a list or map literal, otherwise this
       // should be the start of a variable declaration.
-      return !matchesAny(peek(), [
+      return !_peek().matchesAny([
           TokenType.LT,
           TokenType.OPEN_CURLY_BRACKET,
           TokenType.OPEN_SQUARE_BRACKET,
           TokenType.INDEX]);
     }
     // We know that we have an identifier, and need to see whether it might be a type name.
-    Token token = skipTypeName(_currentToken);
+    Token token = _skipTypeName(_currentToken);
     if (token == null) {
       // There was no type name, so this can't be a declaration.
       return false;
     }
-    token = skipSimpleIdentifier(token);
+    token = _skipSimpleIdentifier(token);
     if (token == null) {
       return false;
     }
     TokenType type = token.type;
-    return identical(type, TokenType.EQ) || identical(type, TokenType.COMMA) || identical(type, TokenType.SEMICOLON) || tokenMatchesKeyword(token, Keyword.IN);
+    return identical(type, TokenType.EQ) || identical(type, TokenType.COMMA) || identical(type, TokenType.SEMICOLON) || _tokenMatchesKeyword(token, Keyword.IN);
   }
 
   /**
@@ -3045,7 +3165,7 @@
    * @param rightIndex the index of the right bracket
    * @return `true` if the bracketed text is followed by a link address
    */
-  bool isLinkText(String comment, int rightIndex) {
+  bool _isLinkText(String comment, int rightIndex) {
     int length = comment.length;
     int index = rightIndex + 1;
     if (index >= length) {
@@ -3071,7 +3191,7 @@
    * @param startToken the token that might be the start of an operator declaration
    * @return `true` if the given token appears to be the beginning of an operator declaration
    */
-  bool isOperator(Token startToken) {
+  bool _isOperator(Token startToken) {
     // Accept any operator here, even if it is not user definable.
     if (!startToken.isOperator) {
       return false;
@@ -3086,7 +3206,7 @@
       token = token.next;
     }
     // Formal parameter list is expect now.
-    return tokenMatches(token, TokenType.OPEN_PAREN);
+    return _tokenMatches(token, TokenType.OPEN_PAREN);
   }
 
   /**
@@ -3094,9 +3214,9 @@
    *
    * @return `true` if the current token appears to be the beginning of a switch member
    */
-  bool isSwitchMember() {
+  bool _isSwitchMember() {
     Token token = _currentToken;
-    while (tokenMatches(token, TokenType.IDENTIFIER) && tokenMatches(token.next, TokenType.COLON)) {
+    while (_tokenMatches(token, TokenType.IDENTIFIER) && _tokenMatches(token.next, TokenType.COLON)) {
       token = token.next.next;
     }
     if (identical(token.type, TokenType.KEYWORD)) {
@@ -3113,13 +3233,13 @@
    * @param startToken the first token of the sequence being checked
    * @return `true` if there is a type name and variable starting at the given token
    */
-  bool isTypedIdentifier(Token startToken) {
-    Token token = skipReturnType(startToken);
+  bool _isTypedIdentifier(Token startToken) {
+    Token token = _skipReturnType(startToken);
     if (token == null) {
       return false;
-    } else if (tokenMatchesIdentifier(token)) {
+    } else if (_tokenMatchesIdentifier(token)) {
       return true;
-    } else if (tokenMatchesKeyword(token, Keyword.THIS) && tokenMatches(token.next, TokenType.PERIOD) && tokenMatchesIdentifier(token.next.next)) {
+    } else if (_tokenMatchesKeyword(token, Keyword.THIS) && _tokenMatches(token.next, TokenType.PERIOD) && _tokenMatchesIdentifier(token.next.next)) {
       return true;
     }
     return false;
@@ -3134,7 +3254,7 @@
    * @param tokens the tokens being compared
    * @return the token with the smallest offset
    */
-  Token lexicallyFirst(List<Token> tokens) {
+  Token _lexicallyFirst(List<Token> tokens) {
     Token first = null;
     int firstOffset = 2147483647;
     for (Token token in tokens) {
@@ -3153,72 +3273,61 @@
    * Increments the error reporting lock level. If level is more than `0`, then
    * [reportError] wont report any error.
    */
-  void lockErrorListener() {
+  void _lockErrorListener() {
     _errorListenerLock++;
   }
 
   /**
-   * Return `true` if the current token has the given type. Note that this method, unlike
-   * other variants, will modify the token stream if possible to match a wider range of tokens. In
-   * particular, if we are attempting to match a '>' and the next token is either a '>>' or '>>>',
-   * the token stream will be re-written and `true` will be returned.
+   * Return `true` if the current token has the given type. Note that the method
+   * [matchesGt] should be used if the argument to this method would be
+   * [TokenType#GT].
    *
    * @param type the type of token that can optionally appear in the current location
    * @return `true` if the current token has the given type
    */
-  bool matches(TokenType type) {
-    TokenType currentType = _currentToken.type;
-    if (currentType != type) {
-      if (identical(type, TokenType.GT)) {
-        if (identical(currentType, TokenType.GT_GT)) {
-          int offset = _currentToken.offset;
-          Token first = new Token(TokenType.GT, offset);
-          Token second = new Token(TokenType.GT, offset + 1);
-          second.setNext(_currentToken.next);
-          first.setNext(second);
-          _currentToken.previous.setNext(first);
-          _currentToken = first;
-          return true;
-        } else if (identical(currentType, TokenType.GT_EQ)) {
-          int offset = _currentToken.offset;
-          Token first = new Token(TokenType.GT, offset);
-          Token second = new Token(TokenType.EQ, offset + 1);
-          second.setNext(_currentToken.next);
-          first.setNext(second);
-          _currentToken.previous.setNext(first);
-          _currentToken = first;
-          return true;
-        } else if (identical(currentType, TokenType.GT_GT_EQ)) {
-          int offset = _currentToken.offset;
-          Token first = new Token(TokenType.GT, offset);
-          Token second = new Token(TokenType.GT, offset + 1);
-          Token third = new Token(TokenType.EQ, offset + 2);
-          third.setNext(_currentToken.next);
-          second.setNext(third);
-          first.setNext(second);
-          _currentToken.previous.setNext(first);
-          _currentToken = first;
-          return true;
-        }
-      }
-      return false;
-    }
-    return true;
-  }
+  bool _matches(TokenType type) => identical(_currentToken.type, type);
 
   /**
-   * Return `true` if the given token has any one of the given types.
+   * Return `true` if the current token has a type of [TokenType#GT]. Note that this
+   * method, unlike other variants, will modify the token stream if possible to match desired type.
+   * In particular, if the next token is either a '>>' or '>>>', the token stream will be re-written
+   * and `true` will be returned.
    *
-   * @param token the token being tested
-   * @param types the types of token that are being tested for
-   * @return `true` if the given token has any of the given types
+   * @return `true` if the current token has a type of [TokenType#GT]
    */
-  bool matchesAny(Token token, List<TokenType> types) {
-    TokenType actualType = token.type;
-    for (TokenType type in types) {
-      if (identical(actualType, type)) {
-        return true;
-      }
+  bool _matchesGt() {
+    TokenType currentType = _currentToken.type;
+    if (identical(currentType, TokenType.GT)) {
+      return true;
+    } else if (identical(currentType, TokenType.GT_GT)) {
+      int offset = _currentToken.offset;
+      Token first = new Token(TokenType.GT, offset);
+      Token second = new Token(TokenType.GT, offset + 1);
+      second.setNext(_currentToken.next);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
+    } else if (identical(currentType, TokenType.GT_EQ)) {
+      int offset = _currentToken.offset;
+      Token first = new Token(TokenType.GT, offset);
+      Token second = new Token(TokenType.EQ, offset + 1);
+      second.setNext(_currentToken.next);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
+    } else if (identical(currentType, TokenType.GT_GT_EQ)) {
+      int offset = _currentToken.offset;
+      Token first = new Token(TokenType.GT, offset);
+      Token second = new Token(TokenType.GT, offset + 1);
+      Token third = new Token(TokenType.EQ, offset + 2);
+      third.setNext(_currentToken.next);
+      second.setNext(third);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
     }
     return false;
   }
@@ -3229,7 +3338,7 @@
    *
    * @return `true` if the current token is a valid identifier
    */
-  bool matchesIdentifier() => tokenMatchesIdentifier(_currentToken);
+  bool _matchesIdentifier() => _tokenMatchesIdentifier(_currentToken);
 
   /**
    * Return `true` if the current token matches the given keyword.
@@ -3237,7 +3346,7 @@
    * @param keyword the keyword that can optionally appear in the current location
    * @return `true` if the current token matches the given keyword
    */
-  bool matchesKeyword(Keyword keyword) => tokenMatchesKeyword(_currentToken, keyword);
+  bool _matchesKeyword(Keyword keyword) => _tokenMatchesKeyword(_currentToken, keyword);
 
   /**
    * Return `true` if the current token matches the given identifier.
@@ -3245,18 +3354,19 @@
    * @param identifier the identifier that can optionally appear in the current location
    * @return `true` if the current token matches the given identifier
    */
-  bool matchesString(String identifier) => identical(_currentToken.type, TokenType.IDENTIFIER) && _currentToken.lexeme == identifier;
+  bool _matchesString(String identifier) => identical(_currentToken.type, TokenType.IDENTIFIER) && _currentToken.lexeme == identifier;
 
   /**
    * If the current token has the given type, then advance to the next token and return `true`
-   * . Otherwise, return `false` without advancing.
+   * . Otherwise, return `false` without advancing. This method should not be invoked with an
+   * argument value of [TokenType#GT].
    *
    * @param type the type of token that can optionally appear in the current location
    * @return `true` if the current token has the given type
    */
-  bool optional(TokenType type) {
-    if (matches(type)) {
-      advance();
+  bool _optional(TokenType type) {
+    if (_matches(type)) {
+      _advance();
       return true;
     }
     return false;
@@ -3273,16 +3383,16 @@
    *
    * @return the additive expression that was parsed
    */
-  Expression parseAdditiveExpression() {
+  Expression _parseAdditiveExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isAdditiveOperator) {
+    if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isAdditiveOperator) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseMultiplicativeExpression();
+      expression = _parseMultiplicativeExpression();
     }
     while (_currentToken.type.isAdditiveOperator) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseMultiplicativeExpression());
+      expression = new BinaryExpression(expression, operator, _parseMultiplicativeExpression());
     }
     return expression;
   }
@@ -3297,10 +3407,10 @@
    *
    * @return the argument definition test that was parsed
    */
-  ArgumentDefinitionTest parseArgumentDefinitionTest() {
-    Token question = expect(TokenType.QUESTION);
+  ArgumentDefinitionTest _parseArgumentDefinitionTest() {
+    Token question = _expect(TokenType.QUESTION);
     SimpleIdentifier identifier = parseSimpleIdentifier();
-    reportErrorForToken(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
+    _reportErrorForToken(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
     return new ArgumentDefinitionTest(question, identifier);
   }
 
@@ -3314,21 +3424,21 @@
    *
    * @return the assert statement
    */
-  AssertStatement parseAssertStatement() {
-    Token keyword = expectKeyword(Keyword.ASSERT);
-    Token leftParen = expect(TokenType.OPEN_PAREN);
+  AssertStatement _parseAssertStatement() {
+    Token keyword = _expectKeyword(Keyword.ASSERT);
+    Token leftParen = _expect(TokenType.OPEN_PAREN);
     Expression expression = parseExpression2();
     if (expression is AssignmentExpression) {
-      reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expression, []);
+      _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expression, []);
     } else if (expression is CascadeExpression) {
-      reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expression, []);
+      _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expression, []);
     } else if (expression is ThrowExpression) {
-      reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression, []);
+      _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression, []);
     } else if (expression is RethrowExpression) {
-      reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expression, []);
+      _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expression, []);
     }
-    Token rightParen = expect(TokenType.CLOSE_PAREN);
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token rightParen = _expect(TokenType.CLOSE_PAREN);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new AssertStatement(keyword, leftParen, expression, rightParen, semicolon);
   }
 
@@ -3346,19 +3456,19 @@
    *          assignable selector
    * @return the assignable expression that was parsed
    */
-  Expression parseAssignableExpression(bool primaryAllowed) {
-    if (matchesKeyword(Keyword.SUPER)) {
-      return parseAssignableSelector(new SuperExpression(andAdvance), false);
+  Expression _parseAssignableExpression(bool primaryAllowed) {
+    if (_matchesKeyword(Keyword.SUPER)) {
+      return _parseAssignableSelector(new SuperExpression(andAdvance), false);
     }
     //
     // A primary expression can start with an identifier. We resolve the ambiguity by determining
     // whether the primary consists of anything other than an identifier and/or is followed by an
     // assignableSelector.
     //
-    Expression expression = parsePrimaryExpression();
+    Expression expression = _parsePrimaryExpression();
     bool isOptional = primaryAllowed || expression is SimpleIdentifier;
     while (true) {
-      while (matches(TokenType.OPEN_PAREN)) {
+      while (_matches(TokenType.OPEN_PAREN)) {
         ArgumentList argumentList = parseArgumentList();
         if (expression is SimpleIdentifier) {
           expression = new MethodInvocation(null, null, expression as SimpleIdentifier, argumentList);
@@ -3375,7 +3485,7 @@
           isOptional = false;
         }
       }
-      Expression selectorExpression = parseAssignableSelector(expression, isOptional || (expression is PrefixedIdentifier));
+      Expression selectorExpression = _parseAssignableSelector(expression, isOptional || (expression is PrefixedIdentifier));
       if (identical(selectorExpression, expression)) {
         if (!isOptional && (expression is PrefixedIdentifier)) {
           PrefixedIdentifier identifier = expression as PrefixedIdentifier;
@@ -3401,19 +3511,19 @@
    * @param optional `true` if the selector is optional
    * @return the assignable selector that was parsed
    */
-  Expression parseAssignableSelector(Expression prefix, bool optional) {
-    if (matches(TokenType.OPEN_SQUARE_BRACKET)) {
+  Expression _parseAssignableSelector(Expression prefix, bool optional) {
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
       Token leftBracket = andAdvance;
       Expression index = parseExpression2();
-      Token rightBracket = expect(TokenType.CLOSE_SQUARE_BRACKET);
+      Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
       return new IndexExpression.forTarget(prefix, leftBracket, index, rightBracket);
-    } else if (matches(TokenType.PERIOD)) {
+    } else if (_matches(TokenType.PERIOD)) {
       Token period = andAdvance;
       return new PropertyAccess(prefix, period, parseSimpleIdentifier());
     } else {
       if (!optional) {
         // Report the missing selector.
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
       }
       return prefix;
     }
@@ -3430,16 +3540,16 @@
    *
    * @return the bitwise and expression that was parsed
    */
-  Expression parseBitwiseAndExpression() {
+  Expression _parseBitwiseAndExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && tokenMatches(peek(), TokenType.AMPERSAND)) {
+    if (_matchesKeyword(Keyword.SUPER) && _tokenMatches(_peek(), TokenType.AMPERSAND)) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseShiftExpression();
+      expression = _parseShiftExpression();
     }
-    while (matches(TokenType.AMPERSAND)) {
+    while (_matches(TokenType.AMPERSAND)) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseShiftExpression());
+      expression = new BinaryExpression(expression, operator, _parseShiftExpression());
     }
     return expression;
   }
@@ -3455,16 +3565,16 @@
    *
    * @return the bitwise exclusive-or expression that was parsed
    */
-  Expression parseBitwiseXorExpression() {
+  Expression _parseBitwiseXorExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && tokenMatches(peek(), TokenType.CARET)) {
+    if (_matchesKeyword(Keyword.SUPER) && _tokenMatches(_peek(), TokenType.CARET)) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseBitwiseAndExpression();
+      expression = _parseBitwiseAndExpression();
     }
-    while (matches(TokenType.CARET)) {
+    while (_matches(TokenType.CARET)) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseBitwiseAndExpression());
+      expression = new BinaryExpression(expression, operator, _parseBitwiseAndExpression());
     }
     return expression;
   }
@@ -3479,16 +3589,16 @@
    *
    * @return the break statement that was parsed
    */
-  Statement parseBreakStatement() {
-    Token breakKeyword = expectKeyword(Keyword.BREAK);
+  Statement _parseBreakStatement() {
+    Token breakKeyword = _expectKeyword(Keyword.BREAK);
     SimpleIdentifier label = null;
-    if (matchesIdentifier()) {
+    if (_matchesIdentifier()) {
       label = parseSimpleIdentifier();
     }
     if (!_inLoop && !_inSwitch && label == null) {
-      reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
+      _reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
     }
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new BreakStatement(breakKeyword, label, semicolon);
   }
 
@@ -3509,21 +3619,21 @@
    *
    * @return the expression representing the cascaded method invocation
    */
-  Expression parseCascadeSection() {
-    Token period = expect(TokenType.PERIOD_PERIOD);
+  Expression _parseCascadeSection() {
+    Token period = _expect(TokenType.PERIOD_PERIOD);
     Expression expression = null;
     SimpleIdentifier functionName = null;
-    if (matchesIdentifier()) {
+    if (_matchesIdentifier()) {
       functionName = parseSimpleIdentifier();
     } else if (identical(_currentToken.type, TokenType.OPEN_SQUARE_BRACKET)) {
       Token leftBracket = andAdvance;
       Expression index = parseExpression2();
-      Token rightBracket = expect(TokenType.CLOSE_SQUARE_BRACKET);
+      Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
       expression = new IndexExpression.forCascade(period, leftBracket, index, rightBracket);
       period = null;
     } else {
-      reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
-      functionName = createSyntheticIdentifier();
+      _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
+      functionName = _createSyntheticIdentifier();
     }
     if (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
       while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
@@ -3533,7 +3643,7 @@
           functionName = null;
         } else if (expression == null) {
           // It should not be possible to get here.
-          expression = new MethodInvocation(expression, period, createSyntheticIdentifier(), parseArgumentList());
+          expression = new MethodInvocation(expression, period, _createSyntheticIdentifier(), parseArgumentList());
         } else {
           expression = new FunctionExpressionInvocation(expression, parseArgumentList());
         }
@@ -3545,7 +3655,7 @@
     bool progress = true;
     while (progress) {
       progress = false;
-      Expression selector = parseAssignableSelector(expression, true);
+      Expression selector = _parseAssignableSelector(expression, true);
       if (selector != expression) {
         expression = selector;
         progress = true;
@@ -3561,7 +3671,7 @@
     }
     if (_currentToken.type.isAssignmentOperator) {
       Token operator = andAdvance;
-      ensureAssignable(expression);
+      _ensureAssignable(expression);
       expression = new AssignmentExpression(expression, operator, parseExpressionWithoutCascade());
     }
     return expression;
@@ -3581,23 +3691,23 @@
    *          not given
    * @return the class declaration that was parsed
    */
-  CompilationUnitMember parseClassDeclaration(CommentAndMetadata commentAndMetadata, Token abstractKeyword) {
-    Token keyword = expectKeyword(Keyword.CLASS);
-    if (matchesIdentifier()) {
-      Token next = peek();
-      if (tokenMatches(next, TokenType.LT)) {
-        next = skipTypeParameterList(next);
-        if (next != null && tokenMatches(next, TokenType.EQ)) {
-          return parseClassTypeAlias(commentAndMetadata, abstractKeyword, keyword);
+  CompilationUnitMember _parseClassDeclaration(CommentAndMetadata commentAndMetadata, Token abstractKeyword) {
+    Token keyword = _expectKeyword(Keyword.CLASS);
+    if (_matchesIdentifier()) {
+      Token next = _peek();
+      if (_tokenMatches(next, TokenType.LT)) {
+        next = _skipTypeParameterList(next);
+        if (next != null && _tokenMatches(next, TokenType.EQ)) {
+          return _parseClassTypeAlias(commentAndMetadata, abstractKeyword, keyword);
         }
-      } else if (tokenMatches(next, TokenType.EQ)) {
-        return parseClassTypeAlias(commentAndMetadata, abstractKeyword, keyword);
+      } else if (_tokenMatches(next, TokenType.EQ)) {
+        return _parseClassTypeAlias(commentAndMetadata, abstractKeyword, keyword);
       }
     }
     SimpleIdentifier name = parseSimpleIdentifier();
     String className = name.name;
     TypeParameterList typeParameters = null;
-    if (matches(TokenType.LT)) {
+    if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
     }
     //
@@ -3609,33 +3719,33 @@
     ImplementsClause implementsClause = null;
     bool foundClause = true;
     while (foundClause) {
-      if (matchesKeyword(Keyword.EXTENDS)) {
+      if (_matchesKeyword(Keyword.EXTENDS)) {
         if (extendsClause == null) {
           extendsClause = parseExtendsClause();
           if (withClause != null) {
-            reportErrorForToken(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
+            _reportErrorForToken(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
           } else if (implementsClause != null) {
-            reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
+            _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
           }
         } else {
-          reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
+          _reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
           parseExtendsClause();
         }
-      } else if (matchesKeyword(Keyword.WITH)) {
+      } else if (_matchesKeyword(Keyword.WITH)) {
         if (withClause == null) {
           withClause = parseWithClause();
           if (implementsClause != null) {
-            reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
+            _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
           }
         } else {
-          reportErrorForToken(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
+          _reportErrorForToken(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
           parseWithClause();
         }
-      } else if (matchesKeyword(Keyword.IMPLEMENTS)) {
+      } else if (_matchesKeyword(Keyword.IMPLEMENTS)) {
         if (implementsClause == null) {
           implementsClause = parseImplementsClause();
         } else {
-          reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
+          _reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
           parseImplementsClause();
         }
       } else {
@@ -3643,14 +3753,14 @@
       }
     }
     if (withClause != null && extendsClause == null) {
-      reportErrorForToken(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
+      _reportErrorForToken(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
     }
     //
     // Look for and skip over the extra-lingual 'native' specification.
     //
     NativeClause nativeClause = null;
-    if (matchesString(_NATIVE) && tokenMatches(peek(), TokenType.STRING)) {
-      nativeClause = parseNativeClause();
+    if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) {
+      nativeClause = _parseNativeClause();
     }
     //
     // Parse the body of the class.
@@ -3658,14 +3768,14 @@
     Token leftBracket = null;
     List<ClassMember> members = null;
     Token rightBracket = null;
-    if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-      leftBracket = expect(TokenType.OPEN_CURLY_BRACKET);
-      members = parseClassMembers(className, getEndToken(leftBracket));
-      rightBracket = expect(TokenType.CLOSE_CURLY_BRACKET);
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      members = _parseClassMembers(className, _getEndToken(leftBracket));
+      rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
     } else {
-      leftBracket = createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
-      rightBracket = createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY, []);
+      leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
+      rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY, []);
     }
     ClassDeclaration classDeclaration = new ClassDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
     classDeclaration.nativeClause = nativeClause;
@@ -3685,13 +3795,13 @@
    *          is missing
    * @return the list of class members that were parsed
    */
-  List<ClassMember> parseClassMembers(String className, Token closingBracket) {
+  List<ClassMember> _parseClassMembers(String className, Token closingBracket) {
     List<ClassMember> members = new List<ClassMember>();
     Token memberStart = _currentToken;
-    while (!matches(TokenType.EOF) && !matches(TokenType.CLOSE_CURLY_BRACKET) && (closingBracket != null || (!matchesKeyword(Keyword.CLASS) && !matchesKeyword(Keyword.TYPEDEF)))) {
-      if (matches(TokenType.SEMICOLON)) {
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
+    while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET) && (closingBracket != null || (!_matchesKeyword(Keyword.CLASS) && !_matchesKeyword(Keyword.TYPEDEF)))) {
+      if (_matches(TokenType.SEMICOLON)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
       } else {
         ClassMember member = parseClassMember(className);
         if (member != null) {
@@ -3699,8 +3809,8 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
       }
       memberStart = _currentToken;
     }
@@ -3723,38 +3833,38 @@
    * @param classKeyword the token representing the 'class' keyword
    * @return the class type alias that was parsed
    */
-  ClassTypeAlias parseClassTypeAlias(CommentAndMetadata commentAndMetadata, Token abstractKeyword, Token classKeyword) {
+  ClassTypeAlias _parseClassTypeAlias(CommentAndMetadata commentAndMetadata, Token abstractKeyword, Token classKeyword) {
     SimpleIdentifier className = parseSimpleIdentifier();
     TypeParameterList typeParameters = null;
-    if (matches(TokenType.LT)) {
+    if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
     }
-    Token equals = expect(TokenType.EQ);
-    if (matchesKeyword(Keyword.ABSTRACT)) {
+    Token equals = _expect(TokenType.EQ);
+    if (_matchesKeyword(Keyword.ABSTRACT)) {
       abstractKeyword = andAdvance;
     }
     TypeName superclass = parseTypeName();
     WithClause withClause = null;
-    if (matchesKeyword(Keyword.WITH)) {
+    if (_matchesKeyword(Keyword.WITH)) {
       withClause = parseWithClause();
     }
     ImplementsClause implementsClause = null;
-    if (matchesKeyword(Keyword.IMPLEMENTS)) {
+    if (_matchesKeyword(Keyword.IMPLEMENTS)) {
       implementsClause = parseImplementsClause();
     }
     Token semicolon;
-    if (matches(TokenType.SEMICOLON)) {
+    if (_matches(TokenType.SEMICOLON)) {
       semicolon = andAdvance;
     } else {
-      if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-        reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
+      if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+        _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
         Token leftBracket = andAdvance;
-        parseClassMembers(className.name, getEndToken(leftBracket));
-        expect(TokenType.CLOSE_CURLY_BRACKET);
+        _parseClassMembers(className.name, _getEndToken(leftBracket));
+        _expect(TokenType.CLOSE_CURLY_BRACKET);
       } else {
-        reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
+        _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
       }
-      semicolon = createSyntheticToken(TokenType.SEMICOLON);
+      semicolon = _createSyntheticToken(TokenType.SEMICOLON);
     }
     return new ClassTypeAlias(commentAndMetadata.comment, commentAndMetadata.metadata, classKeyword, className, typeParameters, equals, abstractKeyword, superclass, withClause, implementsClause, semicolon);
   }
@@ -3770,15 +3880,15 @@
    *
    * @return the combinators that were parsed
    */
-  List<Combinator> parseCombinators() {
+  List<Combinator> _parseCombinators() {
     List<Combinator> combinators = new List<Combinator>();
-    while (matchesString(_SHOW) || matchesString(_HIDE)) {
-      Token keyword = expect(TokenType.IDENTIFIER);
+    while (_matchesString(_SHOW) || _matchesString(_HIDE)) {
+      Token keyword = _expect(TokenType.IDENTIFIER);
       if (keyword.lexeme == _SHOW) {
-        List<SimpleIdentifier> shownNames = parseIdentifierList();
+        List<SimpleIdentifier> shownNames = _parseIdentifierList();
         combinators.add(new ShowCombinator(keyword, shownNames));
       } else {
-        List<SimpleIdentifier> hiddenNames = parseIdentifierList();
+        List<SimpleIdentifier> hiddenNames = _parseIdentifierList();
         combinators.add(new HideCombinator(keyword, hiddenNames));
       }
     }
@@ -3797,12 +3907,12 @@
    *
    * @return the documentation comment and metadata that were parsed
    */
-  CommentAndMetadata parseCommentAndMetadata() {
-    Comment comment = parseDocumentationComment();
+  CommentAndMetadata _parseCommentAndMetadata() {
+    Comment comment = _parseDocumentationComment();
     List<Annotation> metadata = new List<Annotation>();
-    while (matches(TokenType.AT)) {
+    while (_matches(TokenType.AT)) {
       metadata.add(parseAnnotation());
-      Comment optionalComment = parseDocumentationComment();
+      Comment optionalComment = _parseDocumentationComment();
       if (optionalComment != null) {
         comment = optionalComment;
       }
@@ -3823,7 +3933,7 @@
    * @param sourceOffset the offset of the first character of the reference source
    * @return the comment reference that was parsed, or `null` if no reference could be found
    */
-  CommentReference parseCommentReference(String referenceSource, int sourceOffset) {
+  CommentReference _parseCommentReference(String referenceSource, int sourceOffset) {
     // TODO(brianwilkerson) The errors are not getting the right offset/length and are being duplicated.
     if (referenceSource.length == 0) {
       Token syntheticToken = new SyntheticStringToken(TokenType.IDENTIFIER, "", sourceOffset);
@@ -3838,16 +3948,16 @@
         return null;
       }
       Token newKeyword = null;
-      if (tokenMatchesKeyword(firstToken, Keyword.NEW)) {
+      if (_tokenMatchesKeyword(firstToken, Keyword.NEW)) {
         newKeyword = firstToken;
         firstToken = firstToken.next;
       }
-      if (tokenMatchesIdentifier(firstToken)) {
+      if (_tokenMatchesIdentifier(firstToken)) {
         Token secondToken = firstToken.next;
         Token thirdToken = secondToken.next;
         Token nextToken;
         Identifier identifier;
-        if (tokenMatches(secondToken, TokenType.PERIOD) && tokenMatchesIdentifier(thirdToken)) {
+        if (_tokenMatches(secondToken, TokenType.PERIOD) && _tokenMatchesIdentifier(thirdToken)) {
           identifier = new PrefixedIdentifier(new SimpleIdentifier(firstToken), secondToken, new SimpleIdentifier(thirdToken));
           nextToken = thirdToken.next;
         } else {
@@ -3858,7 +3968,7 @@
           return null;
         }
         return new CommentReference(newKeyword, identifier);
-      } else if (tokenMatchesKeyword(firstToken, Keyword.THIS) || tokenMatchesKeyword(firstToken, Keyword.NULL) || tokenMatchesKeyword(firstToken, Keyword.TRUE) || tokenMatchesKeyword(firstToken, Keyword.FALSE)) {
+      } else if (_tokenMatchesKeyword(firstToken, Keyword.THIS) || _tokenMatchesKeyword(firstToken, Keyword.NULL) || _tokenMatchesKeyword(firstToken, Keyword.TRUE) || _tokenMatchesKeyword(firstToken, Keyword.FALSE)) {
         // TODO(brianwilkerson) If we want to support this we will need to extend the definition
         // of CommentReference to take an expression rather than an identifier. For now we just
         // ignore it to reduce the number of errors produced, but that's probably not a valid
@@ -3884,24 +3994,24 @@
    * @param tokens the comment tokens representing the documentation comments to be parsed
    * @return the comment references that were parsed
    */
-  List<CommentReference> parseCommentReferences(List<Token> tokens) {
+  List<CommentReference> _parseCommentReferences(List<Token> tokens) {
     List<CommentReference> references = new List<CommentReference>();
     for (Token token in tokens) {
       String comment = token.lexeme;
       int length = comment.length;
-      List<List<int>> codeBlockRanges = getCodeBlockRanges(comment);
+      List<List<int>> codeBlockRanges = _getCodeBlockRanges(comment);
       int leftIndex = comment.indexOf('[');
       while (leftIndex >= 0 && leftIndex + 1 < length) {
-        List<int> range = findRange(codeBlockRanges, leftIndex);
+        List<int> range = _findRange(codeBlockRanges, leftIndex);
         if (range == null) {
           int nameOffset = token.offset + leftIndex + 1;
           int rightIndex = JavaString.indexOf(comment, ']', leftIndex);
           if (rightIndex >= 0) {
             int firstChar = comment.codeUnitAt(leftIndex + 1);
             if (firstChar != 0x27 && firstChar != 0x22) {
-              if (isLinkText(comment, rightIndex)) {
+              if (_isLinkText(comment, rightIndex)) {
               } else {
-                CommentReference reference = parseCommentReference(comment.substring(leftIndex + 1, rightIndex), nameOffset);
+                CommentReference reference = _parseCommentReference(comment.substring(leftIndex + 1, rightIndex), nameOffset);
                 if (reference != null) {
                   references.add(reference);
                 }
@@ -3951,92 +4061,92 @@
    * @return the compilation unit member that was parsed, or `null` if what was parsed could
    *         not be represented as a compilation unit member
    */
-  CompilationUnitMember parseCompilationUnitMember(CommentAndMetadata commentAndMetadata) {
-    Modifiers modifiers = parseModifiers();
-    if (matchesKeyword(Keyword.CLASS)) {
-      return parseClassDeclaration(commentAndMetadata, validateModifiersForClass(modifiers));
-    } else if (matchesKeyword(Keyword.TYPEDEF) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT) && !tokenMatches(peek(), TokenType.OPEN_PAREN)) {
-      validateModifiersForTypedef(modifiers);
-      return parseTypeAlias(commentAndMetadata);
+  CompilationUnitMember _parseCompilationUnitMember(CommentAndMetadata commentAndMetadata) {
+    Modifiers modifiers = _parseModifiers();
+    if (_matchesKeyword(Keyword.CLASS)) {
+      return _parseClassDeclaration(commentAndMetadata, _validateModifiersForClass(modifiers));
+    } else if (_matchesKeyword(Keyword.TYPEDEF) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT) && !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      _validateModifiersForTypedef(modifiers);
+      return _parseTypeAlias(commentAndMetadata);
     }
-    if (matchesKeyword(Keyword.VOID)) {
+    if (_matchesKeyword(Keyword.VOID)) {
       TypeName returnType = parseReturnType();
-      if ((matchesKeyword(Keyword.GET) || matchesKeyword(Keyword.SET)) && tokenMatchesIdentifier(peek())) {
-        validateModifiersForTopLevelFunction(modifiers);
-        return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
-      } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-        reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-        return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
-      } else if (matchesIdentifier() && matchesAny(peek(), [
+      if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForTopLevelFunction(modifiers);
+        return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+        _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+        return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
+      } else if (_matchesIdentifier() && _peek().matchesAny([
           TokenType.OPEN_PAREN,
           TokenType.OPEN_CURLY_BRACKET,
           TokenType.FUNCTION])) {
-        validateModifiersForTopLevelFunction(modifiers);
-        return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
+        _validateModifiersForTopLevelFunction(modifiers);
+        return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
       } else {
         //
         // We have found an error of some kind. Try to recover.
         //
-        if (matchesIdentifier()) {
-          if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+        if (_matchesIdentifier()) {
+          if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
             //
             // We appear to have a variable declaration with a type of "void".
             //
-            reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
-            return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationListAfterType(null, validateModifiersForTopLevelVariable(modifiers), null), expect(TokenType.SEMICOLON));
+            _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
+            return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModifiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON));
           }
         }
-        reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
-    } else if ((matchesKeyword(Keyword.GET) || matchesKeyword(Keyword.SET)) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForTopLevelFunction(modifiers);
-      return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-      reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-      return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
-    } else if (!matchesIdentifier()) {
-      reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+    } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
+    } else if (!_matchesIdentifier()) {
+      _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
-    } else if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
-      validateModifiersForTopLevelFunction(modifiers);
-      return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
-    } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
-      return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationListAfterType(null, validateModifiersForTopLevelVariable(modifiers), null), expect(TokenType.SEMICOLON));
+      return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModifiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON));
     }
     TypeName returnType = parseReturnType();
-    if ((matchesKeyword(Keyword.GET) || matchesKeyword(Keyword.SET)) && tokenMatchesIdentifier(peek())) {
-      validateModifiersForTopLevelFunction(modifiers);
-      return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
-    } else if (matchesKeyword(Keyword.OPERATOR) && isOperator(peek())) {
-      reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
-      return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
-    } else if (matches(TokenType.AT)) {
-      return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationListAfterType(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect(TokenType.SEMICOLON));
-    } else if (!matchesIdentifier()) {
+    if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
+    } else if (_matches(TokenType.AT)) {
+      return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModifiersForTopLevelVariable(modifiers), returnType), _expect(TokenType.SEMICOLON));
+    } else if (!_matchesIdentifier()) {
       // TODO(brianwilkerson) Generalize this error. We could also be parsing a top-level variable at this point.
-      reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       Token semicolon;
-      if (matches(TokenType.SEMICOLON)) {
+      if (_matches(TokenType.SEMICOLON)) {
         semicolon = andAdvance;
       } else {
-        semicolon = createSyntheticToken(TokenType.SEMICOLON);
+        semicolon = _createSyntheticToken(TokenType.SEMICOLON);
       }
       List<VariableDeclaration> variables = new List<VariableDeclaration>();
-      variables.add(new VariableDeclaration(null, null, createSyntheticIdentifier(), null, null));
+      variables.add(new VariableDeclaration(null, null, _createSyntheticIdentifier(), null, null));
       return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, new VariableDeclarationList(null, null, null, returnType, variables), semicolon);
     }
-    if (matchesAny(peek(), [
+    if (_peek().matchesAny([
         TokenType.OPEN_PAREN,
         TokenType.FUNCTION,
         TokenType.OPEN_CURLY_BRACKET])) {
-      validateModifiersForTopLevelFunction(modifiers);
-      return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
     }
-    return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationListAfterType(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect(TokenType.SEMICOLON));
+    return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModifiersForTopLevelVariable(modifiers), returnType), _expect(TokenType.SEMICOLON));
   }
 
   /**
@@ -4051,65 +4161,65 @@
    *
    * @return the const expression that was parsed
    */
-  Expression parseConstExpression() {
-    Token keyword = expectKeyword(Keyword.CONST);
-    if (matches(TokenType.OPEN_SQUARE_BRACKET) || matches(TokenType.INDEX)) {
-      return parseListLiteral(keyword, null);
-    } else if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-      return parseMapLiteral(keyword, null);
-    } else if (matches(TokenType.LT)) {
-      return parseListOrMapLiteral(keyword);
+  Expression _parseConstExpression() {
+    Token keyword = _expectKeyword(Keyword.CONST);
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) {
+      return _parseListLiteral(keyword, null);
+    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(keyword, null);
+    } else if (_matches(TokenType.LT)) {
+      return _parseListOrMapLiteral(keyword);
     }
-    return parseInstanceCreationExpression(keyword);
+    return _parseInstanceCreationExpression(keyword);
   }
 
-  ConstructorDeclaration parseConstructor(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters) {
+  ConstructorDeclaration _parseConstructor(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters) {
     bool bodyAllowed = externalKeyword == null;
     Token separator = null;
     List<ConstructorInitializer> initializers = null;
-    if (matches(TokenType.COLON)) {
+    if (_matches(TokenType.COLON)) {
       separator = andAdvance;
       initializers = new List<ConstructorInitializer>();
       do {
-        if (matchesKeyword(Keyword.THIS)) {
-          if (tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+        if (_matchesKeyword(Keyword.THIS)) {
+          if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
             bodyAllowed = false;
-            initializers.add(parseRedirectingConstructorInvocation());
-          } else if (tokenMatches(peek(), TokenType.PERIOD) && tokenMatches(peekAt(3), TokenType.OPEN_PAREN)) {
+            initializers.add(_parseRedirectingConstructorInvocation());
+          } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
             bodyAllowed = false;
-            initializers.add(parseRedirectingConstructorInvocation());
+            initializers.add(_parseRedirectingConstructorInvocation());
           } else {
-            initializers.add(parseConstructorFieldInitializer());
+            initializers.add(_parseConstructorFieldInitializer());
           }
-        } else if (matchesKeyword(Keyword.SUPER)) {
-          initializers.add(parseSuperConstructorInvocation());
+        } else if (_matchesKeyword(Keyword.SUPER)) {
+          initializers.add(_parseSuperConstructorInvocation());
         } else {
-          initializers.add(parseConstructorFieldInitializer());
+          initializers.add(_parseConstructorFieldInitializer());
         }
-      } while (optional(TokenType.COMMA));
+      } while (_optional(TokenType.COMMA));
     }
     ConstructorName redirectedConstructor = null;
     FunctionBody body;
-    if (matches(TokenType.EQ)) {
+    if (_matches(TokenType.EQ)) {
       separator = andAdvance;
       redirectedConstructor = parseConstructorName();
-      body = new EmptyFunctionBody(expect(TokenType.SEMICOLON));
+      body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON));
       if (factoryKeyword == null) {
-        reportErrorForNode(ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, redirectedConstructor, []);
+        _reportErrorForNode(ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, redirectedConstructor, []);
       }
     } else {
-      body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+      body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
       if (constKeyword != null && factoryKeyword != null && externalKeyword == null) {
-        reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
+        _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
       } else if (body is EmptyFunctionBody) {
         if (factoryKeyword != null && externalKeyword == null) {
-          reportErrorForToken(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
+          _reportErrorForToken(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
         }
       } else {
         if (constKeyword != null) {
-          reportErrorForNode(ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body, []);
+          _reportErrorForNode(ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body, []);
         } else if (!bodyAllowed) {
-          reportErrorForNode(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, body, []);
+          _reportErrorForNode(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, body, []);
         }
       }
     }
@@ -4126,21 +4236,21 @@
    *
    * @return the field initializer that was parsed
    */
-  ConstructorFieldInitializer parseConstructorFieldInitializer() {
+  ConstructorFieldInitializer _parseConstructorFieldInitializer() {
     Token keyword = null;
     Token period = null;
-    if (matchesKeyword(Keyword.THIS)) {
+    if (_matchesKeyword(Keyword.THIS)) {
       keyword = andAdvance;
-      period = expect(TokenType.PERIOD);
+      period = _expect(TokenType.PERIOD);
     }
     SimpleIdentifier fieldName = parseSimpleIdentifier();
-    Token equals = expect(TokenType.EQ);
+    Token equals = _expect(TokenType.EQ);
     Expression expression = parseConditionalExpression();
     TokenType tokenType = _currentToken.type;
     if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
       List<Expression> cascadeSections = new List<Expression>();
       while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
-        Expression section = parseCascadeSection();
+        Expression section = _parseCascadeSection();
         if (section != null) {
           cascadeSections.add(section);
         }
@@ -4161,19 +4271,19 @@
    *
    * @return the continue statement that was parsed
    */
-  Statement parseContinueStatement() {
-    Token continueKeyword = expectKeyword(Keyword.CONTINUE);
+  Statement _parseContinueStatement() {
+    Token continueKeyword = _expectKeyword(Keyword.CONTINUE);
     if (!_inLoop && !_inSwitch) {
-      reportErrorForToken(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
     }
     SimpleIdentifier label = null;
-    if (matchesIdentifier()) {
+    if (_matchesIdentifier()) {
       label = parseSimpleIdentifier();
     }
     if (_inSwitch && !_inLoop && label == null) {
-      reportErrorForToken(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
     }
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new ContinueStatement(continueKeyword, label, semicolon);
   }
 
@@ -4191,15 +4301,15 @@
    * @param commentAndMetadata the metadata to be associated with the directive
    * @return the directive that was parsed
    */
-  Directive parseDirective(CommentAndMetadata commentAndMetadata) {
-    if (matchesKeyword(Keyword.IMPORT)) {
-      return parseImportDirective(commentAndMetadata);
-    } else if (matchesKeyword(Keyword.EXPORT)) {
-      return parseExportDirective(commentAndMetadata);
-    } else if (matchesKeyword(Keyword.LIBRARY)) {
-      return parseLibraryDirective(commentAndMetadata);
-    } else if (matchesKeyword(Keyword.PART)) {
-      return parsePartDirective(commentAndMetadata);
+  Directive _parseDirective(CommentAndMetadata commentAndMetadata) {
+    if (_matchesKeyword(Keyword.IMPORT)) {
+      return _parseImportDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.EXPORT)) {
+      return _parseExportDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.LIBRARY)) {
+      return _parseLibraryDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.PART)) {
+      return _parsePartDirective(commentAndMetadata);
     } else {
       // Internal error: this method should not have been invoked if the current token was something
       // other than one of the above.
@@ -4218,7 +4328,7 @@
    *
    * @return the documentation comment that was parsed, or `null` if there was no comment
    */
-  Comment parseDocumentationComment() {
+  Comment _parseDocumentationComment() {
     List<Token> commentTokens = new List<Token>();
     Token commentToken = _currentToken.precedingComments;
     while (commentToken != null) {
@@ -4241,7 +4351,7 @@
       return null;
     }
     List<Token> tokens = new List.from(commentTokens);
-    List<CommentReference> references = parseCommentReferences(tokens);
+    List<CommentReference> references = _parseCommentReferences(tokens);
     return Comment.createDocumentationCommentWithReferences(tokens, references);
   }
 
@@ -4255,17 +4365,17 @@
    *
    * @return the do statement that was parsed
    */
-  Statement parseDoStatement() {
+  Statement _parseDoStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
     try {
-      Token doKeyword = expectKeyword(Keyword.DO);
+      Token doKeyword = _expectKeyword(Keyword.DO);
       Statement body = parseStatement2();
-      Token whileKeyword = expectKeyword(Keyword.WHILE);
-      Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+      Token whileKeyword = _expectKeyword(Keyword.WHILE);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression condition = parseExpression2();
-      Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
-      Token semicolon = expect(TokenType.SEMICOLON);
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Token semicolon = _expect(TokenType.SEMICOLON);
       return new DoStatement(doKeyword, body, whileKeyword, leftParenthesis, condition, rightParenthesis, semicolon);
     } finally {
       _inLoop = wasInLoop;
@@ -4282,7 +4392,7 @@
    *
    * @return the empty statement that was parsed
    */
-  Statement parseEmptyStatement() => new EmptyStatement(andAdvance);
+  Statement _parseEmptyStatement() => new EmptyStatement(andAdvance);
 
   /**
    * Parse an equality expression.
@@ -4295,20 +4405,20 @@
    *
    * @return the equality expression that was parsed
    */
-  Expression parseEqualityExpression() {
+  Expression _parseEqualityExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isEqualityOperator) {
+    if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isEqualityOperator) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseRelationalExpression();
+      expression = _parseRelationalExpression();
     }
     bool leftEqualityExpression = false;
     while (_currentToken.type.isEqualityOperator) {
       Token operator = andAdvance;
       if (leftEqualityExpression) {
-        reportErrorForNode(ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, expression, []);
+        _reportErrorForNode(ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, expression, []);
       }
-      expression = new BinaryExpression(expression, operator, parseRelationalExpression());
+      expression = new BinaryExpression(expression, operator, _parseRelationalExpression());
       leftEqualityExpression = true;
     }
     return expression;
@@ -4325,11 +4435,11 @@
    * @param commentAndMetadata the metadata to be associated with the directive
    * @return the export directive that was parsed
    */
-  ExportDirective parseExportDirective(CommentAndMetadata commentAndMetadata) {
-    Token exportKeyword = expectKeyword(Keyword.EXPORT);
+  ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) {
+    Token exportKeyword = _expectKeyword(Keyword.EXPORT);
     StringLiteral libraryUri = parseStringLiteral();
-    List<Combinator> combinators = parseCombinators();
-    Token semicolon = expectSemicolon();
+    List<Combinator> combinators = _parseCombinators();
+    Token semicolon = _expectSemicolon();
     return new ExportDirective(commentAndMetadata.comment, commentAndMetadata.metadata, exportKeyword, libraryUri, combinators, semicolon);
   }
 
@@ -4343,10 +4453,10 @@
    *
    * @return the expression that was parsed
    */
-  List<Expression> parseExpressionList() {
+  List<Expression> _parseExpressionList() {
     List<Expression> expressions = new List<Expression>();
     expressions.add(parseExpression2());
-    while (optional(TokenType.COMMA)) {
+    while (_optional(TokenType.COMMA)) {
       expressions.add(parseExpression2());
     }
     return expressions;
@@ -4366,21 +4476,21 @@
    * @param optional `true` if the keyword and type are optional
    * @return the 'final', 'const', 'var' or type that was parsed
    */
-  FinalConstVarOrType parseFinalConstVarOrType(bool optional) {
+  FinalConstVarOrType _parseFinalConstVarOrType(bool optional) {
     Token keyword = null;
     TypeName type = null;
-    if (matchesKeyword(Keyword.FINAL) || matchesKeyword(Keyword.CONST)) {
+    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.CONST)) {
       keyword = andAdvance;
-      if (isTypedIdentifier(_currentToken)) {
+      if (_isTypedIdentifier(_currentToken)) {
         type = parseTypeName();
       }
-    } else if (matchesKeyword(Keyword.VAR)) {
+    } else if (_matchesKeyword(Keyword.VAR)) {
       keyword = andAdvance;
     } else {
-      if (isTypedIdentifier(_currentToken)) {
+      if (_isTypedIdentifier(_currentToken)) {
         type = parseReturnType();
       } else if (!optional) {
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
     }
     return new FinalConstVarOrType(keyword, type);
@@ -4402,24 +4512,24 @@
    *          delimiters
    * @return the formal parameter that was parsed
    */
-  FormalParameter parseFormalParameter(ParameterKind kind) {
+  FormalParameter _parseFormalParameter(ParameterKind kind) {
     NormalFormalParameter parameter = parseNormalFormalParameter();
-    if (matches(TokenType.EQ)) {
+    if (_matches(TokenType.EQ)) {
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.NAMED)) {
-        reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
+        _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
-        reportErrorForNode(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
+        _reportErrorForNode(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
       return new DefaultFormalParameter(parameter, kind, seperator, defaultValue);
-    } else if (matches(TokenType.COLON)) {
+    } else if (_matches(TokenType.COLON)) {
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.POSITIONAL)) {
-        reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
+        _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
-        reportErrorForNode(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
+        _reportErrorForNode(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
       return new DefaultFormalParameter(parameter, kind, seperator, defaultValue);
     } else if (kind != ParameterKind.REQUIRED) {
@@ -4447,40 +4557,40 @@
    *
    * @return the for statement that was parsed
    */
-  Statement parseForStatement() {
+  Statement _parseForStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
     try {
-      Token forKeyword = expectKeyword(Keyword.FOR);
-      Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+      Token forKeyword = _expectKeyword(Keyword.FOR);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       VariableDeclarationList variableList = null;
       Expression initialization = null;
-      if (!matches(TokenType.SEMICOLON)) {
-        CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-        if (matchesIdentifier() && tokenMatchesKeyword(peek(), Keyword.IN)) {
+      if (!_matches(TokenType.SEMICOLON)) {
+        CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+        if (_matchesIdentifier() && _tokenMatchesKeyword(_peek(), Keyword.IN)) {
           List<VariableDeclaration> variables = new List<VariableDeclaration>();
           SimpleIdentifier variableName = parseSimpleIdentifier();
           variables.add(new VariableDeclaration(null, null, variableName, null, null));
           variableList = new VariableDeclarationList(commentAndMetadata.comment, commentAndMetadata.metadata, null, null, variables);
-        } else if (isInitializedVariableDeclaration()) {
-          variableList = parseVariableDeclarationListAfterMetadata(commentAndMetadata);
+        } else if (_isInitializedVariableDeclaration()) {
+          variableList = _parseVariableDeclarationListAfterMetadata(commentAndMetadata);
         } else {
           initialization = parseExpression2();
         }
-        if (matchesKeyword(Keyword.IN)) {
+        if (_matchesKeyword(Keyword.IN)) {
           DeclaredIdentifier loopVariable = null;
           SimpleIdentifier identifier = null;
           if (variableList == null) {
             // We found: <expression> 'in'
-            reportErrorForCurrentToken(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
+            _reportErrorForCurrentToken(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
           } else {
             NodeList<VariableDeclaration> variables = variableList.variables;
             if (variables.length > 1) {
-              reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
+              _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
             }
             VariableDeclaration variable = variables[0];
             if (variable.initializer != null) {
-              reportErrorForCurrentToken(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
+              _reportErrorForCurrentToken(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
             }
             Token keyword = variableList.keyword;
             TypeName type = variableList.type;
@@ -4492,9 +4602,9 @@
               identifier = variable.name;
             }
           }
-          Token inKeyword = expectKeyword(Keyword.IN);
+          Token inKeyword = _expectKeyword(Keyword.IN);
           Expression iterator = parseExpression2();
-          Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+          Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
           Statement body = parseStatement2();
           if (loopVariable == null) {
             return new ForEachStatement.con2(forKeyword, leftParenthesis, identifier, inKeyword, iterator, rightParenthesis, body);
@@ -4502,17 +4612,17 @@
           return new ForEachStatement.con1(forKeyword, leftParenthesis, loopVariable, inKeyword, iterator, rightParenthesis, body);
         }
       }
-      Token leftSeparator = expect(TokenType.SEMICOLON);
+      Token leftSeparator = _expect(TokenType.SEMICOLON);
       Expression condition = null;
-      if (!matches(TokenType.SEMICOLON)) {
+      if (!_matches(TokenType.SEMICOLON)) {
         condition = parseExpression2();
       }
-      Token rightSeparator = expect(TokenType.SEMICOLON);
+      Token rightSeparator = _expect(TokenType.SEMICOLON);
       List<Expression> updaters = null;
-      if (!matches(TokenType.CLOSE_PAREN)) {
-        updaters = parseExpressionList();
+      if (!_matches(TokenType.CLOSE_PAREN)) {
+        updaters = _parseExpressionList();
       }
-      Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       Statement body = parseStatement2();
       return new ForStatement(forKeyword, leftParenthesis, variableList, initialization, leftSeparator, condition, rightSeparator, updaters, rightParenthesis, body);
     } finally {
@@ -4539,45 +4649,45 @@
    *          and therefore does not have a terminating semicolon
    * @return the function body that was parsed
    */
-  FunctionBody parseFunctionBody(bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
+  FunctionBody _parseFunctionBody(bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
     bool wasInLoop = _inLoop;
     bool wasInSwitch = _inSwitch;
     _inLoop = false;
     _inSwitch = false;
     try {
-      if (matches(TokenType.SEMICOLON)) {
+      if (_matches(TokenType.SEMICOLON)) {
         if (!mayBeEmpty) {
-          reportErrorForCurrentToken(emptyErrorCode, []);
+          _reportErrorForCurrentToken(emptyErrorCode, []);
         }
         return new EmptyFunctionBody(andAdvance);
-      } else if (matches(TokenType.FUNCTION)) {
+      } else if (_matches(TokenType.FUNCTION)) {
         Token functionDefinition = andAdvance;
         Expression expression = parseExpression2();
         Token semicolon = null;
         if (!inExpression) {
-          semicolon = expect(TokenType.SEMICOLON);
+          semicolon = _expect(TokenType.SEMICOLON);
         }
         if (!_parseFunctionBodies) {
-          return new EmptyFunctionBody(createSyntheticToken(TokenType.SEMICOLON));
+          return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON));
         }
         return new ExpressionFunctionBody(functionDefinition, expression, semicolon);
-      } else if (matches(TokenType.OPEN_CURLY_BRACKET)) {
+      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
         if (!_parseFunctionBodies) {
-          skipBlock();
-          return new EmptyFunctionBody(createSyntheticToken(TokenType.SEMICOLON));
+          _skipBlock();
+          return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON));
         }
         return new BlockFunctionBody(parseBlock());
-      } else if (matchesString(_NATIVE)) {
+      } else if (_matchesString(_NATIVE)) {
         Token nativeToken = andAdvance;
         StringLiteral stringLiteral = null;
-        if (matches(TokenType.STRING)) {
+        if (_matches(TokenType.STRING)) {
           stringLiteral = parseStringLiteral();
         }
-        return new NativeFunctionBody(nativeToken, stringLiteral, expect(TokenType.SEMICOLON));
+        return new NativeFunctionBody(nativeToken, stringLiteral, _expect(TokenType.SEMICOLON));
       } else {
         // Invalid function body
-        reportErrorForCurrentToken(emptyErrorCode, []);
-        return new EmptyFunctionBody(createSyntheticToken(TokenType.SEMICOLON));
+        _reportErrorForCurrentToken(emptyErrorCode, []);
+        return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON));
       }
     } finally {
       _inLoop = wasInLoop;
@@ -4601,33 +4711,33 @@
    * @param isStatement `true` if the function declaration is being parsed as a statement
    * @return the function declaration that was parsed
    */
-  FunctionDeclaration parseFunctionDeclaration(CommentAndMetadata commentAndMetadata, Token externalKeyword, TypeName returnType) {
+  FunctionDeclaration _parseFunctionDeclaration(CommentAndMetadata commentAndMetadata, Token externalKeyword, TypeName returnType) {
     Token keyword = null;
     bool isGetter = false;
-    if (matchesKeyword(Keyword.GET) && !tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+    if (_matchesKeyword(Keyword.GET) && !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       keyword = andAdvance;
       isGetter = true;
-    } else if (matchesKeyword(Keyword.SET) && !tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+    } else if (_matchesKeyword(Keyword.SET) && !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       keyword = andAdvance;
     }
     SimpleIdentifier name = parseSimpleIdentifier();
     FormalParameterList parameters = null;
     if (!isGetter) {
-      if (matches(TokenType.OPEN_PAREN)) {
+      if (_matches(TokenType.OPEN_PAREN)) {
         parameters = parseFormalParameterList();
-        validateFormalParameterList(parameters);
+        _validateFormalParameterList(parameters);
       } else {
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
       }
-    } else if (matches(TokenType.OPEN_PAREN)) {
-      reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+    } else if (_matches(TokenType.OPEN_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       parseFormalParameterList();
     }
     FunctionBody body;
     if (externalKeyword == null) {
-      body = parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+      body = _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     } else {
-      body = new EmptyFunctionBody(expect(TokenType.SEMICOLON));
+      body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON));
     }
     //    if (!isStatement && matches(TokenType.SEMICOLON)) {
     //      // TODO(brianwilkerson) Improve this error message.
@@ -4647,10 +4757,10 @@
    *
    * @return the function declaration statement that was parsed
    */
-  Statement parseFunctionDeclarationStatement() {
-    Modifiers modifiers = parseModifiers();
-    validateModifiersForFunctionDeclarationStatement(modifiers);
-    return parseFunctionDeclarationStatementAfterReturnType(parseCommentAndMetadata(), parseOptionalReturnType());
+  Statement _parseFunctionDeclarationStatement() {
+    Modifiers modifiers = _parseModifiers();
+    _validateModifiersForFunctionDeclarationStatement(modifiers);
+    return _parseFunctionDeclarationStatementAfterReturnType(_parseCommentAndMetadata(), _parseOptionalReturnType());
   }
 
   /**
@@ -4666,14 +4776,14 @@
    * @param returnType the return type, or `null` if there is no return type
    * @return the function declaration statement that was parsed
    */
-  Statement parseFunctionDeclarationStatementAfterReturnType(CommentAndMetadata commentAndMetadata, TypeName returnType) {
-    FunctionDeclaration declaration = parseFunctionDeclaration(commentAndMetadata, null, returnType);
+  Statement _parseFunctionDeclarationStatementAfterReturnType(CommentAndMetadata commentAndMetadata, TypeName returnType) {
+    FunctionDeclaration declaration = _parseFunctionDeclaration(commentAndMetadata, null, returnType);
     Token propertyKeyword = declaration.propertyKeyword;
     if (propertyKeyword != null) {
       if (identical((propertyKeyword as KeywordToken).keyword, Keyword.GET)) {
-        reportErrorForToken(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword, []);
+        _reportErrorForToken(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword, []);
       } else {
-        reportErrorForToken(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword, []);
+        _reportErrorForToken(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword, []);
       }
     }
     return new FunctionDeclarationStatement(declaration);
@@ -4694,31 +4804,31 @@
    * @param keyword the token representing the 'typedef' keyword
    * @return the function type alias that was parsed
    */
-  FunctionTypeAlias parseFunctionTypeAlias(CommentAndMetadata commentAndMetadata, Token keyword) {
+  FunctionTypeAlias _parseFunctionTypeAlias(CommentAndMetadata commentAndMetadata, Token keyword) {
     TypeName returnType = null;
     if (hasReturnTypeInTypeAlias) {
       returnType = parseReturnType();
     }
     SimpleIdentifier name = parseSimpleIdentifier();
     TypeParameterList typeParameters = null;
-    if (matches(TokenType.LT)) {
+    if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
     }
-    if (matches(TokenType.SEMICOLON) || matches(TokenType.EOF)) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
-      FormalParameterList parameters = new FormalParameterList(createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken(TokenType.CLOSE_PAREN));
-      Token semicolon = expect(TokenType.SEMICOLON);
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      FormalParameterList parameters = new FormalParameterList(_createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticToken(TokenType.CLOSE_PAREN));
+      Token semicolon = _expect(TokenType.SEMICOLON);
       return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
-    } else if (!matches(TokenType.OPEN_PAREN)) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+    } else if (!_matches(TokenType.OPEN_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       // TODO(brianwilkerson) Recover from this error. At the very least we should skip to the start
       // of the next valid compilation unit member, allowing for the possibility of finding the
       // typedef parameters before that point.
-      return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, new FormalParameterList(createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken(TokenType.CLOSE_PAREN)), createSyntheticToken(TokenType.SEMICOLON));
+      return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, new FormalParameterList(_createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticToken(TokenType.CLOSE_PAREN)), _createSyntheticToken(TokenType.SEMICOLON));
     }
     FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    Token semicolon = expect(TokenType.SEMICOLON);
+    _validateFormalParameterList(parameters);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
   }
 
@@ -4741,17 +4851,17 @@
    *          type
    * @return the getter that was parsed
    */
-  MethodDeclaration parseGetter(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
-    Token propertyKeyword = expectKeyword(Keyword.GET);
+  MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
+    Token propertyKeyword = _expectKeyword(Keyword.GET);
     SimpleIdentifier name = parseSimpleIdentifier();
-    if (matches(TokenType.OPEN_PAREN) && tokenMatches(peek(), TokenType.CLOSE_PAREN)) {
-      reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
-      advance();
-      advance();
+    if (_matches(TokenType.OPEN_PAREN) && _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      _advance();
+      _advance();
     }
-    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
+    FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
     }
     return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, null, body);
   }
@@ -4766,11 +4876,11 @@
    *
    * @return the list of identifiers that were parsed
    */
-  List<SimpleIdentifier> parseIdentifierList() {
+  List<SimpleIdentifier> _parseIdentifierList() {
     List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
     identifiers.add(parseSimpleIdentifier());
-    while (matches(TokenType.COMMA)) {
-      advance();
+    while (_matches(TokenType.COMMA)) {
+      _advance();
       identifiers.add(parseSimpleIdentifier());
     }
     return identifiers;
@@ -4786,15 +4896,15 @@
    *
    * @return the if statement that was parsed
    */
-  Statement parseIfStatement() {
-    Token ifKeyword = expectKeyword(Keyword.IF);
-    Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+  Statement _parseIfStatement() {
+    Token ifKeyword = _expectKeyword(Keyword.IF);
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
     Expression condition = parseExpression2();
-    Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
     Statement thenStatement = parseStatement2();
     Token elseKeyword = null;
     Statement elseStatement = null;
-    if (matchesKeyword(Keyword.ELSE)) {
+    if (_matchesKeyword(Keyword.ELSE)) {
       elseKeyword = andAdvance;
       elseStatement = parseStatement2();
     }
@@ -4812,17 +4922,17 @@
    * @param commentAndMetadata the metadata to be associated with the directive
    * @return the import directive that was parsed
    */
-  ImportDirective parseImportDirective(CommentAndMetadata commentAndMetadata) {
-    Token importKeyword = expectKeyword(Keyword.IMPORT);
+  ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) {
+    Token importKeyword = _expectKeyword(Keyword.IMPORT);
     StringLiteral libraryUri = parseStringLiteral();
     Token asToken = null;
     SimpleIdentifier prefix = null;
-    if (matchesKeyword(Keyword.AS)) {
+    if (_matchesKeyword(Keyword.AS)) {
       asToken = andAdvance;
       prefix = parseSimpleIdentifier();
     }
-    List<Combinator> combinators = parseCombinators();
-    Token semicolon = expectSemicolon();
+    List<Combinator> combinators = _parseCombinators();
+    Token semicolon = _expectSemicolon();
     return new ImportDirective(commentAndMetadata.comment, commentAndMetadata.metadata, importKeyword, libraryUri, asToken, prefix, combinators, semicolon);
   }
 
@@ -4849,9 +4959,9 @@
    * @param type the type that has already been parsed, or `null` if 'var' was provided
    * @return the getter that was parsed
    */
-  FieldDeclaration parseInitializedIdentifierList(CommentAndMetadata commentAndMetadata, Token staticKeyword, Token keyword, TypeName type) {
-    VariableDeclarationList fieldList = parseVariableDeclarationListAfterType(null, keyword, type);
-    return new FieldDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, staticKeyword, fieldList, expect(TokenType.SEMICOLON));
+  FieldDeclaration _parseInitializedIdentifierList(CommentAndMetadata commentAndMetadata, Token staticKeyword, Token keyword, TypeName type) {
+    VariableDeclarationList fieldList = _parseVariableDeclarationListAfterType(null, keyword, type);
+    return new FieldDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, staticKeyword, fieldList, _expect(TokenType.SEMICOLON));
   }
 
   /**
@@ -4865,7 +4975,7 @@
    * @param keyword the 'new' or 'const' keyword that introduces the expression
    * @return the instance creation expression that was parsed
    */
-  InstanceCreationExpression parseInstanceCreationExpression(Token keyword) {
+  InstanceCreationExpression _parseInstanceCreationExpression(Token keyword) {
     ConstructorName constructorName = parseConstructorName();
     ArgumentList argumentList = parseArgumentList();
     return new InstanceCreationExpression(keyword, constructorName, argumentList);
@@ -4882,10 +4992,10 @@
    * @param commentAndMetadata the metadata to be associated with the directive
    * @return the library directive that was parsed
    */
-  LibraryDirective parseLibraryDirective(CommentAndMetadata commentAndMetadata) {
-    Token keyword = expectKeyword(Keyword.LIBRARY);
-    LibraryIdentifier libraryName = parseLibraryName(ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, keyword);
-    Token semicolon = expect(TokenType.SEMICOLON);
+  LibraryDirective _parseLibraryDirective(CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.LIBRARY);
+    LibraryIdentifier libraryName = _parseLibraryName(ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, keyword);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new LibraryDirective(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, libraryName, semicolon);
   }
 
@@ -4902,19 +5012,19 @@
    *          missing
    * @return the library name that was parsed
    */
-  LibraryIdentifier parseLibraryName(ParserErrorCode missingNameError, Token missingNameToken) {
-    if (matchesIdentifier()) {
+  LibraryIdentifier _parseLibraryName(ParserErrorCode missingNameError, Token missingNameToken) {
+    if (_matchesIdentifier()) {
       return parseLibraryIdentifier();
-    } else if (matches(TokenType.STRING)) {
+    } else if (_matches(TokenType.STRING)) {
       // TODO(brianwilkerson) Recovery: This should be extended to handle arbitrary tokens until we
       // can find a token that can start a compilation unit member.
       StringLiteral string = parseStringLiteral();
-      reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, []);
+      _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, []);
     } else {
-      reportErrorForToken(missingNameError, missingNameToken, []);
+      _reportErrorForToken(missingNameError, missingNameToken, []);
     }
     List<SimpleIdentifier> components = new List<SimpleIdentifier>();
-    components.add(createSyntheticIdentifier());
+    components.add(_createSyntheticIdentifier());
     return new LibraryIdentifier(components);
   }
 
@@ -4932,9 +5042,9 @@
    *          are no type arguments
    * @return the list literal that was parsed
    */
-  ListLiteral parseListLiteral(Token modifier, TypeArgumentList typeArguments) {
+  ListLiteral _parseListLiteral(Token modifier, TypeArgumentList typeArguments) {
     // may be empty list literal
-    if (matches(TokenType.INDEX)) {
+    if (_matches(TokenType.INDEX)) {
       BeginToken leftBracket = new BeginToken(TokenType.OPEN_SQUARE_BRACKET, _currentToken.offset);
       Token rightBracket = new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1);
       leftBracket.endToken = rightBracket;
@@ -4945,19 +5055,19 @@
       return new ListLiteral(modifier, typeArguments, leftBracket, null, rightBracket);
     }
     // open
-    Token leftBracket = expect(TokenType.OPEN_SQUARE_BRACKET);
-    if (matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+    Token leftBracket = _expect(TokenType.OPEN_SQUARE_BRACKET);
+    if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
       return new ListLiteral(modifier, typeArguments, leftBracket, null, andAdvance);
     }
     List<Expression> elements = new List<Expression>();
     elements.add(parseExpression2());
-    while (optional(TokenType.COMMA)) {
-      if (matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+    while (_optional(TokenType.COMMA)) {
+      if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
         return new ListLiteral(modifier, typeArguments, leftBracket, elements, andAdvance);
       }
       elements.add(parseExpression2());
     }
-    Token rightBracket = expect(TokenType.CLOSE_SQUARE_BRACKET);
+    Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
     return new ListLiteral(modifier, typeArguments, leftBracket, elements, rightBracket);
   }
 
@@ -4974,18 +5084,18 @@
    *          no modifier
    * @return the list or map literal that was parsed
    */
-  TypedLiteral parseListOrMapLiteral(Token modifier) {
+  TypedLiteral _parseListOrMapLiteral(Token modifier) {
     TypeArgumentList typeArguments = null;
-    if (matches(TokenType.LT)) {
+    if (_matches(TokenType.LT)) {
       typeArguments = parseTypeArgumentList();
     }
-    if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-      return parseMapLiteral(modifier, typeArguments);
-    } else if (matches(TokenType.OPEN_SQUARE_BRACKET) || matches(TokenType.INDEX)) {
-      return parseListLiteral(modifier, typeArguments);
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(modifier, typeArguments);
+    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) {
+      return _parseListLiteral(modifier, typeArguments);
     }
-    reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
-    return new ListLiteral(modifier, typeArguments, createSyntheticToken(TokenType.OPEN_SQUARE_BRACKET), null, createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET));
+    _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
+    return new ListLiteral(modifier, typeArguments, _createSyntheticToken(TokenType.OPEN_SQUARE_BRACKET), null, _createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET));
   }
 
   /**
@@ -4998,11 +5108,11 @@
    *
    * @return the logical and expression that was parsed
    */
-  Expression parseLogicalAndExpression() {
-    Expression expression = parseEqualityExpression();
-    while (matches(TokenType.AMPERSAND_AMPERSAND)) {
+  Expression _parseLogicalAndExpression() {
+    Expression expression = _parseEqualityExpression();
+    while (_matches(TokenType.AMPERSAND_AMPERSAND)) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseEqualityExpression());
+      expression = new BinaryExpression(expression, operator, _parseEqualityExpression());
     }
     return expression;
   }
@@ -5021,20 +5131,20 @@
    *          type arguments
    * @return the map literal that was parsed
    */
-  MapLiteral parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
-    Token leftBracket = expect(TokenType.OPEN_CURLY_BRACKET);
+  MapLiteral _parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
+    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
     List<MapLiteralEntry> entries = new List<MapLiteralEntry>();
-    if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
       return new MapLiteral(modifier, typeArguments, leftBracket, entries, andAdvance);
     }
     entries.add(parseMapLiteralEntry());
-    while (optional(TokenType.COMMA)) {
-      if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
+    while (_optional(TokenType.COMMA)) {
+      if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
         return new MapLiteral(modifier, typeArguments, leftBracket, entries, andAdvance);
       }
       entries.add(parseMapLiteralEntry());
     }
-    Token rightBracket = expect(TokenType.CLOSE_CURLY_BRACKET);
+    Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
     return new MapLiteral(modifier, typeArguments, leftBracket, entries, rightBracket);
   }
 
@@ -5056,15 +5166,15 @@
    * @param parameters the parameters to the method
    * @return the method declaration that was parsed
    */
-  MethodDeclaration parseMethodDeclarationAfterParameters(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType, SimpleIdentifier name, FormalParameterList parameters) {
-    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+  MethodDeclaration _parseMethodDeclarationAfterParameters(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType, SimpleIdentifier name, FormalParameterList parameters) {
+    FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null) {
       if (body is! EmptyFunctionBody) {
-        reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body, []);
+        _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body, []);
       }
     } else if (staticKeyword != null) {
       if (body is EmptyFunctionBody) {
-        reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body, []);
+        _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body, []);
       }
     }
     return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, null, null, name, parameters, body);
@@ -5086,11 +5196,11 @@
    * @param returnType the return type of the method
    * @return the method declaration that was parsed
    */
-  MethodDeclaration parseMethodDeclarationAfterReturnType(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
+  MethodDeclaration _parseMethodDeclarationAfterReturnType(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
     SimpleIdentifier methodName = parseSimpleIdentifier();
     FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    return parseMethodDeclarationAfterParameters(commentAndMetadata, externalKeyword, staticKeyword, returnType, methodName, parameters);
+    _validateFormalParameterList(parameters);
+    return _parseMethodDeclarationAfterParameters(commentAndMetadata, externalKeyword, staticKeyword, returnType, methodName, parameters);
   }
 
   /**
@@ -5106,59 +5216,59 @@
    *
    * @return the modifiers that were parsed
    */
-  Modifiers parseModifiers() {
+  Modifiers _parseModifiers() {
     Modifiers modifiers = new Modifiers();
     bool progress = true;
     while (progress) {
-      if (tokenMatches(peek(), TokenType.PERIOD) || tokenMatches(peek(), TokenType.LT) || tokenMatches(peek(), TokenType.OPEN_PAREN)) {
+      if (_tokenMatches(_peek(), TokenType.PERIOD) || _tokenMatches(_peek(), TokenType.LT) || _tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
         return modifiers;
       }
-      if (matchesKeyword(Keyword.ABSTRACT)) {
+      if (_matchesKeyword(Keyword.ABSTRACT)) {
         if (modifiers.abstractKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.abstractKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.CONST)) {
+      } else if (_matchesKeyword(Keyword.CONST)) {
         if (modifiers.constKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.constKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.EXTERNAL) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT)) {
+      } else if (_matchesKeyword(Keyword.EXTERNAL) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT)) {
         if (modifiers.externalKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.externalKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.FACTORY) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT)) {
+      } else if (_matchesKeyword(Keyword.FACTORY) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT)) {
         if (modifiers.factoryKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.factoryKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.FINAL)) {
+      } else if (_matchesKeyword(Keyword.FINAL)) {
         if (modifiers.finalKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.finalKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.STATIC) && !tokenMatches(peek(), TokenType.PERIOD) && !tokenMatches(peek(), TokenType.LT)) {
+      } else if (_matchesKeyword(Keyword.STATIC) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT)) {
         if (modifiers.staticKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.staticKeyword = andAdvance;
         }
-      } else if (matchesKeyword(Keyword.VAR)) {
+      } else if (_matchesKeyword(Keyword.VAR)) {
         if (modifiers.varKeyword != null) {
-          reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
-          advance();
+          _reportErrorForCurrentToken(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
         } else {
           modifiers.varKeyword = andAdvance;
         }
@@ -5180,16 +5290,16 @@
    *
    * @return the multiplicative expression that was parsed
    */
-  Expression parseMultiplicativeExpression() {
+  Expression _parseMultiplicativeExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isMultiplicativeOperator) {
+    if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isMultiplicativeOperator) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseUnaryExpression();
+      expression = _parseUnaryExpression();
     }
     while (_currentToken.type.isMultiplicativeOperator) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseUnaryExpression());
+      expression = new BinaryExpression(expression, operator, _parseUnaryExpression());
     }
     return expression;
   }
@@ -5204,7 +5314,7 @@
    *
    * @return the class native clause that was parsed
    */
-  NativeClause parseNativeClause() {
+  NativeClause _parseNativeClause() {
     Token keyword = andAdvance;
     StringLiteral name = parseStringLiteral();
     return new NativeClause(keyword, name);
@@ -5220,7 +5330,7 @@
    *
    * @return the new expression that was parsed
    */
-  InstanceCreationExpression parseNewExpression() => parseInstanceCreationExpression(expectKeyword(Keyword.NEW));
+  InstanceCreationExpression _parseNewExpression() => _parseInstanceCreationExpression(_expectKeyword(Keyword.NEW));
 
   /**
    * Parse a non-labeled statement.
@@ -5245,112 +5355,112 @@
    *
    * @return the non-labeled statement that was parsed
    */
-  Statement parseNonLabeledStatement() {
+  Statement _parseNonLabeledStatement() {
     // TODO(brianwilkerson) Pass the comment and metadata on where appropriate.
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
-    if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-      if (tokenMatches(peek(), TokenType.STRING)) {
-        Token afterString = skipStringLiteral(_currentToken.next);
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      if (_tokenMatches(_peek(), TokenType.STRING)) {
+        Token afterString = _skipStringLiteral(_currentToken.next);
         if (afterString != null && identical(afterString.type, TokenType.COLON)) {
-          return new ExpressionStatement(parseExpression2(), expect(TokenType.SEMICOLON));
+          return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
         }
       }
       return parseBlock();
-    } else if (matches(TokenType.KEYWORD) && !(_currentToken as KeywordToken).keyword.isPseudoKeyword) {
+    } else if (_matches(TokenType.KEYWORD) && !(_currentToken as KeywordToken).keyword.isPseudoKeyword) {
       Keyword keyword = (_currentToken as KeywordToken).keyword;
       // TODO(jwren) compute some metrics to figure out a better order for this if-then sequence to optimize performance
       if (identical(keyword, Keyword.ASSERT)) {
-        return parseAssertStatement();
+        return _parseAssertStatement();
       } else if (identical(keyword, Keyword.BREAK)) {
-        return parseBreakStatement();
+        return _parseBreakStatement();
       } else if (identical(keyword, Keyword.CONTINUE)) {
-        return parseContinueStatement();
+        return _parseContinueStatement();
       } else if (identical(keyword, Keyword.DO)) {
-        return parseDoStatement();
+        return _parseDoStatement();
       } else if (identical(keyword, Keyword.FOR)) {
-        return parseForStatement();
+        return _parseForStatement();
       } else if (identical(keyword, Keyword.IF)) {
-        return parseIfStatement();
+        return _parseIfStatement();
       } else if (identical(keyword, Keyword.RETHROW)) {
-        return new ExpressionStatement(parseRethrowExpression(), expect(TokenType.SEMICOLON));
+        return new ExpressionStatement(_parseRethrowExpression(), _expect(TokenType.SEMICOLON));
       } else if (identical(keyword, Keyword.RETURN)) {
-        return parseReturnStatement();
+        return _parseReturnStatement();
       } else if (identical(keyword, Keyword.SWITCH)) {
-        return parseSwitchStatement();
+        return _parseSwitchStatement();
       } else if (identical(keyword, Keyword.THROW)) {
-        return new ExpressionStatement(parseThrowExpression(), expect(TokenType.SEMICOLON));
+        return new ExpressionStatement(_parseThrowExpression(), _expect(TokenType.SEMICOLON));
       } else if (identical(keyword, Keyword.TRY)) {
-        return parseTryStatement();
+        return _parseTryStatement();
       } else if (identical(keyword, Keyword.WHILE)) {
-        return parseWhileStatement();
+        return _parseWhileStatement();
       } else if (identical(keyword, Keyword.VAR) || identical(keyword, Keyword.FINAL)) {
-        return parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
+        return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
       } else if (identical(keyword, Keyword.VOID)) {
         TypeName returnType = parseReturnType();
-        if (matchesIdentifier() && matchesAny(peek(), [
+        if (_matchesIdentifier() && _peek().matchesAny([
             TokenType.OPEN_PAREN,
             TokenType.OPEN_CURLY_BRACKET,
             TokenType.FUNCTION])) {
-          return parseFunctionDeclarationStatementAfterReturnType(commentAndMetadata, returnType);
+          return _parseFunctionDeclarationStatementAfterReturnType(commentAndMetadata, returnType);
         } else {
           //
           // We have found an error of some kind. Try to recover.
           //
-          if (matchesIdentifier()) {
-            if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+          if (_matchesIdentifier()) {
+            if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
               //
               // We appear to have a variable declaration with a type of "void".
               //
-              reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
-              return parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
+              _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []);
+              return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
             }
-          } else if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
+          } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
             //
             // We appear to have found an incomplete statement at the end of a block. Parse it as a
             // variable declaration.
             //
-            return parseVariableDeclarationStatementAfterType(commentAndMetadata, null, returnType);
+            return _parseVariableDeclarationStatementAfterType(commentAndMetadata, null, returnType);
           }
-          reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
+          _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
           // TODO(brianwilkerson) Recover from this error.
-          return new EmptyStatement(createSyntheticToken(TokenType.SEMICOLON));
+          return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
         }
       } else if (identical(keyword, Keyword.CONST)) {
-        if (matchesAny(peek(), [
+        if (_peek().matchesAny([
             TokenType.LT,
             TokenType.OPEN_CURLY_BRACKET,
             TokenType.OPEN_SQUARE_BRACKET,
             TokenType.INDEX])) {
-          return new ExpressionStatement(parseExpression2(), expect(TokenType.SEMICOLON));
-        } else if (tokenMatches(peek(), TokenType.IDENTIFIER)) {
-          Token afterType = skipTypeName(peek());
+          return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
+        } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) {
+          Token afterType = _skipTypeName(_peek());
           if (afterType != null) {
-            if (tokenMatches(afterType, TokenType.OPEN_PAREN) || (tokenMatches(afterType, TokenType.PERIOD) && tokenMatches(afterType.next, TokenType.IDENTIFIER) && tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) {
-              return new ExpressionStatement(parseExpression2(), expect(TokenType.SEMICOLON));
+            if (_tokenMatches(afterType, TokenType.OPEN_PAREN) || (_tokenMatches(afterType, TokenType.PERIOD) && _tokenMatches(afterType.next, TokenType.IDENTIFIER) && _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) {
+              return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
             }
           }
         }
-        return parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
+        return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
       } else if (identical(keyword, Keyword.NEW) || identical(keyword, Keyword.TRUE) || identical(keyword, Keyword.FALSE) || identical(keyword, Keyword.NULL) || identical(keyword, Keyword.SUPER) || identical(keyword, Keyword.THIS)) {
-        return new ExpressionStatement(parseExpression2(), expect(TokenType.SEMICOLON));
+        return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
       } else {
         //
         // We have found an error of some kind. Try to recover.
         //
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
-        return new EmptyStatement(createSyntheticToken(TokenType.SEMICOLON));
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
+        return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
       }
-    } else if (matches(TokenType.SEMICOLON)) {
-      return parseEmptyStatement();
-    } else if (isInitializedVariableDeclaration()) {
-      return parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
-    } else if (isFunctionDeclaration()) {
-      return parseFunctionDeclarationStatement();
-    } else if (matches(TokenType.CLOSE_CURLY_BRACKET)) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
-      return new EmptyStatement(createSyntheticToken(TokenType.SEMICOLON));
+    } else if (_matches(TokenType.SEMICOLON)) {
+      return _parseEmptyStatement();
+    } else if (_isInitializedVariableDeclaration()) {
+      return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
+    } else if (_isFunctionDeclaration()) {
+      return _parseFunctionDeclarationStatement();
+    } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
+      return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
     } else {
-      return new ExpressionStatement(parseExpression2(), expect(TokenType.SEMICOLON));
+      return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
     }
   }
 
@@ -5372,30 +5482,30 @@
    *          type
    * @return the operator declaration that was parsed
    */
-  MethodDeclaration parseOperator(CommentAndMetadata commentAndMetadata, Token externalKeyword, TypeName returnType) {
+  MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata, Token externalKeyword, TypeName returnType) {
     Token operatorKeyword;
-    if (matchesKeyword(Keyword.OPERATOR)) {
+    if (_matchesKeyword(Keyword.OPERATOR)) {
       operatorKeyword = andAdvance;
     } else {
-      reportErrorForToken(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
-      operatorKeyword = createSyntheticKeyword(Keyword.OPERATOR);
+      _reportErrorForToken(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
+      operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR);
     }
     if (!_currentToken.isUserDefinableOperator) {
-      reportErrorForCurrentToken(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
+      _reportErrorForCurrentToken(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
     SimpleIdentifier name = new SimpleIdentifier(andAdvance);
-    if (matches(TokenType.EQ)) {
+    if (_matches(TokenType.EQ)) {
       Token previous = _currentToken.previous;
-      if ((tokenMatches(previous, TokenType.EQ_EQ) || tokenMatches(previous, TokenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) {
-        reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
-        advance();
+      if ((_tokenMatches(previous, TokenType.EQ_EQ) || _tokenMatches(previous, TokenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) {
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
+        _advance();
       }
     }
     FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+    _validateFormalParameterList(parameters);
+    FunctionBody body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
     }
     return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parameters, body);
   }
@@ -5405,12 +5515,12 @@
    *
    * @return the return type that was parsed
    */
-  TypeName parseOptionalReturnType() {
-    if (matchesKeyword(Keyword.VOID)) {
+  TypeName _parseOptionalReturnType() {
+    if (_matchesKeyword(Keyword.VOID)) {
       return parseReturnType();
-    } else if (matchesIdentifier() && !matchesKeyword(Keyword.GET) && !matchesKeyword(Keyword.SET) && !matchesKeyword(Keyword.OPERATOR) && (tokenMatchesIdentifier(peek()) || tokenMatches(peek(), TokenType.LT))) {
+    } else if (_matchesIdentifier() && !_matchesKeyword(Keyword.GET) && !_matchesKeyword(Keyword.SET) && !_matchesKeyword(Keyword.OPERATOR) && (_tokenMatchesIdentifier(_peek()) || _tokenMatches(_peek(), TokenType.LT))) {
       return parseReturnType();
-    } else if (matchesIdentifier() && tokenMatches(peek(), TokenType.PERIOD) && tokenMatchesIdentifier(peekAt(2)) && (tokenMatchesIdentifier(peekAt(3)) || tokenMatches(peekAt(3), TokenType.LT))) {
+    } else if (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatchesIdentifier(_peekAt(2)) && (_tokenMatchesIdentifier(_peekAt(3)) || _tokenMatches(_peekAt(3), TokenType.LT))) {
       return parseReturnType();
     }
     return null;
@@ -5430,16 +5540,16 @@
    * @param commentAndMetadata the metadata to be associated with the directive
    * @return the part or part-of directive that was parsed
    */
-  Directive parsePartDirective(CommentAndMetadata commentAndMetadata) {
-    Token partKeyword = expectKeyword(Keyword.PART);
-    if (matchesString(_OF)) {
+  Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
+    Token partKeyword = _expectKeyword(Keyword.PART);
+    if (_matchesString(_OF)) {
       Token ofKeyword = andAdvance;
-      LibraryIdentifier libraryName = parseLibraryName(ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword);
-      Token semicolon = expect(TokenType.SEMICOLON);
+      LibraryIdentifier libraryName = _parseLibraryName(ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword);
+      Token semicolon = _expect(TokenType.SEMICOLON);
       return new PartOfDirective(commentAndMetadata.comment, commentAndMetadata.metadata, partKeyword, ofKeyword, libraryName, semicolon);
     }
     StringLiteral partUri = parseStringLiteral();
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new PartDirective(commentAndMetadata.comment, commentAndMetadata.metadata, partKeyword, partUri, semicolon);
   }
 
@@ -5458,11 +5568,11 @@
    *
    * @return the postfix expression that was parsed
    */
-  Expression parsePostfixExpression() {
-    Expression operand = parseAssignableExpression(true);
-    if (matches(TokenType.OPEN_SQUARE_BRACKET) || matches(TokenType.PERIOD) || matches(TokenType.OPEN_PAREN)) {
+  Expression _parsePostfixExpression() {
+    Expression operand = _parseAssignableExpression(true);
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.PERIOD) || _matches(TokenType.OPEN_PAREN)) {
       do {
-        if (matches(TokenType.OPEN_PAREN)) {
+        if (_matches(TokenType.OPEN_PAREN)) {
           ArgumentList argumentList = parseArgumentList();
           if (operand is PropertyAccess) {
             PropertyAccess access = operand as PropertyAccess;
@@ -5471,15 +5581,15 @@
             operand = new FunctionExpressionInvocation(operand, argumentList);
           }
         } else {
-          operand = parseAssignableSelector(operand, true);
+          operand = _parseAssignableSelector(operand, true);
         }
-      } while (matches(TokenType.OPEN_SQUARE_BRACKET) || matches(TokenType.PERIOD) || matches(TokenType.OPEN_PAREN));
+      } while (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.PERIOD) || _matches(TokenType.OPEN_PAREN));
       return operand;
     }
     if (!_currentToken.type.isIncrementOperator) {
       return operand;
     }
-    ensureAssignable(operand);
+    _ensureAssignable(operand);
     Token operator = andAdvance;
     return new PostfixExpression(operand, operator);
   }
@@ -5511,18 +5621,18 @@
    *
    * @return the primary expression that was parsed
    */
-  Expression parsePrimaryExpression() {
-    if (matchesKeyword(Keyword.THIS)) {
+  Expression _parsePrimaryExpression() {
+    if (_matchesKeyword(Keyword.THIS)) {
       return new ThisExpression(andAdvance);
-    } else if (matchesKeyword(Keyword.SUPER)) {
-      return parseAssignableSelector(new SuperExpression(andAdvance), false);
-    } else if (matchesKeyword(Keyword.NULL)) {
+    } else if (_matchesKeyword(Keyword.SUPER)) {
+      return _parseAssignableSelector(new SuperExpression(andAdvance), false);
+    } else if (_matchesKeyword(Keyword.NULL)) {
       return new NullLiteral(andAdvance);
-    } else if (matchesKeyword(Keyword.FALSE)) {
+    } else if (_matchesKeyword(Keyword.FALSE)) {
       return new BooleanLiteral(andAdvance, false);
-    } else if (matchesKeyword(Keyword.TRUE)) {
+    } else if (_matchesKeyword(Keyword.TRUE)) {
       return new BooleanLiteral(andAdvance, true);
-    } else if (matches(TokenType.DOUBLE)) {
+    } else if (_matches(TokenType.DOUBLE)) {
       Token token = andAdvance;
       double value = 0.0;
       try {
@@ -5530,7 +5640,7 @@
       } on FormatException catch (exception) {
       }
       return new DoubleLiteral(token, value);
-    } else if (matches(TokenType.HEXADECIMAL)) {
+    } else if (_matches(TokenType.HEXADECIMAL)) {
       Token token = andAdvance;
       int value = null;
       try {
@@ -5538,7 +5648,7 @@
       } on FormatException catch (exception) {
       }
       return new IntegerLiteral(token, value);
-    } else if (matches(TokenType.INT)) {
+    } else if (_matches(TokenType.INT)) {
       Token token = andAdvance;
       int value = null;
       try {
@@ -5546,13 +5656,13 @@
       } on FormatException catch (exception) {
       }
       return new IntegerLiteral(token, value);
-    } else if (matches(TokenType.STRING)) {
+    } else if (_matches(TokenType.STRING)) {
       return parseStringLiteral();
-    } else if (matches(TokenType.OPEN_CURLY_BRACKET)) {
-      return parseMapLiteral(null, null);
-    } else if (matches(TokenType.OPEN_SQUARE_BRACKET) || matches(TokenType.INDEX)) {
-      return parseListLiteral(null, null);
-    } else if (matchesIdentifier()) {
+    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(null, null);
+    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) {
+      return _parseListLiteral(null, null);
+    } else if (_matchesIdentifier()) {
       // TODO(brianwilkerson) The code below was an attempt to recover from an error case, but it
       // needs to be applied as a recovery only after we know that parsing it as an identifier
       // doesn't work. Leaving the code as a reminder of how to recover.
@@ -5564,35 +5674,35 @@
       //        return parseFunctionExpression();
       //      }
       return parsePrefixedIdentifier();
-    } else if (matchesKeyword(Keyword.NEW)) {
-      return parseNewExpression();
-    } else if (matchesKeyword(Keyword.CONST)) {
-      return parseConstExpression();
-    } else if (matches(TokenType.OPEN_PAREN)) {
-      if (isFunctionExpression(_currentToken)) {
+    } else if (_matchesKeyword(Keyword.NEW)) {
+      return _parseNewExpression();
+    } else if (_matchesKeyword(Keyword.CONST)) {
+      return _parseConstExpression();
+    } else if (_matches(TokenType.OPEN_PAREN)) {
+      if (_isFunctionExpression(_currentToken)) {
         return parseFunctionExpression();
       }
       Token leftParenthesis = andAdvance;
       Expression expression = parseExpression2();
-      Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       return new ParenthesizedExpression(leftParenthesis, expression, rightParenthesis);
-    } else if (matches(TokenType.LT)) {
-      return parseListOrMapLiteral(null);
-    } else if (matches(TokenType.QUESTION)) {
-      return parseArgumentDefinitionTest();
-    } else if (matchesKeyword(Keyword.VOID)) {
+    } else if (_matches(TokenType.LT)) {
+      return _parseListOrMapLiteral(null);
+    } else if (_matches(TokenType.QUESTION)) {
+      return _parseArgumentDefinitionTest();
+    } else if (_matchesKeyword(Keyword.VOID)) {
       //
       // Recover from having a return type of "void" where a return type is not expected.
       //
       // TODO(brianwilkerson) Improve this error message.
-      reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
-      advance();
-      return parsePrimaryExpression();
-    } else if (matches(TokenType.HASH)) {
-      return parseSymbolLiteral();
+      _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      _advance();
+      return _parsePrimaryExpression();
+    } else if (_matches(TokenType.HASH)) {
+      return _parseSymbolLiteral();
     } else {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
-      return createSyntheticIdentifier();
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+      return _createSyntheticIdentifier();
     }
   }
 
@@ -5606,11 +5716,11 @@
    *
    * @return the redirecting constructor invocation that was parsed
    */
-  RedirectingConstructorInvocation parseRedirectingConstructorInvocation() {
-    Token keyword = expectKeyword(Keyword.THIS);
+  RedirectingConstructorInvocation _parseRedirectingConstructorInvocation() {
+    Token keyword = _expectKeyword(Keyword.THIS);
     Token period = null;
     SimpleIdentifier constructorName = null;
-    if (matches(TokenType.PERIOD)) {
+    if (_matches(TokenType.PERIOD)) {
       period = andAdvance;
       constructorName = parseSimpleIdentifier();
     }
@@ -5629,21 +5739,21 @@
    *
    * @return the relational expression that was parsed
    */
-  Expression parseRelationalExpression() {
-    if (matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isRelationalOperator) {
+  Expression _parseRelationalExpression() {
+    if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isRelationalOperator) {
       Expression expression = new SuperExpression(andAdvance);
       Token operator = andAdvance;
       expression = new BinaryExpression(expression, operator, parseBitwiseOrExpression());
       return expression;
     }
     Expression expression = parseBitwiseOrExpression();
-    if (matchesKeyword(Keyword.AS)) {
+    if (_matchesKeyword(Keyword.AS)) {
       Token asOperator = andAdvance;
       expression = new AsExpression(expression, asOperator, parseTypeName());
-    } else if (matchesKeyword(Keyword.IS)) {
+    } else if (_matchesKeyword(Keyword.IS)) {
       Token isOperator = andAdvance;
       Token notOperator = null;
-      if (matches(TokenType.BANG)) {
+      if (_matches(TokenType.BANG)) {
         notOperator = andAdvance;
       }
       expression = new IsExpression(expression, isOperator, notOperator, parseTypeName());
@@ -5664,7 +5774,7 @@
    *
    * @return the rethrow expression that was parsed
    */
-  Expression parseRethrowExpression() => new RethrowExpression(expectKeyword(Keyword.RETHROW));
+  Expression _parseRethrowExpression() => new RethrowExpression(_expectKeyword(Keyword.RETHROW));
 
   /**
    * Parse a return statement.
@@ -5676,13 +5786,13 @@
    *
    * @return the return statement that was parsed
    */
-  Statement parseReturnStatement() {
-    Token returnKeyword = expectKeyword(Keyword.RETURN);
-    if (matches(TokenType.SEMICOLON)) {
+  Statement _parseReturnStatement() {
+    Token returnKeyword = _expectKeyword(Keyword.RETURN);
+    if (_matches(TokenType.SEMICOLON)) {
       return new ReturnStatement(returnKeyword, null, andAdvance);
     }
     Expression expression = parseExpression2();
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new ReturnStatement(returnKeyword, expression, semicolon);
   }
 
@@ -5705,14 +5815,14 @@
    *          type
    * @return the setter that was parsed
    */
-  MethodDeclaration parseSetter(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
-    Token propertyKeyword = expectKeyword(Keyword.SET);
+  MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnType) {
+    Token propertyKeyword = _expectKeyword(Keyword.SET);
     SimpleIdentifier name = parseSimpleIdentifier();
     FormalParameterList parameters = parseFormalParameterList();
-    validateFormalParameterList(parameters);
-    FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
+    _validateFormalParameterList(parameters);
+    FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
     }
     return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, parameters, body);
   }
@@ -5728,16 +5838,16 @@
    *
    * @return the shift expression that was parsed
    */
-  Expression parseShiftExpression() {
+  Expression _parseShiftExpression() {
     Expression expression;
-    if (matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isShiftOperator) {
+    if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isShiftOperator) {
       expression = new SuperExpression(andAdvance);
     } else {
-      expression = parseAdditiveExpression();
+      expression = _parseAdditiveExpression();
     }
     while (_currentToken.type.isShiftOperator) {
       Token operator = andAdvance;
-      expression = new BinaryExpression(expression, operator, parseAdditiveExpression());
+      expression = new BinaryExpression(expression, operator, _parseAdditiveExpression());
     }
     return expression;
   }
@@ -5752,14 +5862,14 @@
    *
    * @return the statements that were parsed
    */
-  List<Statement> parseStatementList() {
+  List<Statement> _parseStatementList() {
     List<Statement> statements = new List<Statement>();
     Token statementStart = _currentToken;
-    while (!matches(TokenType.EOF) && !matches(TokenType.CLOSE_CURLY_BRACKET) && !isSwitchMember()) {
+    while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET) && !_isSwitchMember()) {
       statements.add(parseStatement2());
       if (identical(_currentToken, statementStart)) {
-        reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
-        advance();
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        _advance();
       }
       statementStart = _currentToken;
     }
@@ -5771,30 +5881,30 @@
    *
    * @return the string literal that was parsed
    */
-  StringInterpolation parseStringInterpolation(Token string) {
+  StringInterpolation _parseStringInterpolation(Token string) {
     List<InterpolationElement> elements = new List<InterpolationElement>();
-    bool hasMore = matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
-    elements.add(new InterpolationString(string, computeStringValue(string.lexeme, true, !hasMore)));
+    bool hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+    elements.add(new InterpolationString(string, _computeStringValue(string.lexeme, true, !hasMore)));
     while (hasMore) {
-      if (matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
         Token openToken = andAdvance;
         Expression expression = parseExpression2();
-        Token rightBracket = expect(TokenType.CLOSE_CURLY_BRACKET);
+        Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
         elements.add(new InterpolationExpression(openToken, expression, rightBracket));
       } else {
         Token openToken = andAdvance;
         Expression expression = null;
-        if (matchesKeyword(Keyword.THIS)) {
+        if (_matchesKeyword(Keyword.THIS)) {
           expression = new ThisExpression(andAdvance);
         } else {
           expression = parseSimpleIdentifier();
         }
         elements.add(new InterpolationExpression(openToken, expression, null));
       }
-      if (matches(TokenType.STRING)) {
+      if (_matches(TokenType.STRING)) {
         string = andAdvance;
-        hasMore = matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
-        elements.add(new InterpolationString(string, computeStringValue(string.lexeme, false, !hasMore)));
+        hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+        elements.add(new InterpolationString(string, _computeStringValue(string.lexeme, false, !hasMore)));
       }
     }
     return new StringInterpolation(elements);
@@ -5810,11 +5920,11 @@
    *
    * @return the super constructor invocation that was parsed
    */
-  SuperConstructorInvocation parseSuperConstructorInvocation() {
-    Token keyword = expectKeyword(Keyword.SUPER);
+  SuperConstructorInvocation _parseSuperConstructorInvocation() {
+    Token keyword = _expectKeyword(Keyword.SUPER);
     Token period = null;
     SimpleIdentifier constructorName = null;
-    if (matches(TokenType.PERIOD)) {
+    if (_matches(TokenType.PERIOD)) {
       period = andAdvance;
       constructorName = parseSimpleIdentifier();
     }
@@ -5838,56 +5948,56 @@
    *
    * @return the switch statement that was parsed
    */
-  SwitchStatement parseSwitchStatement() {
+  SwitchStatement _parseSwitchStatement() {
     bool wasInSwitch = _inSwitch;
     _inSwitch = true;
     try {
       Set<String> definedLabels = new Set<String>();
-      Token keyword = expectKeyword(Keyword.SWITCH);
-      Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+      Token keyword = _expectKeyword(Keyword.SWITCH);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression expression = parseExpression2();
-      Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
-      Token leftBracket = expect(TokenType.OPEN_CURLY_BRACKET);
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
       Token defaultKeyword = null;
       List<SwitchMember> members = new List<SwitchMember>();
-      while (!matches(TokenType.EOF) && !matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
         List<Label> labels = new List<Label>();
-        while (matchesIdentifier() && tokenMatches(peek(), TokenType.COLON)) {
+        while (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
           SimpleIdentifier identifier = parseSimpleIdentifier();
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
-            reportErrorForToken(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
+            _reportErrorForToken(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
           } else {
             definedLabels.add(label);
           }
-          Token colon = expect(TokenType.COLON);
+          Token colon = _expect(TokenType.COLON);
           labels.add(new Label(identifier, colon));
         }
-        if (matchesKeyword(Keyword.CASE)) {
+        if (_matchesKeyword(Keyword.CASE)) {
           Token caseKeyword = andAdvance;
           Expression caseExpression = parseExpression2();
-          Token colon = expect(TokenType.COLON);
-          members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon, parseStatementList()));
+          Token colon = _expect(TokenType.COLON);
+          members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon, _parseStatementList()));
           if (defaultKeyword != null) {
-            reportErrorForToken(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
+            _reportErrorForToken(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
           }
-        } else if (matchesKeyword(Keyword.DEFAULT)) {
+        } else if (_matchesKeyword(Keyword.DEFAULT)) {
           if (defaultKeyword != null) {
-            reportErrorForToken(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
+            _reportErrorForToken(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, _peek(), []);
           }
           defaultKeyword = andAdvance;
-          Token colon = expect(TokenType.COLON);
-          members.add(new SwitchDefault(labels, defaultKeyword, colon, parseStatementList()));
+          Token colon = _expect(TokenType.COLON);
+          members.add(new SwitchDefault(labels, defaultKeyword, colon, _parseStatementList()));
         } else {
           // We need to advance, otherwise we could end up in an infinite loop, but this could be a
           // lot smarter about recovering from the error.
-          reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
-          while (!matches(TokenType.EOF) && !matches(TokenType.CLOSE_CURLY_BRACKET) && !matchesKeyword(Keyword.CASE) && !matchesKeyword(Keyword.DEFAULT)) {
-            advance();
+          _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
+          while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET) && !_matchesKeyword(Keyword.CASE) && !_matchesKeyword(Keyword.DEFAULT)) {
+            _advance();
           }
         }
       }
-      Token rightBracket = expect(TokenType.CLOSE_CURLY_BRACKET);
+      Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
       return new SwitchStatement(keyword, leftParenthesis, expression, rightParenthesis, leftBracket, members, rightBracket);
     } finally {
       _inSwitch = wasInSwitch;
@@ -5904,26 +6014,26 @@
    *
    * @return the symbol literal that was parsed
    */
-  SymbolLiteral parseSymbolLiteral() {
+  SymbolLiteral _parseSymbolLiteral() {
     Token poundSign = andAdvance;
     List<Token> components = new List<Token>();
-    if (matchesIdentifier()) {
+    if (_matchesIdentifier()) {
       components.add(andAdvance);
-      while (matches(TokenType.PERIOD)) {
-        advance();
-        if (matchesIdentifier()) {
+      while (_matches(TokenType.PERIOD)) {
+        _advance();
+        if (_matchesIdentifier()) {
           components.add(andAdvance);
         } else {
-          reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
-          components.add(createSyntheticToken(TokenType.IDENTIFIER));
+          _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+          components.add(_createSyntheticToken(TokenType.IDENTIFIER));
           break;
         }
       }
     } else if (_currentToken.isOperator) {
       components.add(andAdvance);
     } else {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
-      components.add(createSyntheticToken(TokenType.IDENTIFIER));
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+      components.add(_createSyntheticToken(TokenType.IDENTIFIER));
     }
     return new SymbolLiteral(poundSign, new List.from(components));
   }
@@ -5938,11 +6048,11 @@
    *
    * @return the throw expression that was parsed
    */
-  Expression parseThrowExpression() {
-    Token keyword = expectKeyword(Keyword.THROW);
-    if (matches(TokenType.SEMICOLON) || matches(TokenType.CLOSE_PAREN)) {
-      reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
-      return new ThrowExpression(keyword, createSyntheticIdentifier());
+  Expression _parseThrowExpression() {
+    Token keyword = _expectKeyword(Keyword.THROW);
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+      _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      return new ThrowExpression(keyword, _createSyntheticIdentifier());
     }
     Expression expression = parseExpression2();
     return new ThrowExpression(keyword, expression);
@@ -5958,11 +6068,11 @@
    *
    * @return the throw expression that was parsed
    */
-  Expression parseThrowExpressionWithoutCascade() {
-    Token keyword = expectKeyword(Keyword.THROW);
-    if (matches(TokenType.SEMICOLON) || matches(TokenType.CLOSE_PAREN)) {
-      reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
-      return new ThrowExpression(keyword, createSyntheticIdentifier());
+  Expression _parseThrowExpressionWithoutCascade() {
+    Token keyword = _expectKeyword(Keyword.THROW);
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+      _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      return new ThrowExpression(keyword, _createSyntheticIdentifier());
     }
     Expression expression = parseExpressionWithoutCascade();
     return new ThrowExpression(keyword, expression);
@@ -5988,15 +6098,15 @@
    *
    * @return the try statement that was parsed
    */
-  Statement parseTryStatement() {
-    Token tryKeyword = expectKeyword(Keyword.TRY);
+  Statement _parseTryStatement() {
+    Token tryKeyword = _expectKeyword(Keyword.TRY);
     Block body = parseBlock();
     List<CatchClause> catchClauses = new List<CatchClause>();
     Block finallyClause = null;
-    while (matchesString(_ON) || matchesKeyword(Keyword.CATCH)) {
+    while (_matchesString(_ON) || _matchesKeyword(Keyword.CATCH)) {
       Token onKeyword = null;
       TypeName exceptionType = null;
-      if (matchesString(_ON)) {
+      if (_matchesString(_ON)) {
         onKeyword = andAdvance;
         exceptionType = parseTypeName();
       }
@@ -6006,26 +6116,26 @@
       Token comma = null;
       SimpleIdentifier stackTraceParameter = null;
       Token rightParenthesis = null;
-      if (matchesKeyword(Keyword.CATCH)) {
+      if (_matchesKeyword(Keyword.CATCH)) {
         catchKeyword = andAdvance;
-        leftParenthesis = expect(TokenType.OPEN_PAREN);
+        leftParenthesis = _expect(TokenType.OPEN_PAREN);
         exceptionParameter = parseSimpleIdentifier();
-        if (matches(TokenType.COMMA)) {
+        if (_matches(TokenType.COMMA)) {
           comma = andAdvance;
           stackTraceParameter = parseSimpleIdentifier();
         }
-        rightParenthesis = expect(TokenType.CLOSE_PAREN);
+        rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       }
       Block catchBody = parseBlock();
       catchClauses.add(new CatchClause(onKeyword, exceptionType, catchKeyword, leftParenthesis, exceptionParameter, comma, stackTraceParameter, rightParenthesis, catchBody));
     }
     Token finallyKeyword = null;
-    if (matchesKeyword(Keyword.FINALLY)) {
+    if (_matchesKeyword(Keyword.FINALLY)) {
       finallyKeyword = andAdvance;
       finallyClause = parseBlock();
     } else {
       if (catchClauses.isEmpty) {
-        reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
       }
     }
     return new TryStatement(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
@@ -6058,24 +6168,24 @@
    * @param commentAndMetadata the metadata to be associated with the member
    * @return the type alias that was parsed
    */
-  TypeAlias parseTypeAlias(CommentAndMetadata commentAndMetadata) {
-    Token keyword = expectKeyword(Keyword.TYPEDEF);
-    if (matchesIdentifier()) {
-      Token next = peek();
-      if (tokenMatches(next, TokenType.LT)) {
-        next = skipTypeParameterList(next);
-        if (next != null && tokenMatches(next, TokenType.EQ)) {
-          TypeAlias typeAlias = parseClassTypeAlias(commentAndMetadata, null, keyword);
-          reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
+  TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.TYPEDEF);
+    if (_matchesIdentifier()) {
+      Token next = _peek();
+      if (_tokenMatches(next, TokenType.LT)) {
+        next = _skipTypeParameterList(next);
+        if (next != null && _tokenMatches(next, TokenType.EQ)) {
+          TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, keyword);
+          _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
           return typeAlias;
         }
-      } else if (tokenMatches(next, TokenType.EQ)) {
-        TypeAlias typeAlias = parseClassTypeAlias(commentAndMetadata, null, keyword);
-        reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
+      } else if (_tokenMatches(next, TokenType.EQ)) {
+        TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, keyword);
+        _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword, []);
         return typeAlias;
       }
     }
-    return parseFunctionTypeAlias(commentAndMetadata, keyword);
+    return _parseFunctionTypeAlias(commentAndMetadata, keyword);
   }
 
   /**
@@ -6092,26 +6202,26 @@
    *
    * @return the unary expression that was parsed
    */
-  Expression parseUnaryExpression() {
-    if (matches(TokenType.MINUS) || matches(TokenType.BANG) || matches(TokenType.TILDE)) {
+  Expression _parseUnaryExpression() {
+    if (_matches(TokenType.MINUS) || _matches(TokenType.BANG) || _matches(TokenType.TILDE)) {
       Token operator = andAdvance;
-      if (matchesKeyword(Keyword.SUPER)) {
-        if (tokenMatches(peek(), TokenType.OPEN_SQUARE_BRACKET) || tokenMatches(peek(), TokenType.PERIOD)) {
+      if (_matchesKeyword(Keyword.SUPER)) {
+        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || _tokenMatches(_peek(), TokenType.PERIOD)) {
           //     "prefixOperator unaryExpression"
           // --> "prefixOperator postfixExpression"
           // --> "prefixOperator primary                    selector*"
           // --> "prefixOperator 'super' assignableSelector selector*"
-          return new PrefixExpression(operator, parseUnaryExpression());
+          return new PrefixExpression(operator, _parseUnaryExpression());
         }
         return new PrefixExpression(operator, new SuperExpression(andAdvance));
       }
-      return new PrefixExpression(operator, parseUnaryExpression());
+      return new PrefixExpression(operator, _parseUnaryExpression());
     } else if (_currentToken.type.isIncrementOperator) {
       Token operator = andAdvance;
-      if (matchesKeyword(Keyword.SUPER)) {
-        if (tokenMatches(peek(), TokenType.OPEN_SQUARE_BRACKET) || tokenMatches(peek(), TokenType.PERIOD)) {
+      if (_matchesKeyword(Keyword.SUPER)) {
+        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) || _tokenMatches(_peek(), TokenType.PERIOD)) {
           // --> "prefixOperator 'super' assignableSelector selector*"
-          return new PrefixExpression(operator, parseUnaryExpression());
+          return new PrefixExpression(operator, _parseUnaryExpression());
         }
         //
         // Even though it is not valid to use an incrementing operator ('++' or '--') before 'super',
@@ -6128,16 +6238,16 @@
           return new PrefixExpression(firstOperator, new PrefixExpression(secondOperator, new SuperExpression(andAdvance)));
         } else {
           // Invalid operator before 'super'
-          reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
           return new PrefixExpression(operator, new SuperExpression(andAdvance));
         }
       }
-      return new PrefixExpression(operator, parseAssignableExpression(false));
-    } else if (matches(TokenType.PLUS)) {
-      reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
-      return createSyntheticIdentifier();
+      return new PrefixExpression(operator, _parseAssignableExpression(false));
+    } else if (_matches(TokenType.PLUS)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+      return _createSyntheticIdentifier();
     }
-    return parsePostfixExpression();
+    return _parsePostfixExpression();
   }
 
   /**
@@ -6150,12 +6260,12 @@
    *
    * @return the variable declaration that was parsed
    */
-  VariableDeclaration parseVariableDeclaration() {
-    CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
+  VariableDeclaration _parseVariableDeclaration() {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     SimpleIdentifier name = parseSimpleIdentifier();
     Token equals = null;
     Expression initializer = null;
-    if (matches(TokenType.EQ)) {
+    if (_matches(TokenType.EQ)) {
       equals = andAdvance;
       initializer = parseExpression2();
     }
@@ -6173,9 +6283,9 @@
    * @param commentAndMetadata the metadata to be associated with the variable declaration list
    * @return the variable declaration list that was parsed
    */
-  VariableDeclarationList parseVariableDeclarationListAfterMetadata(CommentAndMetadata commentAndMetadata) {
-    FinalConstVarOrType holder = parseFinalConstVarOrType(false);
-    return parseVariableDeclarationListAfterType(commentAndMetadata, holder.keyword, holder.type);
+  VariableDeclarationList _parseVariableDeclarationListAfterMetadata(CommentAndMetadata commentAndMetadata) {
+    FinalConstVarOrType holder = _parseFinalConstVarOrType(false);
+    return _parseVariableDeclarationListAfterType(commentAndMetadata, holder.keyword, holder.type);
   }
 
   /**
@@ -6193,15 +6303,15 @@
    * @param type the type of the variables in the list
    * @return the variable declaration list that was parsed
    */
-  VariableDeclarationList parseVariableDeclarationListAfterType(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
-    if (type != null && keyword != null && tokenMatchesKeyword(keyword, Keyword.VAR)) {
-      reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword, []);
+  VariableDeclarationList _parseVariableDeclarationListAfterType(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
+    if (type != null && keyword != null && _tokenMatchesKeyword(keyword, Keyword.VAR)) {
+      _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword, []);
     }
     List<VariableDeclaration> variables = new List<VariableDeclaration>();
-    variables.add(parseVariableDeclaration());
-    while (matches(TokenType.COMMA)) {
-      advance();
-      variables.add(parseVariableDeclaration());
+    variables.add(_parseVariableDeclaration());
+    while (_matches(TokenType.COMMA)) {
+      _advance();
+      variables.add(_parseVariableDeclaration());
     }
     return new VariableDeclarationList(commentAndMetadata != null ? commentAndMetadata.comment : null, commentAndMetadata != null ? commentAndMetadata.metadata : null, keyword, type, variables);
   }
@@ -6218,16 +6328,16 @@
    *          statement, or `null` if there is no attempt at parsing the comment and metadata
    * @return the variable declaration statement that was parsed
    */
-  VariableDeclarationStatement parseVariableDeclarationStatementAfterMetadata(CommentAndMetadata commentAndMetadata) {
+  VariableDeclarationStatement _parseVariableDeclarationStatementAfterMetadata(CommentAndMetadata commentAndMetadata) {
     //    Token startToken = currentToken;
-    VariableDeclarationList variableList = parseVariableDeclarationListAfterMetadata(commentAndMetadata);
+    VariableDeclarationList variableList = _parseVariableDeclarationListAfterMetadata(commentAndMetadata);
     //    if (!matches(TokenType.SEMICOLON)) {
     //      if (matches(startToken, Keyword.VAR) && isTypedIdentifier(startToken.getNext())) {
     //        // TODO(brianwilkerson) This appears to be of the form "var type variable". We should do
     //        // a better job of recovering in this case.
     //      }
     //    }
-    Token semicolon = expect(TokenType.SEMICOLON);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new VariableDeclarationStatement(variableList, semicolon);
   }
 
@@ -6246,9 +6356,9 @@
    * @param type the type of the variables in the list
    * @return the variable declaration statement that was parsed
    */
-  VariableDeclarationStatement parseVariableDeclarationStatementAfterType(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
-    VariableDeclarationList variableList = parseVariableDeclarationListAfterType(commentAndMetadata, keyword, type);
-    Token semicolon = expect(TokenType.SEMICOLON);
+  VariableDeclarationStatement _parseVariableDeclarationStatementAfterType(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
+    VariableDeclarationList variableList = _parseVariableDeclarationListAfterType(commentAndMetadata, keyword, type);
+    Token semicolon = _expect(TokenType.SEMICOLON);
     return new VariableDeclarationStatement(variableList, semicolon);
   }
 
@@ -6262,14 +6372,14 @@
    *
    * @return the while statement that was parsed
    */
-  Statement parseWhileStatement() {
+  Statement _parseWhileStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
     try {
-      Token keyword = expectKeyword(Keyword.WHILE);
-      Token leftParenthesis = expect(TokenType.OPEN_PAREN);
+      Token keyword = _expectKeyword(Keyword.WHILE);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression condition = parseExpression2();
-      Token rightParenthesis = expect(TokenType.CLOSE_PAREN);
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       Statement body = parseStatement2();
       return new WhileStatement(keyword, leftParenthesis, condition, rightParenthesis, body);
     } finally {
@@ -6283,7 +6393,7 @@
    *
    * @return the token that is immediately after the current token
    */
-  Token peek() => _currentToken.next;
+  Token _peek() => _currentToken.next;
 
   /**
    * Return the token that is the given distance after the current token.
@@ -6292,7 +6402,7 @@
    *          `1` is the next token, etc.
    * @return the token that is the given distance after the current token
    */
-  Token peekAt(int distance) {
+  Token _peekAt(int distance) {
     Token token = _currentToken;
     for (int i = 0; i < distance; i++) {
       token = token.next;
@@ -6305,7 +6415,7 @@
    *
    * @param error the error to be reported
    */
-  void reportError(AnalysisError error) {
+  void _reportError(AnalysisError error) {
     if (_errorListenerLock != 0) {
       return;
     }
@@ -6318,8 +6428,8 @@
    * @param errorCode the error code of the error to be reported
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorForCurrentToken(ParserErrorCode errorCode, List<Object> arguments) {
-    reportErrorForToken(errorCode, _currentToken, arguments);
+  void _reportErrorForCurrentToken(ParserErrorCode errorCode, List<Object> arguments) {
+    _reportErrorForToken(errorCode, _currentToken, arguments);
   }
 
   /**
@@ -6329,8 +6439,8 @@
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorForNode(ParserErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportError(new AnalysisError.con2(_source, node.offset, node.length, errorCode, arguments));
+  void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _reportError(new AnalysisError.con2(_source, node.offset, node.length, errorCode, arguments));
   }
 
   /**
@@ -6340,14 +6450,14 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportErrorForToken(ParserErrorCode errorCode, Token token, List<Object> arguments) {
-    reportError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
+  void _reportErrorForToken(ParserErrorCode errorCode, Token token, List<Object> arguments) {
+    _reportError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
 
   /**
    * Skips a block with all containing blocks.
    */
-  void skipBlock() {
+  void _skipBlock() {
     _currentToken = (_currentToken as BeginToken).endToken.next;
   }
 
@@ -6368,24 +6478,24 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the type that was parsed
    */
-  Token skipFinalConstVarOrType(Token startToken) {
-    if (tokenMatchesKeyword(startToken, Keyword.FINAL) || tokenMatchesKeyword(startToken, Keyword.CONST)) {
+  Token _skipFinalConstVarOrType(Token startToken) {
+    if (_tokenMatchesKeyword(startToken, Keyword.FINAL) || _tokenMatchesKeyword(startToken, Keyword.CONST)) {
       Token next = startToken.next;
-      if (tokenMatchesIdentifier(next)) {
+      if (_tokenMatchesIdentifier(next)) {
         Token next2 = next.next;
         // "Type parameter" or "Type<" or "prefix.Type"
-        if (tokenMatchesIdentifier(next2) || tokenMatches(next2, TokenType.LT) || tokenMatches(next2, TokenType.PERIOD)) {
-          return skipTypeName(next);
+        if (_tokenMatchesIdentifier(next2) || _tokenMatches(next2, TokenType.LT) || _tokenMatches(next2, TokenType.PERIOD)) {
+          return _skipTypeName(next);
         }
         // "parameter"
         return next;
       }
-    } else if (tokenMatchesKeyword(startToken, Keyword.VAR)) {
+    } else if (_tokenMatchesKeyword(startToken, Keyword.VAR)) {
       return startToken.next;
-    } else if (tokenMatchesIdentifier(startToken)) {
+    } else if (_tokenMatchesIdentifier(startToken)) {
       Token next = startToken.next;
-      if (tokenMatchesIdentifier(next) || tokenMatches(next, TokenType.LT) || tokenMatchesKeyword(next, Keyword.THIS) || (tokenMatches(next, TokenType.PERIOD) && tokenMatchesIdentifier(next.next) && (tokenMatchesIdentifier(next.next.next) || tokenMatches(next.next.next, TokenType.LT) || tokenMatchesKeyword(next.next.next, Keyword.THIS)))) {
-        return skipReturnType(startToken);
+      if (_tokenMatchesIdentifier(next) || _tokenMatches(next, TokenType.LT) || _tokenMatchesKeyword(next, Keyword.THIS) || (_tokenMatches(next, TokenType.PERIOD) && _tokenMatchesIdentifier(next.next) && (_tokenMatchesIdentifier(next.next.next) || _tokenMatches(next.next.next, TokenType.LT) || _tokenMatchesKeyword(next.next.next, Keyword.THIS)))) {
+        return _skipReturnType(startToken);
       }
     }
     return null;
@@ -6428,45 +6538,45 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the formal parameter list that was parsed
    */
-  Token skipFormalParameterList(Token startToken) {
-    if (!tokenMatches(startToken, TokenType.OPEN_PAREN)) {
+  Token _skipFormalParameterList(Token startToken) {
+    if (!_tokenMatches(startToken, TokenType.OPEN_PAREN)) {
       return null;
     }
     Token next = startToken.next;
-    if (tokenMatches(next, TokenType.CLOSE_PAREN)) {
+    if (_tokenMatches(next, TokenType.CLOSE_PAREN)) {
       return next.next;
     }
     //
     // Look to see whether the token after the open parenthesis is something that should only occur
     // at the beginning of a parameter list.
     //
-    if (matchesAny(next, [
+    if (next.matchesAny([
         TokenType.AT,
         TokenType.OPEN_SQUARE_BRACKET,
-        TokenType.OPEN_CURLY_BRACKET]) || tokenMatchesKeyword(next, Keyword.VOID) || (tokenMatchesIdentifier(next) && (matchesAny(next.next, [TokenType.COMMA, TokenType.CLOSE_PAREN])))) {
-      return skipPastMatchingToken(startToken);
+        TokenType.OPEN_CURLY_BRACKET]) || _tokenMatchesKeyword(next, Keyword.VOID) || (_tokenMatchesIdentifier(next) && (next.next.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN])))) {
+      return _skipPastMatchingToken(startToken);
     }
     //
     // Look to see whether the first parameter is a function typed parameter without a return type.
     //
-    if (tokenMatchesIdentifier(next) && tokenMatches(next.next, TokenType.OPEN_PAREN)) {
-      Token afterParameters = skipFormalParameterList(next.next);
-      if (afterParameters != null && (matchesAny(afterParameters, [TokenType.COMMA, TokenType.CLOSE_PAREN]))) {
-        return skipPastMatchingToken(startToken);
+    if (_tokenMatchesIdentifier(next) && _tokenMatches(next.next, TokenType.OPEN_PAREN)) {
+      Token afterParameters = _skipFormalParameterList(next.next);
+      if (afterParameters != null && (afterParameters.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN]))) {
+        return _skipPastMatchingToken(startToken);
       }
     }
     //
     // Look to see whether the first parameter has a type or is a function typed parameter with a
     // return type.
     //
-    Token afterType = skipFinalConstVarOrType(next);
+    Token afterType = _skipFinalConstVarOrType(next);
     if (afterType == null) {
       return null;
     }
-    if (skipSimpleIdentifier(afterType) == null) {
+    if (_skipSimpleIdentifier(afterType) == null) {
       return null;
     }
-    return skipPastMatchingToken(startToken);
+    return _skipPastMatchingToken(startToken);
   }
 
   /**
@@ -6476,7 +6586,7 @@
    * @param startToken the token that is assumed to be a being token
    * @return the token following the matching end token
    */
-  Token skipPastMatchingToken(Token startToken) {
+  Token _skipPastMatchingToken(Token startToken) {
     if (startToken is! BeginToken) {
       return null;
     }
@@ -6503,14 +6613,14 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the prefixed identifier that was parsed
    */
-  Token skipPrefixedIdentifier(Token startToken) {
-    Token token = skipSimpleIdentifier(startToken);
+  Token _skipPrefixedIdentifier(Token startToken) {
+    Token token = _skipSimpleIdentifier(startToken);
     if (token == null) {
       return null;
-    } else if (!tokenMatches(token, TokenType.PERIOD)) {
+    } else if (!_tokenMatches(token, TokenType.PERIOD)) {
       return token;
     }
-    return skipSimpleIdentifier(token.next);
+    return _skipSimpleIdentifier(token.next);
   }
 
   /**
@@ -6529,11 +6639,11 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the return type that was parsed
    */
-  Token skipReturnType(Token startToken) {
-    if (tokenMatchesKeyword(startToken, Keyword.VOID)) {
+  Token _skipReturnType(Token startToken) {
+    if (_tokenMatchesKeyword(startToken, Keyword.VOID)) {
       return startToken.next;
     } else {
-      return skipTypeName(startToken);
+      return _skipTypeName(startToken);
     }
   }
 
@@ -6553,8 +6663,8 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the simple identifier that was parsed
    */
-  Token skipSimpleIdentifier(Token startToken) {
-    if (tokenMatches(startToken, TokenType.IDENTIFIER) || (tokenMatches(startToken, TokenType.KEYWORD) && (startToken as KeywordToken).keyword.isPseudoKeyword)) {
+  Token _skipSimpleIdentifier(Token startToken) {
+    if (_tokenMatches(startToken, TokenType.IDENTIFIER) || (_tokenMatches(startToken, TokenType.KEYWORD) && (startToken as KeywordToken).keyword.isPseudoKeyword)) {
       return startToken.next;
     }
     return null;
@@ -6571,7 +6681,7 @@
    * @param startToken the token at which parsing is to begin
    * @return the string literal that was parsed
    */
-  Token skipStringInterpolation(Token startToken) {
+  Token _skipStringInterpolation(Token startToken) {
     Token token = startToken;
     TokenType type = token.type;
     while (identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION) || identical(type, TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
@@ -6592,7 +6702,7 @@
           } else if (identical(type, TokenType.CLOSE_CURLY_BRACKET)) {
             bracketNestingLevel--;
           } else if (identical(type, TokenType.STRING)) {
-            token = skipStringLiteral(token);
+            token = _skipStringLiteral(token);
             if (token == null) {
               return null;
             }
@@ -6635,13 +6745,13 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the string literal that was parsed
    */
-  Token skipStringLiteral(Token startToken) {
+  Token _skipStringLiteral(Token startToken) {
     Token token = startToken;
-    while (token != null && tokenMatches(token, TokenType.STRING)) {
+    while (token != null && _tokenMatches(token, TokenType.STRING)) {
       token = token.next;
       TokenType type = token.type;
       if (identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION) || identical(type, TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-        token = skipStringInterpolation(token);
+        token = _skipStringInterpolation(token);
       }
     }
     if (identical(token, startToken)) {
@@ -6668,17 +6778,17 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the type argument list that was parsed
    */
-  Token skipTypeArgumentList(Token startToken) {
+  Token _skipTypeArgumentList(Token startToken) {
     Token token = startToken;
-    if (!tokenMatches(token, TokenType.LT)) {
+    if (!_tokenMatches(token, TokenType.LT)) {
       return null;
     }
-    token = skipTypeName(token.next);
+    token = _skipTypeName(token.next);
     if (token == null) {
       return null;
     }
-    while (tokenMatches(token, TokenType.COMMA)) {
-      token = skipTypeName(token.next);
+    while (_tokenMatches(token, TokenType.COMMA)) {
+      token = _skipTypeName(token.next);
       if (token == null) {
         return null;
       }
@@ -6708,13 +6818,13 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the type name that was parsed
    */
-  Token skipTypeName(Token startToken) {
-    Token token = skipPrefixedIdentifier(startToken);
+  Token _skipTypeName(Token startToken) {
+    Token token = _skipPrefixedIdentifier(startToken);
     if (token == null) {
       return null;
     }
-    if (tokenMatches(token, TokenType.LT)) {
-      token = skipTypeArgumentList(token);
+    if (_tokenMatches(token, TokenType.LT)) {
+      token = _skipTypeArgumentList(token);
     }
     return token;
   }
@@ -6735,8 +6845,8 @@
    * @param startToken the token at which parsing is to begin
    * @return the token following the type parameter list that was parsed
    */
-  Token skipTypeParameterList(Token startToken) {
-    if (!tokenMatches(startToken, TokenType.LT)) {
+  Token _skipTypeParameterList(Token startToken) {
+    if (!_tokenMatches(startToken, TokenType.LT)) {
       return null;
     }
     //
@@ -6746,22 +6856,22 @@
     int depth = 1;
     Token next = startToken.next;
     while (depth > 0) {
-      if (tokenMatches(next, TokenType.EOF)) {
+      if (_tokenMatches(next, TokenType.EOF)) {
         return null;
-      } else if (tokenMatches(next, TokenType.LT)) {
+      } else if (_tokenMatches(next, TokenType.LT)) {
         depth++;
-      } else if (tokenMatches(next, TokenType.GT)) {
+      } else if (_tokenMatches(next, TokenType.GT)) {
         depth--;
-      } else if (tokenMatches(next, TokenType.GT_EQ)) {
+      } else if (_tokenMatches(next, TokenType.GT_EQ)) {
         if (depth == 1) {
           Token fakeEquals = new Token(TokenType.EQ, next.offset + 2);
           fakeEquals.setNextWithoutSettingPrevious(next.next);
           return fakeEquals;
         }
         depth--;
-      } else if (tokenMatches(next, TokenType.GT_GT)) {
+      } else if (_tokenMatches(next, TokenType.GT_GT)) {
         depth -= 2;
-      } else if (tokenMatches(next, TokenType.GT_GT_EQ)) {
+      } else if (_tokenMatches(next, TokenType.GT_GT_EQ)) {
         if (depth < 2) {
           return null;
         } else if (depth == 2) {
@@ -6783,7 +6893,7 @@
    * @param type the type of token that is being tested for
    * @return `true` if the given token has the given type
    */
-  bool tokenMatches(Token token, TokenType type) => identical(token.type, type);
+  bool _tokenMatches(Token token, TokenType type) => identical(token.type, type);
 
   /**
    * Return `true` if the given token is a valid identifier. Valid identifiers include
@@ -6791,7 +6901,7 @@
    *
    * @return `true` if the given token is a valid identifier
    */
-  bool tokenMatchesIdentifier(Token token) => tokenMatches(token, TokenType.IDENTIFIER) || (tokenMatches(token, TokenType.KEYWORD) && (token as KeywordToken).keyword.isPseudoKeyword);
+  bool _tokenMatchesIdentifier(Token token) => _tokenMatches(token, TokenType.IDENTIFIER) || (_tokenMatches(token, TokenType.KEYWORD) && (token as KeywordToken).keyword.isPseudoKeyword);
 
   /**
    * Return `true` if the given token matches the given keyword.
@@ -6800,7 +6910,7 @@
    * @param keyword the keyword that is being tested for
    * @return `true` if the given token matches the given keyword
    */
-  bool tokenMatchesKeyword(Token token, Keyword keyword) => identical(token.type, TokenType.KEYWORD) && identical((token as KeywordToken).keyword, keyword);
+  bool _tokenMatchesKeyword(Token token, Keyword keyword) => identical(token.type, TokenType.KEYWORD) && identical((token as KeywordToken).keyword, keyword);
 
   /**
    * Translate the characters at the given index in the given string, appending the translated
@@ -6811,7 +6921,7 @@
    * @param index the index of the character to be translated
    * @return the index of the next character to be translated
    */
-  int translateCharacter(JavaStringBuilder builder, String lexeme, int index) {
+  int _translateCharacter(JavaStringBuilder builder, String lexeme, int index) {
     int currentChar = lexeme.codeUnitAt(index);
     if (currentChar != 0x5C) {
       builder.appendChar(currentChar);
@@ -6847,14 +6957,14 @@
     } else if (currentChar == 0x78) {
       if (currentIndex + 2 >= length) {
         // Illegal escape sequence: not enough hex digits
-        reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []);
         return length;
       }
       int firstDigit = lexeme.codeUnitAt(currentIndex + 1);
       int secondDigit = lexeme.codeUnitAt(currentIndex + 2);
-      if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit)) {
+      if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) {
         // Illegal escape sequence: invalid hex digit
-        reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []);
       } else {
         builder.appendChar(((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)));
       }
@@ -6863,7 +6973,7 @@
       currentIndex++;
       if (currentIndex >= length) {
         // Illegal escape sequence: not enough hex digits
-        reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         return length;
       }
       currentChar = lexeme.codeUnitAt(currentIndex);
@@ -6871,16 +6981,16 @@
         currentIndex++;
         if (currentIndex >= length) {
           // Illegal escape sequence: incomplete escape
-          reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         currentChar = lexeme.codeUnitAt(currentIndex);
         int digitCount = 0;
         int value = 0;
         while (currentChar != 0x7D) {
-          if (!isHexDigit(currentChar)) {
+          if (!_isHexDigit(currentChar)) {
             // Illegal escape sequence: invalid hex digit
-            reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             currentIndex++;
             while (currentIndex < length && lexeme.codeUnitAt(currentIndex) != 0x7D) {
               currentIndex++;
@@ -6892,32 +7002,32 @@
           currentIndex++;
           if (currentIndex >= length) {
             // Illegal escape sequence: incomplete escape
-            reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             return length;
           }
           currentChar = lexeme.codeUnitAt(currentIndex);
         }
         if (digitCount < 1 || digitCount > 6) {
           // Illegal escape sequence: not enough or too many hex digits
-          reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         }
-        appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
+        _appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
         return currentIndex + 1;
       } else {
         if (currentIndex + 3 >= length) {
           // Illegal escape sequence: not enough hex digits
-          reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         int firstDigit = currentChar;
         int secondDigit = lexeme.codeUnitAt(currentIndex + 1);
         int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
         int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
-        if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit) || !isHexDigit(thirdDigit) || !isHexDigit(fourthDigit)) {
+        if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit) || !_isHexDigit(thirdDigit) || !_isHexDigit(fourthDigit)) {
           // Illegal escape sequence: invalid hex digits
-          reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         } else {
-          appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), (((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16), index, currentIndex + 3);
+          _appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), (((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16), index, currentIndex + 3);
         }
         return currentIndex + 4;
       }
@@ -6931,7 +7041,7 @@
    * Decrements the error reporting lock level. If level is more than `0`, then
    * [reportError] wont report any error.
    */
-  void unlockErrorListener() {
+  void _unlockErrorListener() {
     if (_errorListenerLock == 0) {
       throw new IllegalStateException("Attempt to unlock not locked error listener.");
     }
@@ -6943,10 +7053,10 @@
    *
    * @param parameterList the parameter list to be validated
    */
-  void validateFormalParameterList(FormalParameterList parameterList) {
+  void _validateFormalParameterList(FormalParameterList parameterList) {
     for (FormalParameter parameter in parameterList.parameters) {
       if (parameter is FieldFormalParameter) {
-        reportErrorForNode(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, parameter.identifier, []);
+        _reportErrorForNode(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, parameter.identifier, []);
       }
     }
   }
@@ -6957,19 +7067,19 @@
    *
    * @param modifiers the modifiers being validated
    */
-  Token validateModifiersForClass(Modifiers modifiers) {
-    validateModifiersForTopLevelDeclaration(modifiers);
+  Token _validateModifiersForClass(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.constKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
     }
     return modifiers.abstractKeyword;
   }
@@ -6981,27 +7091,27 @@
    * @param modifiers the modifiers being validated
    * @return the 'const' or 'final' keyword associated with the constructor
    */
-  Token validateModifiersForConstructor(Modifiers modifiers) {
+  Token _validateModifiersForConstructor(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportErrorForToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abstractKeyword, []);
+      _reportErrorForToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abstractKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportErrorForToken(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
+      _reportErrorForToken(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token constKeyword = modifiers.constKeyword;
     Token factoryKeyword = modifiers.factoryKeyword;
     if (externalKeyword != null && constKeyword != null && constKeyword.offset < externalKeyword.offset) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
     }
     if (externalKeyword != null && factoryKeyword != null && factoryKeyword.offset < externalKeyword.offset) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
     }
     return constKeyword;
   }
@@ -7013,15 +7123,15 @@
    * @param modifiers the modifiers being validated
    * @return the 'final', 'const' or 'var' keyword associated with the field
    */
-  Token validateModifiersForField(Modifiers modifiers) {
+  Token _validateModifiersForField(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     Token staticKeyword = modifiers.staticKeyword;
     Token constKeyword = modifiers.constKeyword;
@@ -7029,25 +7139,25 @@
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) {
-        reportErrorForToken(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
+        _reportErrorForToken(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) {
-        reportErrorForToken(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
+        _reportErrorForToken(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
       }
     } else if (varKeyword != null && staticKeyword != null && varKeyword.offset < staticKeyword.offset) {
-      reportErrorForToken(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
+      _reportErrorForToken(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
     }
-    return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
+    return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
 
   /**
@@ -7055,9 +7165,9 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
+  void _validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null || modifiers.constKeyword != null || modifiers.externalKeyword != null || modifiers.factoryKeyword != null || modifiers.finalKeyword != null || modifiers.staticKeyword != null || modifiers.varKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
+      _reportErrorForCurrentToken(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
     }
   }
 
@@ -7066,26 +7176,26 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
+  void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token staticKeyword = modifiers.staticKeyword;
     if (externalKeyword != null && staticKeyword != null && staticKeyword.offset < externalKeyword.offset) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
     }
   }
 
@@ -7094,24 +7204,24 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForOperator(Modifiers modifiers) {
+  void _validateModifiersForOperator(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportErrorForToken(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
+      _reportErrorForToken(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -7120,12 +7230,12 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
+  void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
     if (modifiers.factoryKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
+      _reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
     }
   }
 
@@ -7134,19 +7244,19 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForTopLevelFunction(Modifiers modifiers) {
-    validateModifiersForTopLevelDeclaration(modifiers);
+  void _validateModifiersForTopLevelFunction(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
     }
     if (modifiers.constKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -7157,30 +7267,30 @@
    * @param modifiers the modifiers being validated
    * @return the 'final', 'const' or 'var' keyword associated with the field
    */
-  Token validateModifiersForTopLevelVariable(Modifiers modifiers) {
-    validateModifiersForTopLevelDeclaration(modifiers);
+  Token _validateModifiersForTopLevelVariable(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     Token constKeyword = modifiers.constKeyword;
     Token finalKeyword = modifiers.finalKeyword;
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
     }
-    return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
+    return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
 
   /**
@@ -7189,22 +7299,22 @@
    *
    * @param modifiers the modifiers being validated
    */
-  void validateModifiersForTypedef(Modifiers modifiers) {
-    validateModifiersForTopLevelDeclaration(modifiers);
+  void _validateModifiersForTypedef(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportErrorForToken(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
+      _reportErrorForToken(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
     }
     if (modifiers.constKeyword != null) {
-      reportErrorForToken(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
+      _reportErrorForToken(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportErrorForToken(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
+      _reportErrorForToken(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
+      _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
     }
   }
 }
@@ -7221,8 +7331,10 @@
    */
   Parser_SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset);
 
+  @override
   Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
 
+  @override
   int get length => 0;
 }
 
@@ -7678,12 +7790,16 @@
    */
   ParserErrorCode.con3(String name, int ordinal, String message) : this.con1(name, ordinal, ErrorSeverity.ERROR, message);
 
+  @override
   String get correction => correction8;
 
+  @override
   ErrorSeverity get errorSeverity => _severity;
 
+  @override
   String get message => _message;
 
+  @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
 
@@ -7701,7 +7817,7 @@
    */
   static void copyResolutionData(AstNode fromNode, AstNode toNode) {
     ResolutionCopier copier = new ResolutionCopier();
-    copier.isEqualNodes(fromNode, toNode);
+    copier._isEqualNodes(fromNode, toNode);
   }
 
   /**
@@ -7710,23 +7826,26 @@
    */
   AstNode _toNode;
 
+  @override
   bool visitAdjacentStrings(AdjacentStrings node) {
     AdjacentStrings toNode = this._toNode as AdjacentStrings;
-    return isEqualNodeLists(node.strings, toNode.strings);
+    return _isEqualNodeLists(node.strings, toNode.strings);
   }
 
+  @override
   bool visitAnnotation(Annotation node) {
     Annotation toNode = this._toNode as Annotation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.atSign, toNode.atSign), isEqualNodes(node.name, toNode.name)), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.constructorName, toNode.constructorName)), isEqualNodes(node.arguments, toNode.arguments))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.atSign, toNode.atSign), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.arguments, toNode.arguments))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
     ArgumentDefinitionTest toNode = this._toNode as ArgumentDefinitionTest;
-    if (javaBooleanAnd(isEqualTokens(node.question, toNode.question), isEqualNodes(node.identifier, toNode.identifier))) {
+    if (javaBooleanAnd(_isEqualTokens(node.question, toNode.question), _isEqualNodes(node.identifier, toNode.identifier))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7734,14 +7853,16 @@
     return false;
   }
 
+  @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList toNode = this._toNode as ArgumentList;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), isEqualNodeLists(node.arguments, toNode.arguments)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
   }
 
+  @override
   bool visitAsExpression(AsExpression node) {
     AsExpression toNode = this._toNode as AsExpression;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.expression, toNode.expression), isEqualTokens(node.asOperator, toNode.asOperator)), isEqualNodes(node.type, toNode.type))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.asOperator, toNode.asOperator)), _isEqualNodes(node.type, toNode.type))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7749,14 +7870,16 @@
     return false;
   }
 
+  @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement toNode = this._toNode as AssertStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.condition, toNode.condition)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression toNode = this._toNode as AssignmentExpression;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.leftHandSide, toNode.leftHandSide), isEqualTokens(node.operator, toNode.operator)), isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.leftHandSide, toNode.leftHandSide), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -7766,9 +7889,10 @@
     return false;
   }
 
+  @override
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression toNode = this._toNode as BinaryExpression;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.leftOperand, toNode.leftOperand), isEqualTokens(node.operator, toNode.operator)), isEqualNodes(node.rightOperand, toNode.rightOperand))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.leftOperand, toNode.leftOperand), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -7778,19 +7902,22 @@
     return false;
   }
 
+  @override
   bool visitBlock(Block node) {
     Block toNode = this._toNode as Block;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftBracket, toNode.leftBracket), isEqualNodeLists(node.statements, toNode.statements)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.statements, toNode.statements)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitBlockFunctionBody(BlockFunctionBody node) {
     BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
-    return isEqualNodes(node.block, toNode.block);
+    return _isEqualNodes(node.block, toNode.block);
   }
 
+  @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral toNode = this._toNode as BooleanLiteral;
-    if (javaBooleanAnd(isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7798,14 +7925,16 @@
     return false;
   }
 
+  @override
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement toNode = this._toNode as BreakStatement;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.label, toNode.label)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.label, toNode.label)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression toNode = this._toNode as CascadeExpression;
-    if (javaBooleanAnd(isEqualNodes(node.target, toNode.target), isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
+    if (javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7813,43 +7942,50 @@
     return false;
   }
 
+  @override
   bool visitCatchClause(CatchClause node) {
     CatchClause toNode = this._toNode as CatchClause;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.onKeyword, toNode.onKeyword), isEqualNodes(node.exceptionType, toNode.exceptionType)), isEqualTokens(node.catchKeyword, toNode.catchKeyword)), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.exceptionParameter, toNode.exceptionParameter)), isEqualTokens(node.comma, toNode.comma)), isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualNodes(node.body, toNode.body));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.onKeyword, toNode.onKeyword), _isEqualNodes(node.exceptionType, toNode.exceptionType)), _isEqualTokens(node.catchKeyword, toNode.catchKeyword)), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter)), _isEqualTokens(node.comma, toNode.comma)), _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
   }
 
+  @override
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration toNode = this._toNode as ClassDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), isEqualTokens(node.classKeyword, toNode.classKeyword)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.typeParameters, toNode.typeParameters)), isEqualNodes(node.extendsClause, toNode.extendsClause)), isEqualNodes(node.withClause, toNode.withClause)), isEqualNodes(node.implementsClause, toNode.implementsClause)), isEqualTokens(node.leftBracket, toNode.leftBracket)), isEqualNodeLists(node.members, toNode.members)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), _isEqualTokens(node.classKeyword, toNode.classKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualNodes(node.extendsClause, toNode.extendsClause)), _isEqualNodes(node.withClause, toNode.withClause)), _isEqualNodes(node.implementsClause, toNode.implementsClause)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.members, toNode.members)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.typeParameters, toNode.typeParameters)), isEqualTokens(node.equals, toNode.equals)), isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), isEqualNodes(node.superclass, toNode.superclass)), isEqualNodes(node.withClause, toNode.withClause)), isEqualNodes(node.implementsClause, toNode.implementsClause)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualTokens(node.equals, toNode.equals)), _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), _isEqualNodes(node.superclass, toNode.superclass)), _isEqualNodes(node.withClause, toNode.withClause)), _isEqualNodes(node.implementsClause, toNode.implementsClause)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitComment(Comment node) {
     Comment toNode = this._toNode as Comment;
-    return isEqualNodeLists(node.references, toNode.references);
+    return _isEqualNodeLists(node.references, toNode.references);
   }
 
+  @override
   bool visitCommentReference(CommentReference node) {
     CommentReference toNode = this._toNode as CommentReference;
-    return javaBooleanAnd(isEqualTokens(node.newKeyword, toNode.newKeyword), isEqualNodes(node.identifier, toNode.identifier));
+    return javaBooleanAnd(_isEqualTokens(node.newKeyword, toNode.newKeyword), _isEqualNodes(node.identifier, toNode.identifier));
   }
 
+  @override
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit toNode = this._toNode as CompilationUnit;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.beginToken, toNode.beginToken), isEqualNodes(node.scriptTag, toNode.scriptTag)), isEqualNodeLists(node.directives, toNode.directives)), isEqualNodeLists(node.declarations, toNode.declarations)), isEqualTokens(node.endToken, toNode.endToken))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.beginToken, toNode.beginToken), _isEqualNodes(node.scriptTag, toNode.scriptTag)), _isEqualNodeLists(node.directives, toNode.directives)), _isEqualNodeLists(node.declarations, toNode.declarations)), _isEqualTokens(node.endToken, toNode.endToken))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression toNode = this._toNode as ConditionalExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.condition, toNode.condition), isEqualTokens(node.question, toNode.question)), isEqualNodes(node.thenExpression, toNode.thenExpression)), isEqualTokens(node.colon, toNode.colon)), isEqualNodes(node.elseExpression, toNode.elseExpression))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.condition, toNode.condition), _isEqualTokens(node.question, toNode.question)), _isEqualNodes(node.thenExpression, toNode.thenExpression)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7857,52 +7993,60 @@
     return false;
   }
 
+  @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.externalKeyword, toNode.externalKeyword)), isEqualTokens(node.constKeyword, toNode.constKeyword)), isEqualTokens(node.factoryKeyword, toNode.factoryKeyword)), isEqualNodes(node.returnType, toNode.returnType)), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.parameters, toNode.parameters)), isEqualTokens(node.separator, toNode.separator)), isEqualNodeLists(node.initializers, toNode.initializers)), isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor)), isEqualNodes(node.body, toNode.body))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualTokens(node.constKeyword, toNode.constKeyword)), _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodeLists(node.initializers, toNode.initializers)), _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor)), _isEqualNodes(node.body, toNode.body))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer toNode = this._toNode as ConstructorFieldInitializer;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.fieldName, toNode.fieldName)), isEqualTokens(node.equals, toNode.equals)), isEqualNodes(node.expression, toNode.expression));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.fieldName, toNode.fieldName)), _isEqualTokens(node.equals, toNode.equals)), _isEqualNodes(node.expression, toNode.expression));
   }
 
+  @override
   bool visitConstructorName(ConstructorName node) {
     ConstructorName toNode = this._toNode as ConstructorName;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.type, toNode.type), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.name, toNode.name))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.type, toNode.type), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.name, toNode.name))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement toNode = this._toNode as ContinueStatement;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.label, toNode.label)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.label, toNode.label)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.type, toNode.type)), isEqualNodes(node.identifier, toNode.identifier));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodes(node.identifier, toNode.identifier));
   }
 
+  @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.parameter, toNode.parameter), identical(node.kind, toNode.kind)), isEqualTokens(node.separator, toNode.separator)), isEqualNodes(node.defaultValue, toNode.defaultValue));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.parameter, toNode.parameter), identical(node.kind, toNode.kind)), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.defaultValue, toNode.defaultValue));
   }
 
+  @override
   bool visitDoStatement(DoStatement node) {
     DoStatement toNode = this._toNode as DoStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.doKeyword, toNode.doKeyword), isEqualNodes(node.body, toNode.body)), isEqualTokens(node.whileKeyword, toNode.whileKeyword)), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.condition, toNode.condition)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.doKeyword, toNode.doKeyword), _isEqualNodes(node.body, toNode.body)), _isEqualTokens(node.whileKeyword, toNode.whileKeyword)), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral toNode = this._toNode as DoubleLiteral;
-    if (javaBooleanAnd(isEqualTokens(node.literal, toNode.literal), node.value == toNode.value)) {
+    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -7910,78 +8054,92 @@
     return false;
   }
 
+  @override
   bool visitEmptyFunctionBody(EmptyFunctionBody node) {
     EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
-    return isEqualTokens(node.semicolon, toNode.semicolon);
+    return _isEqualTokens(node.semicolon, toNode.semicolon);
   }
 
+  @override
   bool visitEmptyStatement(EmptyStatement node) {
     EmptyStatement toNode = this._toNode as EmptyStatement;
-    return isEqualTokens(node.semicolon, toNode.semicolon);
+    return _isEqualTokens(node.semicolon, toNode.semicolon);
   }
 
+  @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective toNode = this._toNode as ExportDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.uri, toNode.uri)), isEqualNodeLists(node.combinators, toNode.combinators)), isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.uri, toNode.uri)), _isEqualNodeLists(node.combinators, toNode.combinators)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.functionDefinition, toNode.functionDefinition), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.functionDefinition, toNode.functionDefinition), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement toNode = this._toNode as ExpressionStatement;
-    return javaBooleanAnd(isEqualNodes(node.expression, toNode.expression), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause toNode = this._toNode as ExtendsClause;
-    return javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.superclass, toNode.superclass));
+    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.superclass, toNode.superclass));
   }
 
+  @override
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration toNode = this._toNode as FieldDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.staticKeyword, toNode.staticKeyword)), isEqualNodes(node.fields, toNode.fields)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.staticKeyword, toNode.staticKeyword)), _isEqualNodes(node.fields, toNode.fields)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.type, toNode.type)), isEqualTokens(node.thisToken, toNode.thisToken)), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.identifier, toNode.identifier));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualTokens(node.thisToken, toNode.thisToken)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.identifier, toNode.identifier));
   }
 
+  @override
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement toNode = this._toNode as ForEachStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.forKeyword, toNode.forKeyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.loopVariable, toNode.loopVariable)), isEqualTokens(node.inKeyword, toNode.inKeyword)), isEqualNodes(node.iterator, toNode.iterator)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualNodes(node.body, toNode.body));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.forKeyword, toNode.forKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.loopVariable, toNode.loopVariable)), _isEqualTokens(node.inKeyword, toNode.inKeyword)), _isEqualNodes(node.iterator, toNode.iterator)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
   }
 
+  @override
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList toNode = this._toNode as FormalParameterList;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), isEqualNodeLists(node.parameters, toNode.parameters)), isEqualTokens(node.leftDelimiter, toNode.leftDelimiter)), isEqualTokens(node.rightDelimiter, toNode.rightDelimiter)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.parameters, toNode.parameters)), _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter)), _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
   }
 
+  @override
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.forKeyword, toNode.forKeyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.variables, toNode.variables)), isEqualNodes(node.initialization, toNode.initialization)), isEqualTokens(node.leftSeparator, toNode.leftSeparator)), isEqualNodes(node.condition, toNode.condition)), isEqualTokens(node.rightSeparator, toNode.rightSeparator)), isEqualNodeLists(node.updaters, toNode.updaters)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualNodes(node.body, toNode.body));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.forKeyword, toNode.forKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.variables, toNode.variables)), _isEqualNodes(node.initialization, toNode.initialization)), _isEqualTokens(node.leftSeparator, toNode.leftSeparator)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightSeparator, toNode.rightSeparator)), _isEqualNodeLists(node.updaters, toNode.updaters)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
   }
 
+  @override
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.externalKeyword, toNode.externalKeyword)), isEqualNodes(node.returnType, toNode.returnType)), isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.functionExpression, toNode.functionExpression));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.functionExpression, toNode.functionExpression));
   }
 
+  @override
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     FunctionDeclarationStatement toNode = this._toNode as FunctionDeclarationStatement;
-    return isEqualNodes(node.functionDeclaration, toNode.functionDeclaration);
+    return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration);
   }
 
+  @override
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression toNode = this._toNode as FunctionExpression;
-    if (javaBooleanAnd(isEqualNodes(node.parameters, toNode.parameters), isEqualNodes(node.body, toNode.body))) {
+    if (javaBooleanAnd(_isEqualNodes(node.parameters, toNode.parameters), _isEqualNodes(node.body, toNode.body))) {
       toNode.element = node.element;
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
@@ -7990,9 +8148,10 @@
     return false;
   }
 
+  @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation toNode = this._toNode as FunctionExpressionInvocation;
-    if (javaBooleanAnd(isEqualNodes(node.function, toNode.function), isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (javaBooleanAnd(_isEqualNodes(node.function, toNode.function), _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8002,43 +8161,50 @@
     return false;
   }
 
+  @override
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.returnType, toNode.returnType)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.typeParameters, toNode.typeParameters)), isEqualNodes(node.parameters, toNode.parameters)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter toNode = this._toNode as FunctionTypedFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualNodes(node.returnType, toNode.returnType)), isEqualNodes(node.identifier, toNode.identifier)), isEqualNodes(node.parameters, toNode.parameters));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualNodes(node.identifier, toNode.identifier)), _isEqualNodes(node.parameters, toNode.parameters));
   }
 
+  @override
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator toNode = this._toNode as HideCombinator;
-    return javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
+    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
   }
 
+  @override
   bool visitIfStatement(IfStatement node) {
     IfStatement toNode = this._toNode as IfStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.ifKeyword, toNode.ifKeyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.condition, toNode.condition)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualNodes(node.thenStatement, toNode.thenStatement)), isEqualTokens(node.elseKeyword, toNode.elseKeyword)), isEqualNodes(node.elseStatement, toNode.elseStatement));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.ifKeyword, toNode.ifKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.thenStatement, toNode.thenStatement)), _isEqualTokens(node.elseKeyword, toNode.elseKeyword)), _isEqualNodes(node.elseStatement, toNode.elseStatement));
   }
 
+  @override
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause toNode = this._toNode as ImplementsClause;
-    return javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodeLists(node.interfaces, toNode.interfaces));
+    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.interfaces, toNode.interfaces));
   }
 
+  @override
   bool visitImportDirective(ImportDirective node) {
     ImportDirective toNode = this._toNode as ImportDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.uri, toNode.uri)), isEqualTokens(node.asToken, toNode.asToken)), isEqualNodes(node.prefix, toNode.prefix)), isEqualNodeLists(node.combinators, toNode.combinators)), isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.uri, toNode.uri)), _isEqualTokens(node.asToken, toNode.asToken)), _isEqualNodes(node.prefix, toNode.prefix)), _isEqualNodeLists(node.combinators, toNode.combinators)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression toNode = this._toNode as IndexExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.target, toNode.target), isEqualTokens(node.leftBracket, toNode.leftBracket)), isEqualNodes(node.index, toNode.index)), isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodes(node.index, toNode.index)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.auxiliaryElements = node.auxiliaryElements;
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
@@ -8049,9 +8215,10 @@
     return false;
   }
 
+  @override
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression toNode = this._toNode as InstanceCreationExpression;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.constructorName, toNode.constructorName)), isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
@@ -8060,9 +8227,10 @@
     return false;
   }
 
+  @override
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral toNode = this._toNode as IntegerLiteral;
-    if (javaBooleanAnd(isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8070,19 +8238,22 @@
     return false;
   }
 
+  @override
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression toNode = this._toNode as InterpolationExpression;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftBracket, toNode.leftBracket), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString toNode = this._toNode as InterpolationString;
-    return javaBooleanAnd(isEqualTokens(node.contents, toNode.contents), node.value == toNode.value);
+    return javaBooleanAnd(_isEqualTokens(node.contents, toNode.contents), node.value == toNode.value);
   }
 
+  @override
   bool visitIsExpression(IsExpression node) {
     IsExpression toNode = this._toNode as IsExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.expression, toNode.expression), isEqualTokens(node.isOperator, toNode.isOperator)), isEqualTokens(node.notOperator, toNode.notOperator)), isEqualNodes(node.type, toNode.type))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.isOperator, toNode.isOperator)), _isEqualTokens(node.notOperator, toNode.notOperator)), _isEqualNodes(node.type, toNode.type))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8090,24 +8261,28 @@
     return false;
   }
 
+  @override
   bool visitLabel(Label node) {
     Label toNode = this._toNode as Label;
-    return javaBooleanAnd(isEqualNodes(node.label, toNode.label), isEqualTokens(node.colon, toNode.colon));
+    return javaBooleanAnd(_isEqualNodes(node.label, toNode.label), _isEqualTokens(node.colon, toNode.colon));
   }
 
+  @override
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement toNode = this._toNode as LabeledStatement;
-    return javaBooleanAnd(isEqualNodeLists(node.labels, toNode.labels), isEqualNodes(node.statement, toNode.statement));
+    return javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualNodes(node.statement, toNode.statement));
   }
 
+  @override
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective toNode = this._toNode as LibraryDirective;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.libraryToken, toNode.libraryToken)), isEqualNodes(node.name, toNode.name)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.libraryToken, toNode.libraryToken)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitLibraryIdentifier(LibraryIdentifier node) {
     LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
-    if (isEqualNodeLists(node.components, toNode.components)) {
+    if (_isEqualNodeLists(node.components, toNode.components)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8115,9 +8290,10 @@
     return false;
   }
 
+  @override
   bool visitListLiteral(ListLiteral node) {
     ListLiteral toNode = this._toNode as ListLiteral;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.constKeyword, toNode.constKeyword), isEqualNodes(node.typeArguments, toNode.typeArguments)), isEqualTokens(node.leftBracket, toNode.leftBracket)), isEqualNodeLists(node.elements, toNode.elements)), isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.constKeyword, toNode.constKeyword), _isEqualNodes(node.typeArguments, toNode.typeArguments)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.elements, toNode.elements)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8125,9 +8301,10 @@
     return false;
   }
 
+  @override
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral toNode = this._toNode as MapLiteral;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.constKeyword, toNode.constKeyword), isEqualNodes(node.typeArguments, toNode.typeArguments)), isEqualTokens(node.leftBracket, toNode.leftBracket)), isEqualNodeLists(node.entries, toNode.entries)), isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.constKeyword, toNode.constKeyword), _isEqualNodes(node.typeArguments, toNode.typeArguments)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.entries, toNode.entries)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8135,19 +8312,22 @@
     return false;
   }
 
+  @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
-    return javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.key, toNode.key), isEqualTokens(node.separator, toNode.separator)), isEqualNodes(node.value, toNode.value));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.key, toNode.key), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.value, toNode.value));
   }
 
+  @override
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration toNode = this._toNode as MethodDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.externalKeyword, toNode.externalKeyword)), isEqualTokens(node.modifierKeyword, toNode.modifierKeyword)), isEqualNodes(node.returnType, toNode.returnType)), isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), isEqualNodes(node.name, toNode.name)), isEqualNodes(node.parameters, toNode.parameters)), isEqualNodes(node.body, toNode.body));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualNodes(node.body, toNode.body));
   }
 
+  @override
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation toNode = this._toNode as MethodInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.target, toNode.target), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.methodName, toNode.methodName)), isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.methodName, toNode.methodName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8155,9 +8335,10 @@
     return false;
   }
 
+  @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression toNode = this._toNode as NamedExpression;
-    if (javaBooleanAnd(isEqualNodes(node.name, toNode.name), isEqualNodes(node.expression, toNode.expression))) {
+    if (javaBooleanAnd(_isEqualNodes(node.name, toNode.name), _isEqualNodes(node.expression, toNode.expression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8165,19 +8346,22 @@
     return false;
   }
 
+  @override
   bool visitNativeClause(NativeClause node) {
     NativeClause toNode = this._toNode as NativeClause;
-    return javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.name, toNode.name));
+    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.name, toNode.name));
   }
 
+  @override
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.nativeToken, toNode.nativeToken), isEqualNodes(node.stringLiteral, toNode.stringLiteral)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.nativeToken, toNode.nativeToken), _isEqualNodes(node.stringLiteral, toNode.stringLiteral)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitNullLiteral(NullLiteral node) {
     NullLiteral toNode = this._toNode as NullLiteral;
-    if (isEqualTokens(node.literal, toNode.literal)) {
+    if (_isEqualTokens(node.literal, toNode.literal)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8185,9 +8369,10 @@
     return false;
   }
 
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8195,27 +8380,30 @@
     return false;
   }
 
+  @override
   bool visitPartDirective(PartDirective node) {
     PartDirective toNode = this._toNode as PartDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.partToken, toNode.partToken)), isEqualNodes(node.uri, toNode.uri)), isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.partToken, toNode.partToken)), _isEqualNodes(node.uri, toNode.uri)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective toNode = this._toNode as PartOfDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.partToken, toNode.partToken)), isEqualTokens(node.ofToken, toNode.ofToken)), isEqualNodes(node.libraryName, toNode.libraryName)), isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.partToken, toNode.partToken)), _isEqualTokens(node.ofToken, toNode.ofToken)), _isEqualNodes(node.libraryName, toNode.libraryName)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression toNode = this._toNode as PostfixExpression;
-    if (javaBooleanAnd(isEqualNodes(node.operand, toNode.operand), isEqualTokens(node.operator, toNode.operator))) {
+    if (javaBooleanAnd(_isEqualNodes(node.operand, toNode.operand), _isEqualTokens(node.operator, toNode.operator))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8225,9 +8413,10 @@
     return false;
   }
 
+  @override
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.prefix, toNode.prefix), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.identifier, toNode.identifier))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.prefix, toNode.prefix), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.identifier, toNode.identifier))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8235,9 +8424,10 @@
     return false;
   }
 
+  @override
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression toNode = this._toNode as PrefixExpression;
-    if (javaBooleanAnd(isEqualTokens(node.operator, toNode.operator), isEqualNodes(node.operand, toNode.operand))) {
+    if (javaBooleanAnd(_isEqualTokens(node.operator, toNode.operator), _isEqualNodes(node.operand, toNode.operand))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8247,9 +8437,10 @@
     return false;
   }
 
+  @override
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess toNode = this._toNode as PropertyAccess;
-    if (javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.target, toNode.target), isEqualTokens(node.operator, toNode.operator)), isEqualNodes(node.propertyName, toNode.propertyName))) {
+    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.propertyName, toNode.propertyName))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8257,18 +8448,20 @@
     return false;
   }
 
+  @override
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation toNode = this._toNode as RedirectingConstructorInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.constructorName, toNode.constructorName)), isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitRethrowExpression(RethrowExpression node) {
     RethrowExpression toNode = this._toNode as RethrowExpression;
-    if (isEqualTokens(node.keyword, toNode.keyword)) {
+    if (_isEqualTokens(node.keyword, toNode.keyword)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8276,29 +8469,34 @@
     return false;
   }
 
+  @override
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement toNode = this._toNode as ReturnStatement;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitScriptTag(ScriptTag node) {
     ScriptTag toNode = this._toNode as ScriptTag;
-    return isEqualTokens(node.scriptTag, toNode.scriptTag);
+    return _isEqualTokens(node.scriptTag, toNode.scriptTag);
   }
 
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator toNode = this._toNode as ShowCombinator;
-    return javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodeLists(node.shownNames, toNode.shownNames));
+    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.shownNames, toNode.shownNames));
   }
 
+  @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.type, toNode.type)), isEqualNodes(node.identifier, toNode.identifier));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodes(node.identifier, toNode.identifier));
   }
 
+  @override
   bool visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
-    if (isEqualTokens(node.token, toNode.token)) {
+    if (_isEqualTokens(node.token, toNode.token)) {
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
       toNode.propagatedElement = node.propagatedElement;
@@ -8309,9 +8507,10 @@
     return false;
   }
 
+  @override
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
-    if (javaBooleanAnd(isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8319,9 +8518,10 @@
     return false;
   }
 
+  @override
   bool visitStringInterpolation(StringInterpolation node) {
     StringInterpolation toNode = this._toNode as StringInterpolation;
-    if (isEqualNodeLists(node.elements, toNode.elements)) {
+    if (_isEqualNodeLists(node.elements, toNode.elements)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8329,18 +8529,20 @@
     return false;
   }
 
+  @override
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation toNode = this._toNode as SuperConstructorInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.period, toNode.period)), isEqualNodes(node.constructorName, toNode.constructorName)), isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitSuperExpression(SuperExpression node) {
     SuperExpression toNode = this._toNode as SuperExpression;
-    if (isEqualTokens(node.keyword, toNode.keyword)) {
+    if (_isEqualTokens(node.keyword, toNode.keyword)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8348,24 +8550,28 @@
     return false;
   }
 
+  @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase toNode = this._toNode as SwitchCase;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodeLists(node.labels, toNode.labels), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.colon, toNode.colon)), isEqualNodeLists(node.statements, toNode.statements));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodeLists(node.statements, toNode.statements));
   }
 
+  @override
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault toNode = this._toNode as SwitchDefault;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodeLists(node.labels, toNode.labels), isEqualTokens(node.keyword, toNode.keyword)), isEqualTokens(node.colon, toNode.colon)), isEqualNodeLists(node.statements, toNode.statements));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodeLists(node.statements, toNode.statements));
   }
 
+  @override
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement toNode = this._toNode as SwitchStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.expression, toNode.expression)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualTokens(node.leftBracket, toNode.leftBracket)), isEqualNodeLists(node.members, toNode.members)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.members, toNode.members)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral toNode = this._toNode as SymbolLiteral;
-    if (javaBooleanAnd(isEqualTokens(node.poundSign, toNode.poundSign), isEqualTokenLists(node.components, toNode.components))) {
+    if (javaBooleanAnd(_isEqualTokens(node.poundSign, toNode.poundSign), _isEqualTokenLists(node.components, toNode.components))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8373,9 +8579,10 @@
     return false;
   }
 
+  @override
   bool visitThisExpression(ThisExpression node) {
     ThisExpression toNode = this._toNode as ThisExpression;
-    if (isEqualTokens(node.keyword, toNode.keyword)) {
+    if (_isEqualTokens(node.keyword, toNode.keyword)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8383,9 +8590,10 @@
     return false;
   }
 
+  @override
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression toNode = this._toNode as ThrowExpression;
-    if (javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualNodes(node.expression, toNode.expression))) {
+    if (javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.expression, toNode.expression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8393,63 +8601,74 @@
     return false;
   }
 
+  @override
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration toNode = this._toNode as TopLevelVariableDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualNodes(node.variables, toNode.variables)), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.variables, toNode.variables)), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitTryStatement(TryStatement node) {
     TryStatement toNode = this._toNode as TryStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.tryKeyword, toNode.tryKeyword), isEqualNodes(node.body, toNode.body)), isEqualNodeLists(node.catchClauses, toNode.catchClauses)), isEqualTokens(node.finallyKeyword, toNode.finallyKeyword)), isEqualNodes(node.finallyBlock, toNode.finallyBlock));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.tryKeyword, toNode.tryKeyword), _isEqualNodes(node.body, toNode.body)), _isEqualNodeLists(node.catchClauses, toNode.catchClauses)), _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword)), _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
   }
 
+  @override
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList toNode = this._toNode as TypeArgumentList;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftBracket, toNode.leftBracket), isEqualNodeLists(node.arguments, toNode.arguments)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitTypeName(TypeName node) {
     TypeName toNode = this._toNode as TypeName;
-    if (javaBooleanAnd(isEqualNodes(node.name, toNode.name), isEqualNodes(node.typeArguments, toNode.typeArguments))) {
+    if (javaBooleanAnd(_isEqualNodes(node.name, toNode.name), _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
       toNode.type = node.type;
       return true;
     }
     return false;
   }
 
+  @override
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter toNode = this._toNode as TypeParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualNodes(node.name, toNode.name)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.bound, toNode.bound));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.bound, toNode.bound));
   }
 
+  @override
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList toNode = this._toNode as TypeParameterList;
-    return javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.leftBracket, toNode.leftBracket), isEqualNodeLists(node.typeParameters, toNode.typeParameters)), isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.typeParameters, toNode.typeParameters)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
+  @override
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration toNode = this._toNode as VariableDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualNodes(node.name, toNode.name)), isEqualTokens(node.equals, toNode.equals)), isEqualNodes(node.initializer, toNode.initializer));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.equals, toNode.equals)), _isEqualNodes(node.initializer, toNode.initializer));
   }
 
+  @override
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualNodes(node.documentationComment, toNode.documentationComment), isEqualNodeLists(node.metadata, toNode.metadata)), isEqualTokens(node.keyword, toNode.keyword)), isEqualNodes(node.type, toNode.type)), isEqualNodeLists(node.variables, toNode.variables));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodeLists(node.variables, toNode.variables));
   }
 
+  @override
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement toNode = this._toNode as VariableDeclarationStatement;
-    return javaBooleanAnd(isEqualNodes(node.variables, toNode.variables), isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(_isEqualNodes(node.variables, toNode.variables), _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
+  @override
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement toNode = this._toNode as WhileStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(isEqualTokens(node.keyword, toNode.keyword), isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), isEqualNodes(node.condition, toNode.condition)), isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), isEqualNodes(node.body, toNode.body));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
   }
 
+  @override
   bool visitWithClause(WithClause node) {
     WithClause toNode = this._toNode as WithClause;
-    return javaBooleanAnd(isEqualTokens(node.withKeyword, toNode.withKeyword), isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
+    return javaBooleanAnd(_isEqualTokens(node.withKeyword, toNode.withKeyword), _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
   }
 
   /**
@@ -8461,7 +8680,7 @@
    * @return `true` if the given AST nodes have the same size and corresponding elements are
    *         equal
    */
-  bool isEqualNodeLists(NodeList first, NodeList second) {
+  bool _isEqualNodeLists(NodeList first, NodeList second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -8473,7 +8692,7 @@
     }
     bool equal = true;
     for (int i = 0; i < size; i++) {
-      if (!isEqualNodes(first[i], second[i])) {
+      if (!_isEqualNodes(first[i], second[i])) {
         equal = false;
       }
     }
@@ -8489,7 +8708,7 @@
    * @param toNode the node to which resolution information will be copied
    * @return `true` if the given AST nodes have the same structure
    */
-  bool isEqualNodes(AstNode fromNode, AstNode toNode) {
+  bool _isEqualNodes(AstNode fromNode, AstNode toNode) {
     if (fromNode == null) {
       return toNode == null;
     } else if (toNode == null) {
@@ -8526,13 +8745,13 @@
    * @return `true` if the given arrays of tokens have the same length and corresponding
    *         elements are equal
    */
-  bool isEqualTokenLists(List<Token> first, List<Token> second) {
+  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
     int length = first.length;
     if (second.length != length) {
       return false;
     }
     for (int i = 0; i < length; i++) {
-      if (!isEqualTokens(first[i], second[i])) {
+      if (!_isEqualTokens(first[i], second[i])) {
         return false;
       }
     }
@@ -8546,7 +8765,7 @@
    * @param second the second node being compared
    * @return `true` if the given tokens have the same structure
    */
-  bool isEqualTokens(Token first, Token second) {
+  bool _isEqualTokens(Token first, Token second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -8555,1082 +8774,224 @@
     return first.lexeme == second.lexeme;
   }
 }
+Map<String, MethodTrampoline> methodTable_Parser = <String, MethodTrampoline> {
+  'parseCompilationUnit_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCompilationUnit(arg0)),
+  'parseExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExpression(arg0)),
+  'parseStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatement(arg0)),
+  'parseStatements_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatements(arg0)),
+  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
+  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
+  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
+  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
+  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
+  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
+  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
+  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
+  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
+  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
+  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
+  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
+  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
+  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
+  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
+  'parseLabel_0': new MethodTrampoline(0, (Parser target) => target.parseLabel()),
+  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
+  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
+  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
+  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
+  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
+  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
+  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
+  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
+  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
+  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
+  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
+  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
+  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
+  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
+  'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()),
+  'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target._appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
+  'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._computeStringValue(arg0, arg1, arg2)),
+  'convertToFunctionDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)),
+  'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(0, (Parser target) => target._couldBeStartOfCompilationUnitMember()),
+  'createSyntheticIdentifier_0': new MethodTrampoline(0, (Parser target) => target._createSyntheticIdentifier()),
+  'createSyntheticKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target._createSyntheticKeyword(arg0)),
+  'createSyntheticStringLiteral_0': new MethodTrampoline(0, (Parser target) => target._createSyntheticStringLiteral()),
+  'createSyntheticToken_1': new MethodTrampoline(1, (Parser target, arg0) => target._createSyntheticToken(arg0)),
+  'ensureAssignable_1': new MethodTrampoline(1, (Parser target, arg0) => target._ensureAssignable(arg0)),
+  'expect_1': new MethodTrampoline(1, (Parser target, arg0) => target._expect(arg0)),
+  'expectGt_0': new MethodTrampoline(0, (Parser target) => target._expectGt()),
+  'expectKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target._expectKeyword(arg0)),
+  'expectSemicolon_0': new MethodTrampoline(0, (Parser target) => target._expectSemicolon()),
+  'findRange_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._findRange(arg0, arg1)),
+  'getCodeBlockRanges_1': new MethodTrampoline(1, (Parser target, arg0) => target._getCodeBlockRanges(arg0)),
+  'getEndToken_1': new MethodTrampoline(1, (Parser target, arg0) => target._getEndToken(arg0)),
+  'injectToken_1': new MethodTrampoline(1, (Parser target, arg0) => target._injectToken(arg0)),
+  'isFunctionDeclaration_0': new MethodTrampoline(0, (Parser target) => target._isFunctionDeclaration()),
+  'isFunctionExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target._isFunctionExpression(arg0)),
+  'isHexDigit_1': new MethodTrampoline(1, (Parser target, arg0) => target._isHexDigit(arg0)),
+  'isInitializedVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target._isInitializedVariableDeclaration()),
+  'isLinkText_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._isLinkText(arg0, arg1)),
+  'isOperator_1': new MethodTrampoline(1, (Parser target, arg0) => target._isOperator(arg0)),
+  'isSwitchMember_0': new MethodTrampoline(0, (Parser target) => target._isSwitchMember()),
+  'isTypedIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target._isTypedIdentifier(arg0)),
+  'lexicallyFirst_1': new MethodTrampoline(1, (Parser target, arg0) => target._lexicallyFirst(arg0)),
+  'lockErrorListener_0': new MethodTrampoline(0, (Parser target) => target._lockErrorListener()),
+  'matches_1': new MethodTrampoline(1, (Parser target, arg0) => target._matches(arg0)),
+  'matchesGt_0': new MethodTrampoline(0, (Parser target) => target._matchesGt()),
+  'matchesIdentifier_0': new MethodTrampoline(0, (Parser target) => target._matchesIdentifier()),
+  'matchesKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target._matchesKeyword(arg0)),
+  'matchesString_1': new MethodTrampoline(1, (Parser target, arg0) => target._matchesString(arg0)),
+  'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target._optional(arg0)),
+  'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target._parseAdditiveExpression()),
+  'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target._parseArgumentDefinitionTest()),
+  'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target._parseAssertStatement()),
+  'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseAssignableExpression(arg0)),
+  'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseAssignableSelector(arg0, arg1)),
+  'parseBitwiseAndExpression_0': new MethodTrampoline(0, (Parser target) => target._parseBitwiseAndExpression()),
+  'parseBitwiseXorExpression_0': new MethodTrampoline(0, (Parser target) => target._parseBitwiseXorExpression()),
+  'parseBreakStatement_0': new MethodTrampoline(0, (Parser target) => target._parseBreakStatement()),
+  'parseCascadeSection_0': new MethodTrampoline(0, (Parser target) => target._parseCascadeSection()),
+  'parseClassDeclaration_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseClassDeclaration(arg0, arg1)),
+  'parseClassMembers_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseClassMembers(arg0, arg1)),
+  'parseClassTypeAlias_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseClassTypeAlias(arg0, arg1, arg2)),
+  'parseCombinators_0': new MethodTrampoline(0, (Parser target) => target._parseCombinators()),
+  'parseCommentAndMetadata_0': new MethodTrampoline(0, (Parser target) => target._parseCommentAndMetadata()),
+  'parseCommentReference_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseCommentReference(arg0, arg1)),
+  'parseCommentReferences_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseCommentReferences(arg0)),
+  'parseCompilationUnitMember_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseCompilationUnitMember(arg0)),
+  'parseConstExpression_0': new MethodTrampoline(0, (Parser target) => target._parseConstExpression()),
+  'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => target._parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
+  'parseConstructorFieldInitializer_0': new MethodTrampoline(0, (Parser target) => target._parseConstructorFieldInitializer()),
+  'parseContinueStatement_0': new MethodTrampoline(0, (Parser target) => target._parseContinueStatement()),
+  'parseDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseDirective(arg0)),
+  'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) => target._parseDocumentationComment()),
+  'parseDoStatement_0': new MethodTrampoline(0, (Parser target) => target._parseDoStatement()),
+  'parseEmptyStatement_0': new MethodTrampoline(0, (Parser target) => target._parseEmptyStatement()),
+  'parseEqualityExpression_0': new MethodTrampoline(0, (Parser target) => target._parseEqualityExpression()),
+  'parseExportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseExportDirective(arg0)),
+  'parseExpressionList_0': new MethodTrampoline(0, (Parser target) => target._parseExpressionList()),
+  'parseFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseFinalConstVarOrType(arg0)),
+  'parseFormalParameter_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseFormalParameter(arg0)),
+  'parseForStatement_0': new MethodTrampoline(0, (Parser target) => target._parseForStatement()),
+  'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseFunctionBody(arg0, arg1, arg2)),
+  'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseFunctionDeclaration(arg0, arg1, arg2)),
+  'parseFunctionDeclarationStatement_0': new MethodTrampoline(0, (Parser target) => target._parseFunctionDeclarationStatement()),
+  'parseFunctionDeclarationStatementAfterReturnType_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseFunctionDeclarationStatementAfterReturnType(arg0, arg1)),
+  'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseFunctionTypeAlias(arg0, arg1)),
+  'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target._parseGetter(arg0, arg1, arg2, arg3)),
+  'parseIdentifierList_0': new MethodTrampoline(0, (Parser target) => target._parseIdentifierList()),
+  'parseIfStatement_0': new MethodTrampoline(0, (Parser target) => target._parseIfStatement()),
+  'parseImportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseImportDirective(arg0)),
+  'parseInitializedIdentifierList_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target._parseInitializedIdentifierList(arg0, arg1, arg2, arg3)),
+  'parseInstanceCreationExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseInstanceCreationExpression(arg0)),
+  'parseLibraryDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseLibraryDirective(arg0)),
+  'parseLibraryName_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)),
+  'parseListLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)),
+  'parseListOrMapLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseListOrMapLiteral(arg0)),
+  'parseLogicalAndExpression_0': new MethodTrampoline(0, (Parser target) => target._parseLogicalAndExpression()),
+  'parseMapLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)),
+  'parseMethodDeclarationAfterParameters_6': new MethodTrampoline(6, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target._parseMethodDeclarationAfterParameters(arg0, arg1, arg2, arg3, arg4, arg5)),
+  'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)),
+  'parseModifiers_0': new MethodTrampoline(0, (Parser target) => target._parseModifiers()),
+  'parseMultiplicativeExpression_0': new MethodTrampoline(0, (Parser target) => target._parseMultiplicativeExpression()),
+  'parseNativeClause_0': new MethodTrampoline(0, (Parser target) => target._parseNativeClause()),
+  'parseNewExpression_0': new MethodTrampoline(0, (Parser target) => target._parseNewExpression()),
+  'parseNonLabeledStatement_0': new MethodTrampoline(0, (Parser target) => target._parseNonLabeledStatement()),
+  'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseOperator(arg0, arg1, arg2)),
+  'parseOptionalReturnType_0': new MethodTrampoline(0, (Parser target) => target._parseOptionalReturnType()),
+  'parsePartDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parsePartDirective(arg0)),
+  'parsePostfixExpression_0': new MethodTrampoline(0, (Parser target) => target._parsePostfixExpression()),
+  'parsePrimaryExpression_0': new MethodTrampoline(0, (Parser target) => target._parsePrimaryExpression()),
+  'parseRedirectingConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target._parseRedirectingConstructorInvocation()),
+  'parseRelationalExpression_0': new MethodTrampoline(0, (Parser target) => target._parseRelationalExpression()),
+  'parseRethrowExpression_0': new MethodTrampoline(0, (Parser target) => target._parseRethrowExpression()),
+  'parseReturnStatement_0': new MethodTrampoline(0, (Parser target) => target._parseReturnStatement()),
+  'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target._parseSetter(arg0, arg1, arg2, arg3)),
+  'parseShiftExpression_0': new MethodTrampoline(0, (Parser target) => target._parseShiftExpression()),
+  'parseStatementList_0': new MethodTrampoline(0, (Parser target) => target._parseStatementList()),
+  'parseStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseStringInterpolation(arg0)),
+  'parseSuperConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target._parseSuperConstructorInvocation()),
+  'parseSwitchStatement_0': new MethodTrampoline(0, (Parser target) => target._parseSwitchStatement()),
+  'parseSymbolLiteral_0': new MethodTrampoline(0, (Parser target) => target._parseSymbolLiteral()),
+  'parseThrowExpression_0': new MethodTrampoline(0, (Parser target) => target._parseThrowExpression()),
+  'parseThrowExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target._parseThrowExpressionWithoutCascade()),
+  'parseTryStatement_0': new MethodTrampoline(0, (Parser target) => target._parseTryStatement()),
+  'parseTypeAlias_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseTypeAlias(arg0)),
+  'parseUnaryExpression_0': new MethodTrampoline(0, (Parser target) => target._parseUnaryExpression()),
+  'parseVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target._parseVariableDeclaration()),
+  'parseVariableDeclarationListAfterMetadata_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseVariableDeclarationListAfterMetadata(arg0)),
+  'parseVariableDeclarationListAfterType_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseVariableDeclarationListAfterType(arg0, arg1, arg2)),
+  'parseVariableDeclarationStatementAfterMetadata_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseVariableDeclarationStatementAfterMetadata(arg0)),
+  'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)),
+  'parseWhileStatement_0': new MethodTrampoline(0, (Parser target) => target._parseWhileStatement()),
+  'peek_0': new MethodTrampoline(0, (Parser target) => target._peek()),
+  'peekAt_1': new MethodTrampoline(1, (Parser target, arg0) => target._peekAt(arg0)),
+  'reportError_1': new MethodTrampoline(1, (Parser target, arg0) => target._reportError(arg0)),
+  'reportErrorForCurrentToken_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._reportErrorForCurrentToken(arg0, arg1)),
+  'reportErrorForNode_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._reportErrorForNode(arg0, arg1, arg2)),
+  'reportErrorForToken_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._reportErrorForToken(arg0, arg1, arg2)),
+  'skipBlock_0': new MethodTrampoline(0, (Parser target) => target._skipBlock()),
+  'skipFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipFinalConstVarOrType(arg0)),
+  'skipFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipFormalParameterList(arg0)),
+  'skipPastMatchingToken_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipPastMatchingToken(arg0)),
+  'skipPrefixedIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipPrefixedIdentifier(arg0)),
+  'skipReturnType_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipReturnType(arg0)),
+  'skipSimpleIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipSimpleIdentifier(arg0)),
+  'skipStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipStringInterpolation(arg0)),
+  'skipStringLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipStringLiteral(arg0)),
+  'skipTypeArgumentList_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipTypeArgumentList(arg0)),
+  'skipTypeName_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipTypeName(arg0)),
+  'skipTypeParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target._skipTypeParameterList(arg0)),
+  'tokenMatches_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._tokenMatches(arg0, arg1)),
+  'tokenMatchesIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target._tokenMatchesIdentifier(arg0)),
+  'tokenMatchesKeyword_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target._tokenMatchesKeyword(arg0, arg1)),
+  'translateCharacter_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target._translateCharacter(arg0, arg1, arg2)),
+  'unlockErrorListener_0': new MethodTrampoline(0, (Parser target) => target._unlockErrorListener()),
+  'validateFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateFormalParameterList(arg0)),
+  'validateModifiersForClass_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForClass(arg0)),
+  'validateModifiersForConstructor_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForConstructor(arg0)),
+  'validateModifiersForField_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForField(arg0)),
+  'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForFunctionDeclarationStatement(arg0)),
+  'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForGetterOrSetterOrMethod(arg0)),
+  'validateModifiersForOperator_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForOperator(arg0)),
+  'validateModifiersForTopLevelDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForTopLevelDeclaration(arg0)),
+  'validateModifiersForTopLevelFunction_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForTopLevelFunction(arg0)),
+  'validateModifiersForTopLevelVariable_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForTopLevelVariable(arg0)),
+  'validateModifiersForTypedef_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForTypedef(arg0)),};
+
+
+Object invokeParserMethodImpl(Parser parser, String methodName, List<Object> objects, Token tokenStream) {
+  parser.currentToken = tokenStream;
+  MethodTrampoline method = methodTable_Parser['${methodName}_${objects.length}'];
+  return method.invoke(parser, objects);
+}
+
 
 /**
- * Instances of the class {link ToFormattedSourceVisitor} write a source representation of a visited
- * AST node (and all of it's children) to a writer.
+ * Wrapper around [Function] which should be called with "target" and "arguments".
  */
-class ToFormattedSourceVisitor implements AstVisitor<Object> {
-  static String COMMENTS_KEY = "List of comments before statement";
-
-  /**
-   * The writer to which the source is to be written.
-   */
-  PrintWriter _writer;
-
-  int _indentLevel = 0;
-
-  String _indentString = "";
-
-  /**
-   * Initialize a newly created visitor to write source code representing the visited nodes to the
-   * given writer.
-   *
-   * @param writer the writer to which the source is to be written
-   */
-  ToFormattedSourceVisitor(PrintWriter writer) {
-    this._writer = writer;
-  }
-
-  Object visitAdjacentStrings(AdjacentStrings node) {
-    visitNodeListWithSeparator(node.strings, " ");
-    return null;
-  }
-
-  Object visitAnnotation(Annotation node) {
-    _writer.print('@');
-    visitNode(node.name);
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.arguments);
-    return null;
-  }
-
-  Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    _writer.print('?');
-    visitNode(node.identifier);
-    return null;
-  }
-
-  Object visitArgumentList(ArgumentList node) {
-    _writer.print('(');
-    visitNodeListWithSeparator(node.arguments, ", ");
-    _writer.print(')');
-    return null;
-  }
-
-  Object visitAsExpression(AsExpression node) {
-    visitNode(node.expression);
-    _writer.print(" as ");
-    visitNode(node.type);
-    return null;
-  }
-
-  Object visitAssertStatement(AssertStatement node) {
-    _writer.print("assert(");
-    visitNode(node.condition);
-    _writer.print(");");
-    return null;
-  }
-
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    visitNode(node.leftHandSide);
-    _writer.print(' ');
-    _writer.print(node.operator.lexeme);
-    _writer.print(' ');
-    visitNode(node.rightHandSide);
-    return null;
-  }
-
-  Object visitBinaryExpression(BinaryExpression node) {
-    visitNode(node.leftOperand);
-    _writer.print(' ');
-    _writer.print(node.operator.lexeme);
-    _writer.print(' ');
-    visitNode(node.rightOperand);
-    return null;
-  }
-
-  Object visitBlock(Block node) {
-    _writer.print('{');
-    {
-      indentInc();
-      visitNodeListWithSeparatorAndPrefix("\n", node.statements, "\n");
-      indentDec();
+class MethodTrampoline {
+  int parameterCount;
+  Function trampoline;
+  MethodTrampoline(this.parameterCount, this.trampoline);
+  Object invoke(target, List arguments) {
+    if (arguments.length != parameterCount) {
+      throw new IllegalArgumentException("${arguments.length} != $parameterCount");
     }
-    nl2();
-    _writer.print('}');
-    return null;
-  }
-
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
-    visitNode(node.block);
-    return null;
-  }
-
-  Object visitBooleanLiteral(BooleanLiteral node) {
-    _writer.print(node.literal.lexeme);
-    return null;
-  }
-
-  Object visitBreakStatement(BreakStatement node) {
-    _writer.print("break");
-    visitNodeWithPrefix(" ", node.label);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitCascadeExpression(CascadeExpression node) {
-    visitNode(node.target);
-    visitNodeList(node.cascadeSections);
-    return null;
-  }
-
-  Object visitCatchClause(CatchClause node) {
-    visitNodeWithPrefix("on ", node.exceptionType);
-    if (node.catchKeyword != null) {
-      if (node.exceptionType != null) {
-        _writer.print(' ');
-      }
-      _writer.print("catch (");
-      visitNode(node.exceptionParameter);
-      visitNodeWithPrefix(", ", node.stackTraceParameter);
-      _writer.print(") ");
-    } else {
-      _writer.print(" ");
-    }
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitClassDeclaration(ClassDeclaration node) {
-    visitNode(node.documentationComment);
-    visitTokenWithSuffix(node.abstractKeyword, " ");
-    _writer.print("class ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
-    visitNodeWithPrefix(" ", node.extendsClause);
-    visitNodeWithPrefix(" ", node.withClause);
-    visitNodeWithPrefix(" ", node.implementsClause);
-    _writer.print(" {");
-    {
-      indentInc();
-      visitNodeListWithSeparatorAndPrefix("\n", node.members, "\n\n");
-      indentDec();
-    }
-    nl2();
-    _writer.print("}");
-    return null;
-  }
-
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    _writer.print("typedef ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
-    _writer.print(" = ");
-    if (node.abstractKeyword != null) {
-      _writer.print("abstract ");
-    }
-    visitNode(node.superclass);
-    visitNodeWithPrefix(" ", node.withClause);
-    visitNodeWithPrefix(" ", node.implementsClause);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitComment(Comment node) {
-    Token token = node.beginToken;
-    while (token != null) {
-      bool firstLine = true;
-      for (String line in StringUtils.split(token.lexeme, "\n")) {
-        if (firstLine) {
-          firstLine = false;
-        } else {
-          line = " ${line.trim()}";
-          line = StringUtils.replace(line, "/*", "/ *");
-        }
-        _writer.print(line);
-        nl2();
-      }
-      if (identical(token, node.endToken)) {
-        break;
-      }
-    }
-    return null;
-  }
-
-  Object visitCommentReference(CommentReference node) => null;
-
-  Object visitCompilationUnit(CompilationUnit node) {
-    ScriptTag scriptTag = node.scriptTag;
-    NodeList<Directive> directives = node.directives;
-    visitNode(scriptTag);
-    // directives
-    String prefix = scriptTag == null ? "" : " ";
-    visitNodeListWithSeparatorAndPrefix(prefix, directives, "\n");
-    nl();
-    // declarations
-    prefix = scriptTag == null && directives.isEmpty ? "" : "\n";
-    visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, "\n\n");
-    return null;
-  }
-
-  Object visitConditionalExpression(ConditionalExpression node) {
-    visitNode(node.condition);
-    _writer.print(" ? ");
-    visitNode(node.thenExpression);
-    _writer.print(" : ");
-    visitNode(node.elseExpression);
-    return null;
-  }
-
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    visitNode(node.documentationComment);
-    visitTokenWithSuffix(node.externalKeyword, " ");
-    visitTokenWithSuffix(node.constKeyword, " ");
-    visitTokenWithSuffix(node.factoryKeyword, " ");
-    visitNode(node.returnType);
-    visitNodeWithPrefix(".", node.name);
-    visitNode(node.parameters);
-    visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
-    visitNodeWithPrefix(" = ", node.redirectedConstructor);
-    if (node.body is! EmptyFunctionBody) {
-      _writer.print(' ');
-    }
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    visitTokenWithSuffix(node.keyword, ".");
-    visitNode(node.fieldName);
-    _writer.print(" = ");
-    visitNode(node.expression);
-    return null;
-  }
-
-  Object visitConstructorName(ConstructorName node) {
-    visitNode(node.type);
-    visitNodeWithPrefix(".", node.name);
-    return null;
-  }
-
-  Object visitContinueStatement(ContinueStatement node) {
-    _writer.print("continue");
-    visitNodeWithPrefix(" ", node.label);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNode(node.identifier);
-    return null;
-  }
-
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    visitNode(node.parameter);
-    if (node.separator != null) {
-      _writer.print(" ");
-      _writer.print(node.separator.lexeme);
-      visitNodeWithPrefix(" ", node.defaultValue);
-    }
-    return null;
-  }
-
-  Object visitDoStatement(DoStatement node) {
-    _writer.print("do ");
-    visitNode(node.body);
-    _writer.print(" while (");
-    visitNode(node.condition);
-    _writer.print(");");
-    return null;
-  }
-
-  Object visitDoubleLiteral(DoubleLiteral node) {
-    _writer.print(node.literal.lexeme);
-    return null;
-  }
-
-  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitEmptyStatement(EmptyStatement node) {
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitExportDirective(ExportDirective node) {
-    _writer.print("export ");
-    visitNode(node.uri);
-    visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    _writer.print("=> ");
-    visitNode(node.expression);
-    if (node.semicolon != null) {
-      _writer.print(';');
-    }
-    return null;
-  }
-
-  Object visitExpressionStatement(ExpressionStatement node) {
-    visitNode(node.expression);
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitExtendsClause(ExtendsClause node) {
-    _writer.print("extends ");
-    visitNode(node.superclass);
-    return null;
-  }
-
-  Object visitFieldDeclaration(FieldDeclaration node) {
-    visitNode(node.documentationComment);
-    visitTokenWithSuffix(node.staticKeyword, " ");
-    visitNode(node.fields);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    _writer.print("this.");
-    visitNode(node.identifier);
-    visitNode(node.parameters);
-    return null;
-  }
-
-  Object visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    _writer.print("for (");
-    if (loopVariable == null) {
-      visitNode(node.identifier);
-    } else {
-      visitNode(loopVariable);
-    }
-    _writer.print(" in ");
-    visitNode(node.iterator);
-    _writer.print(") ");
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitFormalParameterList(FormalParameterList node) {
-    String groupEnd = null;
-    _writer.print('(');
-    NodeList<FormalParameter> parameters = node.parameters;
-    int size = parameters.length;
-    for (int i = 0; i < size; i++) {
-      FormalParameter parameter = parameters[i];
-      if (i > 0) {
-        _writer.print(", ");
-      }
-      if (groupEnd == null && parameter is DefaultFormalParameter) {
-        if (identical(parameter.kind, ParameterKind.NAMED)) {
-          groupEnd = "}";
-          _writer.print('{');
-        } else {
-          groupEnd = "]";
-          _writer.print('[');
-        }
-      }
-      parameter.accept(this);
-    }
-    if (groupEnd != null) {
-      _writer.print(groupEnd);
-    }
-    _writer.print(')');
-    return null;
-  }
-
-  Object visitForStatement(ForStatement node) {
-    Expression initialization = node.initialization;
-    _writer.print("for (");
-    if (initialization != null) {
-      visitNode(initialization);
-    } else {
-      visitNode(node.variables);
-    }
-    _writer.print(";");
-    visitNodeWithPrefix(" ", node.condition);
-    _writer.print(";");
-    visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
-    _writer.print(") ");
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    visitNodeWithSuffix(node.returnType, " ");
-    visitTokenWithSuffix(node.propertyKeyword, " ");
-    visitNode(node.name);
-    visitNode(node.functionExpression);
-    return null;
-  }
-
-  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    visitNode(node.functionDeclaration);
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitFunctionExpression(FunctionExpression node) {
-    visitNode(node.parameters);
-    _writer.print(' ');
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    visitNode(node.function);
-    visitNode(node.argumentList);
-    return null;
-  }
-
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    _writer.print("typedef ");
-    visitNodeWithSuffix(node.returnType, " ");
-    visitNode(node.name);
-    visitNode(node.typeParameters);
-    visitNode(node.parameters);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    visitNodeWithSuffix(node.returnType, " ");
-    visitNode(node.identifier);
-    visitNode(node.parameters);
-    return null;
-  }
-
-  Object visitHideCombinator(HideCombinator node) {
-    _writer.print("hide ");
-    visitNodeListWithSeparator(node.hiddenNames, ", ");
-    return null;
-  }
-
-  Object visitIfStatement(IfStatement node) {
-    _writer.print("if (");
-    visitNode(node.condition);
-    _writer.print(") ");
-    visitNode(node.thenStatement);
-    visitNodeWithPrefix(" else ", node.elseStatement);
-    return null;
-  }
-
-  Object visitImplementsClause(ImplementsClause node) {
-    _writer.print("implements ");
-    visitNodeListWithSeparator(node.interfaces, ", ");
-    return null;
-  }
-
-  Object visitImportDirective(ImportDirective node) {
-    _writer.print("import ");
-    visitNode(node.uri);
-    visitNodeWithPrefix(" as ", node.prefix);
-    visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitIndexExpression(IndexExpression node) {
-    if (node.isCascaded) {
-      _writer.print("..");
-    } else {
-      visitNode(node.target);
-    }
-    _writer.print('[');
-    visitNode(node.index);
-    _writer.print(']');
-    return null;
-  }
-
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNode(node.constructorName);
-    visitNode(node.argumentList);
-    return null;
-  }
-
-  Object visitIntegerLiteral(IntegerLiteral node) {
-    _writer.print(node.literal.lexeme);
-    return null;
-  }
-
-  Object visitInterpolationExpression(InterpolationExpression node) {
-    if (node.rightBracket != null) {
-      _writer.print("\${");
-      visitNode(node.expression);
-      _writer.print("}");
-    } else {
-      _writer.print("\$");
-      visitNode(node.expression);
-    }
-    return null;
-  }
-
-  Object visitInterpolationString(InterpolationString node) {
-    _writer.print(node.contents.lexeme);
-    return null;
-  }
-
-  Object visitIsExpression(IsExpression node) {
-    visitNode(node.expression);
-    if (node.notOperator == null) {
-      _writer.print(" is ");
-    } else {
-      _writer.print(" is! ");
-    }
-    visitNode(node.type);
-    return null;
-  }
-
-  Object visitLabel(Label node) {
-    visitNode(node.label);
-    _writer.print(":");
-    return null;
-  }
-
-  Object visitLabeledStatement(LabeledStatement node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
-    visitNode(node.statement);
-    return null;
-  }
-
-  Object visitLibraryDirective(LibraryDirective node) {
-    _writer.print("library ");
-    visitNode(node.name);
-    _writer.print(';');
-    nl();
-    return null;
-  }
-
-  Object visitLibraryIdentifier(LibraryIdentifier node) {
-    _writer.print(node.name);
-    return null;
-  }
-
-  Object visitListLiteral(ListLiteral node) {
-    if (node.constKeyword != null) {
-      _writer.print(node.constKeyword.lexeme);
-      _writer.print(' ');
-    }
-    visitNodeWithSuffix(node.typeArguments, " ");
-    _writer.print("[");
-    {
-      NodeList<Expression> elements = node.elements;
-      if (elements.length < 2 || elements.toString().length < 60) {
-        visitNodeListWithSeparator(elements, ", ");
-      } else {
-        String elementIndent = "${_indentString}    ";
-        _writer.print("\n");
-        _writer.print(elementIndent);
-        visitNodeListWithSeparator(elements, ",\n${elementIndent}");
-      }
-    }
-    _writer.print("]");
-    return null;
-  }
-
-  Object visitMapLiteral(MapLiteral node) {
-    if (node.constKeyword != null) {
-      _writer.print(node.constKeyword.lexeme);
-      _writer.print(' ');
-    }
-    visitNodeWithSuffix(node.typeArguments, " ");
-    _writer.print("{");
-    visitNodeListWithSeparator(node.entries, ", ");
-    _writer.print("}");
-    return null;
-  }
-
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
-    visitNode(node.key);
-    _writer.print(" : ");
-    visitNode(node.value);
-    return null;
-  }
-
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    visitNode(node.documentationComment);
-    visitTokenWithSuffix(node.externalKeyword, " ");
-    visitTokenWithSuffix(node.modifierKeyword, " ");
-    visitNodeWithSuffix(node.returnType, " ");
-    visitTokenWithSuffix(node.propertyKeyword, " ");
-    visitTokenWithSuffix(node.operatorKeyword, " ");
-    visitNode(node.name);
-    if (!node.isGetter) {
-      visitNode(node.parameters);
-    }
-    if (node.body is! EmptyFunctionBody) {
-      _writer.print(' ');
-    }
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitMethodInvocation(MethodInvocation node) {
-    if (node.isCascaded) {
-      _writer.print("..");
-    } else {
-      visitNodeWithSuffix(node.target, ".");
-    }
-    visitNode(node.methodName);
-    visitNode(node.argumentList);
-    return null;
-  }
-
-  Object visitNamedExpression(NamedExpression node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" ", node.expression);
-    return null;
-  }
-
-  Object visitNativeClause(NativeClause node) {
-    _writer.print("native ");
-    visitNode(node.name);
-    return null;
-  }
-
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
-    _writer.print("native ");
-    visitNode(node.stringLiteral);
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitNullLiteral(NullLiteral node) {
-    _writer.print("null");
-    return null;
-  }
-
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
-    _writer.print('(');
-    visitNode(node.expression);
-    _writer.print(')');
-    return null;
-  }
-
-  Object visitPartDirective(PartDirective node) {
-    _writer.print("part ");
-    visitNode(node.uri);
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitPartOfDirective(PartOfDirective node) {
-    _writer.print("part of ");
-    visitNode(node.libraryName);
-    _writer.print(';');
-    return null;
-  }
-
-  Object visitPostfixExpression(PostfixExpression node) {
-    visitNode(node.operand);
-    _writer.print(node.operator.lexeme);
-    return null;
-  }
-
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    visitNode(node.prefix);
-    _writer.print('.');
-    visitNode(node.identifier);
-    return null;
-  }
-
-  Object visitPrefixExpression(PrefixExpression node) {
-    _writer.print(node.operator.lexeme);
-    visitNode(node.operand);
-    return null;
-  }
-
-  Object visitPropertyAccess(PropertyAccess node) {
-    if (node.isCascaded) {
-      _writer.print("..");
-    } else {
-      visitNodeWithSuffix(node.target, ".");
-    }
-    visitNode(node.propertyName);
-    return null;
-  }
-
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    _writer.print("this");
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.argumentList);
-    return null;
-  }
-
-  Object visitRethrowExpression(RethrowExpression node) {
-    _writer.print("rethrow");
-    return null;
-  }
-
-  Object visitReturnStatement(ReturnStatement node) {
-    Expression expression = node.expression;
-    if (expression == null) {
-      _writer.print("return;");
-    } else {
-      _writer.print("return ");
-      expression.accept(this);
-      _writer.print(";");
-    }
-    return null;
-  }
-
-  Object visitScriptTag(ScriptTag node) {
-    _writer.print(node.scriptTag.lexeme);
-    return null;
-  }
-
-  Object visitShowCombinator(ShowCombinator node) {
-    _writer.print("show ");
-    visitNodeListWithSeparator(node.shownNames, ", ");
-    return null;
-  }
-
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNode(node.identifier);
-    return null;
-  }
-
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    _writer.print(node.token.lexeme);
-    return null;
-  }
-
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    _writer.print(node.literal.lexeme);
-    return null;
-  }
-
-  Object visitStringInterpolation(StringInterpolation node) {
-    visitNodeList(node.elements);
-    return null;
-  }
-
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _writer.print("super");
-    visitNodeWithPrefix(".", node.constructorName);
-    visitNode(node.argumentList);
-    return null;
-  }
-
-  Object visitSuperExpression(SuperExpression node) {
-    _writer.print("super");
-    return null;
-  }
-
-  Object visitSwitchCase(SwitchCase node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
-    _writer.print("case ");
-    visitNode(node.expression);
-    _writer.print(": ");
-    {
-      indentInc();
-      visitNodeListWithSeparator(node.statements, "\n");
-      indentDec();
-    }
-    return null;
-  }
-
-  Object visitSwitchDefault(SwitchDefault node) {
-    visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
-    _writer.print("default: ");
-    {
-      indentInc();
-      visitNodeListWithSeparator(node.statements, "\n");
-      indentDec();
-    }
-    return null;
-  }
-
-  Object visitSwitchStatement(SwitchStatement node) {
-    _writer.print("switch (");
-    visitNode(node.expression);
-    _writer.print(") {");
-    {
-      indentInc();
-      visitNodeListWithSeparator(node.members, "\n");
-      indentDec();
-    }
-    nl2();
-    _writer.print('}');
-    return null;
-  }
-
-  Object visitSymbolLiteral(SymbolLiteral node) {
-    _writer.print("#");
-    visitTokenListWithSeparator(node.components, ".");
-    return null;
-  }
-
-  Object visitThisExpression(ThisExpression node) {
-    _writer.print("this");
-    return null;
-  }
-
-  Object visitThrowExpression(ThrowExpression node) {
-    _writer.print("throw ");
-    visitNode(node.expression);
-    return null;
-  }
-
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    visitNodeWithSuffix(node.variables, ";");
-    return null;
-  }
-
-  Object visitTryStatement(TryStatement node) {
-    _writer.print("try ");
-    visitNode(node.body);
-    visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
-    visitNodeWithPrefix(" finally ", node.finallyBlock);
-    return null;
-  }
-
-  Object visitTypeArgumentList(TypeArgumentList node) {
-    _writer.print('<');
-    visitNodeListWithSeparator(node.arguments, ", ");
-    _writer.print('>');
-    return null;
-  }
-
-  Object visitTypeName(TypeName node) {
-    visitNode(node.name);
-    visitNode(node.typeArguments);
-    return null;
-  }
-
-  Object visitTypeParameter(TypeParameter node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" extends ", node.bound);
-    return null;
-  }
-
-  Object visitTypeParameterList(TypeParameterList node) {
-    _writer.print('<');
-    visitNodeListWithSeparator(node.typeParameters, ", ");
-    _writer.print('>');
-    return null;
-  }
-
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    visitNode(node.name);
-    visitNodeWithPrefix(" = ", node.initializer);
-    return null;
-  }
-
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    visitTokenWithSuffix(node.keyword, " ");
-    visitNodeWithSuffix(node.type, " ");
-    visitNodeListWithSeparator(node.variables, ", ");
-    return null;
-  }
-
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    visitNode(node.variables);
-    _writer.print(";");
-    return null;
-  }
-
-  Object visitWhileStatement(WhileStatement node) {
-    _writer.print("while (");
-    visitNode(node.condition);
-    _writer.print(") ");
-    visitNode(node.body);
-    return null;
-  }
-
-  Object visitWithClause(WithClause node) {
-    _writer.print("with ");
-    visitNodeListWithSeparator(node.mixinTypes, ", ");
-    return null;
-  }
-
-  void indent() {
-    _writer.print(_indentString);
-  }
-
-  void indentDec() {
-    _indentLevel -= 2;
-    _indentString = StringUtils.repeat(" ", _indentLevel);
-  }
-
-  void indentInc() {
-    _indentLevel += 2;
-    _indentString = StringUtils.repeat(" ", _indentLevel);
-  }
-
-  void nl() {
-    _writer.print("\n");
-  }
-
-  void nl2() {
-    nl();
-    indent();
-  }
-
-  void printLeadingComments(Statement statement) {
-    List<String> comments = statement.getProperty(COMMENTS_KEY) as List<String>;
-    if (comments == null) {
-      return;
-    }
-    for (String comment in comments) {
-      _writer.print(comment);
-      _writer.print("\n");
-      indent();
+    switch (parameterCount) {
+      case 0:
+        return trampoline(target);
+      case 1:
+        return trampoline(target, arguments[0]);
+      case 2:
+        return trampoline(target, arguments[0], arguments[1]);
+      case 3:
+        return trampoline(target, arguments[0], arguments[1], arguments[2]);
+      case 4:
+        return trampoline(target, arguments[0], arguments[1], arguments[2], arguments[3]);
+      default:
+        throw new IllegalArgumentException("Not implemented for > 4 arguments");
     }
   }
-
-  /**
-   * Safely visit the given node.
-   *
-   * @param node the node to be visited
-   */
-  void visitNode(AstNode node) {
-    if (node != null) {
-      node.accept(this);
-    }
-  }
-
-  /**
-   * Print a list of nodes without any separation.
-   *
-   * @param nodes the nodes to be printed
-   * @param separator the separator to be printed between adjacent nodes
-   */
-  void visitNodeList(NodeList<AstNode> nodes) {
-    visitNodeListWithSeparator(nodes, "");
-  }
-
-  /**
-   * Print a list of nodes, separated by the given separator.
-   *
-   * @param nodes the nodes to be printed
-   * @param separator the separator to be printed between adjacent nodes
-   */
-  void visitNodeListWithSeparator(NodeList<AstNode> nodes, String separator) {
-    visitNodeListWithSeparatorPrefixAndSuffix("", nodes, separator, "");
-  }
-
-  /**
-   * Print a list of nodes, separated by the given separator.
-   *
-   * @param prefix the prefix to be printed if the list is not empty
-   * @param nodes the nodes to be printed
-   * @param separator the separator to be printed between adjacent nodes
-   */
-  void visitNodeListWithSeparatorAndPrefix(String prefix, NodeList<AstNode> nodes, String separator) {
-    visitNodeListWithSeparatorPrefixAndSuffix(prefix, nodes, separator, "");
-  }
-
-  /**
-   * Print a list of nodes, separated by the given separator.
-   *
-   * @param nodes the nodes to be printed
-   * @param separator the separator to be printed between adjacent nodes
-   * @param suffix the suffix to be printed if the list is not empty
-   */
-  void visitNodeListWithSeparatorAndSuffix(NodeList<AstNode> nodes, String separator, String suffix) {
-    visitNodeListWithSeparatorPrefixAndSuffix("", nodes, separator, suffix);
-  }
-
-  /**
-   * Print a list of nodes, separated by the given separator.
-   *
-   * @param prefix the prefix to be printed if the list is not empty
-   * @param nodes the nodes to be printed
-   * @param separator the separator to be printed between adjacent nodes
-   * @param suffix the suffix to be printed if the list is not empty
-   */
-  void visitNodeListWithSeparatorPrefixAndSuffix(String prefix, NodeList<AstNode> nodes, String separator, String suffix) {
-    if (nodes != null) {
-      int size = nodes.length;
-      if (size != 0) {
-        // prefix
-        _writer.print(prefix);
-        if (prefix.endsWith("\n")) {
-          indent();
-        }
-        // nodes
-        bool newLineSeparator = separator.endsWith("\n");
-        for (int i = 0; i < size; i++) {
-          if (i > 0) {
-            _writer.print(separator);
-            if (newLineSeparator) {
-              indent();
-            }
-          }
-          AstNode node = nodes[i];
-          if (node is Statement) {
-            printLeadingComments(node);
-          }
-          node.accept(this);
-        }
-        // suffix
-        _writer.print(suffix);
-      }
-    }
-  }
-
-  /**
-   * Safely visit the given node, printing the prefix before the node if it is non-<code>null</code>
-   * .
-   *
-   * @param prefix the prefix to be printed if there is a node to visit
-   * @param node the node to be visited
-   */
-  void visitNodeWithPrefix(String prefix, AstNode node) {
-    if (node != null) {
-      _writer.print(prefix);
-      node.accept(this);
-    }
-  }
-
-  /**
-   * Safely visit the given node, printing the suffix after the node if it is non-<code>null</code>.
-   *
-   * @param suffix the suffix to be printed if there is a node to visit
-   * @param node the node to be visited
-   */
-  void visitNodeWithSuffix(AstNode node, String suffix) {
-    if (node != null) {
-      node.accept(this);
-      _writer.print(suffix);
-    }
-  }
-
-  /**
-   * Print a list of tokens, separated by the given separator.
-   *
-   * @param tokens the tokens to be printed
-   * @param separator the separator to be printed between adjacent tokens
-   */
-  void visitTokenListWithSeparator(List<Token> tokens, String separator) {
-    int size = tokens.length;
-    for (int i = 0; i < size; i++) {
-      if ("\n" == separator) {
-        _writer.print("\n");
-        indent();
-      } else if (i > 0) {
-        _writer.print(separator);
-      }
-      _writer.print(tokens[i].lexeme);
-    }
-  }
-
-  /**
-   * Safely visit the given node, printing the suffix after the node if it is non-<code>null</code>.
-   *
-   * @param suffix the suffix to be printed if there is a node to visit
-   * @param node the node to be visited
-   */
-  void visitTokenWithSuffix(Token token, String suffix) {
-    if (token != null) {
-      _writer.print(token.lexeme);
-      _writer.print(suffix);
-    }
-  }
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 4d27e6b..6137bf0 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -85,7 +85,7 @@
       List<AngularPropertyElement> properties = AngularPropertyElement.EMPTY_ARRAY;
       // maybe name
       if (toolkitObject is AngularElement) {
-        if (isNameCoveredByLiteral(toolkitObject, node)) {
+        if (_isNameCoveredByLiteral(toolkitObject, node)) {
           return toolkitObject;
         }
       }
@@ -93,7 +93,7 @@
       if (toolkitObject is AngularHasSelectorElement) {
         AngularHasSelectorElement hasSelector = toolkitObject;
         AngularSelectorElement selector = hasSelector.selector;
-        if (isNameCoveredByLiteral(selector, node)) {
+        if (_isNameCoveredByLiteral(selector, node)) {
           return selector;
         }
       }
@@ -110,7 +110,7 @@
       // check properties
       for (AngularPropertyElement property in properties) {
         // property name (use complete node range)
-        if (isNameCoveredByLiteral(property, node)) {
+        if (_isNameCoveredByLiteral(property, node)) {
           return property;
         }
         // field name (use complete node range, including @, => and <=>)
@@ -167,7 +167,7 @@
   /**
    * Returns the [FieldElement] of the first field in the given [FieldDeclaration].
    */
-  static FieldElement getOnlyFieldElement(FieldDeclaration fieldDeclaration) {
+  static FieldElement _getOnlyFieldElement(FieldDeclaration fieldDeclaration) {
     NodeList<VariableDeclaration> fields = fieldDeclaration.fields.variables;
     return fields[0].element as FieldElement;
   }
@@ -176,7 +176,7 @@
    * If given [Annotation] has one argument and it is [SimpleStringLiteral], returns it,
    * otherwise returns `null`.
    */
-  static SimpleStringLiteral getOnlySimpleStringLiteralArgument(Annotation annotation) {
+  static SimpleStringLiteral _getOnlySimpleStringLiteralArgument(Annotation annotation) {
     SimpleStringLiteral nameLiteral = null;
     ArgumentList argsNode = annotation.arguments;
     if (argsNode != null) {
@@ -195,7 +195,7 @@
    * Checks if the name range of the given [Element] is completely covered by the given
    * [SimpleStringLiteral].
    */
-  static bool isNameCoveredByLiteral(Element element, AstNode node) {
+  static bool _isNameCoveredByLiteral(Element element, AstNode node) {
     if (element != null) {
       String name = element.name;
       if (name != null) {
@@ -210,7 +210,7 @@
   /**
    * Parses given [SimpleStringLiteral] using [parseSelector].
    */
-  static AngularSelectorElement parseSelectorFromString(SimpleStringLiteral literal) {
+  static AngularSelectorElement _parseSelectorFromString(SimpleStringLiteral literal) {
     int offset = literal.valueOffset;
     String text = literal.stringValue;
     return parseSelector(offset, text);
@@ -268,7 +268,7 @@
    * Builds Angular specific element models and adds them to the existing Dart elements.
    */
   void build() {
-    parseViews();
+    _parseViews();
     // process classes
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
@@ -284,23 +284,23 @@
           }
           this._annotation = annotation;
           // @NgFilter
-          if (isAngularAnnotation(annotation, _NG_FILTER)) {
-            parseNgFilter();
+          if (_isAngularAnnotation(annotation, _NG_FILTER)) {
+            _parseNgFilter();
             continue;
           }
           // @NgComponent
-          if (isAngularAnnotation(annotation, _NG_COMPONENT)) {
-            parseNgComponent();
+          if (_isAngularAnnotation(annotation, _NG_COMPONENT)) {
+            _parseNgComponent();
             continue;
           }
           // @NgController
-          if (isAngularAnnotation(annotation, _NG_CONTROLLER)) {
-            parseNgController();
+          if (_isAngularAnnotation(annotation, _NG_CONTROLLER)) {
+            _parseNgController();
             continue;
           }
           // @NgDirective
-          if (isAngularAnnotation(annotation, _NG_DIRECTIVE)) {
-            parseNgDirective();
+          if (_isAngularAnnotation(annotation, _NG_DIRECTIVE)) {
+            _parseNgDirective();
             continue;
           }
         }
@@ -317,7 +317,7 @@
    * @return the argument [Expression] with given name form [annotation], may be
    *         `null` if not found.
    */
-  Expression getArgument(String name) {
+  Expression _getArgument(String name) {
     List<Expression> arguments = _annotation.arguments.arguments;
     for (Expression argument in arguments) {
       if (argument is NamedExpression) {
@@ -334,36 +334,36 @@
   /**
    * @return the [String] value of the named argument.
    */
-  String getStringArgument(String name) => getStringLiteral(name).value;
+  String _getStringArgument(String name) => _getStringLiteral(name).value;
 
   /**
    * @return the offset of the value of the named argument.
    */
-  int getStringArgumentOffset(String name) {
-    Expression argument = getArgument(name);
+  int _getStringArgumentOffset(String name) {
+    Expression argument = _getArgument(name);
     return (argument as SimpleStringLiteral).valueOffset;
   }
 
   /**
    * @return the [SimpleStringLiteral] of the named argument.
    */
-  SimpleStringLiteral getStringLiteral(String name) {
-    Expression argument = getArgument(name);
+  SimpleStringLiteral _getStringLiteral(String name) {
+    Expression argument = _getArgument(name);
     return argument as SimpleStringLiteral;
   }
 
   /**
    * Checks if [namedArguments] has string value for the argument with the given name.
    */
-  bool hasStringArgument(String name) {
-    Expression argument = getArgument(name);
+  bool _hasStringArgument(String name) {
+    Expression argument = _getArgument(name);
     return argument is SimpleStringLiteral;
   }
 
   /**
    * Checks if given [Annotation] is an annotation with required name.
    */
-  bool isAngularAnnotation(Annotation annotation, String name) {
+  bool _isAngularAnnotation(Annotation annotation, String name) {
     Element element = annotation.element;
     if (element is ConstructorElement) {
       ConstructorElement constructorElement = element;
@@ -372,41 +372,41 @@
     return false;
   }
 
-  void parseNgComponent() {
+  void _parseNgComponent() {
     bool isValid = true;
     // publishAs
     String name = null;
     int nameOffset = -1;
-    if (hasStringArgument(_PUBLISH_AS)) {
-      name = getStringArgument(_PUBLISH_AS);
-      nameOffset = getStringArgumentOffset(_PUBLISH_AS);
+    if (_hasStringArgument(_PUBLISH_AS)) {
+      name = _getStringArgument(_PUBLISH_AS);
+      nameOffset = _getStringArgumentOffset(_PUBLISH_AS);
     }
     // selector
     AngularSelectorElement selector = null;
-    if (!hasStringArgument(_SELECTOR)) {
-      reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
+    if (!_hasStringArgument(_SELECTOR)) {
+      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
       isValid = false;
     } else {
-      SimpleStringLiteral selectorLiteral = getStringLiteral(_SELECTOR);
-      selector = parseSelectorFromString(selectorLiteral);
+      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
+      selector = _parseSelectorFromString(selectorLiteral);
       if (selector == null) {
-        reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
+        _reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
         isValid = false;
       }
     }
     // templateUrl
     String templateUri = null;
     int templateUriOffset = -1;
-    if (hasStringArgument(_TEMPLATE_URL)) {
-      templateUri = getStringArgument(_TEMPLATE_URL);
-      templateUriOffset = getStringArgumentOffset(_TEMPLATE_URL);
+    if (_hasStringArgument(_TEMPLATE_URL)) {
+      templateUri = _getStringArgument(_TEMPLATE_URL);
+      templateUriOffset = _getStringArgumentOffset(_TEMPLATE_URL);
     }
     // cssUrl
     String styleUri = null;
     int styleUriOffset = -1;
-    if (hasStringArgument(_CSS_URL)) {
-      styleUri = getStringArgument(_CSS_URL);
-      styleUriOffset = getStringArgumentOffset(_CSS_URL);
+    if (_hasStringArgument(_CSS_URL)) {
+      styleUri = _getStringArgument(_CSS_URL);
+      styleUriOffset = _getStringArgumentOffset(_CSS_URL);
     }
     // create
     if (isValid) {
@@ -416,8 +416,8 @@
       element.templateUriOffset = templateUriOffset;
       element.styleUri = styleUri;
       element.styleUriOffset = styleUriOffset;
-      element.properties = parseNgComponentProperties();
-      element.scopeProperties = parseScopeProperties();
+      element.properties = _parseNgComponentProperties();
+      element.scopeProperties = _parseScopeProperties();
       _classToolkitObjects.add(element);
     }
   }
@@ -425,17 +425,17 @@
   /**
    * Parses [AngularPropertyElement]s from [annotation] and [classDeclaration].
    */
-  List<AngularPropertyElement> parseNgComponentProperties() {
+  List<AngularPropertyElement> _parseNgComponentProperties() {
     List<AngularPropertyElement> properties = [];
-    parseNgComponentProperties_fromMap(properties);
-    parseNgComponentProperties_fromFields(properties);
+    _parseNgComponentProperties_fromMap(properties);
+    _parseNgComponentProperties_fromFields(properties);
     return new List.from(properties);
   }
 
   /**
    * Parses [AngularPropertyElement]s from [annotation].
    */
-  void parseNgComponentProperties_fromFields(List<AngularPropertyElement> properties) {
+  void _parseNgComponentProperties_fromFields(List<AngularPropertyElement> properties) {
     NodeList<ClassMember> members = _classDeclaration.members;
     for (ClassMember member in members) {
       if (member is FieldDeclaration) {
@@ -443,21 +443,21 @@
         for (Annotation annotation in fieldDeclaration.metadata) {
           // prepare property kind (if property annotation at all)
           AngularPropertyKind kind = null;
-          if (isAngularAnnotation(annotation, _NG_ATTR)) {
+          if (_isAngularAnnotation(annotation, _NG_ATTR)) {
             kind = AngularPropertyKind.ATTR;
-          } else if (isAngularAnnotation(annotation, _NG_CALLBACK)) {
+          } else if (_isAngularAnnotation(annotation, _NG_CALLBACK)) {
             kind = AngularPropertyKind.CALLBACK;
-          } else if (isAngularAnnotation(annotation, _NG_ONE_WAY)) {
+          } else if (_isAngularAnnotation(annotation, _NG_ONE_WAY)) {
             kind = AngularPropertyKind.ONE_WAY;
-          } else if (isAngularAnnotation(annotation, _NG_ONE_WAY_ONE_TIME)) {
+          } else if (_isAngularAnnotation(annotation, _NG_ONE_WAY_ONE_TIME)) {
             kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-          } else if (isAngularAnnotation(annotation, _NG_TWO_WAY)) {
+          } else if (_isAngularAnnotation(annotation, _NG_TWO_WAY)) {
             kind = AngularPropertyKind.TWO_WAY;
           }
           // add property
           if (kind != null) {
-            SimpleStringLiteral nameLiteral = getOnlySimpleStringLiteralArgument(annotation);
-            FieldElement field = getOnlyFieldElement(fieldDeclaration);
+            SimpleStringLiteral nameLiteral = _getOnlySimpleStringLiteralArgument(annotation);
+            FieldElement field = _getOnlyFieldElement(fieldDeclaration);
             if (nameLiteral != null && field != null) {
               AngularPropertyElementImpl property = new AngularPropertyElementImpl(nameLiteral.value, nameLiteral.valueOffset);
               property.field = field;
@@ -473,15 +473,15 @@
   /**
    * Parses [AngularPropertyElement]s from [annotation].
    */
-  void parseNgComponentProperties_fromMap(List<AngularPropertyElement> properties) {
-    Expression mapExpression = getArgument("map");
+  void _parseNgComponentProperties_fromMap(List<AngularPropertyElement> properties) {
+    Expression mapExpression = _getArgument("map");
     // may be not properties
     if (mapExpression == null) {
       return;
     }
     // prepare map literal
     if (mapExpression is! MapLiteral) {
-      reportErrorForNode(AngularCode.INVALID_PROPERTY_MAP, mapExpression, []);
+      _reportErrorForNode(AngularCode.INVALID_PROPERTY_MAP, mapExpression, []);
       return;
     }
     MapLiteral mapLiteral = mapExpression as MapLiteral;
@@ -490,7 +490,7 @@
       // prepare property name
       Expression nameExpression = entry.key;
       if (nameExpression is! SimpleStringLiteral) {
-        reportErrorForNode(AngularCode.INVALID_PROPERTY_NAME, nameExpression, []);
+        _reportErrorForNode(AngularCode.INVALID_PROPERTY_NAME, nameExpression, []);
         continue;
       }
       SimpleStringLiteral nameLiteral = nameExpression as SimpleStringLiteral;
@@ -499,7 +499,7 @@
       // prepare field specification
       Expression specExpression = entry.value;
       if (specExpression is! SimpleStringLiteral) {
-        reportErrorForNode(AngularCode.INVALID_PROPERTY_SPEC, specExpression, []);
+        _reportErrorForNode(AngularCode.INVALID_PROPERTY_SPEC, specExpression, []);
         continue;
       }
       SimpleStringLiteral specLiteral = specExpression as SimpleStringLiteral;
@@ -523,7 +523,7 @@
         kind = AngularPropertyKind.TWO_WAY;
         fieldNameOffset = 3;
       } else {
-        reportErrorForNode(AngularCode.INVALID_PROPERTY_KIND, specLiteral, [spec]);
+        _reportErrorForNode(AngularCode.INVALID_PROPERTY_KIND, specLiteral, [spec]);
         continue;
       }
       String fieldName = spec.substring(fieldNameOffset);
@@ -531,7 +531,7 @@
       // prepare field
       PropertyAccessorElement setter = _classElement.type.lookUpSetter(fieldName, _classElement.library);
       if (setter == null) {
-        reportErrorForOffset(AngularCode.INVALID_PROPERTY_FIELD, fieldNameOffset, fieldName.length, [fieldName]);
+        _reportErrorForOffset(AngularCode.INVALID_PROPERTY_FIELD, fieldNameOffset, fieldName.length, [fieldName]);
         continue;
       }
       FieldElement field = setter.variable as FieldElement;
@@ -544,48 +544,48 @@
     }
   }
 
-  void parseNgController() {
+  void _parseNgController() {
     bool isValid = true;
     // publishAs
-    if (!hasStringArgument(_PUBLISH_AS)) {
-      reportErrorForAnnotation(AngularCode.MISSING_PUBLISH_AS, []);
+    if (!_hasStringArgument(_PUBLISH_AS)) {
+      _reportErrorForAnnotation(AngularCode.MISSING_PUBLISH_AS, []);
       isValid = false;
     }
     // selector
     AngularSelectorElement selector = null;
-    if (!hasStringArgument(_SELECTOR)) {
-      reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
+    if (!_hasStringArgument(_SELECTOR)) {
+      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
       isValid = false;
     } else {
-      SimpleStringLiteral selectorLiteral = getStringLiteral(_SELECTOR);
-      selector = parseSelectorFromString(selectorLiteral);
+      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
+      selector = _parseSelectorFromString(selectorLiteral);
       if (selector == null) {
-        reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
+        _reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
         isValid = false;
       }
     }
     // create
     if (isValid) {
-      String name = getStringArgument(_PUBLISH_AS);
-      int nameOffset = getStringArgumentOffset(_PUBLISH_AS);
+      String name = _getStringArgument(_PUBLISH_AS);
+      int nameOffset = _getStringArgumentOffset(_PUBLISH_AS);
       AngularControllerElementImpl element = new AngularControllerElementImpl(name, nameOffset);
       element.selector = selector;
       _classToolkitObjects.add(element);
     }
   }
 
-  void parseNgDirective() {
+  void _parseNgDirective() {
     bool isValid = true;
     // selector
     AngularSelectorElement selector = null;
-    if (!hasStringArgument(_SELECTOR)) {
-      reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
+    if (!_hasStringArgument(_SELECTOR)) {
+      _reportErrorForAnnotation(AngularCode.MISSING_SELECTOR, []);
       isValid = false;
     } else {
-      SimpleStringLiteral selectorLiteral = getStringLiteral(_SELECTOR);
-      selector = parseSelectorFromString(selectorLiteral);
+      SimpleStringLiteral selectorLiteral = _getStringLiteral(_SELECTOR);
+      selector = _parseSelectorFromString(selectorLiteral);
       if (selector == null) {
-        reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
+        _reportErrorForArgument(_SELECTOR, AngularCode.CANNOT_PARSE_SELECTOR, [selectorLiteral]);
         isValid = false;
       }
     }
@@ -594,27 +594,27 @@
       int offset = _annotation.offset;
       AngularDirectiveElementImpl element = new AngularDirectiveElementImpl(offset);
       element.selector = selector;
-      element.properties = parseNgComponentProperties();
+      element.properties = _parseNgComponentProperties();
       _classToolkitObjects.add(element);
     }
   }
 
-  void parseNgFilter() {
+  void _parseNgFilter() {
     bool isValid = true;
     // name
-    if (!hasStringArgument(_NAME)) {
-      reportErrorForAnnotation(AngularCode.MISSING_NAME, []);
+    if (!_hasStringArgument(_NAME)) {
+      _reportErrorForAnnotation(AngularCode.MISSING_NAME, []);
       isValid = false;
     }
     // create
     if (isValid) {
-      String name = getStringArgument(_NAME);
-      int nameOffset = getStringArgumentOffset(_NAME);
+      String name = _getStringArgument(_NAME);
+      int nameOffset = _getStringArgumentOffset(_NAME);
       _classToolkitObjects.add(new AngularFilterElementImpl(name, nameOffset));
     }
   }
 
-  List<AngularScopePropertyElement> parseScopeProperties() {
+  List<AngularScopePropertyElement> _parseScopeProperties() {
     List<AngularScopePropertyElement> properties = [];
     _classDeclaration.accept(new RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties(properties));
     return new List.from(properties);
@@ -624,7 +624,7 @@
    * Create [AngularViewElement] for each valid <code>view('template.html')</code> invocation,
    * where <code>view</code> is <code>ViewFactory</code>.
    */
-  void parseViews() {
+  void _parseViews() {
     List<AngularViewElement> views = [];
     _unit.accept(new RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(views));
     if (!views.isEmpty) {
@@ -633,22 +633,22 @@
     }
   }
 
-  void reportErrorForAnnotation(ErrorCode errorCode, List<Object> arguments) {
-    reportErrorForNode(errorCode, _annotation, arguments);
+  void _reportErrorForAnnotation(ErrorCode errorCode, List<Object> arguments) {
+    _reportErrorForNode(errorCode, _annotation, arguments);
   }
 
-  void reportErrorForArgument(String argumentName, ErrorCode errorCode, List<Object> arguments) {
-    Expression argument = getArgument(argumentName);
-    reportErrorForNode(errorCode, argument, arguments);
+  void _reportErrorForArgument(String argumentName, ErrorCode errorCode, List<Object> arguments) {
+    Expression argument = _getArgument(argumentName);
+    _reportErrorForNode(errorCode, argument, arguments);
   }
 
-  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+  void _reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
     int offset = node.offset;
     int length = node.length;
-    reportErrorForOffset(errorCode, offset, length, arguments);
+    _reportErrorForOffset(errorCode, offset, length, arguments);
   }
 
-  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
   }
 }
@@ -658,20 +658,21 @@
 
   RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties(this.properties) : super();
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
-    addProperty(node);
+    _addProperty(node);
     return super.visitAssignmentExpression(node);
   }
 
-  void addProperty(AssignmentExpression node) {
+  void _addProperty(AssignmentExpression node) {
     // try to find "name" in scope[name]
-    SimpleStringLiteral nameNode = getNameNode(node.leftHandSide);
+    SimpleStringLiteral nameNode = _getNameNode(node.leftHandSide);
     if (nameNode == null) {
       return;
     }
     // prepare unique
     String name = nameNode.stringValue;
-    if (hasPropertyWithName(name)) {
+    if (_hasPropertyWithName(name)) {
       return;
     }
     // do add property
@@ -681,19 +682,19 @@
     properties.add(property);
   }
 
-  SimpleStringLiteral getNameNode(Expression node) {
+  SimpleStringLiteral _getNameNode(Expression node) {
     if (node is IndexExpression) {
       IndexExpression indexExpression = node;
       Expression target = indexExpression.target;
       Expression index = indexExpression.index;
-      if (index is SimpleStringLiteral && isContext(target)) {
+      if (index is SimpleStringLiteral && _isContext(target)) {
         return index;
       }
     }
     return null;
   }
 
-  bool hasPropertyWithName(String name) {
+  bool _hasPropertyWithName(String name) {
     for (AngularScopePropertyElement property in properties) {
       if (property.name == name) {
         return true;
@@ -702,19 +703,19 @@
     return false;
   }
 
-  bool isContext(Expression target) {
+  bool _isContext(Expression target) {
     if (target is PrefixedIdentifier) {
       PrefixedIdentifier prefixed = target;
       SimpleIdentifier prefix = prefixed.prefix;
       SimpleIdentifier identifier = prefixed.identifier;
-      return (identifier.name == "context") && isScope(prefix);
+      return (identifier.name == "context") && _isScope(prefix);
     }
     return false;
   }
 
-  bool isScope(Expression target) {
+  bool _isScope(Expression target) {
     if (target != null) {
-      Type2 type = target.bestType;
+      DartType type = target.bestType;
       if (type is InterfaceType) {
         InterfaceType interfaceType = type;
         return interfaceType.name == "Scope";
@@ -729,12 +730,13 @@
 
   RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(this.views) : super();
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
-    addView(node);
+    _addView(node);
     return super.visitMethodInvocation(node);
   }
 
-  void addView(MethodInvocation node) {
+  void _addView(MethodInvocation node) {
     // only one argument
     List<Expression> arguments = node.argumentList.arguments;
     if (arguments.length != 1) {
@@ -751,7 +753,7 @@
       return;
     }
     // should be ViewFactory
-    if (!isViewFactory(node.methodName)) {
+    if (!_isViewFactory(node.methodName)) {
       return;
     }
     // add AngularViewElement
@@ -760,13 +762,13 @@
     views.add(new AngularViewElementImpl(templateUri, templateUriOffset));
   }
 
-  bool isViewFactory(Expression target) {
+  bool _isViewFactory(Expression target) {
     if (target is SimpleIdentifier) {
       SimpleIdentifier identifier = target;
       Element element = identifier.staticElement;
       if (element is VariableElement) {
         VariableElement variable = element;
-        Type2 type = variable.type;
+        DartType type = variable.type;
         if (type is InterfaceType) {
           InterfaceType interfaceType = type;
           return interfaceType.name == "ViewFactory";
@@ -861,6 +863,7 @@
     _currentHolder = initialHolder;
   }
 
+  @override
   Object visitBlock(Block node) {
     bool wasInField = _inFieldContext;
     _inFieldContext = false;
@@ -872,6 +875,7 @@
     return null;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
@@ -888,6 +892,7 @@
     return super.visitCatchClause(node);
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ElementHolder holder = new ElementHolder();
     _isValidMixin = true;
@@ -901,7 +906,7 @@
     try {
       List<ClassMember> nonFields = new List<ClassMember>();
       node.visitChildren(new UnifyingAstVisitor_ElementBuilder_visitClassDeclaration(this, nonFields));
-      buildFieldMap(holder.fieldsWithoutFlushing);
+      _buildFieldMap(holder.fieldsWithoutFlushing);
       int count = nonFields.length;
       for (int i = 0; i < count; i++) {
         nonFields[i].accept(this);
@@ -912,7 +917,7 @@
     SimpleIdentifier className = node.name;
     ClassElementImpl element = new ClassElementImpl(className);
     List<TypeParameterElement> typeParameters = holder.typeParameters;
-    List<Type2> typeArguments = createTypeParameterTypes(typeParameters);
+    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
     InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
     interfaceType.typeArguments = typeArguments;
     element.type = interfaceType;
@@ -921,7 +926,7 @@
       //
       // Create the default constructor.
       //
-      constructors = createDefaultConstructors(interfaceType);
+      constructors = _createDefaultConstructors(interfaceType);
     }
     element.abstract = node.abstractKeyword != null;
     element.accessors = holder.accessors;
@@ -942,22 +947,23 @@
     return null;
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     _functionTypesToFix = new List<FunctionTypeImpl>();
-    visitChildren(holder, node);
+    _visitChildren(holder, node);
     SimpleIdentifier className = node.name;
     ClassElementImpl element = new ClassElementImpl(className);
     element.abstract = node.abstractKeyword != null;
     element.typedef = true;
     List<TypeParameterElement> typeParameters = holder.typeParameters;
     element.typeParameters = typeParameters;
-    List<Type2> typeArguments = createTypeParameterTypes(typeParameters);
+    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
     InterfaceTypeImpl interfaceType = new InterfaceTypeImpl.con1(element);
     interfaceType.typeArguments = typeArguments;
     element.type = interfaceType;
     // set default constructor
-    element.constructors = createDefaultConstructors(interfaceType);
+    element.constructors = _createDefaultConstructors(interfaceType);
     for (FunctionTypeImpl functionType in _functionTypesToFix) {
       functionType.typeArguments = typeArguments;
     }
@@ -968,13 +974,14 @@
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     _isValidMixin = false;
     ElementHolder holder = new ElementHolder();
     bool wasInFunction = _inFunction;
     _inFunction = true;
     try {
-      visitChildren(holder, node);
+      _visitChildren(holder, node);
     } finally {
       _inFunction = wasInFunction;
     }
@@ -1002,6 +1009,7 @@
     return null;
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
     sc.Token keyword = node.keyword;
@@ -1010,13 +1018,14 @@
     int declarationEnd = node.offset + node.length;
     int statementEnd = statement.offset + statement.length;
     element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1);
-    element.const3 = matches(keyword, sc.Keyword.CONST);
-    element.final2 = matches(keyword, sc.Keyword.FINAL);
+    element.const3 = _matches(keyword, sc.Keyword.CONST);
+    element.final2 = _matches(keyword, sc.Keyword.FINAL);
     _currentHolder.addLocalVariable(element);
     variableName.staticElement = element;
     return super.visitDeclaredIdentifier(node);
   }
 
+  @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     ElementHolder holder = new ElementHolder();
     NormalFormalParameter normalParameter = node.parameter;
@@ -1037,7 +1046,7 @@
     // set initializer, default value range
     Expression defaultValue = node.defaultValue;
     if (defaultValue != null) {
-      visit(holder, defaultValue);
+      _visit(holder, defaultValue);
       FunctionElementImpl initializer = new FunctionElementImpl.con2(defaultValue.beginToken.offset);
       initializer.functions = holder.functions;
       initializer.labels = holder.labels;
@@ -1048,7 +1057,7 @@
       parameter.setDefaultValueRange(defaultValue.offset, defaultValue.length);
     }
     // visible range
-    setParameterVisibleRange(node, parameter);
+    _setParameterVisibleRange(node, parameter);
     _currentHolder.addParameter(parameter);
     parameterName.staticElement = parameter;
     normalParameter.accept(this);
@@ -1056,6 +1065,7 @@
     return null;
   }
 
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     bool wasInField = _inFieldContext;
     _inFieldContext = true;
@@ -1067,6 +1077,7 @@
     return null;
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -1085,12 +1096,13 @@
     // The children of this parameter include any parameters defined on the type of this parameter.
     //
     ElementHolder holder = new ElementHolder();
-    visitChildren(holder, node);
+    _visitChildren(holder, node);
     (node.element as ParameterElementImpl).parameters = holder.parameters;
     holder.validate();
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression expression = node.functionExpression;
     if (expression != null) {
@@ -1098,7 +1110,7 @@
       bool wasInFunction = _inFunction;
       _inFunction = true;
       try {
-        visitChildren(holder, expression);
+        _visitChildren(holder, expression);
       } finally {
         _inFunction = wasInFunction;
       }
@@ -1135,7 +1147,7 @@
           variable.synthetic = true;
           _currentHolder.addTopLevelVariable(variable);
         }
-        if (matches(property, sc.Keyword.GET)) {
+        if (_matches(property, sc.Keyword.GET)) {
           PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con1(propertyNameNode);
           getter.functions = holder.functions;
           getter.labels = holder.labels;
@@ -1168,12 +1180,13 @@
     return null;
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     ElementHolder holder = new ElementHolder();
     bool wasInFunction = _inFunction;
     _inFunction = true;
     try {
-      visitChildren(holder, node);
+      _visitChildren(holder, node);
     } finally {
       _inFunction = wasInFunction;
     }
@@ -1201,9 +1214,10 @@
     return null;
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     ElementHolder holder = new ElementHolder();
-    visitChildren(holder, node);
+    _visitChildren(holder, node);
     SimpleIdentifier aliasName = node.name;
     List<ParameterElement> parameters = holder.parameters;
     List<TypeParameterElement> typeParameters = holder.typeParameters;
@@ -1211,7 +1225,7 @@
     element.parameters = parameters;
     element.typeParameters = typeParameters;
     FunctionTypeImpl type = new FunctionTypeImpl.con2(element);
-    type.typeArguments = createTypeParameterTypes(typeParameters);
+    type.typeArguments = _createTypeParameterTypes(typeParameters);
     element.type = type;
     _currentHolder.addTypeAlias(element);
     aliasName.staticElement = element;
@@ -1219,12 +1233,13 @@
     return null;
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
       ParameterElementImpl parameter = new ParameterElementImpl.con1(parameterName);
       parameter.parameterKind = node.kind;
-      setParameterVisibleRange(node, parameter);
+      _setParameterVisibleRange(node, parameter);
       _currentHolder.addParameter(parameter);
       parameterName.staticElement = parameter;
     }
@@ -1232,12 +1247,13 @@
     // The children of this parameter include any parameters defined on the type of this parameter.
     //
     ElementHolder holder = new ElementHolder();
-    visitChildren(holder, node);
+    _visitChildren(holder, node);
     (node.element as ParameterElementImpl).parameters = holder.parameters;
     holder.validate();
     return null;
   }
 
+  @override
   Object visitLabeledStatement(LabeledStatement node) {
     bool onSwitchStatement = node.statement is SwitchStatement;
     for (Label label in node.labels) {
@@ -1249,12 +1265,13 @@
     return super.visitLabeledStatement(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ElementHolder holder = new ElementHolder();
     bool wasInFunction = _inFunction;
     _inFunction = true;
     try {
-      visitChildren(holder, node);
+      _visitChildren(holder, node);
     } finally {
       _inFunction = wasInFunction;
     }
@@ -1286,7 +1303,7 @@
         field.synthetic = true;
         _currentHolder.addField(field);
       }
-      if (matches(property, sc.Keyword.GET)) {
+      if (_matches(property, sc.Keyword.GET)) {
         PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con1(propertyNameNode);
         getter.functions = holder.functions;
         getter.labels = holder.labels;
@@ -1305,7 +1322,7 @@
         setter.localVariables = holder.localVariables;
         setter.parameters = holder.parameters;
         setter.variable = field;
-        setter.abstract = node.body is EmptyFunctionBody && !matches(node.externalKeyword, sc.Keyword.EXTERNAL);
+        setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
         setter.setter = true;
         setter.static = isStatic;
         field.setter = setter;
@@ -1318,6 +1335,7 @@
     return null;
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -1325,18 +1343,20 @@
       parameter.const3 = node.isConst;
       parameter.final2 = node.isFinal;
       parameter.parameterKind = node.kind;
-      setParameterVisibleRange(node, parameter);
+      _setParameterVisibleRange(node, parameter);
       _currentHolder.addParameter(parameter);
       parameterName.staticElement = parameter;
     }
     return super.visitSimpleFormalParameter(node);
   }
 
+  @override
   Object visitSuperExpression(SuperExpression node) {
     _isValidMixin = false;
     return super.visitSuperExpression(node);
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
@@ -1347,6 +1367,7 @@
     return super.visitSwitchCase(node);
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
@@ -1357,6 +1378,7 @@
     return super.visitSwitchDefault(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
     TypeParameterElementImpl typeParameter = new TypeParameterElementImpl(parameterName);
@@ -1367,10 +1389,11 @@
     return super.visitTypeParameter(node);
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     sc.Token keyword = (node.parent as VariableDeclarationList).keyword;
-    bool isConst = matches(keyword, sc.Keyword.CONST);
-    bool isFinal = matches(keyword, sc.Keyword.FINAL);
+    bool isConst = _matches(keyword, sc.Keyword.CONST);
+    bool isFinal = _matches(keyword, sc.Keyword.FINAL);
     bool hasInitializer = node.initializer != null;
     VariableElementImpl element;
     if (_inFieldContext) {
@@ -1419,7 +1442,7 @@
       bool wasInFieldContext = _inFieldContext;
       _inFieldContext = false;
       try {
-        visit(holder, node.initializer);
+        _visit(holder, node.initializer);
       } finally {
         _inFieldContext = wasInFieldContext;
       }
@@ -1434,7 +1457,7 @@
     if (element is PropertyInducingElementImpl) {
       PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
       if (_inFieldContext) {
-        (variable as FieldElementImpl).static = matches((node.parent.parent as FieldDeclaration).staticKeyword, sc.Keyword.STATIC);
+        (variable as FieldElementImpl).static = _matches((node.parent.parent as FieldDeclaration).staticKeyword, sc.Keyword.STATIC);
       }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
       getter.getter = true;
@@ -1462,7 +1485,7 @@
    *
    * @param fields the field elements defined in the current class
    */
-  void buildFieldMap(List<FieldElement> fields) {
+  void _buildFieldMap(List<FieldElement> fields) {
     _fieldMap = new Map<String, FieldElement>();
     int count = fields.length;
     for (int i = 0; i < count; i++) {
@@ -1477,7 +1500,7 @@
    * @param interfaceType the interface type for which to create a default constructor
    * @return the [ConstructorElement]s array with the single default constructor element
    */
-  List<ConstructorElement> createDefaultConstructors(InterfaceTypeImpl interfaceType) {
+  List<ConstructorElement> _createDefaultConstructors(InterfaceTypeImpl interfaceType) {
     ConstructorElementImpl constructor = new ConstructorElementImpl.con1(null);
     constructor.synthetic = true;
     constructor.returnType = interfaceType;
@@ -1494,9 +1517,9 @@
    * @param typeParameters the type parameters for which types are to be created
    * @return an array of types corresponding to the given parameters
    */
-  List<Type2> createTypeParameterTypes(List<TypeParameterElement> typeParameters) {
+  List<DartType> _createTypeParameterTypes(List<TypeParameterElement> typeParameters) {
     int typeParameterCount = typeParameters.length;
-    List<Type2> typeArguments = new List<Type2>(typeParameterCount);
+    List<DartType> typeArguments = new List<DartType>(typeParameterCount);
     for (int i = 0; i < typeParameterCount; i++) {
       TypeParameterElementImpl typeParameter = typeParameters[i] as TypeParameterElementImpl;
       TypeParameterTypeImpl typeParameterType = new TypeParameterTypeImpl(typeParameter);
@@ -1513,7 +1536,7 @@
    * @param node the parameter contained in the function whose body is to be returned
    * @return the body of the function that contains the given parameter
    */
-  FunctionBody getFunctionBody(FormalParameter node) {
+  FunctionBody _getFunctionBody(FormalParameter node) {
     AstNode parent = node.parent;
     while (parent != null) {
       if (parent is ConstructorDeclaration) {
@@ -1535,13 +1558,13 @@
    * @param keyword the keyword being tested for
    * @return `true` if the given token is a token for the given keyword
    */
-  bool matches(sc.Token token, sc.Keyword keyword) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical((token as sc.KeywordToken).keyword, keyword);
+  bool _matches(sc.Token token, sc.Keyword keyword) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical((token as sc.KeywordToken).keyword, keyword);
 
   /**
    * Sets the visible source range for formal parameter.
    */
-  void setParameterVisibleRange(FormalParameter node, ParameterElementImpl element) {
-    FunctionBody body = getFunctionBody(node);
+  void _setParameterVisibleRange(FormalParameter node, ParameterElementImpl element) {
+    FunctionBody body = _getFunctionBody(node);
     if (body != null) {
       element.setVisibleRange(body.offset, body.length);
     }
@@ -1553,7 +1576,7 @@
    * @param holder the holder that will gather elements that are built while visiting the children
    * @param node the node to be visited
    */
-  void visit(ElementHolder holder, AstNode node) {
+  void _visit(ElementHolder holder, AstNode node) {
     if (node != null) {
       ElementHolder previousHolder = _currentHolder;
       _currentHolder = holder;
@@ -1571,7 +1594,7 @@
    * @param holder the holder that will gather elements that are built while visiting the children
    * @param node the node whose children are to be visited
    */
-  void visitChildren(ElementHolder holder, AstNode node) {
+  void _visitChildren(ElementHolder holder, AstNode node) {
     if (node != null) {
       ElementHolder previousHolder = _currentHolder;
       _currentHolder = holder;
@@ -1591,16 +1614,19 @@
 
   UnifyingAstVisitor_ElementBuilder_visitClassDeclaration(this.ElementBuilder_this, this.nonFields) : super();
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     nonFields.add(node);
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     nonFields.add(node);
     return null;
   }
 
+  @override
   Object visitNode(AstNode node) => node.accept(ElementBuilder_this);
 }
 
@@ -2031,14 +2057,15 @@
    */
   Set<Library> get resolvedLibraries => _resolvedLibraries;
 
+  @override
   Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
     if (_parentNodes.contains(node)) {
-      return reportCircularity(node);
+      return _reportCircularity(node);
     }
     _parentNodes.add(node);
     try {
       Source htmlSource = _htmlElement.source;
-      ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node);
+      ht.XmlAttributeNode scriptAttribute = _getScriptSourcePath(node);
       String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
       if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePath == null) {
         EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
@@ -2065,10 +2092,10 @@
             Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
             script.scriptSource = scriptSource;
             if (!_context.exists(scriptSource)) {
-              reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
+              _reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
             }
           } on URISyntaxException catch (exception) {
-            reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
+            _reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
           }
         }
         node.scriptElement = script;
@@ -2080,6 +2107,7 @@
     return null;
   }
 
+  @override
   Object visitHtmlUnit(ht.HtmlUnit node) {
     _parentNodes = new List<ht.XmlTagNode>();
     _scripts = new List<HtmlScriptElement>();
@@ -2093,11 +2121,13 @@
     return null;
   }
 
+  @override
   Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
 
+  @override
   Object visitXmlTagNode(ht.XmlTagNode node) {
     if (_parentNodes.contains(node)) {
-      return reportCircularity(node);
+      return _reportCircularity(node);
     }
     _parentNodes.add(node);
     try {
@@ -2114,7 +2144,7 @@
    * @param node the node containing attributes
    * @return the source attribute contained in the given tag
    */
-  ht.XmlAttributeNode getScriptSourcePath(ht.XmlTagNode node) {
+  ht.XmlAttributeNode _getScriptSourcePath(ht.XmlTagNode node) {
     for (ht.XmlAttributeNode attribute in node.attributes) {
       if (attribute.name == _SRC) {
         return attribute;
@@ -2123,7 +2153,7 @@
     return null;
   }
 
-  Object reportCircularity(ht.XmlTagNode node) {
+  Object _reportCircularity(ht.XmlTagNode node) {
     //
     // This should not be possible, but we have an error report that suggests that it happened at
     // least once. This code will guard against infinite recursion and might help us identify the
@@ -2160,7 +2190,7 @@
    * @param length the number of characters to be highlighted
    * @param arguments the arguments used to compose the error message
    */
-  void reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
   }
 
@@ -2173,10 +2203,10 @@
    * @param length the number of characters to be highlighted
    * @param arguments the arguments used to compose the error message
    */
-  void reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
+  void _reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
     int offset = attribute.valueToken.offset + 1;
     int length = attribute.valueToken.length - 2;
-    reportErrorForOffset(errorCode, offset, length, arguments);
+    _reportErrorForOffset(errorCode, offset, length, arguments);
   }
 }
 
@@ -2208,9 +2238,9 @@
    * @return the first parent or grand-parent that is a parenthesized expression, that does not have
    *         a parenthesized expression parent
    */
-  static ParenthesizedExpression wrapParenthesizedExpression(ParenthesizedExpression parenthesizedExpression) {
+  static ParenthesizedExpression _wrapParenthesizedExpression(ParenthesizedExpression parenthesizedExpression) {
     if (parenthesizedExpression.parent is ParenthesizedExpression) {
-      return wrapParenthesizedExpression(parenthesizedExpression.parent as ParenthesizedExpression);
+      return _wrapParenthesizedExpression(parenthesizedExpression.parent as ParenthesizedExpression);
     }
     return parenthesizedExpression;
   }
@@ -2235,27 +2265,31 @@
     this._errorReporter = errorReporter;
   }
 
+  @override
   Object visitAsExpression(AsExpression node) {
-    checkForUnnecessaryCast(node);
+    _checkForUnnecessaryCast(node);
     return super.visitAsExpression(node);
   }
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.TokenType operatorType = node.operator.type;
     if (operatorType != sc.TokenType.EQ) {
-      checkForDeprecatedMemberUse(node.bestElement, node);
+      _checkForDeprecatedMemberUse(node.bestElement, node);
     } else {
-      checkForUseOfVoidResult(node.rightHandSide);
+      _checkForUseOfVoidResult(node.rightHandSide);
     }
     return super.visitAssignmentExpression(node);
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
-    checkForDivisionOptimizationHint(node);
-    checkForDeprecatedMemberUse(node.bestElement, node);
+    _checkForDivisionOptimizationHint(node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
     return super.visitBinaryExpression(node);
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
@@ -2268,70 +2302,83 @@
     }
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
-    checkForDeprecatedMemberUse(node.uriElement, node);
+    _checkForDeprecatedMemberUse(node.uriElement, node);
     return super.visitExportDirective(node);
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    checkForMissingReturn(node.returnType, node.functionExpression.body);
+    _checkForMissingReturn(node.returnType, node.functionExpression.body);
     return super.visitFunctionDeclaration(node);
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
-    checkForDeprecatedMemberUse(node.uriElement, node);
+    _checkForDeprecatedMemberUse(node.uriElement, node);
     return super.visitImportDirective(node);
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
-    checkForDeprecatedMemberUse(node.bestElement, node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
     return super.visitIndexExpression(node);
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    checkForDeprecatedMemberUse(node.staticElement, node);
+    _checkForDeprecatedMemberUse(node.staticElement, node);
     return super.visitInstanceCreationExpression(node);
   }
 
+  @override
   Object visitIsExpression(IsExpression node) {
-    checkAllTypeChecks(node);
+    _checkAllTypeChecks(node);
     return super.visitIsExpression(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     // This was determined to not be a good hint, see: dartbug.com/16029
     //checkForOverridingPrivateMember(node);
-    checkForMissingReturn(node.returnType, node.body);
+    _checkForMissingReturn(node.returnType, node.body);
     return super.visitMethodDeclaration(node);
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
-    checkForDeprecatedMemberUse(node.bestElement, node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
     return super.visitPostfixExpression(node);
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
-    checkForDeprecatedMemberUse(node.bestElement, node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
     return super.visitPrefixExpression(node);
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    checkForDeprecatedMemberUse(node.staticElement, node);
+    _checkForDeprecatedMemberUse(node.staticElement, node);
     return super.visitRedirectingConstructorInvocation(node);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    checkForDeprecatedMemberUseAtIdentifier(node);
+    _checkForDeprecatedMemberUseAtIdentifier(node);
     return super.visitSimpleIdentifier(node);
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    checkForDeprecatedMemberUse(node.staticElement, node);
+    _checkForDeprecatedMemberUse(node.staticElement, node);
     return super.visitSuperConstructorInvocation(node);
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
-    checkForUseOfVoidResult(node.initializer);
+    _checkForUseOfVoidResult(node.initializer);
     return super.visitVariableDeclaration(node);
   }
 
@@ -2346,11 +2393,11 @@
    * @see HintCode#UNNECESSARY_TYPE_CHECK_TRUE
    * @see HintCode#UNNECESSARY_TYPE_CHECK_FALSE
    */
-  bool checkAllTypeChecks(IsExpression node) {
+  bool _checkAllTypeChecks(IsExpression node) {
     Expression expression = node.expression;
     TypeName typeName = node.type;
-    Type2 lhsType = expression.staticType;
-    Type2 rhsType = typeName.type;
+    DartType lhsType = expression.staticType;
+    DartType rhsType = typeName.type;
     if (lhsType == null || rhsType == null) {
       return false;
     }
@@ -2402,7 +2449,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#DEPRECATED_MEMBER_USE
    */
-  bool checkForDeprecatedMemberUse(Element element, AstNode node) {
+  bool _checkForDeprecatedMemberUse(Element element, AstNode node) {
     if (element != null && element.isDeprecated) {
       String displayName = element.displayName;
       if (element is ConstructorElement) {
@@ -2434,7 +2481,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#DEPRECATED_MEMBER_USE
    */
-  bool checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
+  bool _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
     if (identifier.inDeclarationContext()) {
       return false;
     }
@@ -2442,7 +2489,7 @@
     if ((parent is ConstructorName && identical(identifier, parent.name)) || (parent is SuperConstructorInvocation && identical(identifier, parent.constructorName)) || parent is HideCombinator) {
       return false;
     }
-    return checkForDeprecatedMemberUse(identifier.bestElement, identifier);
+    return _checkForDeprecatedMemberUse(identifier.bestElement, identifier);
   }
 
   /**
@@ -2452,7 +2499,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#DIVISION_OPTIMIZATION
    */
-  bool checkForDivisionOptimizationHint(BinaryExpression node) {
+  bool _checkForDivisionOptimizationHint(BinaryExpression node) {
     // Return if the operator is not '/'
     if (node.operator.type != sc.TokenType.SLASH) {
       return false;
@@ -2468,7 +2515,7 @@
     }
     // Report error if the (x/y) has toInt() invoked on it
     if (node.parent is ParenthesizedExpression) {
-      ParenthesizedExpression parenthesizedExpression = wrapParenthesizedExpression(node.parent as ParenthesizedExpression);
+      ParenthesizedExpression parenthesizedExpression = _wrapParenthesizedExpression(node.parent as ParenthesizedExpression);
       if (parenthesizedExpression.parent is MethodInvocation) {
         MethodInvocation methodInvocation = parenthesizedExpression.parent as MethodInvocation;
         if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && methodInvocation.argumentList.arguments.isEmpty) {
@@ -2490,7 +2537,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#MISSING_RETURN
    */
-  bool checkForMissingReturn(TypeName returnType, FunctionBody body) {
+  bool _checkForMissingReturn(TypeName returnType, FunctionBody body) {
     // Check that the method or function has a return type, and a function body
     if (returnType == null || body == null) {
       return false;
@@ -2500,7 +2547,7 @@
       return false;
     }
     // Check that the type is resolvable, and is not "void"
-    Type2 returnTypeType = returnType.type;
+    DartType returnTypeType = returnType.type;
     if (returnTypeType == null || returnTypeType.isVoid) {
       return false;
     }
@@ -2521,7 +2568,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#OVERRIDE_EQUALS_BUT_NOT_HASH_CODE
    */
-  bool checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
+  bool _checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
     ClassElement classElement = node.element;
     if (classElement == null) {
       return false;
@@ -2545,7 +2592,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#OVERRIDDING_PRIVATE_MEMBER
    */
-  bool checkForOverridingPrivateMember(MethodDeclaration node) {
+  bool _checkForOverridingPrivateMember(MethodDeclaration node) {
     // If not in an enclosing class, return false
     if (_enclosingClass == null) {
       return false;
@@ -2613,11 +2660,11 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#UNNECESSARY_CAST
    */
-  bool checkForUnnecessaryCast(AsExpression node) {
+  bool _checkForUnnecessaryCast(AsExpression node) {
     Expression expression = node.expression;
     TypeName typeName = node.type;
-    Type2 lhsType = expression.staticType;
-    Type2 rhsType = typeName.type;
+    DartType lhsType = expression.staticType;
+    DartType rhsType = typeName.type;
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
     // !(x instanceof TypeParameterType) checks.
     if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
@@ -2638,7 +2685,7 @@
    * @return `true` if and only if a hint code is generated on the passed node
    * @see HintCode#USE_OF_VOID_RESULT
    */
-  bool checkForUseOfVoidResult(Expression expression) {
+  bool _checkForUseOfVoidResult(Expression expression) {
     if (expression == null || expression is! MethodInvocation) {
       return false;
     }
@@ -2676,8 +2723,9 @@
     this._errorReporter = errorReporter;
   }
 
+  @override
   Object visitIsExpression(IsExpression node) {
-    checkForIsDoubleHints(node);
+    _checkForIsDoubleHints(node);
     return super.visitIsExpression(node);
   }
 
@@ -2692,9 +2740,9 @@
    * @see HintCode#IS_NOT_DOUBLE
    * @see HintCode#IS_NOT_INT
    */
-  bool checkForIsDoubleHints(IsExpression node) {
+  bool _checkForIsDoubleHints(IsExpression node) {
     TypeName typeName = node.type;
-    Type2 type = typeName.type;
+    DartType type = typeName.type;
     if (type != null && type.element != null) {
       Element element = type.element;
       String typeNameStr = element.name;
@@ -2740,26 +2788,27 @@
     this._errorReporter = errorReporter;
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
     bool isAmpAmp = identical(operator.type, sc.TokenType.AMPERSAND_AMPERSAND);
     bool isBarBar = identical(operator.type, sc.TokenType.BAR_BAR);
     if (isAmpAmp || isBarBar) {
       Expression lhsCondition = node.leftOperand;
-      if (!isDebugConstant(lhsCondition)) {
-        ValidResult lhsResult = getConstantBooleanValue(lhsCondition);
+      if (!_isDebugConstant(lhsCondition)) {
+        ValidResult lhsResult = _getConstantBooleanValue(lhsCondition);
         if (lhsResult != null) {
           if (lhsResult.isTrue && isBarBar) {
             // report error on else block: true || !e!
             _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
             // only visit the LHS:
-            safelyVisit(lhsCondition);
+            _safelyVisit(lhsCondition);
             return null;
           } else if (lhsResult.isFalse && isAmpAmp) {
             // report error on if block: false && !e!
             _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.rightOperand, []);
             // only visit the LHS:
-            safelyVisit(lhsCondition);
+            _safelyVisit(lhsCondition);
             return null;
           }
         }
@@ -2774,12 +2823,13 @@
    *
    * @param node the block to evaluate
    */
+  @override
   Object visitBlock(Block node) {
     NodeList<Statement> statements = node.statements;
     int size = statements.length;
     for (int i = 0; i < size; i++) {
       Statement currentStatement = statements[i];
-      safelyVisit(currentStatement);
+      _safelyVisit(currentStatement);
       if (currentStatement is ReturnStatement && i != size - 1) {
         Statement nextStatement = statements[i + 1];
         Statement lastStatement = statements[size - 1];
@@ -2792,21 +2842,22 @@
     return null;
   }
 
+  @override
   Object visitConditionalExpression(ConditionalExpression node) {
     Expression conditionExpression = node.condition;
-    safelyVisit(conditionExpression);
-    if (!isDebugConstant(conditionExpression)) {
-      ValidResult result = getConstantBooleanValue(conditionExpression);
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
         if (result.isTrue) {
           // report error on else block: true ? 1 : !2!
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.elseExpression, []);
-          safelyVisit(node.thenExpression);
+          _safelyVisit(node.thenExpression);
           return null;
         } else {
           // report error on if block: false ? !1! : 2
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenExpression, []);
-          safelyVisit(node.elseExpression);
+          _safelyVisit(node.elseExpression);
           return null;
         }
       }
@@ -2814,24 +2865,25 @@
     return super.visitConditionalExpression(node);
   }
 
+  @override
   Object visitIfStatement(IfStatement node) {
     Expression conditionExpression = node.condition;
-    safelyVisit(conditionExpression);
-    if (!isDebugConstant(conditionExpression)) {
-      ValidResult result = getConstantBooleanValue(conditionExpression);
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
         if (result.isTrue) {
           // report error on else block: if(true) {} else {!}
           Statement elseStatement = node.elseStatement;
           if (elseStatement != null) {
             _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, elseStatement, []);
-            safelyVisit(node.thenStatement);
+            _safelyVisit(node.thenStatement);
             return null;
           }
         } else {
           // report error on if block: if (false) {!} else {}
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.thenStatement, []);
-          safelyVisit(node.elseStatement);
+          _safelyVisit(node.elseStatement);
           return null;
         }
       }
@@ -2839,12 +2891,13 @@
     return super.visitIfStatement(node);
   }
 
+  @override
   Object visitTryStatement(TryStatement node) {
-    safelyVisit(node.body);
-    safelyVisit(node.finallyBlock);
+    _safelyVisit(node.body);
+    _safelyVisit(node.finallyBlock);
     NodeList<CatchClause> catchClauses = node.catchClauses;
     int numOfCatchClauses = catchClauses.length;
-    List<Type2> visitedTypes = new List<Type2>();
+    List<DartType> visitedTypes = new List<DartType>();
     for (int i = 0; i < numOfCatchClauses; i++) {
       CatchClause catchClause = catchClauses[i];
       if (catchClause.onKeyword != null) {
@@ -2852,12 +2905,12 @@
         // on-catch exception type
         TypeName typeName = catchClause.exceptionType;
         if (typeName != null && typeName.type != null) {
-          Type2 currentType = typeName.type;
+          DartType currentType = typeName.type;
           if (currentType.isObject) {
             // Found catch clause clause that has Object as an exception type, this is equivalent to
             // having a catch clause that doesn't have an exception type, visit the block, but
              // generate an error on any following catch clauses (and don't visit them).
-            safelyVisit(catchClause);
+            _safelyVisit(catchClause);
             if (i + 1 != numOfCatchClauses) {
                // this catch clause is not the last in the try statement
               CatchClause nextCatchClause = catchClauses[i + 1];
@@ -2868,7 +2921,7 @@
               return null;
             }
           }
-          for (Type2 type in visitedTypes) {
+          for (DartType type in visitedTypes) {
             if (currentType.isSubtypeOf(type)) {
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = catchClause.offset;
@@ -2879,11 +2932,11 @@
           }
           visitedTypes.add(currentType);
         }
-        safelyVisit(catchClause);
+        _safelyVisit(catchClause);
       } else {
          // Found catch clause clause that doesn't have an exception type, visit the block, but
         // generate an error on any following catch clauses (and don't visit them).
-        safelyVisit(catchClause);
+        _safelyVisit(catchClause);
         if (i + 1 != numOfCatchClauses) {
           // this catch clause is not the last in the try statement
           CatchClause nextCatchClause = catchClauses[i + 1];
@@ -2898,11 +2951,12 @@
     return null;
   }
 
+  @override
   Object visitWhileStatement(WhileStatement node) {
     Expression conditionExpression = node.condition;
-    safelyVisit(conditionExpression);
-    if (!isDebugConstant(conditionExpression)) {
-      ValidResult result = getConstantBooleanValue(conditionExpression);
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      ValidResult result = _getConstantBooleanValue(conditionExpression);
       if (result != null) {
         if (result.isFalse) {
           // report error on if block: while (false) {!}
@@ -2911,7 +2965,7 @@
         }
       }
     }
-    safelyVisit(node.body);
+    _safelyVisit(node.body);
     return null;
   }
 
@@ -2925,7 +2979,7 @@
    *         if it is `false`, or `null` if the expression is not a constant boolean
    *         value
    */
-  ValidResult getConstantBooleanValue(Expression expression) {
+  ValidResult _getConstantBooleanValue(Expression expression) {
     if (expression is BooleanLiteral) {
       if (expression.value) {
         return new ValidResult(new DartObjectImpl(null, BoolState.from(true)));
@@ -2962,7 +3016,7 @@
    * @param expression some conditional expression
    * @return `true` if and only if the passed expression is resolved to a constant variable
    */
-  bool isDebugConstant(Expression expression) {
+  bool _isDebugConstant(Expression expression) {
     Element element = null;
     if (expression is Identifier) {
       Identifier identifier = expression;
@@ -2984,7 +3038,7 @@
    *
    * @param node the node to be visited
    */
-  void safelyVisit(AstNode node) {
+  void _safelyVisit(AstNode node) {
     if (node != null) {
       node.accept(this);
     }
@@ -3003,14 +3057,19 @@
    */
   bool _enclosingBlockContainsBreak = false;
 
-  bool visitArgumentList(ArgumentList node) => visitExpressions(node.arguments);
+  @override
+  bool visitArgumentList(ArgumentList node) => _visitExpressions(node.arguments);
 
+  @override
   bool visitAsExpression(AsExpression node) => node.expression.accept(this);
 
+  @override
   bool visitAssertStatement(AssertStatement node) => node.condition.accept(this);
 
+  @override
   bool visitAssignmentExpression(AssignmentExpression node) => node.leftHandSide.accept(this) || node.rightHandSide.accept(this);
 
+  @override
   bool visitBinaryExpression(BinaryExpression node) {
     Expression lhsExpression = node.leftOperand;
     sc.TokenType operatorType = node.operator.type;
@@ -3039,23 +3098,28 @@
     return lhsExpression.accept(this) || node.rightOperand.accept(this);
   }
 
-  bool visitBlock(Block node) => visitStatements(node.statements);
+  @override
+  bool visitBlock(Block node) => _visitStatements(node.statements);
 
+  @override
   bool visitBlockFunctionBody(BlockFunctionBody node) => node.block.accept(this);
 
+  @override
   bool visitBreakStatement(BreakStatement node) {
     _enclosingBlockContainsBreak = true;
     return false;
   }
 
+  @override
   bool visitCascadeExpression(CascadeExpression node) {
     Expression target = node.target;
     if (target.accept(this)) {
       return true;
     }
-    return visitExpressions(node.cascadeSections);
+    return _visitExpressions(node.cascadeSections);
   }
 
+  @override
   bool visitConditionalExpression(ConditionalExpression node) {
     Expression conditionExpression = node.condition;
     Expression thenStatement = node.thenExpression;
@@ -3071,8 +3135,10 @@
     return thenStatement.accept(this) && elseStatement.accept(this);
   }
 
+  @override
   bool visitContinueStatement(ContinueStatement node) => false;
 
+  @override
   bool visitDoStatement(DoStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -3097,10 +3163,13 @@
     }
   }
 
+  @override
   bool visitEmptyStatement(EmptyStatement node) => false;
 
+  @override
   bool visitExpressionStatement(ExpressionStatement node) => node.expression.accept(this);
 
+  @override
   bool visitForEachStatement(ForEachStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -3111,11 +3180,12 @@
     }
   }
 
+  @override
   bool visitForStatement(ForStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
     try {
-      if (node.variables != null && visitVariableDeclarations(node.variables.variables)) {
+      if (node.variables != null && _visitVariableDeclarations(node.variables.variables)) {
         return true;
       }
       if (node.initialization != null && node.initialization.accept(this)) {
@@ -3125,7 +3195,7 @@
       if (conditionExpression != null && conditionExpression.accept(this)) {
         return true;
       }
-      if (visitExpressions(node.updaters)) {
+      if (_visitExpressions(node.updaters)) {
         return true;
       }
       // TODO(jwren) Do we want to take all constant expressions into account?
@@ -3144,10 +3214,13 @@
     }
   }
 
+  @override
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => false;
 
+  @override
   bool visitFunctionExpression(FunctionExpression node) => false;
 
+  @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     if (node.function.accept(this)) {
       return true;
@@ -3155,8 +3228,10 @@
     return node.argumentList.accept(this);
   }
 
+  @override
   bool visitIdentifier(Identifier node) => false;
 
+  @override
   bool visitIfStatement(IfStatement node) {
     Expression conditionExpression = node.condition;
     Statement thenStatement = node.thenStatement;
@@ -3181,6 +3256,7 @@
     return thenStatement.accept(this) && elseStatement.accept(this);
   }
 
+  @override
   bool visitIndexExpression(IndexExpression node) {
     Expression target = node.realTarget;
     if (target != null && target.accept(this)) {
@@ -3192,16 +3268,22 @@
     return false;
   }
 
+  @override
   bool visitInstanceCreationExpression(InstanceCreationExpression node) => node.argumentList.accept(this);
 
+  @override
   bool visitIsExpression(IsExpression node) => node.expression.accept(this);
 
+  @override
   bool visitLabel(Label node) => false;
 
+  @override
   bool visitLabeledStatement(LabeledStatement node) => node.statement.accept(this);
 
+  @override
   bool visitLiteral(Literal node) => false;
 
+  @override
   bool visitMethodInvocation(MethodInvocation node) {
     Expression target = node.realTarget;
     if (target != null && target.accept(this)) {
@@ -3210,14 +3292,19 @@
     return node.argumentList.accept(this);
   }
 
+  @override
   bool visitNamedExpression(NamedExpression node) => node.expression.accept(this);
 
+  @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
 
+  @override
   bool visitPostfixExpression(PostfixExpression node) => false;
 
+  @override
   bool visitPrefixExpression(PrefixExpression node) => false;
 
+  @override
   bool visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     if (target != null && target.accept(this)) {
@@ -3226,16 +3313,22 @@
     return false;
   }
 
+  @override
   bool visitRethrowExpression(RethrowExpression node) => true;
 
+  @override
   bool visitReturnStatement(ReturnStatement node) => true;
 
+  @override
   bool visitSuperExpression(SuperExpression node) => false;
 
-  bool visitSwitchCase(SwitchCase node) => visitStatements(node.statements);
+  @override
+  bool visitSwitchCase(SwitchCase node) => _visitStatements(node.statements);
 
-  bool visitSwitchDefault(SwitchDefault node) => visitStatements(node.statements);
+  @override
+  bool visitSwitchDefault(SwitchDefault node) => _visitStatements(node.statements);
 
+  @override
   bool visitSwitchStatement(SwitchStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -3264,10 +3357,13 @@
     }
   }
 
+  @override
   bool visitThisExpression(ThisExpression node) => false;
 
+  @override
   bool visitThrowExpression(ThrowExpression node) => true;
 
+  @override
   bool visitTryStatement(TryStatement node) {
     if (node.body.accept(this)) {
       return true;
@@ -3279,8 +3375,10 @@
     return false;
   }
 
+  @override
   bool visitTypeName(TypeName node) => false;
 
+  @override
   bool visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
     if (initializer != null) {
@@ -3289,8 +3387,10 @@
     return false;
   }
 
-  bool visitVariableDeclarationList(VariableDeclarationList node) => visitVariableDeclarations(node.variables);
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) => _visitVariableDeclarations(node.variables);
 
+  @override
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     NodeList<VariableDeclaration> variables = node.variables.variables;
     for (int i = 0; i < variables.length; i++) {
@@ -3301,6 +3401,7 @@
     return false;
   }
 
+  @override
   bool visitWhileStatement(WhileStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -3325,7 +3426,7 @@
     }
   }
 
-  bool visitExpressions(NodeList<Expression> expressions) {
+  bool _visitExpressions(NodeList<Expression> expressions) {
     for (int i = expressions.length - 1; i >= 0; i--) {
       if (expressions[i].accept(this)) {
         return true;
@@ -3334,7 +3435,7 @@
     return false;
   }
 
-  bool visitStatements(NodeList<Statement> statements) {
+  bool _visitStatements(NodeList<Statement> statements) {
     for (int i = statements.length - 1; i >= 0; i--) {
       if (statements[i].accept(this)) {
         return true;
@@ -3343,7 +3444,7 @@
     return false;
   }
 
-  bool visitVariableDeclarations(NodeList<VariableDeclaration> variableDeclarations) {
+  bool _visitVariableDeclarations(NodeList<VariableDeclaration> variableDeclarations) {
     for (int i = variableDeclarations.length - 1; i >= 0; i--) {
       if (variableDeclarations[i].accept(this)) {
         return true;
@@ -3393,10 +3494,10 @@
         if (element != null) {
           if (i == 0) {
             _importsVerifier.inDefiningCompilationUnit = true;
-            generateForCompilationUnit(_compilationUnits[i], element.source);
+            _generateForCompilationUnit(_compilationUnits[i], element.source);
             _importsVerifier.inDefiningCompilationUnit = false;
           } else {
-            generateForCompilationUnit(_compilationUnits[i], element.source);
+            _generateForCompilationUnit(_compilationUnits[i], element.source);
           }
         }
       }
@@ -3408,7 +3509,7 @@
     }
   }
 
-  void generateForCompilationUnit(CompilationUnit unit, Source source) {
+  void _generateForCompilationUnit(CompilationUnit unit, Source source) {
     ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
     unit.accept(_importsVerifier);
     // dead code analysis
@@ -3542,6 +3643,7 @@
     }
   }
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     if (_inDefiningCompilationUnit) {
       NodeList<Directive> directives = node.directives;
@@ -3567,12 +3669,12 @@
             //
             // Initialize libraryMap: libraryElement -> importDirective
             //
-            putIntoLibraryMap(libraryElement, importDirective);
+            _putIntoLibraryMap(libraryElement, importDirective);
             //
             // For this new addition to the libraryMap, also recursively add any exports from the
             // libraryElement
             //
-            addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
+            _addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
           }
         }
       }
@@ -3604,21 +3706,25 @@
     return super.visitCompilationUnit(node);
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
-    visitMetadata(node.metadata);
+    _visitMetadata(node.metadata);
     return null;
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
-    visitMetadata(node.metadata);
+    _visitMetadata(node.metadata);
     return null;
   }
 
+  @override
   Object visitLibraryDirective(LibraryDirective node) {
-    visitMetadata(node.metadata);
+    _visitMetadata(node.metadata);
     return null;
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (_unusedImports.isEmpty) {
       return null;
@@ -3633,14 +3739,15 @@
       return null;
     }
     // Otherwise, pass the prefixed identifier element and name onto visitIdentifier.
-    return visitIdentifier(element, prefixIdentifier.name);
+    return _visitIdentifier(element, prefixIdentifier.name);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (_unusedImports.isEmpty) {
       return null;
     }
-    return visitIdentifier(node.staticElement, node.name);
+    return _visitIdentifier(node.staticElement, node.name);
   }
 
   void set inDefiningCompilationUnit(bool inDefiningCompilationUnit) {
@@ -3650,14 +3757,14 @@
   /**
    * Recursively add any exported library elements into the [libraryMap].
    */
-  void addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
+  void _addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
     if (exportPath.contains(library)) {
       return;
     }
     exportPath.add(library);
     for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
-      putIntoLibraryMap(exportedLibraryElt, importDirective);
-      addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
+      _putIntoLibraryMap(exportedLibraryElt, importDirective);
+      _addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
     }
   }
 
@@ -3669,7 +3776,7 @@
    * @param importDirective the import directive used to compute the returned namespace
    * @return the computed or looked up [Namespace]
    */
-  Namespace computeNamespace(ImportDirective importDirective) {
+  Namespace _computeNamespace(ImportDirective importDirective) {
     Namespace namespace = _namespaceMap[importDirective];
     if (namespace == null) {
       // If the namespace isn't in the namespaceMap, then compute and put it in the map
@@ -3689,7 +3796,7 @@
    * used to simply add the mapping between the library element an an import directive without
    * needing to check to see if a list needs to be created.
    */
-  void putIntoLibraryMap(LibraryElement libraryElement, ImportDirective importDirective) {
+  void _putIntoLibraryMap(LibraryElement libraryElement, ImportDirective importDirective) {
     List<ImportDirective> importList = _libraryMap[libraryElement];
     if (importList == null) {
       importList = new List<ImportDirective>();
@@ -3698,7 +3805,7 @@
     importList.add(importDirective);
   }
 
-  Object visitIdentifier(Element element, String name) {
+  Object _visitIdentifier(Element element, String name) {
     if (element == null) {
       return null;
     }
@@ -3706,7 +3813,7 @@
     if (element is MultiplyDefinedElement) {
       MultiplyDefinedElement multiplyDefinedElement = element;
       for (Element elt in multiplyDefinedElement.conflictingElements) {
-        visitIdentifier(elt, name);
+        _visitIdentifier(elt, name);
       }
       return null;
     } else if (element is PrefixElement) {
@@ -3739,7 +3846,7 @@
       // Otherwise, for each of the imported directives, use the namespaceMap to
       for (ImportDirective importDirective in importsFromSameLibrary) {
         // Get the namespace for this import
-        Namespace namespace = computeNamespace(importDirective);
+        Namespace namespace = _computeNamespace(importDirective);
         if (namespace != null && namespace.get(name) != null) {
           _unusedImports.remove(importDirective);
         }
@@ -3755,10 +3862,10 @@
    *
    * @param annotations the list of annotations to visit
    */
-  void visitMetadata(NodeList<Annotation> annotations) {
+  void _visitMetadata(NodeList<Annotation> annotations) {
     for (Annotation annotation in annotations) {
       Identifier name = annotation.name;
-      visitIdentifier(name.staticElement, name.name);
+      _visitIdentifier(name.staticElement, name.name);
     }
   }
 }
@@ -3789,10 +3896,11 @@
     this._errorReporter = errorReporter;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement element = node.element;
-    if (isOverride(element)) {
-      if (getOverriddenMember(element) == null) {
+    if (_isOverride(element)) {
+      if (_getOverriddenMember(element) == null) {
         if (element is MethodElement) {
           _errorReporter.reportErrorForNode(HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name, []);
         } else if (element is PropertyAccessorElement) {
@@ -3813,7 +3921,7 @@
    * @param member the member that overrides the returned member
    * @return the member that overrides the given member
    */
-  ExecutableElement getOverriddenMember(ExecutableElement member) {
+  ExecutableElement _getOverriddenMember(ExecutableElement member) {
     LibraryElement library = member.library;
     if (library == null) {
       return null;
@@ -3831,7 +3939,7 @@
    * @param element the element being tested
    * @return `true` if the element has an override annotation associated with it
    */
-  bool isOverride(Element element) => element != null && element.isOverride;
+  bool _isOverride(Element element) => element != null && element.isOverride;
 }
 
 /**
@@ -3856,6 +3964,7 @@
     this._errorReporter = errorReporter;
   }
 
+  @override
   Object visitImportDirective(ImportDirective directive) {
     return null;
   }
@@ -3870,9 +3979,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
    */
-  bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
-    Source source = getSource(uriLiteral);
-    String fullName = getSourceFullName(source);
+  bool _checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
+    Source source = _getSource(uriLiteral);
+    String fullName = _getSourceFullName(source);
     if (fullName != null) {
       int pathIndex = 0;
       int fullNameIndex = fullName.length;
@@ -3907,15 +4016,15 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
    */
-  bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
+  bool _checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
     if (StringUtilities.startsWith4(path, 0, 0x6C, 0x69, 0x62, 0x2F)) {
-      if (checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, 0)) {
+      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, 0)) {
         return true;
       }
     }
     int pathIndex = StringUtilities.indexOf5(path, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
     while (pathIndex != -1) {
-      if (checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, pathIndex + 1)) {
+      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(uriLiteral, path, pathIndex + 1)) {
         return true;
       }
       pathIndex = StringUtilities.indexOf5(path, pathIndex + 4, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
@@ -3923,14 +4032,14 @@
     return false;
   }
 
-  bool checkForFileImportOutsideLibReferencesFileInsideAtIndex(StringLiteral uriLiteral, String path, int pathIndex) {
-    Source source = getSource(uriLiteral);
+  bool _checkForFileImportOutsideLibReferencesFileInsideAtIndex(StringLiteral uriLiteral, String path, int pathIndex) {
+    Source source = _getSource(uriLiteral);
     String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
     Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
     if (!_context.exists(pubspecSource)) {
       return false;
     }
-    String fullName = getSourceFullName(source);
+    String fullName = _getSourceFullName(source);
     if (fullName != null) {
       if (StringUtilities.indexOf5(fullName, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F) < 0) {
         // Files outside the lib directory hierarchy should not reference files inside
@@ -3950,7 +4059,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
    */
-  bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
+  bool _checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
     if (StringUtilities.startsWith3(path, 0, 0x2E, 0x2E, 0x2F) || StringUtilities.indexOf4(path, 0, 0x2F, 0x2E, 0x2E, 0x2F) >= 0) {
       // Package import should not to contain ".."
       _errorReporter.reportErrorForNode(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
@@ -3965,7 +4074,7 @@
    * @param node the node (not `null`)
    * @return the source or `null` if it could not be determined
    */
-  Source getSource(AstNode node) {
+  Source _getSource(AstNode node) {
     Source source = null;
     CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
     if (unit != null) {
@@ -3984,7 +4093,7 @@
    * @param source the source
    * @return the full name or `null` if it could not be determined
    */
-  String getSourceFullName(Source source) {
+  String _getSourceFullName(Source source) {
     if (source != null) {
       String fullName = source.fullName;
       if (fullName != null) {
@@ -4020,7 +4129,7 @@
    * @param unit the compilation unit containing the to-do comments
    */
   void findIn(CompilationUnit unit) {
-    gatherTodoComments(unit.beginToken);
+    _gatherTodoComments(unit.beginToken);
   }
 
   /**
@@ -4029,12 +4138,12 @@
    *
    * @param token the head of the list of tokens being searched
    */
-  void gatherTodoComments(sc.Token token) {
+  void _gatherTodoComments(sc.Token token) {
     while (token != null && token.type != sc.TokenType.EOF) {
       sc.Token commentToken = token.precedingComments;
       while (commentToken != null) {
         if (identical(commentToken.type, sc.TokenType.SINGLE_LINE_COMMENT) || identical(commentToken.type, sc.TokenType.MULTI_LINE_COMMENT)) {
-          scrapeTodoComment(commentToken);
+          _scrapeTodoComment(commentToken);
         }
         commentToken = commentToken.next;
       }
@@ -4047,7 +4156,7 @@
    *
    * @param commentToken the comment token to analyze
    */
-  void scrapeTodoComment(sc.Token commentToken) {
+  void _scrapeTodoComment(sc.Token commentToken) {
     JavaPatternMatcher matcher = new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme);
     if (matcher.find()) {
       int offset = commentToken.offset + matcher.start() + matcher.group(1).length;
@@ -4114,8 +4223,8 @@
    *         element model
    */
   bool matches(AstNode node, Element element) {
-    captureEnclosingElements(element);
-    gatherElements(element);
+    _captureEnclosingElements(element);
+    _gatherElements(element);
     try {
       node.accept(this);
     } on DeclarationMatcher_DeclarationMismatchException catch (exception) {
@@ -4124,28 +4233,30 @@
     return _unmatchedElements.isEmpty;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
       List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
-      LocalVariableElement exceptionElement = findIdentifier(localVariables, exceptionParameter);
+      LocalVariableElement exceptionElement = _findIdentifier(localVariables, exceptionParameter);
       processElement(exceptionElement);
       SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
       if (stackTraceParameter != null) {
-        LocalVariableElement stackTraceElement = findIdentifier(localVariables, stackTraceParameter);
+        LocalVariableElement stackTraceElement = _findIdentifier(localVariables, stackTraceParameter);
         processElement(stackTraceElement);
       }
     }
     return super.visitCatchClause(node);
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
-      _enclosingClass = findIdentifier(_enclosingUnit.types, className);
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       processElement(_enclosingClass);
-      if (!hasConstructor(node)) {
+      if (!_hasConstructor(node)) {
         ConstructorElement constructor = _enclosingClass.unnamedConstructor;
         if (constructor.isSynthetic) {
           processElement(constructor);
@@ -4157,11 +4268,12 @@
     }
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
-      _enclosingClass = findIdentifier(_enclosingUnit.types, className);
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       processElement(_enclosingClass);
       return super.visitClassTypeAlias(node);
     } finally {
@@ -4169,11 +4281,13 @@
     }
   }
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     processElement(_enclosingUnit);
     return super.visitCompilationUnit(node);
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4190,16 +4304,18 @@
     }
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
-    LocalVariableElement element = findIdentifier(_enclosingExecutable.localVariables, variableName);
+    LocalVariableElement element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
     processElement(element);
     return super.visitDeclaredIdentifier(node);
   }
 
+  @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     SimpleIdentifier parameterName = node.parameter.identifier;
-    ParameterElement element = getElementForParameter(node, parameterName);
+    ParameterElement element = _getElementForParameter(node, parameterName);
     Expression defaultValue = node.defaultValue;
     if (defaultValue != null) {
       ExecutableElement outerExecutable = _enclosingExecutable;
@@ -4224,20 +4340,22 @@
     }
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
-      ExportElement exportElement = findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
+      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
       processElement(exportElement);
     }
     return super.visitExportDirective(node);
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4251,6 +4369,7 @@
     }
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4258,12 +4377,12 @@
       sc.Token property = node.propertyKeyword;
       if (property == null) {
         if (_enclosingExecutable != null) {
-          _enclosingExecutable = findIdentifier(_enclosingExecutable.functions, functionName);
+          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
         } else {
-          _enclosingExecutable = findIdentifier(_enclosingUnit.functions, functionName);
+          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
         }
       } else {
-        PropertyAccessorElement accessor = findIdentifier(_enclosingUnit.accessors, functionName);
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
         if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
         }
@@ -4276,9 +4395,10 @@
     }
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
-      FunctionElement element = findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
+      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
       processElement(element);
     }
     ExecutableElement outerExecutable = _enclosingExecutable;
@@ -4291,11 +4411,12 @@
     }
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAliasElement outerAlias = _enclosingAlias;
     try {
       SimpleIdentifier aliasName = node.name;
-      _enclosingAlias = findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
+      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
       processElement(_enclosingAlias);
       return super.visitFunctionTypeAlias(node);
     } finally {
@@ -4303,10 +4424,11 @@
     }
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4320,25 +4442,28 @@
     }
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
-      ImportElement importElement = findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
+      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
       processElement(importElement);
     }
     return super.visitImportDirective(node);
   }
 
+  @override
   Object visitLabeledStatement(LabeledStatement node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      LabelElement element = findIdentifier(_enclosingExecutable.labels, labelName);
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
       processElement(element);
     }
     return super.visitLabeledStatement(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4349,10 +4474,10 @@
         nameOfMethod = "unary-";
       }
       if (property == null) {
-        _enclosingExecutable = findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
+        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
         methodName.staticElement = _enclosingExecutable;
       } else {
-        PropertyAccessorElement accessor = findIdentifier(_enclosingClass.accessors, methodName);
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
         if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
           methodName.staticElement = accessor;
@@ -4366,20 +4491,22 @@
     }
   }
 
+  @override
   Object visitPartDirective(PartDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
-      CompilationUnitElement element = findPart(_enclosingUnit.library.parts, partSource);
+      CompilationUnitElement element = _findPart(_enclosingUnit.library.parts, partSource);
       processElement(element);
     }
     return super.visitPartDirective(node);
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4393,47 +4520,51 @@
     return super.visitSimpleFormalParameter(node);
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      LabelElement element = findIdentifier(_enclosingExecutable.labels, labelName);
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
       processElement(element);
     }
     return super.visitSwitchCase(node);
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      LabelElement element = findIdentifier(_enclosingExecutable.labels, labelName);
+      LabelElement element = _findIdentifier(_enclosingExecutable.labels, labelName);
       processElement(element);
     }
     return super.visitSwitchDefault(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
     TypeParameterElement element = null;
     if (_enclosingClass != null) {
-      element = findIdentifier(_enclosingClass.typeParameters, parameterName);
+      element = _findIdentifier(_enclosingClass.typeParameters, parameterName);
     } else if (_enclosingAlias != null) {
-      element = findIdentifier(_enclosingAlias.typeParameters, parameterName);
+      element = _findIdentifier(_enclosingAlias.typeParameters, parameterName);
     }
     processElement(element);
     return super.visitTypeParameter(node);
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     VariableElement element = null;
     SimpleIdentifier variableName = node.name;
     if (_enclosingExecutable != null) {
-      element = findIdentifier(_enclosingExecutable.localVariables, variableName);
+      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
     }
     if (element == null && _enclosingClass != null) {
-      element = findIdentifier(_enclosingClass.fields, variableName);
+      element = _findIdentifier(_enclosingClass.fields, variableName);
     }
     if (element == null && _enclosingUnit != null) {
-      element = findIdentifier(_enclosingUnit.topLevelVariables, variableName);
+      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
     }
     Expression initializer = node.initializer;
     if (initializer != null) {
@@ -4469,7 +4600,7 @@
    *
    * @param element the element corresponding to the AST structure to be compared
    */
-  void captureEnclosingElements(Element element) {
+  void _captureEnclosingElements(Element element) {
     Element parent = element is CompilationUnitElement ? element : element.enclosingElement;
     while (parent != null) {
       if (parent is CompilationUnitElement) {
@@ -4503,7 +4634,7 @@
    * @param offset the offset of the name of the element to be returned
    * @return the element at the given offset
    */
-  Element findAtOffset(List<Element> elements, int offset) => findWithNameAndOffset(elements, "", offset);
+  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
 
   /**
    * Return the export element from the given array whose library has the given source, or
@@ -4514,7 +4645,7 @@
    *          for
    * @return the export element whose library has the given source
    */
-  ExportElement findExport(List<ExportElement> exports, Source source) {
+  ExportElement _findExport(List<ExportElement> exports, Source source) {
     for (ExportElement export in exports) {
       if (export.exportedLibrary.source == source) {
         return export;
@@ -4531,7 +4662,7 @@
    * @param identifier the name node in the declaration of the element to be returned
    * @return the element created for the declaration with the given name
    */
-  Element findIdentifier(List<Element> elements, SimpleIdentifier identifier) => findWithNameAndOffset(elements, identifier.name, identifier.offset);
+  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) => _findWithNameAndOffset(elements, identifier.name, identifier.offset);
 
   /**
    * Return the import element from the given array whose library has the given source and that has
@@ -4543,7 +4674,7 @@
    * @param prefix the prefix with which the library was imported
    * @return the import element whose library has the given source and prefix
    */
-  ImportElement findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
     for (ImportElement element in imports) {
       if (element.importedLibrary.source == source) {
         PrefixElement prefixElement = element.prefix;
@@ -4569,7 +4700,7 @@
    * @param partSource the source for the part whose element is to be returned
    * @return the element for the part with the given source
    */
-  CompilationUnitElement findPart(List<CompilationUnitElement> parts, Source partSource) {
+  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
     for (CompilationUnitElement part in parts) {
       if (part.source == partSource) {
         return part;
@@ -4587,7 +4718,7 @@
    * @param offset the offset of the name of the element to be returned
    * @return the element with the given name and offset
    */
-  Element findWithNameAndOffset(List<Element> elements, String name, int offset) {
+  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
     for (Element element in elements) {
       if (element.displayName == name && element.nameOffset == offset) {
         return element;
@@ -4596,7 +4727,7 @@
     return null;
   }
 
-  void gatherElements(Element element) {
+  void _gatherElements(Element element) {
     element.accept(new GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this));
   }
 
@@ -4607,7 +4738,7 @@
    * @param parameterName the name of the parameter being searched for
    * @return the element representing the parameter with that name
    */
-  ParameterElement getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
+  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
     List<ParameterElement> parameters = null;
     if (_enclosingParameter != null) {
       parameters = _enclosingParameter.parameters;
@@ -4618,7 +4749,7 @@
     if (parameters == null && _enclosingAlias != null) {
       parameters = _enclosingAlias.parameters;
     }
-    return parameters == null ? null : findIdentifier(parameters, parameterName);
+    return parameters == null ? null : _findIdentifier(parameters, parameterName);
   }
 
   /**
@@ -4628,7 +4759,7 @@
    * @param literal the string literal whose value is to be returned
    * @return the value of the given string literal
    */
-  String getStringValue(StringLiteral literal) {
+  String _getStringValue(StringLiteral literal) {
     if (literal is StringInterpolation) {
       return null;
     }
@@ -4641,7 +4772,7 @@
    * @param node the class being tested
    * @return `true` if the class defines at least one constructor
    */
-  bool hasConstructor(ClassDeclaration node) {
+  bool _hasConstructor(ClassDeclaration node) {
     for (ClassMember member in node.members) {
       if (member is ConstructorDeclaration) {
         return true;
@@ -4664,6 +4795,7 @@
 
   GeneralizingElementVisitor_DeclarationMatcher_gatherElements(this.DeclarationMatcher_this) : super();
 
+  @override
   Object visitElement(Element element) {
     DeclarationMatcher_this._allElements.add(element);
     DeclarationMatcher_this._unmatchedElements.add(element);
@@ -4718,41 +4850,45 @@
     unit.accept(this);
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
       List<LocalVariableElement> localVariables = _enclosingExecutable.localVariables;
-      findIdentifier(localVariables, exceptionParameter);
+      _findIdentifier(localVariables, exceptionParameter);
       SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
       if (stackTraceParameter != null) {
-        findIdentifier(localVariables, stackTraceParameter);
+        _findIdentifier(localVariables, stackTraceParameter);
       }
     }
     return super.visitCatchClause(node);
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
-      _enclosingClass = findIdentifier(_enclosingUnit.types, className);
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       return super.visitClassDeclaration(node);
     } finally {
       _enclosingClass = outerClass;
     }
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement outerClass = _enclosingClass;
     try {
       SimpleIdentifier className = node.name;
-      _enclosingClass = findIdentifier(_enclosingUnit.types, className);
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
       return super.visitClassTypeAlias(node);
     } finally {
       _enclosingClass = outerClass;
     }
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4770,15 +4906,17 @@
     }
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
-    findIdentifier(_enclosingExecutable.localVariables, variableName);
+    _findIdentifier(_enclosingExecutable.localVariables, variableName);
     return super.visitDeclaredIdentifier(node);
   }
 
+  @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
     SimpleIdentifier parameterName = node.parameter.identifier;
-    ParameterElement element = getElementForParameter(node, parameterName);
+    ParameterElement element = _getElementForParameter(node, parameterName);
     Expression defaultValue = node.defaultValue;
     if (defaultValue != null) {
       ExecutableElement outerExecutable = _enclosingExecutable;
@@ -4801,20 +4939,22 @@
     }
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
-      ExportElement exportElement = findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
+      ExportElement exportElement = _findExport(library.exports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri));
       node.element = exportElement;
     }
     return super.visitExportDirective(node);
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4827,6 +4967,7 @@
     }
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4834,12 +4975,12 @@
       sc.Token property = node.propertyKeyword;
       if (property == null) {
         if (_enclosingExecutable != null) {
-          _enclosingExecutable = findIdentifier(_enclosingExecutable.functions, functionName);
+          _enclosingExecutable = _findIdentifier(_enclosingExecutable.functions, functionName);
         } else {
-          _enclosingExecutable = findIdentifier(_enclosingUnit.functions, functionName);
+          _enclosingExecutable = _findIdentifier(_enclosingUnit.functions, functionName);
         }
       } else {
-        PropertyAccessorElement accessor = findIdentifier(_enclosingUnit.accessors, functionName);
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
         if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
           functionName.staticElement = accessor;
@@ -4853,9 +4994,10 @@
     }
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
-      FunctionElement element = findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
+      FunctionElement element = _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
       node.element = element;
     }
     ExecutableElement outerExecutable = _enclosingExecutable;
@@ -4867,21 +5009,23 @@
     }
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAliasElement outerAlias = _enclosingAlias;
     try {
       SimpleIdentifier aliasName = node.name;
-      _enclosingAlias = findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
+      _enclosingAlias = _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
       return super.visitFunctionTypeAlias(node);
     } finally {
       _enclosingAlias = outerAlias;
     }
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4894,29 +5038,33 @@
     }
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       LibraryElement library = _enclosingUnit.library;
-      ImportElement importElement = findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
+      ImportElement importElement = _findImport(library.imports, _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri), node.prefix);
       node.element = importElement;
     }
     return super.visitImportDirective(node);
   }
 
+  @override
   Object visitLabeledStatement(LabeledStatement node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      findIdentifier(_enclosingExecutable.labels, labelName);
+      _findIdentifier(_enclosingExecutable.labels, labelName);
     }
     return super.visitLabeledStatement(node);
   }
 
+  @override
   Object visitLibraryDirective(LibraryDirective node) {
     node.element = _enclosingUnit.library;
     return super.visitLibraryDirective(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerExecutable = _enclosingExecutable;
     try {
@@ -4927,10 +5075,10 @@
         nameOfMethod = "unary-";
       }
       if (property == null) {
-        _enclosingExecutable = findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
+        _enclosingExecutable = _findWithNameAndOffset(_enclosingClass.methods, nameOfMethod, methodName.offset);
         methodName.staticElement = _enclosingExecutable;
       } else {
-        PropertyAccessorElement accessor = findIdentifier(_enclosingClass.accessors, methodName);
+        PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
         if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
           methodName.staticElement = accessor;
@@ -4943,24 +5091,27 @@
     }
   }
 
+  @override
   Object visitPartDirective(PartDirective node) {
-    String uri = getStringValue(node.uri);
+    String uri = _getStringValue(node.uri);
     if (uri != null) {
       Source partSource = _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source, uri);
-      node.element = findPart(_enclosingUnit.library.parts, partSource);
+      node.element = _findPart(_enclosingUnit.library.parts, partSource);
     }
     return super.visitPartDirective(node);
   }
 
+  @override
   Object visitPartOfDirective(PartOfDirective node) {
     node.element = _enclosingUnit.library;
     return super.visitPartOfDirective(node);
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
-      ParameterElement element = getElementForParameter(node, parameterName);
+      ParameterElement element = _getElementForParameter(node, parameterName);
       ParameterElement outerParameter = _enclosingParameter;
       try {
         _enclosingParameter = element;
@@ -4973,43 +5124,47 @@
     return super.visitSimpleFormalParameter(node);
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      findIdentifier(_enclosingExecutable.labels, labelName);
+      _findIdentifier(_enclosingExecutable.labels, labelName);
     }
     return super.visitSwitchCase(node);
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
     for (Label label in node.labels) {
       SimpleIdentifier labelName = label.label;
-      findIdentifier(_enclosingExecutable.labels, labelName);
+      _findIdentifier(_enclosingExecutable.labels, labelName);
     }
     return super.visitSwitchDefault(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
     if (_enclosingClass != null) {
-      findIdentifier(_enclosingClass.typeParameters, parameterName);
+      _findIdentifier(_enclosingClass.typeParameters, parameterName);
     } else if (_enclosingAlias != null) {
-      findIdentifier(_enclosingAlias.typeParameters, parameterName);
+      _findIdentifier(_enclosingAlias.typeParameters, parameterName);
     }
     return super.visitTypeParameter(node);
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     VariableElement element = null;
     SimpleIdentifier variableName = node.name;
     if (_enclosingExecutable != null) {
-      element = findIdentifier(_enclosingExecutable.localVariables, variableName);
+      element = _findIdentifier(_enclosingExecutable.localVariables, variableName);
     }
     if (element == null && _enclosingClass != null) {
-      element = findIdentifier(_enclosingClass.fields, variableName);
+      element = _findIdentifier(_enclosingClass.fields, variableName);
     }
     if (element == null && _enclosingUnit != null) {
-      element = findIdentifier(_enclosingUnit.topLevelVariables, variableName);
+      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
     }
     Expression initializer = node.initializer;
     if (initializer != null) {
@@ -5035,7 +5190,7 @@
    * @param offset the offset of the name of the element to be returned
    * @return the element at the given offset
    */
-  Element findAtOffset(List<Element> elements, int offset) => findWithNameAndOffset(elements, "", offset);
+  Element _findAtOffset(List<Element> elements, int offset) => _findWithNameAndOffset(elements, "", offset);
 
   /**
    * Return the export element from the given array whose library has the given source, or
@@ -5046,7 +5201,7 @@
    *          for
    * @return the export element whose library has the given source
    */
-  ExportElement findExport(List<ExportElement> exports, Source source) {
+  ExportElement _findExport(List<ExportElement> exports, Source source) {
     for (ExportElement export in exports) {
       if (export.exportedLibrary.source == source) {
         return export;
@@ -5063,8 +5218,8 @@
    * @param identifier the name node in the declaration of the element to be returned
    * @return the element created for the declaration with the given name
    */
-  Element findIdentifier(List<Element> elements, SimpleIdentifier identifier) {
-    Element element = findWithNameAndOffset(elements, identifier.name, identifier.offset);
+  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) {
+    Element element = _findWithNameAndOffset(elements, identifier.name, identifier.offset);
     identifier.staticElement = element;
     return element;
   }
@@ -5079,7 +5234,7 @@
    * @param prefix the prefix with which the library was imported
    * @return the import element whose library has the given source and prefix
    */
-  ImportElement findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+  ImportElement _findImport(List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
     for (ImportElement element in imports) {
       if (element.importedLibrary.source == source) {
         PrefixElement prefixElement = element.prefix;
@@ -5105,7 +5260,7 @@
    * @param partSource the source for the part whose element is to be returned
    * @return the element for the part with the given source
    */
-  CompilationUnitElement findPart(List<CompilationUnitElement> parts, Source partSource) {
+  CompilationUnitElement _findPart(List<CompilationUnitElement> parts, Source partSource) {
     for (CompilationUnitElement part in parts) {
       if (part.source == partSource) {
         return part;
@@ -5123,7 +5278,7 @@
    * @param offset the offset of the name of the element to be returned
    * @return the element with the given name and offset
    */
-  Element findWithNameAndOffset(List<Element> elements, String name, int offset) {
+  Element _findWithNameAndOffset(List<Element> elements, String name, int offset) {
     for (Element element in elements) {
       if (element.displayName == name && element.nameOffset == offset) {
         return element;
@@ -5139,7 +5294,7 @@
    * @param parameterName the name of the parameter being searched for
    * @return the element representing the parameter with that name
    */
-  ParameterElement getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
+  ParameterElement _getElementForParameter(FormalParameter node, SimpleIdentifier parameterName) {
     List<ParameterElement> parameters = null;
     if (_enclosingParameter != null) {
       parameters = _enclosingParameter.parameters;
@@ -5150,7 +5305,7 @@
     if (parameters == null && _enclosingAlias != null) {
       parameters = _enclosingAlias.parameters;
     }
-    ParameterElement element = parameters == null ? null : findIdentifier(parameters, parameterName);
+    ParameterElement element = parameters == null ? null : _findIdentifier(parameters, parameterName);
     if (element == null) {
       PrintStringWriter writer = new PrintStringWriter();
       writer.println("Invalid state found in the Analysis Engine:");
@@ -5174,7 +5329,7 @@
    * @param literal the string literal whose value is to be returned
    * @return the value of the given string literal
    */
-  String getStringValue(StringLiteral literal) {
+  String _getStringValue(StringLiteral literal) {
     if (literal is StringInterpolation) {
       return null;
     }
@@ -5256,7 +5411,7 @@
    *
    * @return `true` if the given identifier is the return type of a constructor declaration.
    */
-  static bool isConstructorReturnType(SimpleIdentifier identifier) {
+  static bool _isConstructorReturnType(SimpleIdentifier identifier) {
     AstNode parent = identifier.parent;
     if (parent is ConstructorDeclaration) {
       return identical(parent.returnType, identifier);
@@ -5270,7 +5425,7 @@
    * @return `true` if the given identifier is the return type of a factory constructor
    *         declaration.
    */
-  static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
+  static bool _isFactoryConstructorReturnType(SimpleIdentifier node) {
     AstNode parent = node.parent;
     if (parent is ConstructorDeclaration) {
       ConstructorDeclaration constructor = parent;
@@ -5285,7 +5440,7 @@
    * @param node the 'super' expression to analyze
    * @return `true` if the 'super' expression is in a valid context
    */
-  static bool isSuperInValidContext(SuperExpression node) {
+  static bool _isSuperInValidContext(SuperExpression node) {
     for (AstNode n = node; n != null; n = n.parent) {
       if (n is CompilationUnit) {
         return false;
@@ -5323,12 +5478,12 @@
   /**
    * The type representing the type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The type representing the type 'type'.
    */
-  Type2 _typeType;
+  DartType _typeType;
 
   /**
    * A utility class for the resolver to answer the question of "what are my subtypes?".
@@ -5368,23 +5523,24 @@
     _promoteManager = resolver.promoteManager;
   }
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
     if (operatorType != sc.TokenType.EQ) {
-      operatorType = operatorFromCompoundAssignment(operatorType);
+      operatorType = _operatorFromCompoundAssignment(operatorType);
       Expression leftHandSide = node.leftHandSide;
       if (leftHandSide != null) {
         String methodName = operatorType.lexeme;
-        Type2 staticType = getStaticType(leftHandSide);
-        MethodElement staticMethod = lookUpMethod(leftHandSide, staticType, methodName);
+        DartType staticType = _getStaticType(leftHandSide);
+        MethodElement staticMethod = _lookUpMethod(leftHandSide, staticType, methodName);
         node.staticElement = staticMethod;
-        Type2 propagatedType = getPropagatedType(leftHandSide);
-        MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedType, methodName);
+        DartType propagatedType = _getPropagatedType(leftHandSide);
+        MethodElement propagatedMethod = _lookUpMethod(leftHandSide, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
-        if (shouldReportMissingMember(staticType, staticMethod)) {
+        if (_shouldReportMissingMember(staticType, staticMethod)) {
           _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
-        } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
           _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]);
         }
       }
@@ -5392,21 +5548,22 @@
     return null;
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
     if (operator.isUserDefinableOperator) {
       Expression leftOperand = node.leftOperand;
       if (leftOperand != null) {
         String methodName = operator.lexeme;
-        Type2 staticType = getStaticType(leftOperand);
-        MethodElement staticMethod = lookUpMethod(leftOperand, staticType, methodName);
+        DartType staticType = _getStaticType(leftOperand);
+        MethodElement staticMethod = _lookUpMethod(leftOperand, staticType, methodName);
         node.staticElement = staticMethod;
-        Type2 propagatedType = getPropagatedType(leftOperand);
-        MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedType, methodName);
+        DartType propagatedType = _getPropagatedType(leftOperand);
+        MethodElement propagatedMethod = _lookUpMethod(leftOperand, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
-        if (shouldReportMissingMember(staticType, staticMethod)) {
+        if (_shouldReportMissingMember(staticType, staticMethod)) {
           _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
-        } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
           _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
         }
       }
@@ -5414,31 +5571,35 @@
     return null;
   }
 
+  @override
   Object visitBreakStatement(BreakStatement node) {
-    lookupLabel(node, node.label);
+    _lookupLabel(node, node.label);
     return null;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitCommentReference(CommentReference node) {
     Identifier identifier = node.identifier;
     if (identifier is SimpleIdentifier) {
       SimpleIdentifier simpleIdentifier = identifier;
-      Element element = resolveSimpleIdentifier(simpleIdentifier);
+      Element element = _resolveSimpleIdentifier(simpleIdentifier);
       if (element == null) {
         //
         // This might be a reference to an imported name that is missing the prefix.
         //
-        element = findImportWithoutPrefix(simpleIdentifier);
+        element = _findImportWithoutPrefix(simpleIdentifier);
         if (element is MultiplyDefinedElement) {
           // TODO(brianwilkerson) Report this error?
           element = null;
@@ -5464,7 +5625,7 @@
       PrefixedIdentifier prefixedIdentifier = identifier;
       SimpleIdentifier prefix = prefixedIdentifier.prefix;
       SimpleIdentifier name = prefixedIdentifier.identifier;
-      Element element = resolveSimpleIdentifier(prefix);
+      Element element = _resolveSimpleIdentifier(prefix);
       if (element == null) {
       } else {
         if (element is PrefixElement) {
@@ -5483,11 +5644,11 @@
         name.staticElement = element;
         if (node.newKeyword == null) {
           if (element is ClassElement) {
-            Element memberElement = lookupGetterOrMethod((element as ClassElement).type, name.name);
+            Element memberElement = _lookupGetterOrMethod((element as ClassElement).type, name.name);
             if (memberElement == null) {
               memberElement = (element as ClassElement).getNamedConstructor(name.name);
               if (memberElement == null) {
-                memberElement = lookUpSetter(prefix, (element as ClassElement).type, name.name);
+                memberElement = _lookUpSetter(prefix, (element as ClassElement).type, name.name);
               }
             }
             if (memberElement == null) {
@@ -5511,6 +5672,7 @@
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ConstructorElement element = node.element;
@@ -5530,11 +5692,12 @@
           }
         }
       }
-      setMetadata(constructorElement, node);
+      _setMetadata(constructorElement, node);
     }
     return null;
   }
 
+  @override
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
     ClassElement enclosingClass = _resolver.enclosingClass;
@@ -5543,8 +5706,9 @@
     return null;
   }
 
+  @override
   Object visitConstructorName(ConstructorName node) {
-    Type2 type = node.type.type;
+    DartType type = node.type.type;
     if (type != null && type.isDynamic) {
       return null;
     } else if (type is! InterfaceType) {
@@ -5575,38 +5739,44 @@
     return null;
   }
 
+  @override
   Object visitContinueStatement(ContinueStatement node) {
-    lookupLabel(node, node.label);
+    _lookupLabel(node, node.label);
     return null;
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
       // The element is null when the URI is invalid
       // TODO(brianwilkerson) Figure out whether the element can ever be something other than an
       // ExportElement
-      resolveCombinators(exportElement.exportedLibrary, node.combinators);
-      setMetadata(exportElement, node);
+      _resolveCombinators(exportElement.exportedLibrary, node.combinators);
+      _setMetadata(exportElement, node);
     }
     return null;
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
-    setMetadataForParameter(node.element, node);
+    _setMetadataForParameter(node.element, node);
     return super.visitFieldFormalParameter(node);
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     // TODO(brianwilkerson) Can we ever resolve the function being invoked?
     Expression expression = node.function;
@@ -5614,7 +5784,7 @@
       FunctionExpression functionExpression = expression;
       ExecutableElement functionElement = functionExpression.element;
       ArgumentList argumentList = node.argumentList;
-      List<ParameterElement> parameters = resolveArgumentsToFunction(false, argumentList, functionElement);
+      List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, functionElement);
       if (parameters != null) {
         argumentList.correspondingStaticParameters = parameters;
       }
@@ -5622,16 +5792,19 @@
     return null;
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    setMetadataForParameter(node.element, node);
+    _setMetadataForParameter(node.element, node);
     return null;
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
     SimpleIdentifier prefixNode = node.prefix;
     if (prefixNode != null) {
@@ -5648,81 +5821,86 @@
       // The element is null when the URI is invalid
       LibraryElement library = importElement.importedLibrary;
       if (library != null) {
-        resolveCombinators(library, node.combinators);
+        _resolveCombinators(library, node.combinators);
       }
-      setMetadata(importElement, node);
+      _setMetadata(importElement, node);
     }
     return null;
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
     Expression target = node.realTarget;
-    Type2 staticType = getStaticType(target);
-    Type2 propagatedType = getPropagatedType(target);
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
     String getterMethodName = sc.TokenType.INDEX.lexeme;
     String setterMethodName = sc.TokenType.INDEX_EQ.lexeme;
     bool isInGetterContext = node.inGetterContext();
     bool isInSetterContext = node.inSetterContext();
     if (isInGetterContext && isInSetterContext) {
       // lookup setter
-      MethodElement setterStaticMethod = lookUpMethod(target, staticType, setterMethodName);
-      MethodElement setterPropagatedMethod = lookUpMethod(target, propagatedType, setterMethodName);
+      MethodElement setterStaticMethod = _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement setterPropagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
       // set setter element
       node.staticElement = setterStaticMethod;
       node.propagatedElement = setterPropagatedMethod;
       // generate undefined method warning
-      checkForUndefinedIndexOperator(node, target, getterMethodName, setterStaticMethod, setterPropagatedMethod, staticType, propagatedType);
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, setterStaticMethod, setterPropagatedMethod, staticType, propagatedType);
       // lookup getter method
-      MethodElement getterStaticMethod = lookUpMethod(target, staticType, getterMethodName);
-      MethodElement getterPropagatedMethod = lookUpMethod(target, propagatedType, getterMethodName);
+      MethodElement getterStaticMethod = _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement getterPropagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
       // set getter element
       AuxiliaryElements auxiliaryElements = new AuxiliaryElements(getterStaticMethod, getterPropagatedMethod);
       node.auxiliaryElements = auxiliaryElements;
       // generate undefined method warning
-      checkForUndefinedIndexOperator(node, target, getterMethodName, getterStaticMethod, getterPropagatedMethod, staticType, propagatedType);
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, getterStaticMethod, getterPropagatedMethod, staticType, propagatedType);
     } else if (isInGetterContext) {
       // lookup getter method
-      MethodElement staticMethod = lookUpMethod(target, staticType, getterMethodName);
-      MethodElement propagatedMethod = lookUpMethod(target, propagatedType, getterMethodName);
+      MethodElement staticMethod = _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
       // set getter element
       node.staticElement = staticMethod;
       node.propagatedElement = propagatedMethod;
       // generate undefined method warning
-      checkForUndefinedIndexOperator(node, target, getterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
     } else if (isInSetterContext) {
       // lookup setter method
-      MethodElement staticMethod = lookUpMethod(target, staticType, setterMethodName);
-      MethodElement propagatedMethod = lookUpMethod(target, propagatedType, setterMethodName);
+      MethodElement staticMethod = _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
       // set setter element
       node.staticElement = staticMethod;
       node.propagatedElement = propagatedMethod;
       // generate undefined method warning
-      checkForUndefinedIndexOperator(node, target, setterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
+      _checkForUndefinedIndexOperator(node, target, setterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
     }
     return null;
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement invokedConstructor = node.constructorName.staticElement;
     node.staticElement = invokedConstructor;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = resolveArgumentsToFunction(node.isConst, argumentList, invokedConstructor);
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(node.isConst, argumentList, invokedConstructor);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
     return null;
   }
 
+  @override
   Object visitLibraryDirective(LibraryDirective node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodName = node.methodName;
     //
@@ -5737,16 +5915,16 @@
     // propagated type information.
     //
     Expression target = node.realTarget;
-    if (target is SuperExpression && !isSuperInValidContext(target)) {
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
       return null;
     }
     Element staticElement;
     Element propagatedElement;
     if (target == null) {
-      staticElement = resolveInvokedElement(methodName);
+      staticElement = _resolveInvokedElement(methodName);
       propagatedElement = null;
     } else {
-      Type2 staticType = getStaticType(target);
+      DartType staticType = _getStaticType(target);
       //
       // If this method invocation is of the form 'C.m' where 'C' is a class, then we don't call
       // resolveInvokedElement(..) which walks up the class hierarchy, instead we just look for the
@@ -5754,14 +5932,14 @@
       //
       ClassElementImpl typeReference = getTypeReference(target);
       if (typeReference != null) {
-        staticElement = propagatedElement = resolveElement(typeReference, methodName);
+        staticElement = propagatedElement = _resolveElement(typeReference, methodName);
       } else {
-        staticElement = resolveInvokedElementWithTarget(target, staticType, methodName);
-        propagatedElement = resolveInvokedElementWithTarget(target, getPropagatedType(target), methodName);
+        staticElement = _resolveInvokedElementWithTarget(target, staticType, methodName);
+        propagatedElement = _resolveInvokedElementWithTarget(target, _getPropagatedType(target), methodName);
       }
     }
-    staticElement = convertSetterToGetter(staticElement);
-    propagatedElement = convertSetterToGetter(propagatedElement);
+    staticElement = _convertSetterToGetter(staticElement);
+    propagatedElement = _convertSetterToGetter(propagatedElement);
     //
     // Record the results.
     //
@@ -5769,13 +5947,13 @@
     methodName.propagatedElement = propagatedElement;
     ArgumentList argumentList = node.argumentList;
     if (staticElement != null) {
-      List<ParameterElement> parameters = computeCorrespondingParameters(argumentList, staticElement);
+      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, staticElement);
       if (parameters != null) {
         argumentList.correspondingStaticParameters = parameters;
       }
     }
     if (propagatedElement != null) {
-      List<ParameterElement> parameters = computeCorrespondingParameters(argumentList, propagatedElement);
+      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, propagatedElement);
       if (parameters != null) {
         argumentList.correspondingPropagatedParameters = parameters;
       }
@@ -5783,16 +5961,16 @@
     //
     // Then check for error conditions.
     //
-    ErrorCode errorCode = checkForInvocationError(target, true, staticElement);
+    ErrorCode errorCode = _checkForInvocationError(target, true, staticElement);
     bool generatedWithTypePropagation = false;
     if (_enableHints && errorCode == null && staticElement == null) {
-      errorCode = checkForInvocationError(target, false, propagatedElement);
+      errorCode = _checkForInvocationError(target, false, propagatedElement);
       if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
         ClassElement classElementContext = null;
         if (target == null) {
           classElementContext = _resolver.enclosingClass;
         } else {
-          Type2 type = target.bestType;
+          DartType type = target.bestType;
           if (type != null) {
             if (type.element is ClassElement) {
               classElementContext = type.element as ClassElement;
@@ -5829,14 +6007,14 @@
         // ignore Function "call"
         // (if we are about to create a hint using type propagation, then we can use type
         // propagation here as well)
-        Type2 targetType = null;
+        DartType targetType = null;
         if (!generatedWithTypePropagation) {
-          targetType = getStaticType(target);
+          targetType = _getStaticType(target);
         } else {
           // choose the best type
-          targetType = getPropagatedType(target);
+          targetType = _getPropagatedType(target);
           if (targetType == null) {
-            targetType = getStaticType(target);
+            targetType = _getStaticType(target);
           }
         }
         if (targetType != null && targetType.isDartCoreFunction && methodName.name == CALL_METHOD_NAME) {
@@ -5851,40 +6029,44 @@
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
       // Generate the type name.
       // The error code will never be generated via type propagation
-      Type2 targetType = getStaticType(target);
+      DartType targetType = _getStaticType(target);
       String targetTypeName = targetType == null ? null : targetType.name;
       _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
     }
     return null;
   }
 
+  @override
   Object visitPartDirective(PartDirective node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitPartOfDirective(PartOfDirective node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
-    String methodName = getPostfixOperator(node);
-    Type2 staticType = getStaticType(operand);
-    MethodElement staticMethod = lookUpMethod(operand, staticType, methodName);
+    String methodName = _getPostfixOperator(node);
+    DartType staticType = _getStaticType(operand);
+    MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
     node.staticElement = staticMethod;
-    Type2 propagatedType = getPropagatedType(operand);
-    MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
+    DartType propagatedType = _getPropagatedType(operand);
+    MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
     node.propagatedElement = propagatedMethod;
-    if (shouldReportMissingMember(staticType, staticMethod)) {
+    if (_shouldReportMissingMember(staticType, staticMethod)) {
       _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
-    } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+    } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
       _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]);
     }
     return null;
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     SimpleIdentifier identifier = node.identifier;
@@ -5924,7 +6106,7 @@
       // Validate annotation element.
       if (node.parent is Annotation) {
         Annotation annotation = node.parent as Annotation;
-        resolveAnnotationElement(annotation);
+        _resolveAnnotationElement(annotation);
         return null;
       }
       return null;
@@ -5932,47 +6114,50 @@
     // May be annotation, resolve invocation of "const" constructor.
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
-      resolveAnnotationElement(annotation);
+      _resolveAnnotationElement(annotation);
     }
     //
     // Otherwise, the prefix is really an expression that happens to be a simple identifier and this
     // is really equivalent to a property access node.
     //
-    resolvePropertyAccess(prefix, identifier);
+    _resolvePropertyAccess(prefix, identifier);
     return null;
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
     if (operatorType.isUserDefinableOperator || identical(operatorType, sc.TokenType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
       Expression operand = node.operand;
-      String methodName = getPrefixOperator(node);
-      Type2 staticType = getStaticType(operand);
-      MethodElement staticMethod = lookUpMethod(operand, staticType, methodName);
+      String methodName = _getPrefixOperator(node);
+      DartType staticType = _getStaticType(operand);
+      MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
       node.staticElement = staticMethod;
-      Type2 propagatedType = getPropagatedType(operand);
-      MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
+      DartType propagatedType = _getPropagatedType(operand);
+      MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
       node.propagatedElement = propagatedMethod;
-      if (shouldReportMissingMember(staticType, staticMethod)) {
+      if (_shouldReportMissingMember(staticType, staticMethod)) {
         _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
-      } else if (_enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+      } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
         _resolver.reportErrorProxyConditionalAnalysisError(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
       }
     }
     return null;
   }
 
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
-    if (target is SuperExpression && !isSuperInValidContext(target)) {
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
       return null;
     }
     SimpleIdentifier propertyName = node.propertyName;
-    resolvePropertyAccess(target, propertyName);
+    _resolvePropertyAccess(target, propertyName);
     return null;
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
@@ -5995,18 +6180,20 @@
     }
     node.staticElement = element;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = resolveArgumentsToFunction(false, argumentList, element);
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, element);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
     return null;
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    setMetadataForParameter(node.element, node);
+    _setMetadataForParameter(node.element, node);
     return null;
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     //
     // Synthetic identifiers have been already reported during parsing.
@@ -6032,16 +6219,16 @@
     //
     // Otherwise, the node should be resolved.
     //
-    Element element = resolveSimpleIdentifier(node);
+    Element element = _resolveSimpleIdentifier(node);
     ClassElement enclosingClass = _resolver.enclosingClass;
-    if (isFactoryConstructorReturnType(node) && element != enclosingClass) {
+    if (_isFactoryConstructorReturnType(node) && element != enclosingClass) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
-    } else if (isConstructorReturnType(node) && element != enclosingClass) {
+    } else if (_isConstructorReturnType(node) && element != enclosingClass) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       element = null;
-    } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
+    } else if (element == null || (element is PrefixElement && !_isValidAsPrefix(node))) {
       // TODO(brianwilkerson) Recover from this error.
-      if (isConstructorReturnType(node)) {
+      if (_isConstructorReturnType(node)) {
         _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       } else if (node.parent is Annotation) {
         Annotation annotation = node.parent as Annotation;
@@ -6053,7 +6240,7 @@
     node.staticElement = element;
     if (node.inSetterContext() && node.inGetterContext() && enclosingClass != null) {
       InterfaceType enclosingType = enclosingClass.type;
-      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(lookUpGetter(null, enclosingType, node.name), null);
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(_lookUpGetter(null, enclosingType, node.name), null);
       node.auxiliaryElements = auxiliaryElements;
     }
     //
@@ -6061,11 +6248,12 @@
     //
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
-      resolveAnnotationElement(annotation);
+      _resolveAnnotationElement(annotation);
     }
     return null;
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
@@ -6097,27 +6285,30 @@
     }
     node.staticElement = element;
     ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = resolveArgumentsToFunction(isInConstConstructor, argumentList, element);
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(isInConstConstructor, argumentList, element);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
     return null;
   }
 
+  @override
   Object visitSuperExpression(SuperExpression node) {
-    if (!isSuperInValidContext(node)) {
+    if (!_isSuperInValidContext(node)) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
     }
     return super.visitSuperExpression(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
-    setMetadata(node.element, node);
+    _setMetadata(node.element, node);
     return null;
   }
 
@@ -6128,12 +6319,15 @@
    * @param annotationList the list of elements to which new elements are to be added
    * @param annotations the AST nodes used to generate new elements
    */
-  void addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annotation> annotations) {
+  void _addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annotation> annotations) {
     int annotationCount = annotations.length;
     for (int i = 0; i < annotationCount; i++) {
-      Element resolvedElement = annotations[i].element;
+      Annotation annotation = annotations[i];
+      Element resolvedElement = annotation.element;
       if (resolvedElement != null) {
-        annotationList.add(new ElementAnnotationImpl(resolvedElement));
+        ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(resolvedElement);
+        annotation.elementAnnotation = elementAnnotation;
+        annotationList.add(elementAnnotation);
       }
     }
   }
@@ -6147,7 +6341,7 @@
    * @param element the element to be invoked
    * @return the error code that should be reported
    */
-  ErrorCode checkForInvocationError(Expression target, bool useStaticContext, Element element) {
+  ErrorCode _checkForInvocationError(Expression target, bool useStaticContext, Element element) {
     // Prefix is not declared, instead "prefix.id" are declared.
     if (element is PrefixElement) {
       element = null;
@@ -6159,8 +6353,8 @@
       // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
       FunctionType getterType = element.type;
       if (getterType != null) {
-        Type2 returnType = getterType.returnType;
-        if (!isExecutableType(returnType)) {
+        DartType returnType = getterType.returnType;
+        if (!_isExecutableType(returnType)) {
           return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
         }
       }
@@ -6180,14 +6374,14 @@
         PropertyAccessorElement getter = element.getter;
         FunctionType getterType = getter.type;
         if (getterType != null) {
-          Type2 returnType = getterType.returnType;
-          if (!isExecutableType(returnType)) {
+          DartType returnType = getterType.returnType;
+          if (!_isExecutableType(returnType)) {
             return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
           }
         }
       } else if (element is VariableElement) {
-        Type2 variableType = element.type;
-        if (!isExecutableType(variableType)) {
+        DartType variableType = element.type;
+        if (!_isExecutableType(variableType)) {
           return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
         }
       } else {
@@ -6202,9 +6396,9 @@
             return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
           }
         } else {
-          Type2 targetType;
+          DartType targetType;
           if (useStaticContext) {
-            targetType = getStaticType(target);
+            targetType = _getStaticType(target);
           } else {
             // Compute and use the propagated type, if it is null, then it may be the case that
             // static type is some type, in which the static type should be used.
@@ -6232,9 +6426,9 @@
    *          index expression
    * @return `true` if and only if an error code is generated on the passed node
    */
-  bool checkForUndefinedIndexOperator(IndexExpression node, Expression target, String methodName, MethodElement staticMethod, MethodElement propagatedMethod, Type2 staticType, Type2 propagatedType) {
-    bool shouldReportMissingMember_static = shouldReportMissingMember(staticType, staticMethod);
-    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && shouldReportMissingMember(propagatedType, propagatedMethod) && !memberFoundInSubclass(propagatedType.element, methodName, true, false);
+  bool _checkForUndefinedIndexOperator(IndexExpression node, Expression target, String methodName, MethodElement staticMethod, MethodElement propagatedMethod, DartType staticType, DartType propagatedType) {
+    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticMethod);
+    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false);
     if (shouldReportMissingMember_static || shouldReportMissingMember_propagated) {
       sc.Token leftBracket = node.leftBracket;
       sc.Token rightBracket = node.rightBracket;
@@ -6264,41 +6458,41 @@
    * @param executableElement the element that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
    */
-  List<ParameterElement> computeCorrespondingParameters(ArgumentList argumentList, Element element) {
+  List<ParameterElement> _computeCorrespondingParameters(ArgumentList argumentList, Element element) {
     if (element is PropertyAccessorElement) {
       //
       // This is an invocation of the call method defined on the value returned by the getter.
       //
       FunctionType getterType = element.type;
       if (getterType != null) {
-        Type2 getterReturnType = getterType.returnType;
+        DartType getterReturnType = getterType.returnType;
         if (getterReturnType is InterfaceType) {
           MethodElement callMethod = getterReturnType.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
           if (callMethod != null) {
-            return resolveArgumentsToFunction(false, argumentList, callMethod);
+            return _resolveArgumentsToFunction(false, argumentList, callMethod);
           }
         } else if (getterReturnType is FunctionType) {
           Element functionElement = getterReturnType.element;
           if (functionElement is ExecutableElement) {
-            return resolveArgumentsToFunction(false, argumentList, functionElement);
+            return _resolveArgumentsToFunction(false, argumentList, functionElement);
           }
         }
       }
     } else if (element is ExecutableElement) {
-      return resolveArgumentsToFunction(false, argumentList, element);
+      return _resolveArgumentsToFunction(false, argumentList, element);
     } else if (element is VariableElement) {
       VariableElement variable = element;
-      Type2 type = _promoteManager.getStaticType(variable);
+      DartType type = _promoteManager.getStaticType(variable);
       if (type is FunctionType) {
         FunctionType functionType = type;
         List<ParameterElement> parameters = functionType.parameters;
-        return resolveArgumentsToParameters(false, argumentList, parameters);
+        return _resolveArgumentsToParameters(false, argumentList, parameters);
       } else if (type is InterfaceType) {
         // "call" invocation
         MethodElement callMethod = type.lookUpMethod(CALL_METHOD_NAME, _definingLibrary);
         if (callMethod != null) {
           List<ParameterElement> parameters = callMethod.parameters;
-          return resolveArgumentsToParameters(false, argumentList, parameters);
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
         }
       }
     }
@@ -6312,7 +6506,7 @@
    * @param element the element to be normalized
    * @return a non-setter element derived from the given element
    */
-  Element convertSetterToGetter(Element element) {
+  Element _convertSetterToGetter(Element element) {
     // TODO(brianwilkerson) Determine whether and why the element could ever be a setter.
     if (element is PropertyAccessorElement) {
       return element.variable.getter;
@@ -6327,7 +6521,7 @@
    * @param identifier the identifier that might have been imported using a prefix
    * @return the element that was found
    */
-  Element findImportWithoutPrefix(SimpleIdentifier identifier) {
+  Element _findImportWithoutPrefix(SimpleIdentifier identifier) {
     Element element = null;
     Scope nameScope = _resolver.nameScope;
     for (ImportElement importElement in _definingLibrary.imports) {
@@ -6353,7 +6547,7 @@
    * @param node the postfix expression being invoked
    * @return the name of the method invoked by the expression
    */
-  String getPostfixOperator(PostfixExpression node) => (identical(node.operator.type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
+  String _getPostfixOperator(PostfixExpression node) => (identical(node.operator.type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
 
   /**
    * Return the name of the method invoked by the given postfix expression.
@@ -6361,7 +6555,7 @@
    * @param node the postfix expression being invoked
    * @return the name of the method invoked by the expression
    */
-  String getPrefixOperator(PrefixExpression node) {
+  String _getPrefixOperator(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
     if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
@@ -6381,8 +6575,8 @@
    * @param expression the expression whose type is to be returned
    * @return the type of the given expression
    */
-  Type2 getPropagatedType(Expression expression) {
-    Type2 propagatedType = resolveTypeParameter(expression.propagatedType);
+  DartType _getPropagatedType(Expression expression) {
+    DartType propagatedType = _resolveTypeParameter(expression.propagatedType);
     if (propagatedType is FunctionType) {
       //
       // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
@@ -6398,11 +6592,11 @@
    * @param expression the expression whose type is to be returned
    * @return the type of the given expression
    */
-  Type2 getStaticType(Expression expression) {
+  DartType _getStaticType(Expression expression) {
     if (expression is NullLiteral) {
       return _resolver.typeProvider.bottomType;
     }
-    Type2 staticType = resolveTypeParameter(expression.staticType);
+    DartType staticType = _resolveTypeParameter(expression.staticType);
     if (staticType is FunctionType) {
       //
       // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
@@ -6419,7 +6613,7 @@
    * @param type the type being tested
    * @return `true` if the given type represents an object that could be invoked
    */
-  bool isExecutableType(Type2 type) {
+  bool _isExecutableType(DartType type) {
     if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || type.isObject) {
       return true;
     } else if (type is InterfaceType) {
@@ -6447,7 +6641,7 @@
    * @param element the element being tested
    * @return `true` if the given element is a static element
    */
-  bool isStatic(Element element) {
+  bool _isStatic(Element element) {
     if (element is ExecutableElement) {
       return element.isStatic;
     } else if (element is PropertyInducingElement) {
@@ -6464,7 +6658,7 @@
    * @param node the node being tested
    * @return `true` if the given node is the prefix in an import directive
    */
-  bool isValidAsPrefix(SimpleIdentifier node) {
+  bool _isValidAsPrefix(SimpleIdentifier node) {
     AstNode parent = node.parent;
     if (parent is ImportDirective) {
       return identical(parent.prefix, node);
@@ -6485,8 +6679,8 @@
    * @param getterName the name of the getter being looked up
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement lookUpGetter(Expression target, Type2 type, String getterName) {
-    type = resolveTypeParameter(type);
+  PropertyAccessorElement _lookUpGetter(Expression target, DartType type, String getterName) {
+    type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
       PropertyAccessorElement accessor;
@@ -6498,7 +6692,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
+      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6515,7 +6709,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6532,13 +6726,13 @@
       }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      PropertyAccessorElement getter = lookUpGetterInInterfaces(interfaceType, true, getterName, visitedInterfaces);
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(interfaceType, true, getterName, visitedInterfaces);
       if (getter != null) {
         return getter;
       }
     }
     for (InterfaceType mixinType in targetType.mixins) {
-      PropertyAccessorElement getter = lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
       if (getter != null) {
         return getter;
       }
@@ -6547,7 +6741,7 @@
     if (superclass == null) {
       return null;
     }
-    return lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfaces);
+    return _lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfaces);
   }
 
   /**
@@ -6559,8 +6753,8 @@
    * @param memberName the name of the method or getter being looked up
    * @return the element representing the method or getter that was found
    */
-  ExecutableElement lookupGetterOrMethod(Type2 type, String memberName) {
-    type = resolveTypeParameter(type);
+  ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
+    type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
       ExecutableElement member = interfaceType.lookUpMethod(memberName, _definingLibrary);
@@ -6571,7 +6765,7 @@
       if (member != null) {
         return member;
       }
-      return lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
+      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6588,7 +6782,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method or getter that was found
    */
-  ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6609,13 +6803,13 @@
       }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      ExecutableElement member = lookUpGetterOrMethodInInterfaces(interfaceType, true, memberName, visitedInterfaces);
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(interfaceType, true, memberName, visitedInterfaces);
       if (member != null) {
         return member;
       }
     }
     for (InterfaceType mixinType in targetType.mixins) {
-      ExecutableElement member = lookUpGetterOrMethodInInterfaces(mixinType, true, memberName, visitedInterfaces);
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(mixinType, true, memberName, visitedInterfaces);
       if (member != null) {
         return member;
       }
@@ -6624,7 +6818,7 @@
     if (superclass == null) {
       return null;
     }
-    return lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visitedInterfaces);
+    return _lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visitedInterfaces);
   }
 
   /**
@@ -6634,7 +6828,7 @@
    * @param labelNode the node representing the label being looked up
    * @return the element corresponding to the given label node in the current scope
    */
-  LabelElementImpl lookupLabel(AstNode parentNode, SimpleIdentifier labelNode) {
+  LabelElementImpl _lookupLabel(AstNode parentNode, SimpleIdentifier labelNode) {
     LabelScope labelScope = _resolver.labelScope;
     LabelElementImpl labelElement = null;
     if (labelNode == null) {
@@ -6680,8 +6874,8 @@
    * @param methodName the name of the method being looked up
    * @return the element representing the method that was found
    */
-  MethodElement lookUpMethod(Expression target, Type2 type, String methodName) {
-    type = resolveTypeParameter(type);
+  MethodElement _lookUpMethod(Expression target, DartType type, String methodName) {
+    type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
       MethodElement method;
@@ -6693,7 +6887,7 @@
       if (method != null) {
         return method;
       }
-      return lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
+      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6710,7 +6904,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method that was found
    */
-  MethodElement lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6727,13 +6921,13 @@
       }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      MethodElement method = lookUpMethodInInterfaces(interfaceType, true, methodName, visitedInterfaces);
+      MethodElement method = _lookUpMethodInInterfaces(interfaceType, true, methodName, visitedInterfaces);
       if (method != null) {
         return method;
       }
     }
     for (InterfaceType mixinType in targetType.mixins) {
-      MethodElement method = lookUpMethodInInterfaces(mixinType, true, methodName, visitedInterfaces);
+      MethodElement method = _lookUpMethodInInterfaces(mixinType, true, methodName, visitedInterfaces);
       if (method != null) {
         return method;
       }
@@ -6742,7 +6936,7 @@
     if (superclass == null) {
       return null;
     }
-    return lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfaces);
+    return _lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfaces);
   }
 
   /**
@@ -6754,8 +6948,8 @@
    * @param setterName the name of the setter being looked up
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement lookUpSetter(Expression target, Type2 type, String setterName) {
-    type = resolveTypeParameter(type);
+  PropertyAccessorElement _lookUpSetter(Expression target, DartType type, String setterName) {
+    type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
       PropertyAccessorElement accessor;
@@ -6767,7 +6961,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
+      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6784,7 +6978,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6801,13 +6995,13 @@
       }
     }
     for (InterfaceType interfaceType in targetType.interfaces) {
-      PropertyAccessorElement setter = lookUpSetterInInterfaces(interfaceType, true, setterName, visitedInterfaces);
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(interfaceType, true, setterName, visitedInterfaces);
       if (setter != null) {
         return setter;
       }
     }
     for (InterfaceType mixinType in targetType.mixins) {
-      PropertyAccessorElement setter = lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
       if (setter != null) {
         return setter;
       }
@@ -6816,7 +7010,7 @@
     if (superclass == null) {
       return null;
     }
-    return lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfaces);
+    return _lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfaces);
   }
 
   /**
@@ -6832,7 +7026,7 @@
    *          the subtypes
    * @return `true` if and only if the passed memberName was found in a subtype
    */
-  bool memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
+  bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
     if (element is ClassElement) {
       _subtypeManager.ensureLibraryVisited(_definingLibrary);
       Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
@@ -6853,7 +7047,7 @@
    * @param operator the assignment operator being mapped
    * @return the binary operator that invoked by the given assignment operator
    */
-  sc.TokenType operatorFromCompoundAssignment(sc.TokenType operator) {
+  sc.TokenType _operatorFromCompoundAssignment(sc.TokenType operator) {
     while (true) {
       if (operator == sc.TokenType.AMPERSAND_EQ) {
         return sc.TokenType.AMPERSAND;
@@ -6886,14 +7080,14 @@
     }
   }
 
-  void resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
+  void _resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
     ArgumentList argumentList = annotation.arguments;
     // error will be reported in ConstantVerifier
     if (argumentList == null) {
       return;
     }
     // resolve arguments to parameters
-    List<ParameterElement> parameters = resolveArgumentsToFunction(true, argumentList, constructor);
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(true, argumentList, constructor);
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
@@ -6904,7 +7098,7 @@
    *
    * @param annotation the [Annotation] to resolve
    */
-  void resolveAnnotationElement(Annotation annotation) {
+  void _resolveAnnotationElement(Annotation annotation) {
     SimpleIdentifier nameNode1;
     SimpleIdentifier nameNode2;
     {
@@ -6927,7 +7121,7 @@
       Element element1 = nameNode1.staticElement;
       // CONST
       if (element1 is PropertyAccessorElement) {
-        resolveAnnotationElementGetter(annotation, element1);
+        _resolveAnnotationElementGetter(annotation, element1);
         return;
       }
       // Class(args)
@@ -6951,7 +7145,7 @@
       if (element2 is PropertyAccessorElement) {
         nameNode2.staticElement = element2;
         annotation.element = element2;
-        resolveAnnotationElementGetter(annotation, element2 as PropertyAccessorElement);
+        _resolveAnnotationElementGetter(annotation, element2 as PropertyAccessorElement);
         return;
       }
       // prefix.Class()
@@ -6980,7 +7174,7 @@
         if (getter != null) {
           nameNode3.staticElement = getter;
           annotation.element = element2;
-          resolveAnnotationElementGetter(annotation, getter);
+          _resolveAnnotationElementGetter(annotation, getter);
           return;
         }
         // prefix.Class.constructor(args)
@@ -6996,10 +7190,10 @@
     // record element
     annotation.element = constructor;
     // resolve arguments
-    resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+    _resolveAnnotationConstructorInvocationArguments(annotation, constructor);
   }
 
-  void resolveAnnotationElementGetter(Annotation annotation, PropertyAccessorElement accessorElement) {
+  void _resolveAnnotationElementGetter(Annotation annotation, PropertyAccessorElement accessorElement) {
     // accessor should be synthetic
     if (!accessorElement.isSynthetic) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
@@ -7025,12 +7219,12 @@
    * @param executableElement the element that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
    */
-  List<ParameterElement> resolveArgumentsToFunction(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
+  List<ParameterElement> _resolveArgumentsToFunction(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
     if (executableElement == null) {
       return null;
     }
     List<ParameterElement> parameters = executableElement.parameters;
-    return resolveArgumentsToParameters(reportError, argumentList, parameters);
+    return _resolveArgumentsToParameters(reportError, argumentList, parameters);
   }
 
   /**
@@ -7044,7 +7238,7 @@
    * @param parameters the of the function that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
    */
-  List<ParameterElement> resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
+  List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
     Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
@@ -7106,7 +7300,7 @@
    * @param library the library that defines the names
    * @param combinators the combinators containing the names to be resolved
    */
-  void resolveCombinators(LibraryElement library, NodeList<Combinator> combinators) {
+  void _resolveCombinators(LibraryElement library, NodeList<Combinator> combinators) {
     if (library == null) {
       //
       // The library will be null if the directive containing the combinators has a URI that is not
@@ -7138,7 +7332,7 @@
    * @param classElement the class element
    * @param nameNode the member name node
    */
-  Element resolveElement(ClassElementImpl classElement, SimpleIdentifier nameNode) {
+  Element _resolveElement(ClassElementImpl classElement, SimpleIdentifier nameNode) {
     String name = nameNode.name;
     Element element = null;
     element = classElement.getMethod(name);
@@ -7163,7 +7357,7 @@
    * @param methodName the name of the method being invoked ('m')
    * @return the element being invoked
    */
-  Element resolveInvokedElement(SimpleIdentifier methodName) {
+  Element _resolveInvokedElement(SimpleIdentifier methodName) {
     //
     // Look first in the lexical scope.
     //
@@ -7176,12 +7370,12 @@
       ClassElement enclosingClass = _resolver.enclosingClass;
       if (enclosingClass != null) {
         InterfaceType enclosingType = enclosingClass.type;
-        element = lookUpMethod(null, enclosingType, methodName.name);
+        element = _lookUpMethod(null, enclosingType, methodName.name);
         if (element == null) {
           //
           // If there's no method, then it's possible that 'm' is a getter that returns a function.
           //
-          element = lookUpGetter(null, enclosingType, methodName.name);
+          element = _lookUpGetter(null, enclosingType, methodName.name);
         }
       }
     }
@@ -7200,15 +7394,15 @@
    * @param methodName the name of the method being invoked ('m')
    * @return the element being invoked
    */
-  Element resolveInvokedElementWithTarget(Expression target, Type2 targetType, SimpleIdentifier methodName) {
+  Element _resolveInvokedElementWithTarget(Expression target, DartType targetType, SimpleIdentifier methodName) {
     if (targetType is InterfaceType) {
       InterfaceType classType = targetType;
-      Element element = lookUpMethod(target, classType, methodName.name);
+      Element element = _lookUpMethod(target, classType, methodName.name);
       if (element == null) {
         //
         // If there's no method, then it's possible that 'm' is a getter that returns a function.
         //
-        element = lookUpGetter(target, classType, methodName.name);
+        element = _lookUpGetter(target, classType, methodName.name);
       }
       return element;
     } else if (target is SimpleIdentifier) {
@@ -7241,23 +7435,23 @@
    * @param propertyName the name of the property being accessed
    * @return the element that represents the property
    */
-  ExecutableElement resolveProperty(Expression target, Type2 targetType, SimpleIdentifier propertyName) {
+  ExecutableElement _resolveProperty(Expression target, DartType targetType, SimpleIdentifier propertyName) {
     ExecutableElement memberElement = null;
     if (propertyName.inSetterContext()) {
-      memberElement = lookUpSetter(target, targetType, propertyName.name);
+      memberElement = _lookUpSetter(target, targetType, propertyName.name);
     }
     if (memberElement == null) {
-      memberElement = lookUpGetter(target, targetType, propertyName.name);
+      memberElement = _lookUpGetter(target, targetType, propertyName.name);
     }
     if (memberElement == null) {
-      memberElement = lookUpMethod(target, targetType, propertyName.name);
+      memberElement = _lookUpMethod(target, targetType, propertyName.name);
     }
     return memberElement;
   }
 
-  void resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
-    Type2 staticType = getStaticType(target);
-    Type2 propagatedType = getPropagatedType(target);
+  void _resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
     Element staticElement = null;
     Element propagatedElement = null;
     //
@@ -7267,10 +7461,10 @@
     //
     ClassElementImpl typeReference = getTypeReference(target);
     if (typeReference != null) {
-      staticElement = propagatedElement = resolveElement(typeReference, propertyName);
+      staticElement = propagatedElement = _resolveElement(typeReference, propertyName);
     } else {
-      staticElement = resolveProperty(target, staticType, propertyName);
-      propagatedElement = resolveProperty(target, propagatedType, propertyName);
+      staticElement = _resolveProperty(target, staticType, propertyName);
+      propagatedElement = _resolveProperty(target, propagatedType, propertyName);
     }
     // May be part of annotation, record property element only if exists.
     // Error was already reported in validateAnnotationElement().
@@ -7282,12 +7476,12 @@
     }
     propertyName.staticElement = staticElement;
     propertyName.propagatedElement = propagatedElement;
-    bool shouldReportMissingMember_static = shouldReportMissingMember(staticType, staticElement);
-    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints ? shouldReportMissingMember(propagatedType, propagatedElement) : false;
+    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticElement);
+    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints ? _shouldReportMissingMember(propagatedType, propagatedElement) : false;
     // If we are about to generate the hint (propagated version of this warning), then check
     // that the member is not in a subtype of the propagated type.
     if (shouldReportMissingMember_propagated) {
-      if (memberFoundInSubclass(propagatedType.element, propertyName.name, false, true)) {
+      if (_memberFoundInSubclass(propagatedType.element, propertyName.name, false, true)) {
         shouldReportMissingMember_propagated = false;
       }
     }
@@ -7305,7 +7499,7 @@
       }
       Element staticOrPropagatedEnclosingElt = shouldReportMissingMember_static ? staticType.element : propagatedType.element;
       if (staticOrPropagatedEnclosingElt != null) {
-        bool isStaticProperty = isStatic(staticOrPropagatedEnclosingElt);
+        bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt);
         if (propertyName.inSetterContext()) {
           if (isStaticProperty) {
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticWarningCode.UNDEFINED_SETTER : HintCode.UNDEFINED_SETTER) as ErrorCode;
@@ -7345,7 +7539,7 @@
    * @param node the identifier to be resolved
    * @return the element to which the identifier could be resolved
    */
-  Element resolveSimpleIdentifier(SimpleIdentifier node) {
+  Element _resolveSimpleIdentifier(SimpleIdentifier node) {
     Element element = _resolver.nameScope.lookup(node, _definingLibrary);
     if (element is PropertyAccessorElement && node.inSetterContext()) {
       PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
@@ -7357,7 +7551,7 @@
           //
           ClassElement enclosingClass = _resolver.enclosingClass;
           if (enclosingClass != null) {
-            setter = lookUpSetter(null, enclosingClass.type, node.name);
+            setter = _lookUpSetter(null, enclosingClass.type, node.name);
           }
         }
         if (setter != null) {
@@ -7371,13 +7565,13 @@
     if (element == null && enclosingClass != null) {
       InterfaceType enclosingType = enclosingClass.type;
       if (element == null && node.inSetterContext()) {
-        element = lookUpSetter(null, enclosingType, node.name);
+        element = _lookUpSetter(null, enclosingType, node.name);
       }
       if (element == null && node.inGetterContext()) {
-        element = lookUpGetter(null, enclosingType, node.name);
+        element = _lookUpGetter(null, enclosingType, node.name);
       }
       if (element == null) {
-        element = lookUpMethod(null, enclosingType, node.name);
+        element = _lookUpMethod(null, enclosingType, node.name);
       }
     }
     return element;
@@ -7391,9 +7585,9 @@
    * @return the type that should be used in place of the argument if it is a type parameter, or the
    *         original argument if it isn't a type parameter
    */
-  Type2 resolveTypeParameter(Type2 type) {
+  DartType _resolveTypeParameter(DartType type) {
     if (type is TypeParameterType) {
-      Type2 bound = type.element.bound;
+      DartType bound = type.element.bound;
       if (bound == null) {
         return _resolver.typeProvider.objectType;
       }
@@ -7410,21 +7604,21 @@
    * @param element the element to which the node has been resolved
    * @param node the node that can have annotations associated with it
    */
-  void setMetadata(Element element, AnnotatedNode node) {
+  void _setMetadata(Element element, AnnotatedNode node) {
     if (element is! ElementImpl) {
       return;
     }
     List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
-    addAnnotations(annotationList, node.metadata);
+    _addAnnotations(annotationList, node.metadata);
     if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
       VariableDeclarationList list = node.parent as VariableDeclarationList;
-      addAnnotations(annotationList, list.metadata);
+      _addAnnotations(annotationList, list.metadata);
       if (list.parent is FieldDeclaration) {
         FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
-        addAnnotations(annotationList, fieldDeclaration.metadata);
+        _addAnnotations(annotationList, fieldDeclaration.metadata);
       } else if (list.parent is TopLevelVariableDeclaration) {
         TopLevelVariableDeclaration variableDeclaration = list.parent as TopLevelVariableDeclaration;
-        addAnnotations(annotationList, variableDeclaration.metadata);
+        _addAnnotations(annotationList, variableDeclaration.metadata);
       }
     }
     if (!annotationList.isEmpty) {
@@ -7440,12 +7634,12 @@
    * @param element the element to which the node has been resolved
    * @param node the node that can have annotations associated with it
    */
-  void setMetadataForParameter(Element element, NormalFormalParameter node) {
+  void _setMetadataForParameter(Element element, NormalFormalParameter node) {
     if (element is! ElementImpl) {
       return;
     }
     List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
-    addAnnotations(annotationList, node.metadata);
+    _addAnnotations(annotationList, node.metadata);
     if (!annotationList.isEmpty) {
       (element as ElementImpl).metadata = new List.from(annotationList);
     }
@@ -7459,7 +7653,7 @@
    * @param member the result of the look-up
    * @return `true` if we should report an error
    */
-  bool shouldReportMissingMember(Type2 type, Element member) {
+  bool _shouldReportMissingMember(DartType type, Element member) {
     if (member != null || type == null || type.isDynamic || type.isBottom) {
       return false;
     }
@@ -7486,20 +7680,28 @@
    */
   ElementResolver_SyntheticIdentifier(this.name);
 
+  @override
   accept(AstVisitor visitor) => null;
 
+  @override
   sc.Token get beginToken => null;
 
+  @override
   Element get bestElement => null;
 
+  @override
   sc.Token get endToken => null;
 
+  @override
   int get precedence => 16;
 
+  @override
   Element get propagatedElement => null;
 
+  @override
   Element get staticElement => null;
 
+  @override
   void visitChildren(AstVisitor visitor) {
   }
 }
@@ -7554,14 +7756,14 @@
    * @throws AnalysisException if the node could not be resolved
    */
   void resolve(AstNode node) {
-    AstNode rootNode = findResolutionRoot(node);
+    AstNode rootNode = _findResolutionRoot(node);
     Scope scope = ScopeBuilder.scopeFor(rootNode, _errorListener);
-    if (elementModelChanged(rootNode.parent)) {
+    if (_elementModelChanged(rootNode.parent)) {
       throw new AnalysisException.con1("Cannot resolve node: element model changed");
     }
-    resolveTypes(node, scope);
-    resolveVariables(node, scope);
-    resolveReferences(node, scope);
+    _resolveTypes(node, scope);
+    _resolveVariables(node, scope);
+    _resolveReferences(node, scope);
   }
 
   /**
@@ -7572,7 +7774,7 @@
    * @param node the node being tested
    * @return `true` if the given node can be resolved independently of any other nodes
    */
-  bool canBeResolved(AstNode node) => node is ClassDeclaration || node is ClassTypeAlias || node is CompilationUnit || node is ConstructorDeclaration || node is FunctionDeclaration || node is FunctionTypeAlias || node is MethodDeclaration;
+  bool _canBeResolved(AstNode node) => node is ClassDeclaration || node is ClassTypeAlias || node is CompilationUnit || node is ConstructorDeclaration || node is FunctionDeclaration || node is FunctionTypeAlias || node is MethodDeclaration;
 
   /**
    * Return `true` if the portion of the element model defined by the given node has changed.
@@ -7581,8 +7783,8 @@
    * @return `true` if the element model defined by the given node has changed
    * @throws AnalysisException if the correctness of the element model cannot be determined
    */
-  bool elementModelChanged(AstNode node) {
-    Element element = getElement(node);
+  bool _elementModelChanged(AstNode node) {
+    Element element = _getElement(node);
     if (element == null) {
       throw new AnalysisException.con1("Cannot resolve node: a ${node.runtimeType.toString()} does not define an element");
     }
@@ -7598,10 +7800,10 @@
    * @return the smallest AST node that can be resolved independently of any other nodes
    * @throws AnalysisException if there is no such node
    */
-  AstNode findResolutionRoot(AstNode node) {
+  AstNode _findResolutionRoot(AstNode node) {
     AstNode result = node;
     AstNode parent = result.parent;
-    while (parent != null && !canBeResolved(parent)) {
+    while (parent != null && !_canBeResolved(parent)) {
       result = parent;
       parent = result.parent;
     }
@@ -7618,7 +7820,7 @@
    * @param node the node defining the element to be returned
    * @return the element defined by the given node
    */
-  Element getElement(AstNode node) {
+  Element _getElement(AstNode node) {
     if (node is Declaration) {
       return node.element;
     } else if (node is CompilationUnit) {
@@ -7627,7 +7829,7 @@
     return null;
   }
 
-  void resolveReferences(AstNode node, Scope scope) {
+  void _resolveReferences(AstNode node, Scope scope) {
     ResolverVisitor visitor = new ResolverVisitor.con3(_definingLibrary, _source, _typeProvider, scope, _errorListener);
     node.accept(visitor);
     for (ProxyConditionalAnalysisError conditionalCode in visitor.proxyConditionalAnalysisErrors) {
@@ -7637,12 +7839,12 @@
     }
   }
 
-  void resolveTypes(AstNode node, Scope scope) {
+  void _resolveTypes(AstNode node, Scope scope) {
     TypeResolverVisitor visitor = new TypeResolverVisitor.con3(_definingLibrary, _source, _typeProvider, scope, _errorListener);
     node.accept(visitor);
   }
 
-  void resolveVariables(AstNode node, Scope scope) {
+  void _resolveVariables(AstNode node, Scope scope) {
     VariableResolverVisitor visitor = new VariableResolverVisitor.con2(_definingLibrary, _source, _typeProvider, scope, _errorListener);
     node.accept(visitor);
   }
@@ -7662,26 +7864,26 @@
    * TODO (jwren) Associate a propagated type to the synthetic method element using least upper
    * bound calls
    */
-  static ExecutableElement computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
-    int h = getNumOfPositionalParameters(elementArrayToMerge[0]);
-    int r = getNumOfRequiredParameters(elementArrayToMerge[0]);
+  static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
+    int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
+    int r = _getNumOfRequiredParameters(elementArrayToMerge[0]);
     Set<String> namedParametersList = new Set<String>();
     for (int i = 1; i < elementArrayToMerge.length; i++) {
       ExecutableElement element = elementArrayToMerge[i];
-      int numOfPositionalParams = getNumOfPositionalParameters(element);
+      int numOfPositionalParams = _getNumOfPositionalParameters(element);
       if (h < numOfPositionalParams) {
         h = numOfPositionalParams;
       }
-      int numOfRequiredParams = getNumOfRequiredParameters(element);
+      int numOfRequiredParams = _getNumOfRequiredParameters(element);
       if (r > numOfRequiredParams) {
         r = numOfRequiredParams;
       }
-      namedParametersList.addAll(getNamedParameterNames(element));
+      namedParametersList.addAll(_getNamedParameterNames(element));
     }
     if (r > h) {
       return null;
     }
-    return createSyntheticExecutableElement(elementArrayToMerge, elementArrayToMerge[0].displayName, r, h - r, new List.from(namedParametersList));
+    return _createSyntheticExecutableElement(elementArrayToMerge, elementArrayToMerge[0].displayName, r, h - r, new List.from(namedParametersList));
   }
 
   /**
@@ -7695,7 +7897,7 @@
    * @param namedParameters the list of [String]s that are the named parameters
    * @return the created synthetic element
    */
-  static ExecutableElement createSyntheticExecutableElement(List<ExecutableElement> elementArrayToMerge, String name, int numOfRequiredParameters, int numOfPositionalParameters, List<String> namedParameters) {
+  static ExecutableElement _createSyntheticExecutableElement(List<ExecutableElement> elementArrayToMerge, String name, int numOfRequiredParameters, int numOfPositionalParameters, List<String> namedParameters) {
     DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
     SimpleIdentifier nameIdentifier = new SimpleIdentifier(new sc.StringToken(sc.TokenType.IDENTIFIER, name, 0));
     ExecutableElementImpl executable;
@@ -7741,7 +7943,7 @@
   /**
    * Given some [ExecutableElement], return the list of named parameters.
    */
-  static List<String> getNamedParameterNames(ExecutableElement executableElement) {
+  static List<String> _getNamedParameterNames(ExecutableElement executableElement) {
     List<String> namedParameterNames = new List<String>();
     List<ParameterElement> parameters = executableElement.parameters;
     for (int i = 0; i < parameters.length; i++) {
@@ -7756,7 +7958,7 @@
   /**
    * Given some [ExecutableElement] return the number of parameters of the specified kind.
    */
-  static int getNumOfParameters(ExecutableElement executableElement, ParameterKind parameterKind) {
+  static int _getNumOfParameters(ExecutableElement executableElement, ParameterKind parameterKind) {
     int parameterCount = 0;
     List<ParameterElement> parameters = executableElement.parameters;
     for (int i = 0; i < parameters.length; i++) {
@@ -7773,12 +7975,12 @@
    *
    * Note: by positional we mean [ParameterKind#REQUIRED] or [ParameterKind#POSITIONAL].
    */
-  static int getNumOfPositionalParameters(ExecutableElement executableElement) => getNumOfParameters(executableElement, ParameterKind.REQUIRED) + getNumOfParameters(executableElement, ParameterKind.POSITIONAL);
+  static int _getNumOfPositionalParameters(ExecutableElement executableElement) => _getNumOfParameters(executableElement, ParameterKind.REQUIRED) + _getNumOfParameters(executableElement, ParameterKind.POSITIONAL);
 
   /**
    * Given some [ExecutableElement] return the number of required parameters.
    */
-  static int getNumOfRequiredParameters(ExecutableElement executableElement) => getNumOfParameters(executableElement, ParameterKind.REQUIRED);
+  static int _getNumOfRequiredParameters(ExecutableElement executableElement) => _getNumOfParameters(executableElement, ParameterKind.REQUIRED);
 
   /**
    * Given some [ExecutableElement] returns `true` if it is an abstract member of a
@@ -7787,7 +7989,7 @@
    * @param executableElement some [ExecutableElement] to evaluate
    * @return `true` if the given element is an abstract member of a class
    */
-  static bool isAbstract(ExecutableElement executableElement) {
+  static bool _isAbstract(ExecutableElement executableElement) {
     if (executableElement is MethodElement) {
       return executableElement.isAbstract;
     } else if (executableElement is PropertyAccessorElement) {
@@ -7848,7 +8050,7 @@
    * @return a mapping between the set of all members inherited from the passed [ClassElement]
    *         superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new Set<ClassElement>());
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -7858,7 +8060,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement].
    */
-  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new Set<ClassElement>());
 
   /**
    * Given some [ClassElement] and some member name, this returns the
@@ -7875,9 +8077,9 @@
     if (memberName == null || memberName.isEmpty) {
       return null;
     }
-    ExecutableElement executable = computeClassChainLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+    ExecutableElement executable = _computeClassChainLookupMap(classElt, new Set<ClassElement>()).get(memberName);
     if (executable == null) {
-      return computeInterfaceLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+      return _computeInterfaceLookupMap(classElt, new Set<ClassElement>()).get(memberName);
     }
     return executable;
   }
@@ -7893,7 +8095,7 @@
    *         member exists
    */
   ExecutableElement lookupMember(ClassElement classElt, String memberName) {
-    ExecutableElement element = lookupMemberInClass(classElt, memberName);
+    ExecutableElement element = _lookupMemberInClass(classElt, memberName);
     if (element != null) {
       return element;
     }
@@ -7939,12 +8141,13 @@
    * @return the passed function type with any parameterized types substituted
    */
   FunctionType substituteTypeArgumentsInMemberFromInheritance(FunctionType baseFunctionType, String memberName, InterfaceType definingType) {
-    if (baseFunctionType == null) {
+    // if the baseFunctionType is null, or does not have any parameters, return it.
+    if (baseFunctionType == null || baseFunctionType.typeArguments.length == 0) {
       return baseFunctionType;
     }
     // First, generate the path from the defining type to the overridden member
     Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>();
-    computeInheritancePath(inheritancePath, definingType, memberName);
+    _computeInheritancePath(inheritancePath, definingType, memberName);
     if (inheritancePath == null || inheritancePath.isEmpty) {
       // TODO(jwren) log analysis engine error
       return baseFunctionType;
@@ -7953,8 +8156,8 @@
     // loop backward through the list substituting as we go:
     while (!inheritancePath.isEmpty) {
       InterfaceType lastType = inheritancePath.removeLast();
-      List<Type2> parameterTypes = lastType.element.type.typeArguments;
-      List<Type2> argumentTypes = lastType.typeArguments;
+      List<DartType> parameterTypes = lastType.element.type.typeArguments;
+      List<DartType> argumentTypes = lastType.typeArguments;
       functionTypeToReturn = functionTypeToReturn.substitute2(argumentTypes, parameterTypes);
     }
     return functionTypeToReturn;
@@ -7971,7 +8174,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
+  MemberMap _computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
     MemberMap resultMap = _classLookup[classElt];
     if (resultMap != null) {
       return resultMap;
@@ -7991,15 +8194,15 @@
       if (!visitedClasses.contains(superclassElt)) {
         visitedClasses.add(superclassElt);
         try {
-          resultMap = new MemberMap.con2(computeClassChainLookupMap(superclassElt, visitedClasses));
+          resultMap = new MemberMap.con2(_computeClassChainLookupMap(superclassElt, visitedClasses));
           //
           // Substitute the super types down the hierarchy.
           //
-          substituteTypeParametersDownHierarchy(supertype, resultMap);
+          _substituteTypeParametersDownHierarchy(supertype, resultMap);
           //
           // Include the members from the superclass in the resultMap.
           //
-          recordMapWithClassMembers(resultMap, supertype, false);
+          _recordMapWithClassMembers(resultMap, supertype, false);
         } finally {
           visitedClasses.remove(superclassElt);
         }
@@ -8020,15 +8223,15 @@
         if (!visitedClasses.contains(mixinElement)) {
           visitedClasses.add(mixinElement);
           try {
-            MemberMap map = new MemberMap.con2(computeClassChainLookupMap(mixinElement, visitedClasses));
+            MemberMap map = new MemberMap.con2(_computeClassChainLookupMap(mixinElement, visitedClasses));
             //
             // Substitute the super types down the hierarchy.
             //
-            substituteTypeParametersDownHierarchy(mixins[i], map);
+            _substituteTypeParametersDownHierarchy(mixins[i], map);
             //
             // Include the members from the superclass in the resultMap.
             //
-            recordMapWithClassMembers(map, mixins[i], false);
+            _recordMapWithClassMembers(map, mixins[i], false);
             //
             // Add the members from map into result map.
             //
@@ -8036,7 +8239,7 @@
               String key = map.getKey(j);
               ExecutableElement value = map.getValue(j);
               if (key != null) {
-                if (resultMap.get(key) == null || (resultMap.get(key) != null && !isAbstract(value))) {
+                if (resultMap.get(key) == null || (resultMap.get(key) != null && !_isAbstract(value))) {
                   resultMap.put(key, value);
                 }
               }
@@ -8065,7 +8268,7 @@
    * @param currentType the current type in the inheritance path
    * @param memberName the name of the member that is being looked up the inheritance path
    */
-  void computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentType, String memberName) {
+  void _computeInheritancePath(Queue<InterfaceType> chain, InterfaceType currentType, String memberName) {
     // TODO (jwren) create a public version of this method which doesn't require the initial chain
     // to be provided, then provided tests for this functionality in InheritanceManagerTest
     chain.add(currentType);
@@ -8081,7 +8284,7 @@
     // We are not done if this is the first recursive call on this method.
     if (chain.length != 1) {
       // We are done however if the member is in this classElt
-      if (lookupMemberInClass(classElt, memberName) != null) {
+      if (_lookupMemberInClass(classElt, memberName) != null) {
         return;
       }
     }
@@ -8090,7 +8293,7 @@
     for (int i = mixins.length - 1; i >= 0; i--) {
       ClassElement mixinElement = mixins[i].element;
       if (mixinElement != null) {
-        ExecutableElement elt = lookupMemberInClass(mixinElement, memberName);
+        ExecutableElement elt = _lookupMemberInClass(mixinElement, memberName);
         if (elt != null) {
           // this is equivalent (but faster than) calling this method recursively
           // (return computeInheritancePath(chain, mixins[i], memberName);)
@@ -8102,7 +8305,7 @@
     // Superclass
     ClassElement superclassElt = supertype.element;
     if (lookupMember(superclassElt, memberName) != null) {
-      computeInheritancePath(chain, supertype, memberName);
+      _computeInheritancePath(chain, supertype, memberName);
       return;
     }
     // Interfaces
@@ -8110,7 +8313,7 @@
     for (InterfaceType interfaceType in interfaces) {
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null && lookupMember(interfaceElement, memberName) != null) {
-        computeInheritancePath(chain, interfaceType, memberName);
+        _computeInheritancePath(chain, interfaceType, memberName);
         return;
       }
     }
@@ -8127,7 +8330,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
+  MemberMap _computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
     MemberMap resultMap = _interfaceLookup[classElt];
     if (resultMap != null) {
       return resultMap;
@@ -8150,16 +8353,16 @@
           //
           // Recursively compute the map for the super type.
           //
-          MemberMap map = computeInterfaceLookupMap(superclassElement, visitedInterfaces);
+          MemberMap map = _computeInterfaceLookupMap(superclassElement, visitedInterfaces);
           map = new MemberMap.con2(map);
           //
           // Substitute the super type down the hierarchy.
           //
-          substituteTypeParametersDownHierarchy(supertype, map);
+          _substituteTypeParametersDownHierarchy(supertype, map);
           //
           // Add any members from the super type into the map as well.
           //
-          recordMapWithClassMembers(map, supertype, true);
+          _recordMapWithClassMembers(map, supertype, true);
           lookupMaps.add(map);
         } finally {
           visitedInterfaces.remove(superclassElement);
@@ -8187,16 +8390,16 @@
             //
             // Recursively compute the map for the mixin.
             //
-            MemberMap map = computeInterfaceLookupMap(mixinElement, visitedInterfaces);
+            MemberMap map = _computeInterfaceLookupMap(mixinElement, visitedInterfaces);
             map = new MemberMap.con2(map);
             //
             // Substitute the mixin type down the hierarchy.
             //
-            substituteTypeParametersDownHierarchy(mixinType, map);
+            _substituteTypeParametersDownHierarchy(mixinType, map);
             //
             // Add any members from the mixin type into the map as well.
             //
-            recordMapWithClassMembers(map, mixinType, true);
+            _recordMapWithClassMembers(map, mixinType, true);
             lookupMaps.add(map);
           } finally {
             visitedInterfaces.remove(mixinElement);
@@ -8224,16 +8427,16 @@
             //
             // Recursively compute the map for the interfaces.
             //
-            MemberMap map = computeInterfaceLookupMap(interfaceElement, visitedInterfaces);
+            MemberMap map = _computeInterfaceLookupMap(interfaceElement, visitedInterfaces);
             map = new MemberMap.con2(map);
             //
             // Substitute the supertypes down the hierarchy
             //
-            substituteTypeParametersDownHierarchy(interfaceType, map);
+            _substituteTypeParametersDownHierarchy(interfaceType, map);
             //
             // And add any members from the interface into the map as well.
             //
-            recordMapWithClassMembers(map, interfaceType, true);
+            _recordMapWithClassMembers(map, interfaceType, true);
             lookupMaps.add(map);
           } finally {
             visitedInterfaces.remove(interfaceElement);
@@ -8386,7 +8589,7 @@
               // of the other, we create a warning, and have this class inherit nothing.
               //
               String firstTwoFuntionTypesStr = "${executableElementTypes[0].toString()}, ${executableElementTypes[1].toString()}";
-              reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, [key, firstTwoFuntionTypesStr]);
+              _reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, [key, firstTwoFuntionTypesStr]);
             } else {
               //
               // Example: class A inherits 2 methods named 'm'. One has the function type
@@ -8399,14 +8602,14 @@
               for (int i = 0; i < elementArrayToMerge.length; i++) {
                 elementArrayToMerge[i] = elements[subtypesOfAllOtherTypesIndexes[i]];
               }
-              ExecutableElement mergedExecutableElement = computeMergedExecutableElement(elementArrayToMerge);
+              ExecutableElement mergedExecutableElement = _computeMergedExecutableElement(elementArrayToMerge);
               if (mergedExecutableElement != null) {
                 resultMap.put(key, mergedExecutableElement);
               }
             }
           }
         } else {
-          reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, [key]);
+          _reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, [key]);
         }
       }
     }
@@ -8423,7 +8626,7 @@
    * @param memberName the name of the member to lookup in the class
    * @return the found [ExecutableElement], or `null` if no such member was found
    */
-  ExecutableElement lookupMemberInClass(ClassElement classElt, String memberName) {
+  ExecutableElement _lookupMemberInClass(ClassElement classElt, String memberName) {
     List<MethodElement> methods = classElt.methods;
     for (MethodElement method in methods) {
       if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
@@ -8448,7 +8651,7 @@
    * @param type the type that will be recorded into the passed map
    * @param doIncludeAbstract `true` if abstract members will be put into the map
    */
-  void recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
+  void _recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
     List<MethodElement> methods = type.methods;
     for (MethodElement method in methods) {
       if (method.isAccessibleIn(_library) && !method.isStatic && (doIncludeAbstract || !method.isAbstract)) {
@@ -8474,7 +8677,7 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  void reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+  void _reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
     Set<AnalysisError> errorSet = _errorsInClassElement[classElt];
     if (errorSet == null) {
       errorSet = new Set<AnalysisError>();
@@ -8490,7 +8693,7 @@
    * @param superType the supertype to substitute into the members of the [MemberMap]
    * @param map the MemberMap to perform the substitutions on
    */
-  void substituteTypeParametersDownHierarchy(InterfaceType superType, MemberMap map) {
+  void _substituteTypeParametersDownHierarchy(InterfaceType superType, MemberMap map) {
     for (int i = 0; i < map.size; i++) {
       ExecutableElement executableElement = map.getValue(i);
       if (executableElement is MethodMember) {
@@ -8808,6 +9011,7 @@
     }
   }
 
+  @override
   String toString() => librarySource.shortName;
 }
 
@@ -8855,7 +9059,7 @@
     NodeList<Directive> directives = definingCompilationUnit.directives;
     LibraryIdentifier libraryNameNode = null;
     bool hasPartDirective = false;
-    FunctionElement entryPoint = findEntryPoint(definingCompilationUnitElement);
+    FunctionElement entryPoint = _findEntryPoint(definingCompilationUnitElement);
     List<Directive> directivesToResolve = new List<Directive>();
     List<CompilationUnitElementImpl> sourcedCompilationUnits = new List<CompilationUnitElementImpl>();
     for (Directive directive in directives) {
@@ -8877,11 +9081,13 @@
         if (_analysisContext.exists(partSource)) {
           hasPartDirective = true;
           CompilationUnitElementImpl part = builder.buildCompilationUnit(partSource, library.getAST(partSource));
+          part.uriOffset = partUri.offset;
+          part.uriEnd = partUri.end;
           part.uri = library.getUri(partDirective);
           //
           // Validate that the part contains a part-of directive with the same name as the library.
           //
-          String partLibraryName = getPartLibraryName(library, partSource, directivesToResolve);
+          String partLibraryName = _getPartLibraryName(library, partSource, directivesToResolve);
           if (partLibraryName == null) {
             _errorListener.onError(new AnalysisError.con2(librarySource, partUri.offset, partUri.length, CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSource()]));
           } else if (libraryNameNode == null) {
@@ -8889,7 +9095,7 @@
             _errorListener.onError(new AnalysisError.con2(librarySource, partUri.offset, partUri.length, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [libraryNameNode.name, partLibraryName]));
           }
           if (entryPoint == null) {
-            entryPoint = findEntryPoint(part);
+            entryPoint = _findEntryPoint(part);
           }
           directive.element = part;
           sourcedCompilationUnits.add(part);
@@ -8914,7 +9120,7 @@
     }
     library.libraryElement = libraryElement;
     if (sourcedUnitCount > 0) {
-      patchTopLevelAccessors(libraryElement);
+      _patchTopLevelAccessors(libraryElement);
     }
     return libraryElement;
   }
@@ -8927,7 +9133,7 @@
    * @param setters the list to which setters are to be added
    * @param unit the compilation unit defining the accessors that are potentially being added
    */
-  void collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+  void _collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     for (PropertyAccessorElement accessor in unit.accessors) {
       if (accessor.isGetter) {
         if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
@@ -8948,7 +9154,7 @@
    * @return the entry point that was found, or `null` if the compilation unit does not define
    *         an entry point
    */
-  FunctionElement findEntryPoint(CompilationUnitElementImpl element) {
+  FunctionElement _findEntryPoint(CompilationUnitElementImpl element) {
     for (FunctionElement function in element.functions) {
       if (function.name == ENTRY_POINT_NAME) {
         return function;
@@ -8967,7 +9173,7 @@
    *          built
    * @return the name of the library that the given part is declared to be a part of
    */
-  String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) {
+  String _getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) {
     try {
       CompilationUnit partUnit = library.getAST(partSource);
       for (Directive directive in partUnit.directives) {
@@ -8991,12 +9197,12 @@
    *
    * @param libraryElement the library defining the compilation units to be processed
    */
-  void patchTopLevelAccessors(LibraryElementImpl libraryElement) {
+  void _patchTopLevelAccessors(LibraryElementImpl libraryElement) {
     Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAccessorElement>();
     List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
-    collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
+    _collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
     for (CompilationUnitElement unit in libraryElement.parts) {
-      collectAccessors(getters, setters, unit);
+      _collectAccessors(getters, setters, unit);
     }
     for (PropertyAccessorElement setter in setters) {
       PropertyAccessorElement getter = getters[setter.displayName];
@@ -9096,7 +9302,7 @@
       //
       // Create the objects representing the library being resolved and the core library.
       //
-      Library targetLibrary = createLibraryWithUnit(librarySource, modificationStamp, unit);
+      Library targetLibrary = _createLibraryWithUnit(librarySource, modificationStamp, unit);
       _coreLibrary = _libraryMap[_coreLibrarySource];
       if (_coreLibrary == null) {
         // This will be true unless the library being analyzed is the core library.
@@ -9106,8 +9312,8 @@
       //
       // Compute the set of libraries that need to be resolved together.
       //
-      computeEmbeddedLibraryDependencies(targetLibrary, unit);
-      _librariesInCycles = computeLibrariesInCycles(targetLibrary);
+      _computeEmbeddedLibraryDependencies(targetLibrary, unit);
+      _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
       //
       // Build the element models representing the libraries being resolved. This is done in three
       // steps:
@@ -9122,16 +9328,16 @@
       //    requires that we be able to compute the names visible in the libraries being resolved,
       //    which in turn requires that we have resolved the import directives.
       //
-      buildElementModels();
+      _buildElementModels();
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
         throw new AnalysisException.con1("Could not resolve dart:core");
       }
-      buildDirectiveModels();
+      _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
       _typeProvider = new TypeProviderImpl(coreElement);
-      buildTypeHierarchies();
+      _buildTypeHierarchies();
       instrumentation.metric3("buildTypeHierarchies", "complete");
       //
       // Perform resolution and type analysis.
@@ -9143,12 +9349,12 @@
       // possibility is to add a parameter to this method and punt the decision to the clients.
       //
       //if (analyzeAll) {
-      resolveReferencesAndTypes();
+      _resolveReferencesAndTypes();
       instrumentation.metric3("resolveReferencesAndTypes", "complete");
       //} else {
       //  resolveReferencesAndTypes(targetLibrary);
       //}
-      performConstantEvaluation();
+      _performConstantEvaluation();
       instrumentation.metric3("performConstantEvaluation", "complete");
       return targetLibrary.libraryElement;
     } finally {
@@ -9181,7 +9387,7 @@
       _coreLibrary = _libraryMap[_coreLibrarySource];
       if (_coreLibrary == null) {
         // This will be true unless the library being analyzed is the core library.
-        _coreLibrary = createLibraryOrNull(_coreLibrarySource);
+        _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (_coreLibrary == null) {
           throw new AnalysisException.con1("Core library does not exist");
         }
@@ -9190,8 +9396,8 @@
       //
       // Compute the set of libraries that need to be resolved together.
       //
-      computeLibraryDependencies(targetLibrary);
-      _librariesInCycles = computeLibrariesInCycles(targetLibrary);
+      _computeLibraryDependencies(targetLibrary);
+      _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
       //
       // Build the element models representing the libraries being resolved. This is done in three
       // steps:
@@ -9206,16 +9412,16 @@
       //    requires that we be able to compute the names visible in the libraries being resolved,
       //    which in turn requires that we have resolved the import directives.
       //
-      buildElementModels();
+      _buildElementModels();
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
         throw new AnalysisException.con1("Could not resolve dart:core");
       }
-      buildDirectiveModels();
+      _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
       _typeProvider = new TypeProviderImpl(coreElement);
-      buildTypeHierarchies();
+      _buildTypeHierarchies();
       instrumentation.metric3("buildTypeHierarchies", "complete");
       //
       // Perform resolution and type analysis.
@@ -9227,12 +9433,12 @@
       // possibility is to add a parameter to this method and punt the decision to the clients.
       //
       //if (analyzeAll) {
-      resolveReferencesAndTypes();
+      _resolveReferencesAndTypes();
       instrumentation.metric3("resolveReferencesAndTypes", "complete");
       //} else {
       //  resolveReferencesAndTypes(targetLibrary);
       //}
-      performConstantEvaluation();
+      _performConstantEvaluation();
       instrumentation.metric3("performConstantEvaluation", "complete");
       instrumentation.metric2("librariesInCycles", _librariesInCycles.length);
       for (Library lib in _librariesInCycles) {
@@ -9245,13 +9451,27 @@
   }
 
   /**
+   * Create an object to represent the information about the library defined by the compilation unit
+   * with the given source.
+   *
+   * @param librarySource the source of the library's defining compilation unit
+   * @return the library object that was created
+   * @throws AnalysisException if the library source is not valid
+   */
+  Library createLibrary(Source librarySource) {
+    Library library = new Library(analysisContext, _errorListener, librarySource);
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
    * Add a dependency to the given map from the referencing library to the referenced library.
    *
    * @param dependencyMap the map to which the dependency is to be added
    * @param referencingLibrary the library that references the referenced library
    * @param referencedLibrary the library referenced by the referencing library
    */
-  void addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
+  void _addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
     List<Library> dependentLibraries = dependencyMap[referencedLibrary];
     if (dependentLibraries == null) {
       dependentLibraries = new List<Library>();
@@ -9270,12 +9490,12 @@
    * @param dependencyMap a table mapping libraries to the collection of libraries from which those
    *          libraries are referenced
    */
-  void addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
+  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
     if (librariesInCycle.add(library)) {
       List<Library> dependentLibraries = dependencyMap[library];
       if (dependentLibraries != null) {
         for (Library dependentLibrary in dependentLibraries) {
-          addLibrariesInCycle(dependentLibrary, librariesInCycle, dependencyMap);
+          _addLibrariesInCycle(dependentLibrary, librariesInCycle, dependencyMap);
         }
       }
     }
@@ -9290,14 +9510,14 @@
    * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
    *          recursion
    */
-  void addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
+  void _addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
     if (visitedLibraries.add(library)) {
       for (Library referencedLibrary in library.importsAndExports) {
-        addDependencyToMap(dependencyMap, library, referencedLibrary);
-        addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
+        _addDependencyToMap(dependencyMap, library, referencedLibrary);
+        _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
       }
       if (!library.explicitlyImportsCore && library != _coreLibrary) {
-        addDependencyToMap(dependencyMap, library, _coreLibrary);
+        _addDependencyToMap(dependencyMap, library, _coreLibrary);
       }
     }
   }
@@ -9308,18 +9528,18 @@
    * @param directive the directive that declares the combinators
    * @return an array containing the import combinators that were built
    */
-  List<NamespaceCombinator> buildCombinators(NamespaceDirective directive) {
+  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
     List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
     for (Combinator combinator in directive.combinators) {
       if (combinator is HideCombinator) {
         HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
-        hide.hiddenNames = getIdentifiers(combinator.hiddenNames);
+        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
         combinators.add(hide);
       } else {
         ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
         show.offset = combinator.offset;
         show.end = combinator.end;
-        show.shownNames = getIdentifiers((combinator as ShowCombinator).shownNames);
+        show.shownNames = _getIdentifiers((combinator as ShowCombinator).shownNames);
         combinators.add(show);
       }
     }
@@ -9333,7 +9553,7 @@
    * @throws AnalysisException if the defining compilation unit for any of the libraries could not
    *           be accessed
    */
-  void buildDirectiveModels() {
+  void _buildDirectiveModels() {
     for (Library library in _librariesInCycles) {
       Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
@@ -9348,11 +9568,10 @@
             if (importedLibrary != null) {
               ImportElementImpl importElement = new ImportElementImpl(directive.offset);
               StringLiteral uriLiteral = importDirective.uri;
-              if (uriLiteral != null) {
-                importElement.uriEnd = uriLiteral.end;
-              }
+              importElement.uriOffset = uriLiteral.offset;
+              importElement.uriEnd = uriLiteral.end;
               importElement.uri = library.getUri(importDirective);
-              importElement.combinators = buildCombinators(importDirective);
+              importElement.combinators = _buildCombinators(importDirective);
               LibraryElement importedLibraryElement = importedLibrary.libraryElement;
               if (importedLibraryElement != null) {
                 importElement.importedLibrary = importedLibraryElement;
@@ -9384,8 +9603,11 @@
             Library exportedLibrary = _libraryMap[exportedSource];
             if (exportedLibrary != null) {
               ExportElementImpl exportElement = new ExportElementImpl();
+              StringLiteral uriLiteral = exportDirective.uri;
+              exportElement.uriOffset = uriLiteral.offset;
+              exportElement.uriEnd = uriLiteral.end;
               exportElement.uri = library.getUri(exportDirective);
-              exportElement.combinators = buildCombinators(exportDirective);
+              exportElement.combinators = _buildCombinators(exportDirective);
               LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
               if (exportedLibraryElement != null) {
                 exportElement.exportedLibrary = exportedLibraryElement;
@@ -9393,7 +9615,6 @@
               directive.element = exportElement;
               exports.add(exportElement);
               if (analysisContext.computeKindOf(exportedSource) != SourceKind.LIBRARY) {
-                StringLiteral uriLiteral = exportDirective.uri;
                 _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
               }
             }
@@ -9425,7 +9646,7 @@
    *
    * @throws AnalysisException if any of the element models cannot be built
    */
-  void buildElementModels() {
+  void _buildElementModels() {
     for (Library library in _librariesInCycles) {
       LibraryElementBuilder builder = new LibraryElementBuilder(this);
       LibraryElementImpl libraryElement = builder.buildLibrary(library);
@@ -9439,7 +9660,7 @@
    *
    * @throws AnalysisException if any of the type hierarchies could not be resolved
    */
-  void buildTypeHierarchies() {
+  void _buildTypeHierarchies() {
     TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
     try {
       for (Library library in _librariesInCycles) {
@@ -9464,9 +9685,9 @@
    *
    * @param library the library currently being added to the dependency map
    */
-  Map<Library, List<Library>> computeDependencyMap(Library library) {
+  Map<Library, List<Library>> _computeDependencyMap(Library library) {
     Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>();
-    addToDependencyMap(library, dependencyMap, new Set<Library>());
+    _addToDependencyMap(library, dependencyMap, new Set<Library>());
     return dependencyMap;
   }
 
@@ -9477,24 +9698,24 @@
    * @param library the library to be processed to find libraries that have not yet been traversed
    * @throws AnalysisException if some portion of the library graph could not be traversed
    */
-  void computeEmbeddedLibraryDependencies(Library library, CompilationUnit unit) {
+  void _computeEmbeddedLibraryDependencies(Library library, CompilationUnit unit) {
     Source librarySource = library.librarySource;
     Set<Source> exportedSources = new Set<Source>();
     Set<Source> importedSources = new Set<Source>();
     for (Directive directive in unit.directives) {
       if (directive is ExportDirective) {
-        Source exportSource = resolveSource(librarySource, directive);
+        Source exportSource = _resolveSource(librarySource, directive);
         if (exportSource != null) {
           exportedSources.add(exportSource);
         }
       } else if (directive is ImportDirective) {
-        Source importSource = resolveSource(librarySource, directive);
+        Source importSource = _resolveSource(librarySource, directive);
         if (importSource != null) {
           importedSources.add(importSource);
         }
       }
     }
-    computeLibraryDependenciesFromDirectives(library, new List.from(importedSources), new List.from(exportedSources));
+    _computeLibraryDependenciesFromDirectives(library, new List.from(importedSources), new List.from(exportedSources));
   }
 
   /**
@@ -9505,10 +9726,10 @@
    * @return all of the libraries referenced by the given library that have a circular reference
    *         back to the given library
    */
-  Set<Library> computeLibrariesInCycles(Library library) {
-    Map<Library, List<Library>> dependencyMap = computeDependencyMap(library);
+  Set<Library> _computeLibrariesInCycles(Library library) {
+    Map<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
     Set<Library> librariesInCycle = new Set<Library>();
-    addLibrariesInCycle(library, librariesInCycle, dependencyMap);
+    _addLibrariesInCycle(library, librariesInCycle, dependencyMap);
     return librariesInCycle;
   }
 
@@ -9519,9 +9740,9 @@
    * @param library the library to be processed to find libraries that have not yet been traversed
    * @throws AnalysisException if some portion of the library graph could not be traversed
    */
-  void computeLibraryDependencies(Library library) {
+  void _computeLibraryDependencies(Library library) {
     Source librarySource = library.librarySource;
-    computeLibraryDependenciesFromDirectives(library, analysisContext.computeImportedLibraries(librarySource), analysisContext.computeExportedLibraries(librarySource));
+    _computeLibraryDependenciesFromDirectives(library, analysisContext.computeImportedLibraries(librarySource), analysisContext.computeExportedLibraries(librarySource));
   }
 
   /**
@@ -9533,7 +9754,7 @@
    * @param exportedSources an array containing the sources that are exported from the given library
    * @throws AnalysisException if some portion of the library graph could not be traversed
    */
-  void computeLibraryDependenciesFromDirectives(Library library, List<Source> importedSources, List<Source> exportedSources) {
+  void _computeLibraryDependenciesFromDirectives(Library library, List<Source> importedSources, List<Source> exportedSources) {
     List<Library> importedLibraries = new List<Library>();
     bool explicitlyImportsCore = false;
     for (Source importedSource in importedSources) {
@@ -9542,9 +9763,9 @@
       }
       Library importedLibrary = _libraryMap[importedSource];
       if (importedLibrary == null) {
-        importedLibrary = createLibraryOrNull(importedSource);
+        importedLibrary = _createLibraryOrNull(importedSource);
         if (importedLibrary != null) {
-          computeLibraryDependencies(importedLibrary);
+          _computeLibraryDependencies(importedLibrary);
         }
       }
       if (importedLibrary != null) {
@@ -9556,9 +9777,9 @@
     for (Source exportedSource in exportedSources) {
       Library exportedLibrary = _libraryMap[exportedSource];
       if (exportedLibrary == null) {
-        exportedLibrary = createLibraryOrNull(exportedSource);
+        exportedLibrary = _createLibraryOrNull(exportedSource);
         if (exportedLibrary != null) {
-          computeLibraryDependencies(exportedLibrary);
+          _computeLibraryDependencies(exportedLibrary);
         }
       }
       if (exportedLibrary != null) {
@@ -9570,9 +9791,9 @@
     if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
       Library importedLibrary = _libraryMap[_coreLibrarySource];
       if (importedLibrary == null) {
-        importedLibrary = createLibraryOrNull(_coreLibrarySource);
+        importedLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (importedLibrary != null) {
-          computeLibraryDependencies(importedLibrary);
+          _computeLibraryDependencies(importedLibrary);
         }
       }
     }
@@ -9580,27 +9801,13 @@
 
   /**
    * Create an object to represent the information about the library defined by the compilation unit
-   * with the given source.
-   *
-   * @param librarySource the source of the library's defining compilation unit
-   * @return the library object that was created
-   * @throws AnalysisException if the library source is not valid
-   */
-  Library createLibrary(Source librarySource) {
-    Library library = new Library(analysisContext, _errorListener, librarySource);
-    _libraryMap[librarySource] = library;
-    return library;
-  }
-
-  /**
-   * Create an object to represent the information about the library defined by the compilation unit
    * with the given source. Return the library object that was created, or `null` if the
    * source is not valid.
    *
    * @param librarySource the source of the library's defining compilation unit
    * @return the library object that was created
    */
-  Library createLibraryOrNull(Source librarySource) {
+  Library _createLibraryOrNull(Source librarySource) {
     if (!analysisContext.exists(librarySource)) {
       return null;
     }
@@ -9620,7 +9827,7 @@
    * @return the library object that was created
    * @throws AnalysisException if the library source is not valid
    */
-  Library createLibraryWithUnit(Source librarySource, int modificationStamp, CompilationUnit unit) {
+  Library _createLibraryWithUnit(Source librarySource, int modificationStamp, CompilationUnit unit) {
     Library library = new Library(analysisContext, _errorListener, librarySource);
     library.setDefiningCompilationUnit(modificationStamp, unit);
     _libraryMap[librarySource] = library;
@@ -9633,7 +9840,7 @@
    * @param names the AST nodes representing the identifiers
    * @return the lexical identifiers associated with the nodes in the list
    */
-  List<String> getIdentifiers(NodeList<SimpleIdentifier> names) {
+  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
     int count = names.length;
     List<String> identifiers = new List<String>(count);
     for (int i = 0; i < count; i++) {
@@ -9645,7 +9852,7 @@
   /**
    * Compute a value for all of the constants in the libraries being analyzed.
    */
-  void performConstantEvaluation() {
+  void _performConstantEvaluation() {
     TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
     try {
       ConstantValueComputer computer = new ConstantValueComputer(_typeProvider);
@@ -9673,9 +9880,9 @@
    * @throws AnalysisException if any of the identifiers could not be resolved or if any of the
    *           libraries could not have their types analyzed
    */
-  void resolveReferencesAndTypes() {
+  void _resolveReferencesAndTypes() {
     for (Library library in _librariesInCycles) {
-      resolveReferencesAndTypesInLibrary(library);
+      _resolveReferencesAndTypesInLibrary(library);
     }
   }
 
@@ -9686,7 +9893,7 @@
    * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
    *           the library cannot be analyzed
    */
-  void resolveReferencesAndTypesInLibrary(Library library) {
+  void _resolveReferencesAndTypesInLibrary(Library library) {
     TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
     try {
       for (Source source in library.compilationUnitSources) {
@@ -9723,7 +9930,7 @@
    * @param directive the directive which URI should be resolved
    * @return the result of resolving the URI against the URI of the library
    */
-  Source resolveSource(Source librarySource, UriBasedDirective directive) {
+  Source _resolveSource(Source librarySource, UriBasedDirective directive) {
     StringLiteral uriLiteral = directive.uri;
     if (uriLiteral is StringInterpolation) {
       return null;
@@ -9768,14 +9975,14 @@
    * @param initialCapacity the initial capacity
    */
   MemberMap.con1(int initialCapacity) {
-    initArrays(initialCapacity);
+    _initArrays(initialCapacity);
   }
 
   /**
    * Copy constructor.
    */
   MemberMap.con2(MemberMap memberMap) {
-    initArrays(memberMap._size + 5);
+    _initArrays(memberMap._size + 5);
     for (int i = 0; i < memberMap._size; i++) {
       _keys[i] = memberMap._keys[i];
       _values[i] = memberMap._values[i];
@@ -9894,7 +10101,7 @@
   /**
    * Initializes [keys] and [values].
    */
-  void initArrays(int initialCapacity) {
+  void _initArrays(int initialCapacity) {
     _keys = new List<String>(initialCapacity);
     _values = new List<ExecutableElement>(initialCapacity);
   }
@@ -10059,18 +10266,21 @@
 
   List<ProxyConditionalAnalysisError> get proxyConditionalAnalysisErrors => _proxyConditionalAnalysisErrors;
 
+  @override
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
     overrideExpression(node.expression, node.type.type);
     return null;
   }
 
+  @override
   Object visitAssertStatement(AssertStatement node) {
     super.visitAssertStatement(node);
-    propagateTrueState(node.condition);
+    _propagateTrueState(node.condition);
     return null;
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     sc.TokenType operatorType = node.operator.type;
     Expression leftOperand = node.leftOperand;
@@ -10081,12 +10291,12 @@
         try {
           _overrideManager.enterScope();
           _promoteManager.enterScope();
-          propagateTrueState(leftOperand);
+          _propagateTrueState(leftOperand);
           // Type promotion.
-          promoteTypes(leftOperand);
-          clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
-          clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
-          clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(rightOperand);
+          _promoteTypes(leftOperand);
+          _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
+          _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
+          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(rightOperand);
           // Visit right operand.
           rightOperand.accept(this);
         } finally {
@@ -10099,7 +10309,7 @@
       if (rightOperand != null) {
         try {
           _overrideManager.enterScope();
-          propagateFalseState(leftOperand);
+          _propagateFalseState(leftOperand);
           rightOperand.accept(this);
         } finally {
           _overrideManager.exitScope();
@@ -10114,6 +10324,7 @@
     return null;
   }
 
+  @override
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
     try {
@@ -10125,6 +10336,7 @@
     return null;
   }
 
+  @override
   Object visitBreakStatement(BreakStatement node) {
     //
     // We do not visit the label because it needs to be visited in the context of the statement.
@@ -10134,6 +10346,7 @@
     return null;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerType = _enclosingClass;
     try {
@@ -10147,6 +10360,7 @@
     return null;
   }
 
+  @override
   Object visitComment(Comment node) {
     if (node.parent is FunctionDeclaration || node.parent is ConstructorDeclaration || node.parent is MethodDeclaration) {
       if (node != _commentBeforeFunction) {
@@ -10159,6 +10373,7 @@
     return null;
   }
 
+  @override
   Object visitCommentReference(CommentReference node) {
     //
     // We do not visit the identifier because it needs to be visited in the context of the reference.
@@ -10168,6 +10383,7 @@
     return null;
   }
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     //
     // TODO(brianwilkerson) The goal of the code below is to visit the declarations in such an
@@ -10206,6 +10422,7 @@
     return null;
   }
 
+  @override
   Object visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     safelyVisit(condition);
@@ -10214,11 +10431,11 @@
       try {
         _overrideManager.enterScope();
         _promoteManager.enterScope();
-        propagateTrueState(condition);
+        _propagateTrueState(condition);
         // Type promotion.
-        promoteTypes(condition);
-        clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
-        clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenExpression);
+        _promoteTypes(condition);
+        _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
+        _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenExpression);
         // Visit "then" expression.
         thenExpression.accept(this);
       } finally {
@@ -10230,7 +10447,7 @@
     if (elseExpression != null) {
       try {
         _overrideManager.enterScope();
-        propagateFalseState(condition);
+        _propagateFalseState(condition);
         elseExpression.accept(this);
       } finally {
         _overrideManager.exitScope();
@@ -10238,18 +10455,19 @@
     }
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
-    bool thenIsAbrupt = isAbruptTerminationExpression(thenExpression);
-    bool elseIsAbrupt = isAbruptTerminationExpression(elseExpression);
+    bool thenIsAbrupt = _isAbruptTerminationExpression(thenExpression);
+    bool elseIsAbrupt = _isAbruptTerminationExpression(elseExpression);
     if (elseIsAbrupt && !thenIsAbrupt) {
-      propagateTrueState(condition);
-      propagateState(thenExpression);
+      _propagateTrueState(condition);
+      _propagateState(thenExpression);
     } else if (thenIsAbrupt && !elseIsAbrupt) {
-      propagateFalseState(condition);
-      propagateState(elseExpression);
+      _propagateFalseState(condition);
+      _propagateState(elseExpression);
     }
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -10261,6 +10479,7 @@
     return null;
   }
 
+  @override
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     //
     // We visit the expression, but do not visit the field name because it needs to be visited in
@@ -10272,6 +10491,7 @@
     return null;
   }
 
+  @override
   Object visitConstructorName(ConstructorName node) {
     //
     // We do not visit either the type name, because it won't be visited anyway, or the name,
@@ -10282,6 +10502,7 @@
     return null;
   }
 
+  @override
   Object visitContinueStatement(ContinueStatement node) {
     //
     // We do not visit the label because it needs to be visited in the context of the statement.
@@ -10291,6 +10512,7 @@
     return null;
   }
 
+  @override
   Object visitDoStatement(DoStatement node) {
     try {
       _overrideManager.enterScope();
@@ -10303,11 +10525,13 @@
     return null;
   }
 
+  @override
   Object visitEmptyFunctionBody(EmptyFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
     return super.visitEmptyFunctionBody(node);
   }
 
+  @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
     try {
@@ -10319,18 +10543,20 @@
     return null;
   }
 
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     try {
       _overrideManager.enterScope();
       super.visitFieldDeclaration(node);
     } finally {
-      Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.fields);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
     return null;
   }
 
+  @override
   Object visitForEachStatement(ForEachStatement node) {
     try {
       _overrideManager.enterScope();
@@ -10341,6 +10567,7 @@
     return null;
   }
 
+  @override
   Object visitForStatement(ForStatement node) {
     try {
       _overrideManager.enterScope();
@@ -10351,6 +10578,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -10363,6 +10591,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -10376,31 +10605,34 @@
     return null;
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     safelyVisit(node.function);
     node.accept(_elementResolver);
-    inferFunctionExpressionsParametersTypes(node.argumentList);
+    _inferFunctionExpressionsParametersTypes(node.argumentList);
     safelyVisit(node.argumentList);
     node.accept(_typeAnalyzer);
     return null;
   }
 
+  @override
   Object visitHideCombinator(HideCombinator node) => null;
 
+  @override
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
-    Map<Element, Type2> thenOverrides = null;
+    Map<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
       try {
         _overrideManager.enterScope();
         _promoteManager.enterScope();
-        propagateTrueState(condition);
+        _propagateTrueState(condition);
         // Type promotion.
-        promoteTypes(condition);
-        clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
-        clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenStatement);
+        _promoteTypes(condition);
+        _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
+        _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(thenStatement);
         // Visit "then".
         visitStatementInScope(thenStatement);
       } finally {
@@ -10409,12 +10641,12 @@
         _promoteManager.exitScope();
       }
     }
-    Map<Element, Type2> elseOverrides = null;
+    Map<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
       try {
         _overrideManager.enterScope();
-        propagateFalseState(condition);
+        _propagateFalseState(condition);
         visitStatementInScope(elseStatement);
       } finally {
         elseOverrides = _overrideManager.captureLocalOverrides();
@@ -10423,15 +10655,15 @@
     }
     node.accept(_elementResolver);
     node.accept(_typeAnalyzer);
-    bool thenIsAbrupt = isAbruptTerminationStatement(thenStatement);
-    bool elseIsAbrupt = isAbruptTerminationStatement(elseStatement);
+    bool thenIsAbrupt = _isAbruptTerminationStatement(thenStatement);
+    bool elseIsAbrupt = _isAbruptTerminationStatement(elseStatement);
     if (elseIsAbrupt && !thenIsAbrupt) {
-      propagateTrueState(condition);
+      _propagateTrueState(condition);
       if (thenOverrides != null) {
         _overrideManager.applyOverrides(thenOverrides);
       }
     } else if (thenIsAbrupt && !elseIsAbrupt) {
-      propagateFalseState(condition);
+      _propagateFalseState(condition);
       if (elseOverrides != null) {
         _overrideManager.applyOverrides(elseOverrides);
       }
@@ -10439,10 +10671,13 @@
     return null;
   }
 
+  @override
   Object visitLabel(Label node) => null;
 
+  @override
   Object visitLibraryIdentifier(LibraryIdentifier node) => null;
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -10454,6 +10689,7 @@
     return null;
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     //
     // We visit the target and argument list, but do not visit the method name because it needs to
@@ -10461,12 +10697,13 @@
     //
     safelyVisit(node.target);
     node.accept(_elementResolver);
-    inferFunctionExpressionsParametersTypes(node.argumentList);
+    _inferFunctionExpressionsParametersTypes(node.argumentList);
     safelyVisit(node.argumentList);
     node.accept(_typeAnalyzer);
     return null;
   }
 
+  @override
   Object visitNode(AstNode node) {
     node.visitChildren(this);
     node.accept(_elementResolver);
@@ -10474,6 +10711,7 @@
     return null;
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     //
     // We visit the prefix, but do not visit the identifier because it needs to be visited in the
@@ -10485,6 +10723,7 @@
     return null;
   }
 
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     //
     // We visit the target, but do not visit the property name because it needs to be visited in the
@@ -10496,6 +10735,7 @@
     return null;
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     //
     // We visit the argument list, but do not visit the optional identifier because it needs to be
@@ -10507,8 +10747,10 @@
     return null;
   }
 
+  @override
   Object visitShowCombinator(ShowCombinator node) => null;
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     //
     // We visit the argument list, but do not visit the optional identifier because it needs to be
@@ -10520,6 +10762,7 @@
     return null;
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     try {
       _overrideManager.enterScope();
@@ -10530,6 +10773,7 @@
     return null;
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
     try {
       _overrideManager.enterScope();
@@ -10540,20 +10784,23 @@
     return null;
   }
 
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     try {
       _overrideManager.enterScope();
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.variables);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
     return null;
   }
 
+  @override
   Object visitTypeName(TypeName node) => null;
 
+  @override
   Object visitWhileStatement(WhileStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
@@ -10561,7 +10808,7 @@
     if (body != null) {
       try {
         _overrideManager.enterScope();
-        propagateTrueState(condition);
+        _propagateTrueState(condition);
         visitStatementInScope(body);
       } finally {
         _overrideManager.exitScope();
@@ -10672,7 +10919,7 @@
    *          might be overridden
    * @param potentialType the potential type of the elements
    */
-  void overrideExpression(Expression expression, Type2 potentialType) {
+  void overrideExpression(Expression expression, DartType potentialType) {
     VariableElement element = getOverridableStaticElement(expression);
     if (element != null) {
       overrideVariable(element, potentialType);
@@ -10691,7 +10938,7 @@
    * @param element the element whose type might be overridden
    * @param potentialType the potential type of the element
    */
-  void overrideVariable(VariableElement element, Type2 potentialType) {
+  void overrideVariable(VariableElement element, DartType potentialType) {
     if (potentialType == null || potentialType.isBottom) {
       return;
     }
@@ -10701,7 +10948,7 @@
         return;
       }
     }
-    Type2 currentType = getBestType(element);
+    DartType currentType = _getBestType(element);
     if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
       _overrideManager.setType(element, potentialType);
     }
@@ -10744,6 +10991,7 @@
     _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode, arguments)));
   }
 
+  @override
   void visitForEachStatementInScope(ForEachStatement node) {
     //
     // We visit the iterator before the loop variable because the loop variable cannot be in scope
@@ -10762,16 +11010,16 @@
         if (loopVariable != null && iterator != null) {
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
-            Type2 iteratorElementType = getIteratorElementType(iterator);
+            DartType iteratorElementType = _getIteratorElementType(iterator);
             overrideVariable(loopElement, iteratorElementType);
-            recordPropagatedType(loopVariable.identifier, iteratorElementType);
+            _recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
         } else if (identifier != null && iterator != null) {
           Element identifierElement = identifier.staticElement;
           if (identifierElement is VariableElement) {
-            Type2 iteratorElementType = getIteratorElementType(iterator);
+            DartType iteratorElementType = _getIteratorElementType(iterator);
             overrideVariable(identifierElement, iteratorElementType);
-            recordPropagatedType(identifier, iteratorElementType);
+            _recordPropagatedType(identifier, iteratorElementType);
           }
         }
         visitStatementInScope(body);
@@ -10783,13 +11031,14 @@
     node.accept(_typeAnalyzer);
   }
 
+  @override
   void visitForStatementInScope(ForStatement node) {
     safelyVisit(node.variables);
     safelyVisit(node.initialization);
     safelyVisit(node.condition);
     _overrideManager.enterScope();
     try {
-      propagateTrueState(node.condition);
+      _propagateTrueState(node.condition);
       visitStatementInScope(node.body);
       node.updaters.accept(this);
     } finally {
@@ -10804,10 +11053,10 @@
    * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> then the variable
    * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>.
    */
-  void clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(AstNode target) {
+  void _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(AstNode target) {
     for (Element element in _promoteManager.promotedElements) {
       if ((element as VariableElementImpl).isPotentiallyMutatedInScope) {
-        if (isVariableAccessedInClosure(element, target)) {
+        if (_isVariableAccessedInClosure(element, target)) {
           _promoteManager.setType(element, null);
         }
       }
@@ -10820,9 +11069,9 @@
    *
    * <i>v</i> is not potentially mutated in <i>s<sub>1</sub></i> or within a closure.
    */
-  void clearTypePromotionsIfPotentiallyMutatedIn(AstNode target) {
+  void _clearTypePromotionsIfPotentiallyMutatedIn(AstNode target) {
     for (Element element in _promoteManager.promotedElements) {
-      if (isVariablePotentiallyMutatedIn(element, target)) {
+      if (_isVariablePotentiallyMutatedIn(element, target)) {
         _promoteManager.setType(element, null);
       }
     }
@@ -10835,8 +11084,8 @@
    * @param element the element for which type information is to be returned
    * @return the best type information available for the given element
    */
-  Type2 getBestType(Element element) {
-    Type2 bestType = _overrideManager.getType(element);
+  DartType _getBestType(Element element) {
+    DartType bestType = _overrideManager.getType(element);
     if (bestType == null) {
       if (element is LocalVariableElement) {
         bestType = element.type;
@@ -10855,8 +11104,8 @@
    * @param iterator the iterator for a for-each statement
    * @return the type of objects that will be assigned to the loop variable
    */
-  Type2 getIteratorElementType(Expression iteratorExpression) {
-    Type2 expressionType = iteratorExpression.staticType;
+  DartType _getIteratorElementType(Expression iteratorExpression) {
+    DartType expressionType = iteratorExpression.staticType;
     if (expressionType is InterfaceType) {
       InterfaceType interfaceType = expressionType;
       FunctionType iteratorFunction = _inheritanceManager.lookupMemberType(interfaceType, "iterator");
@@ -10864,7 +11113,7 @@
         // TODO(brianwilkerson) Should we report this error?
         return null;
       }
-      Type2 iteratorType = iteratorFunction.returnType;
+      DartType iteratorType = iteratorFunction.returnType;
       if (iteratorType is InterfaceType) {
         InterfaceType iteratorInterfaceType = iteratorType;
         FunctionType currentFunction = _inheritanceManager.lookupMemberType(iteratorInterfaceType, "current");
@@ -10882,7 +11131,7 @@
    * If given "mayBeClosure" is [FunctionExpression] without explicit parameters types and its
    * required type is [FunctionType], then infer parameters types from [FunctionType].
    */
-  void inferFunctionExpressionParametersTypes(Expression mayBeClosure, Type2 mayByFunctionType) {
+  void _inferFunctionExpressionParametersTypes(Expression mayBeClosure, DartType mayByFunctionType) {
     // prepare closure
     if (mayBeClosure is! FunctionExpression) {
       return;
@@ -10901,9 +11150,9 @@
     for (int i = 0; i < parameters.length && i < expectedParameters.length; i++) {
       FormalParameter parameter = parameters[i];
       ParameterElement element = parameter.element;
-      Type2 currentType = getBestType(element);
+      DartType currentType = _getBestType(element);
       // may be override the type
-      Type2 expectedType = expectedParameters[i].type;
+      DartType expectedType = expectedParameters[i].type;
       if (currentType == null || expectedType.isMoreSpecificThan(currentType)) {
         _overrideManager.setType(element, expectedType);
       }
@@ -10913,14 +11162,14 @@
   /**
    * Try to infer types of parameters of the [FunctionExpression] arguments.
    */
-  void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
+  void _inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
     for (Expression argument in argumentList.arguments) {
       ParameterElement parameter = argument.propagatedParameterElement;
       if (parameter == null) {
         parameter = argument.staticParameterElement;
       }
       if (parameter != null) {
-        inferFunctionExpressionParametersTypes(argument, parameter.type);
+        _inferFunctionExpressionParametersTypes(argument, parameter.type);
       }
     }
   }
@@ -10932,7 +11181,7 @@
    * @param expression the expression being tested
    * @return `true` if the given expression terminates abruptly
    */
-  bool isAbruptTerminationExpression(Expression expression) {
+  bool _isAbruptTerminationExpression(Expression expression) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we would eventually
     // turn this into a method on Expression that returns a termination indication (normal, abrupt
     // with no exception, abrupt with an exception).
@@ -10949,21 +11198,21 @@
    * @param statement the statement being tested
    * @return `true` if the given statement terminates abruptly
    */
-  bool isAbruptTerminationStatement(Statement statement) {
+  bool _isAbruptTerminationStatement(Statement statement) {
     // TODO(brianwilkerson) This needs to be significantly improved. Ideally we would eventually
     // turn this into a method on Statement that returns a termination indication (normal, abrupt
     // with no exception, abrupt with an exception).
     if (statement is ReturnStatement || statement is BreakStatement || statement is ContinueStatement) {
       return true;
     } else if (statement is ExpressionStatement) {
-      return isAbruptTerminationExpression(statement.expression);
+      return _isAbruptTerminationExpression(statement.expression);
     } else if (statement is Block) {
       NodeList<Statement> statements = statement.statements;
       int size = statements.length;
       if (size == 0) {
         return false;
       }
-      return isAbruptTerminationStatement(statements[size - 1]);
+      return _isAbruptTerminationStatement(statements[size - 1]);
     }
     return false;
   }
@@ -10977,7 +11226,7 @@
    * @param target the [AstNode] to check within
    * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
    */
-  bool isVariableAccessedInClosure(Element variable, AstNode target) {
+  bool _isVariableAccessedInClosure(Element variable, AstNode target) {
     List<bool> result = [false];
     target.accept(new RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(result, variable));
     return result[0];
@@ -10991,7 +11240,7 @@
    * @param target the [AstNode] to check within
    * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
    */
-  bool isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
+  bool _isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
     List<bool> result = [false];
     target.accept(new RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(result, variable));
     return result[0];
@@ -11006,7 +11255,7 @@
    *          promoted
    * @param potentialType the potential type of the elements
    */
-  void promote(Expression expression, Type2 potentialType) {
+  void _promote(Expression expression, DartType potentialType) {
     VariableElement element = getPromotionStaticElement(expression);
     if (element != null) {
       // may be mutated somewhere in closure
@@ -11014,7 +11263,7 @@
         return;
       }
       // prepare current variable type
-      Type2 type = _promoteManager.getType(element);
+      DartType type = _promoteManager.getType(element);
       if (type == null) {
         type = expression.staticType;
       }
@@ -11038,23 +11287,23 @@
   /**
    * Promotes type information using given condition.
    */
-  void promoteTypes(Expression condition) {
+  void _promoteTypes(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
       if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
         Expression left = binary.leftOperand;
         Expression right = binary.rightOperand;
-        promoteTypes(left);
-        promoteTypes(right);
-        clearTypePromotionsIfPotentiallyMutatedIn(right);
+        _promoteTypes(left);
+        _promoteTypes(right);
+        _clearTypePromotionsIfPotentiallyMutatedIn(right);
       }
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
       if (is2.notOperator == null) {
-        promote(is2.expression, is2.type.type);
+        _promote(is2.expression, is2.type.type);
       }
     } else if (condition is ParenthesizedExpression) {
-      promoteTypes(condition.expression);
+      _promoteTypes(condition.expression);
     }
   }
 
@@ -11064,12 +11313,12 @@
    *
    * @param condition the condition that will have evaluated to 'false'
    */
-  void propagateFalseState(Expression condition) {
+  void _propagateFalseState(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
       if (identical(binary.operator.type, sc.TokenType.BAR_BAR)) {
-        propagateFalseState(binary.leftOperand);
-        propagateFalseState(binary.rightOperand);
+        _propagateFalseState(binary.leftOperand);
+        _propagateFalseState(binary.rightOperand);
       }
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
@@ -11079,10 +11328,10 @@
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
       if (identical(prefix.operator.type, sc.TokenType.BANG)) {
-        propagateTrueState(prefix.operand);
+        _propagateTrueState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
-      propagateFalseState(condition.expression);
+      _propagateFalseState(condition.expression);
     }
   }
 
@@ -11092,7 +11341,7 @@
    *
    * @param expression the expression that will have been evaluated
    */
-  void propagateState(Expression expression) {
+  void _propagateState(Expression expression) {
   }
 
   /**
@@ -11101,12 +11350,12 @@
    *
    * @param condition the condition that will have evaluated to 'true'
    */
-  void propagateTrueState(Expression condition) {
+  void _propagateTrueState(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
       if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
-        propagateTrueState(binary.leftOperand);
-        propagateTrueState(binary.rightOperand);
+        _propagateTrueState(binary.leftOperand);
+        _propagateTrueState(binary.rightOperand);
       }
     } else if (condition is IsExpression) {
       IsExpression is2 = condition;
@@ -11116,10 +11365,10 @@
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
       if (identical(prefix.operator.type, sc.TokenType.BANG)) {
-        propagateFalseState(prefix.operand);
+        _propagateFalseState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
-      propagateTrueState(condition.expression);
+      _propagateTrueState(condition.expression);
     }
   }
 
@@ -11129,7 +11378,7 @@
    * @param expression the node whose type is to be recorded
    * @param type the propagated type of the node
    */
-  void recordPropagatedType(Expression expression, Type2 type) {
+  void _recordPropagatedType(Expression expression, DartType type) {
     if (type != null && !type.isDynamic) {
       expression.propagatedType = type;
     }
@@ -11165,6 +11414,7 @@
 
   bool _inClosure = false;
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     bool inClosure = this._inClosure;
     try {
@@ -11175,6 +11425,7 @@
     }
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (result[0]) {
       return null;
@@ -11193,6 +11444,7 @@
 
   RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(this.result, this.variable) : super();
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (result[0]) {
       return null;
@@ -11326,11 +11578,12 @@
     _errorListener.onError(analysisError);
   }
 
+  @override
   Object visitBlock(Block node) {
     Scope outerScope = _nameScope;
     try {
       EnclosedScope enclosedScope = new EnclosedScope(_nameScope);
-      hideNamesDefinedInBlock(enclosedScope, node);
+      _hideNamesDefinedInBlock(enclosedScope, node);
       _nameScope = enclosedScope;
       super.visitBlock(node);
     } finally {
@@ -11339,6 +11592,7 @@
     return null;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
@@ -11360,6 +11614,7 @@
     return null;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     Scope outerScope = _nameScope;
     try {
@@ -11371,6 +11626,7 @@
     return null;
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = _nameScope;
     try {
@@ -11382,6 +11638,7 @@
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     Scope outerScope = _nameScope;
     try {
@@ -11393,6 +11650,7 @@
     return null;
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     VariableElement element = node.element;
     if (element != null) {
@@ -11402,6 +11660,7 @@
     return null;
   }
 
+  @override
   Object visitDoStatement(DoStatement node) {
     LabelScope outerLabelScope = _labelScope;
     try {
@@ -11414,6 +11673,7 @@
     return null;
   }
 
+  @override
   Object visitForEachStatement(ForEachStatement node) {
     Scope outerNameScope = _nameScope;
     LabelScope outerLabelScope = _labelScope;
@@ -11428,6 +11688,7 @@
     return null;
   }
 
+  @override
   Object visitFormalParameterList(FormalParameterList node) {
     super.visitFormalParameterList(node);
     // We finished resolving function signature, now include formal parameters scope.
@@ -11440,6 +11701,7 @@
     return null;
   }
 
+  @override
   Object visitForStatement(ForStatement node) {
     Scope outerNameScope = _nameScope;
     LabelScope outerLabelScope = _labelScope;
@@ -11454,6 +11716,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement function = node.element;
     Scope outerScope = _nameScope;
@@ -11469,6 +11732,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // We have already created a function scope and don't need to do so again.
@@ -11489,6 +11753,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     Scope outerScope = _nameScope;
     try {
@@ -11500,6 +11765,7 @@
     return null;
   }
 
+  @override
   Object visitIfStatement(IfStatement node) {
     safelyVisit(node.condition);
     visitStatementInScope(node.thenStatement);
@@ -11507,8 +11773,9 @@
     return null;
   }
 
+  @override
   Object visitLabeledStatement(LabeledStatement node) {
-    LabelScope outerScope = addScopesFor(node.labels);
+    LabelScope outerScope = _addScopesFor(node.labels);
     try {
       super.visitLabeledStatement(node);
     } finally {
@@ -11517,6 +11784,7 @@
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     Scope outerScope = _nameScope;
     try {
@@ -11528,6 +11796,7 @@
     return null;
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     node.expression.accept(this);
     Scope outerNameScope = _nameScope;
@@ -11540,6 +11809,7 @@
     return null;
   }
 
+  @override
   Object visitSwitchDefault(SwitchDefault node) {
     Scope outerNameScope = _nameScope;
     try {
@@ -11551,6 +11821,7 @@
     return null;
   }
 
+  @override
   Object visitSwitchStatement(SwitchStatement node) {
     LabelScope outerScope = _labelScope;
     try {
@@ -11569,6 +11840,7 @@
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent is! FieldDeclaration) {
@@ -11580,6 +11852,7 @@
     return null;
   }
 
+  @override
   Object visitWhileStatement(WhileStatement node) {
     LabelScope outerScope = _labelScope;
     try {
@@ -11715,7 +11988,7 @@
    * @param labels the labels for which new scopes are to be added
    * @return the scope that was in effect before the new scopes were added
    */
-  LabelScope addScopesFor(NodeList<Label> labels) {
+  LabelScope _addScopesFor(NodeList<Label> labels) {
     LabelScope outerScope = _labelScope;
     for (Label label in labels) {
       SimpleIdentifier labelNameNode = label.label;
@@ -11731,7 +12004,7 @@
    * According to the scoping rules name is hidden if block defines it, but name is defined after
    * its declaration statement.
    */
-  void hideNamesDefinedInBlock(EnclosedScope scope, Block block) {
+  void _hideNamesDefinedInBlock(EnclosedScope scope, Block block) {
     NodeList<Statement> statements = block.statements;
     int statementCount = statements.length;
     for (int i = 0; i < statementCount; i++) {
@@ -11767,7 +12040,7 @@
    *
    * @return the table that was created
    */
-  static Map<String, String> createHtmlTagToClassMap() {
+  static Map<String, String> _createHtmlTagToClassMap() {
     Map<String, String> map = new Map<String, String>();
     map["a"] = "AnchorElement";
     map["area"] = "AreaElement";
@@ -11843,7 +12116,7 @@
   /**
    * The type representing the type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The type representing the class containing the nodes being analyzed, or `null` if the
@@ -11864,13 +12137,13 @@
   /**
    * A table mapping [ExecutableElement]s to their propagated return types.
    */
-  Map<ExecutableElement, Type2> _propagatedReturnTypes = new Map<ExecutableElement, Type2>();
+  Map<ExecutableElement, DartType> _propagatedReturnTypes = new Map<ExecutableElement, DartType>();
 
   /**
    * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
    * those tags.
    */
-  static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = createHtmlTagToClassMap();
+  static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
 
   /**
    * Initialize a newly created type analyzer.
@@ -11898,8 +12171,9 @@
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
    * `String`.</blockquote>
    */
+  @override
   Object visitAdjacentStrings(AdjacentStrings node) {
-    recordStaticType(node, _typeProvider.stringType);
+    _recordStaticType(node, _typeProvider.stringType);
     return null;
   }
 
@@ -11907,8 +12181,9 @@
    * The Dart Language Specification, 12.33: <blockquote>The static type of an argument definition
    * test is `bool`.</blockquote>
    */
+  @override
   Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) {
-    recordStaticType(node, _typeProvider.boolType);
+    _recordStaticType(node, _typeProvider.boolType);
     return null;
   }
 
@@ -11920,8 +12195,9 @@
    *
    * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
    */
+  @override
   Object visitAsExpression(AsExpression node) {
-    recordStaticType(node, getType(node.type));
+    _recordStaticType(node, _getType(node.type));
     return null;
   }
 
@@ -11964,30 +12240,31 @@
    * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
    * <i>e<sub>3</sub></i>.</blockquote>
    */
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.TokenType operator = node.operator.type;
     if (identical(operator, sc.TokenType.EQ)) {
       Expression rightHandSide = node.rightHandSide;
-      Type2 staticType = getStaticType(rightHandSide);
-      recordStaticType(node, staticType);
-      Type2 overrideType = staticType;
-      Type2 propagatedType = rightHandSide.propagatedType;
+      DartType staticType = _getStaticType(rightHandSide);
+      _recordStaticType(node, staticType);
+      DartType overrideType = staticType;
+      DartType propagatedType = rightHandSide.propagatedType;
       if (propagatedType != null) {
         if (propagatedType.isMoreSpecificThan(staticType)) {
-          recordPropagatedType(node, propagatedType);
+          _recordPropagatedType(node, propagatedType);
         }
         overrideType = propagatedType;
       }
       _resolver.overrideExpression(node.leftHandSide, overrideType);
     } else {
       ExecutableElement staticMethodElement = node.staticElement;
-      Type2 staticType = computeStaticReturnType(staticMethodElement);
-      recordStaticType(node, staticType);
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
-        Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          recordPropagatedType(node, propagatedType);
+          _recordPropagatedType(node, propagatedType);
         }
       }
     }
@@ -12031,16 +12308,17 @@
    * e<sub>2</sub></i> is equivalent to the method invocation
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
    */
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     ExecutableElement staticMethodElement = node.staticElement;
-    Type2 staticType = computeStaticReturnType(staticMethodElement);
-    staticType = refineBinaryExpressionType(node, staticType);
-    recordStaticType(node, staticType);
+    DartType staticType = _computeStaticReturnType(staticMethodElement);
+    staticType = _refineBinaryExpressionType(node, staticType);
+    _recordStaticType(node, staticType);
     MethodElement propagatedMethodElement = node.propagatedElement;
     if (propagatedMethodElement != staticMethodElement) {
-      Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
+      DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
       if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        recordPropagatedType(node, propagatedType);
+        _recordPropagatedType(node, propagatedType);
       }
     }
     return null;
@@ -12050,8 +12328,9 @@
    * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
    * bool.</blockquote>
    */
+  @override
   Object visitBooleanLiteral(BooleanLiteral node) {
-    recordStaticType(node, _typeProvider.boolType);
+    _recordStaticType(node, _typeProvider.boolType);
     return null;
   }
 
@@ -12060,9 +12339,10 @@
    * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suffix; return
    * t;}(e)</i>.</blockquote>
    */
+  @override
   Object visitCascadeExpression(CascadeExpression node) {
-    recordStaticType(node, getStaticType(node.target));
-    recordPropagatedType(node, node.target.propagatedType);
+    _recordStaticType(node, _getStaticType(node.target));
+    _recordPropagatedType(node, node.target.propagatedType);
     return null;
   }
 
@@ -12075,9 +12355,10 @@
    * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
    * and the static type of <i>e<sub>3</sub></i>.</blockquote>
    */
+  @override
   Object visitConditionalExpression(ConditionalExpression node) {
-    Type2 staticThenType = getStaticType(node.thenExpression);
-    Type2 staticElseType = getStaticType(node.elseExpression);
+    DartType staticThenType = _getStaticType(node.thenExpression);
+    DartType staticElseType = _getStaticType(node.elseExpression);
     if (staticThenType == null) {
       // TODO(brianwilkerson) Determine whether this can still happen.
       staticThenType = _dynamicType;
@@ -12086,13 +12367,13 @@
       // TODO(brianwilkerson) Determine whether this can still happen.
       staticElseType = _dynamicType;
     }
-    Type2 staticType = staticThenType.getLeastUpperBound(staticElseType);
+    DartType staticType = staticThenType.getLeastUpperBound(staticElseType);
     if (staticType == null) {
       staticType = _dynamicType;
     }
-    recordStaticType(node, staticType);
-    Type2 propagatedThenType = node.thenExpression.propagatedType;
-    Type2 propagatedElseType = node.elseExpression.propagatedType;
+    _recordStaticType(node, staticType);
+    DartType propagatedThenType = node.thenExpression.propagatedType;
+    DartType propagatedElseType = node.elseExpression.propagatedType;
     if (propagatedThenType != null || propagatedElseType != null) {
       if (propagatedThenType == null) {
         propagatedThenType = staticThenType;
@@ -12100,9 +12381,9 @@
       if (propagatedElseType == null) {
         propagatedElseType = staticElseType;
       }
-      Type2 propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
+      DartType propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
       if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        recordPropagatedType(node, propagatedType);
+        _recordPropagatedType(node, propagatedType);
       }
     }
     return null;
@@ -12112,17 +12393,19 @@
    * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
    * double.</blockquote>
    */
+  @override
   Object visitDoubleLiteral(DoubleLiteral node) {
-    recordStaticType(node, _typeProvider.doubleType);
+    _recordStaticType(node, _typeProvider.doubleType);
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
     ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = computeStaticReturnTypeOfFunctionDeclaration(node);
-    recordPropagatedTypeOfFunction(functionElement, function.body);
-    recordStaticType(function, functionElement.type);
+    functionElement.returnType = _computeStaticReturnTypeOfFunctionDeclaration(node);
+    _recordPropagatedTypeOfFunction(functionElement, function.body);
+    _recordStaticType(function, functionElement.type);
     return null;
   }
 
@@ -12156,15 +12439,16 @@
    * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
    * specified as dynamic.</blockquote>
    */
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // The function type will be resolved and set when we visit the parent node.
       return null;
     }
     ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = computeStaticReturnTypeOfFunctionExpression(node);
-    recordPropagatedTypeOfFunction(functionElement, node.body);
-    recordStaticType(node, node.element.type);
+    functionElement.returnType = _computeStaticReturnTypeOfFunctionExpression(node);
+    _recordPropagatedTypeOfFunction(functionElement, node.body);
+    _recordStaticType(node, node.element.type);
     return null;
   }
 
@@ -12180,27 +12464,28 @@
    * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
    * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
    */
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     ExecutableElement staticMethodElement = node.staticElement;
     // Record static return type of the static element.
-    Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
-    recordStaticType(node, staticStaticType);
+    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
+    _recordStaticType(node, staticStaticType);
     // Record propagated return type of the static element.
-    Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement);
+    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
     if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
-      recordPropagatedType(node, staticPropagatedType);
+      _recordPropagatedType(node, staticPropagatedType);
     }
     ExecutableElement propagatedMethodElement = node.propagatedElement;
     if (propagatedMethodElement != staticMethodElement) {
       // Record static return type of the propagated element.
-      Type2 propagatedStaticType = computeStaticReturnType(propagatedMethodElement);
+      DartType propagatedStaticType = _computeStaticReturnType(propagatedMethodElement);
       if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
-        recordPropagatedType(node, propagatedStaticType);
+        _recordPropagatedType(node, propagatedStaticType);
       }
       // Record propagated return type of the propagated element.
-      Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedMethodElement);
+      DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedMethodElement);
       if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
-        recordPropagatedType(node, propagatedPropagatedType);
+        _recordPropagatedType(node, propagatedPropagatedType);
       }
     }
     return null;
@@ -12211,27 +12496,28 @@
    * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
    * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
    */
+  @override
   Object visitIndexExpression(IndexExpression node) {
     if (node.inSetterContext()) {
       ExecutableElement staticMethodElement = node.staticElement;
-      Type2 staticType = computeArgumentType(staticMethodElement);
-      recordStaticType(node, staticType);
+      DartType staticType = _computeArgumentType(staticMethodElement);
+      _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
-        Type2 propagatedType = computeArgumentType(propagatedMethodElement);
+        DartType propagatedType = _computeArgumentType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          recordPropagatedType(node, propagatedType);
+          _recordPropagatedType(node, propagatedType);
         }
       }
     } else {
       ExecutableElement staticMethodElement = node.staticElement;
-      Type2 staticType = computeStaticReturnType(staticMethodElement);
-      recordStaticType(node, staticType);
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
-        Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          recordPropagatedType(node, propagatedType);
+          _recordPropagatedType(node, propagatedType);
         }
       }
     }
@@ -12247,22 +12533,23 @@
    * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the
    * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
    */
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    recordStaticType(node, node.constructorName.type.type);
+    _recordStaticType(node, node.constructorName.type.type);
     ConstructorElement element = node.staticElement;
     if (element != null && "Element" == element.enclosingElement.name) {
       LibraryElement library = element.library;
-      if (isHtmlLibrary(library)) {
+      if (_isHtmlLibrary(library)) {
         String constructorName = element.name;
         if ("tag" == constructorName) {
-          Type2 returnType = getFirstArgumentAsTypeWithMap(library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
+          DartType returnType = _getFirstArgumentAsTypeWithMap(library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
           if (returnType != null) {
-            recordPropagatedType(node, returnType);
+            _recordPropagatedType(node, returnType);
           }
         } else {
-          Type2 returnType = getElementNameAsType(library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
+          DartType returnType = _getElementNameAsType(library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
           if (returnType != null) {
-            recordPropagatedType(node, returnType);
+            _recordPropagatedType(node, returnType);
           }
         }
       }
@@ -12274,8 +12561,9 @@
    * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is
    * `int`.</blockquote>
    */
+  @override
   Object visitIntegerLiteral(IntegerLiteral node) {
-    recordStaticType(node, _typeProvider.intType);
+    _recordStaticType(node, _typeProvider.intType);
     return null;
   }
 
@@ -12285,8 +12573,9 @@
    *
    * The static type of an is-expression is `bool`.</blockquote>
    */
+  @override
   Object visitIsExpression(IsExpression node) {
-    recordStaticType(node, _typeProvider.boolType);
+    _recordStaticType(node, _typeProvider.boolType);
     return null;
   }
 
@@ -12298,26 +12587,27 @@
    * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynamic&gt;`
    * .</blockquote>
    */
+  @override
   Object visitListLiteral(ListLiteral node) {
-    Type2 staticType = _dynamicType;
+    DartType staticType = _dynamicType;
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
       NodeList<TypeName> arguments = typeArguments.arguments;
       if (arguments != null && arguments.length == 1) {
         TypeName argumentTypeName = arguments[0];
-        Type2 argumentType = getType(argumentTypeName);
+        DartType argumentType = _getType(argumentTypeName);
         if (argumentType != null) {
           staticType = argumentType;
         }
       }
     }
-    recordStaticType(node, _typeProvider.listType.substitute4(<Type2> [staticType]));
+    _recordStaticType(node, _typeProvider.listType.substitute4(<DartType> [staticType]));
     NodeList<Expression> elements = node.elements;
     int count = elements.length;
     if (count > 0) {
-      Type2 propagatedType = elements[0].bestType;
+      DartType propagatedType = elements[0].bestType;
       for (int i = 1; i < count; i++) {
-        Type2 elementType = elements[i].bestType;
+        DartType elementType = elements[i].bestType;
         if (propagatedType != elementType) {
           propagatedType = _dynamicType;
         } else {
@@ -12328,7 +12618,7 @@
         }
       }
       if (propagatedType.isMoreSpecificThan(staticType)) {
-        recordPropagatedType(node, _typeProvider.listType.substitute4(<Type2> [propagatedType]));
+        _recordPropagatedType(node, _typeProvider.listType.substitute4(<DartType> [propagatedType]));
       }
     }
     return null;
@@ -12346,35 +12636,36 @@
    * It is a compile-time error if the first type argument to a map literal is not
    * <i>String</i>.</blockquote>
    */
+  @override
   Object visitMapLiteral(MapLiteral node) {
-    Type2 staticKeyType = _dynamicType;
-    Type2 staticValueType = _dynamicType;
+    DartType staticKeyType = _dynamicType;
+    DartType staticValueType = _dynamicType;
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
       NodeList<TypeName> arguments = typeArguments.arguments;
       if (arguments != null && arguments.length == 2) {
         TypeName entryKeyTypeName = arguments[0];
-        Type2 entryKeyType = getType(entryKeyTypeName);
+        DartType entryKeyType = _getType(entryKeyTypeName);
         if (entryKeyType != null) {
           staticKeyType = entryKeyType;
         }
         TypeName entryValueTypeName = arguments[1];
-        Type2 entryValueType = getType(entryValueTypeName);
+        DartType entryValueType = _getType(entryValueTypeName);
         if (entryValueType != null) {
           staticValueType = entryValueType;
         }
       }
     }
-    recordStaticType(node, _typeProvider.mapType.substitute4(<Type2> [staticKeyType, staticValueType]));
+    _recordStaticType(node, _typeProvider.mapType.substitute4(<DartType> [staticKeyType, staticValueType]));
     NodeList<MapLiteralEntry> entries = node.entries;
     int count = entries.length;
     if (count > 0) {
       MapLiteralEntry entry = entries[0];
-      Type2 propagatedKeyType = entry.key.bestType;
-      Type2 propagatedValueType = entry.value.bestType;
+      DartType propagatedKeyType = entry.key.bestType;
+      DartType propagatedValueType = entry.value.bestType;
       for (int i = 1; i < count; i++) {
         entry = entries[i];
-        Type2 elementKeyType = entry.key.bestType;
+        DartType elementKeyType = entry.key.bestType;
         if (propagatedKeyType != elementKeyType) {
           propagatedKeyType = _dynamicType;
         } else {
@@ -12383,7 +12674,7 @@
             propagatedKeyType = _dynamicType;
           }
         }
-        Type2 elementValueType = entry.value.bestType;
+        DartType elementValueType = entry.value.bestType;
         if (propagatedValueType != elementValueType) {
           propagatedValueType = _dynamicType;
         } else {
@@ -12402,7 +12693,7 @@
         if (!betterValue) {
           propagatedValueType = staticValueType;
         }
-        recordPropagatedType(node, _typeProvider.mapType.substitute4(<Type2> [propagatedKeyType, propagatedValueType]));
+        _recordPropagatedType(node, _typeProvider.mapType.substitute4(<DartType> [propagatedKeyType, propagatedValueType]));
       }
     }
     return null;
@@ -12444,26 +12735,27 @@
    * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
    * <i>F</i>.</blockquote>
    */
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodNameNode = node.methodName;
     Element staticMethodElement = methodNameNode.staticElement;
     // Record types of the local variable invoked as a function.
     if (staticMethodElement is LocalVariableElement) {
       LocalVariableElement variable = staticMethodElement;
-      Type2 staticType = variable.type;
-      recordStaticType(methodNameNode, staticType);
-      Type2 propagatedType = _overrideManager.getType(variable);
+      DartType staticType = variable.type;
+      _recordStaticType(methodNameNode, staticType);
+      DartType propagatedType = _overrideManager.getType(variable);
       if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        recordPropagatedType(methodNameNode, propagatedType);
+        _recordPropagatedType(methodNameNode, propagatedType);
       }
     }
     // Record static return type of the static element.
-    Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
-    recordStaticType(node, staticStaticType);
+    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
+    _recordStaticType(node, staticStaticType);
     // Record propagated return type of the static element.
-    Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement);
+    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
     if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
-      recordPropagatedType(node, staticPropagatedType);
+      _recordPropagatedType(node, staticPropagatedType);
     }
     String methodName = methodNameNode.name;
     // Future.then(closure) return type is:
@@ -12471,27 +12763,27 @@
     // 2) Future<valueType>, if the closure returns a value.
     if (methodName == "then") {
       Expression target = node.realTarget;
-      Type2 targetType = target == null ? null : target.bestType;
-      if (isAsyncFutureType(targetType)) {
+      DartType targetType = target == null ? null : target.bestType;
+      if (_isAsyncFutureType(targetType)) {
         NodeList<Expression> arguments = node.argumentList.arguments;
         if (arguments.length == 1) {
           // TODO(brianwilkerson) Handle the case where both arguments are provided.
           Expression closureArg = arguments[0];
           if (closureArg is FunctionExpression) {
             FunctionExpression closureExpr = closureArg;
-            Type2 returnType = computePropagatedReturnType(closureExpr.element);
+            DartType returnType = _computePropagatedReturnType(closureExpr.element);
             if (returnType != null) {
               // prepare the type of the returned Future
               InterfaceTypeImpl newFutureType;
-              if (isAsyncFutureType(returnType)) {
+              if (_isAsyncFutureType(returnType)) {
                 newFutureType = returnType as InterfaceTypeImpl;
               } else {
                 InterfaceType futureType = targetType as InterfaceType;
                 newFutureType = new InterfaceTypeImpl.con1(futureType.element);
-                newFutureType.typeArguments = <Type2> [returnType];
+                newFutureType.typeArguments = <DartType> [returnType];
               }
               // set the 'then' invocation type
-              recordPropagatedType(node, newFutureType);
+              _recordPropagatedType(node, newFutureType);
               return null;
             }
           }
@@ -12501,13 +12793,13 @@
     if (methodName == "\$dom_createEvent") {
       Expression target = node.realTarget;
       if (target != null) {
-        Type2 targetType = target.bestType;
+        DartType targetType = target.bestType;
         if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
           LibraryElement library = targetType.element.library;
-          if (isHtmlLibrary(library)) {
-            Type2 returnType = getFirstArgumentAsType(library, node.argumentList);
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsType(library, node.argumentList);
             if (returnType != null) {
-              recordPropagatedType(node, returnType);
+              _recordPropagatedType(node, returnType);
             }
           }
         }
@@ -12518,64 +12810,65 @@
         Element methodElement = methodNameNode.bestElement;
         if (methodElement != null) {
           LibraryElement library = methodElement.library;
-          if (isHtmlLibrary(library)) {
-            Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
             if (returnType != null) {
-              recordPropagatedType(node, returnType);
+              _recordPropagatedType(node, returnType);
             }
           }
         }
       } else {
-        Type2 targetType = target.bestType;
+        DartType targetType = target.bestType;
         if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
           LibraryElement library = targetType.element.library;
-          if (isHtmlLibrary(library)) {
-            Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
             if (returnType != null) {
-              recordPropagatedType(node, returnType);
+              _recordPropagatedType(node, returnType);
             }
           }
         }
       }
     } else if (methodName == "\$dom_createElement") {
       Expression target = node.realTarget;
-      Type2 targetType = target.bestType;
+      DartType targetType = target.bestType;
       if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
         LibraryElement library = targetType.element.library;
-        if (isHtmlLibrary(library)) {
-          Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
+        if (_isHtmlLibrary(library)) {
+          DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
           if (returnType != null) {
-            recordPropagatedType(node, returnType);
+            _recordPropagatedType(node, returnType);
           }
         }
       }
     } else if (methodName == "JS") {
-      Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
+      DartType returnType = _getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
       if (returnType != null) {
-        recordPropagatedType(node, returnType);
+        _recordPropagatedType(node, returnType);
       }
     } else {
       Element propagatedElement = methodNameNode.propagatedElement;
       if (propagatedElement != staticMethodElement) {
         // Record static return type of the propagated element.
-        Type2 propagatedStaticType = computeStaticReturnType(propagatedElement);
+        DartType propagatedStaticType = _computeStaticReturnType(propagatedElement);
         if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
-          recordPropagatedType(node, propagatedStaticType);
+          _recordPropagatedType(node, propagatedStaticType);
         }
         // Record propagated return type of the propagated element.
-        Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedElement);
+        DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedElement);
         if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
-          recordPropagatedType(node, propagatedPropagatedType);
+          _recordPropagatedType(node, propagatedPropagatedType);
         }
       }
     }
     return null;
   }
 
+  @override
   Object visitNamedExpression(NamedExpression node) {
     Expression expression = node.expression;
-    recordStaticType(node, getStaticType(expression));
-    recordPropagatedType(node, expression.propagatedType);
+    _recordStaticType(node, _getStaticType(expression));
+    _recordPropagatedType(node, expression.propagatedType);
     return null;
   }
 
@@ -12583,15 +12876,17 @@
    * The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
    * </blockquote>
    */
+  @override
   Object visitNullLiteral(NullLiteral node) {
-    recordStaticType(node, _typeProvider.bottomType);
+    _recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
 
+  @override
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     Expression expression = node.expression;
-    recordStaticType(node, getStaticType(expression));
-    recordPropagatedType(node, expression.propagatedType);
+    _recordStaticType(node, _getStaticType(expression));
+    _recordPropagatedType(node, expression.propagatedType);
     return null;
   }
 
@@ -12621,36 +12916,38 @@
    * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
    * = r - 1; return r}(e1, e2)</i></blockquote>
    */
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
-    Type2 staticType = getStaticType(operand);
+    DartType staticType = _getStaticType(operand);
     sc.TokenType operator = node.operator.type;
     if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc.TokenType.PLUS_PLUS)) {
-      Type2 intType = _typeProvider.intType;
-      if (identical(getStaticType(node.operand), intType)) {
+      DartType intType = _typeProvider.intType;
+      if (identical(_getStaticType(node.operand), intType)) {
         staticType = intType;
       }
     }
-    recordStaticType(node, staticType);
-    recordPropagatedType(node, operand.propagatedType);
+    _recordStaticType(node, staticType);
+    _recordPropagatedType(node, operand.propagatedType);
     return null;
   }
 
   /**
    * See [visitSimpleIdentifier].
    */
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element staticElement = prefixedIdentifier.staticElement;
-    Type2 staticType = _dynamicType;
+    DartType staticType = _dynamicType;
     if (staticElement is ClassElement) {
-      if (isNotTypeLiteral(node)) {
+      if (_isNotTypeLiteral(node)) {
         staticType = staticElement.type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (staticElement is FunctionTypeAliasElement) {
-      if (isNotTypeLiteral(node)) {
+      if (_isNotTypeLiteral(node)) {
         staticType = staticElement.type;
       } else {
         staticType = _typeProvider.typeType;
@@ -12658,7 +12955,7 @@
     } else if (staticElement is MethodElement) {
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
-      staticType = getTypeOfProperty(staticElement, node.prefix.staticType);
+      staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
     } else if (staticElement is ExecutableElement) {
       staticType = staticElement.type;
     } else if (staticElement is TypeParameterElement) {
@@ -12666,12 +12963,12 @@
     } else if (staticElement is VariableElement) {
       staticType = staticElement.type;
     }
-    recordStaticType(prefixedIdentifier, staticType);
-    recordStaticType(node, staticType);
+    _recordStaticType(prefixedIdentifier, staticType);
+    _recordStaticType(node, staticType);
     Element propagatedElement = prefixedIdentifier.propagatedElement;
-    Type2 propagatedType = null;
+    DartType propagatedType = null;
     if (propagatedElement is ClassElement) {
-      if (isNotTypeLiteral(node)) {
+      if (_isNotTypeLiteral(node)) {
         propagatedType = propagatedElement.type;
       } else {
         propagatedType = _typeProvider.typeType;
@@ -12681,7 +12978,7 @@
     } else if (propagatedElement is MethodElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
-      propagatedType = getTypeOfProperty(propagatedElement, node.prefix.staticType);
+      propagatedType = _getTypeOfProperty(propagatedElement, node.prefix.staticType);
     } else if (propagatedElement is ExecutableElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is TypeParameterElement) {
@@ -12689,13 +12986,13 @@
     } else if (propagatedElement is VariableElement) {
       propagatedType = propagatedElement.type;
     }
-    Type2 overriddenType = _overrideManager.getType(propagatedElement);
+    DartType overriddenType = _overrideManager.getType(propagatedElement);
     if (propagatedType == null || (overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType))) {
       propagatedType = overriddenType;
     }
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      recordPropagatedType(prefixedIdentifier, propagatedType);
-      recordPropagatedType(node, propagatedType);
+      _recordPropagatedType(prefixedIdentifier, propagatedType);
+      _recordPropagatedType(node, propagatedType);
     }
     return null;
   }
@@ -12705,26 +13002,27 @@
    * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
    * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i>.</blockquote>
    */
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operator = node.operator.type;
     if (identical(operator, sc.TokenType.BANG)) {
-      recordStaticType(node, _typeProvider.boolType);
+      _recordStaticType(node, _typeProvider.boolType);
     } else {
       // The other cases are equivalent to invoking a method.
       ExecutableElement staticMethodElement = node.staticElement;
-      Type2 staticType = computeStaticReturnType(staticMethodElement);
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
       if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc.TokenType.PLUS_PLUS)) {
-        Type2 intType = _typeProvider.intType;
-        if (identical(getStaticType(node.operand), intType)) {
+        DartType intType = _typeProvider.intType;
+        if (identical(_getStaticType(node.operand), intType)) {
           staticType = intType;
         }
       }
-      recordStaticType(node, staticType);
+      _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
-        Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          recordPropagatedType(node, propagatedType);
+          _recordPropagatedType(node, propagatedType);
         }
       }
     }
@@ -12772,31 +13070,32 @@
    *
    * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
    */
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     SimpleIdentifier propertyName = node.propertyName;
     Element staticElement = propertyName.staticElement;
-    Type2 staticType = _dynamicType;
+    DartType staticType = _dynamicType;
     if (staticElement is MethodElement) {
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
       Expression realTarget = node.realTarget;
-      staticType = getTypeOfProperty(staticElement, realTarget != null ? getStaticType(realTarget) : null);
+      staticType = _getTypeOfProperty(staticElement, realTarget != null ? _getStaticType(realTarget) : null);
     } else {
     }
-    recordStaticType(propertyName, staticType);
-    recordStaticType(node, staticType);
+    _recordStaticType(propertyName, staticType);
+    _recordStaticType(node, staticType);
     Element propagatedElement = propertyName.propagatedElement;
-    Type2 propagatedType = _overrideManager.getType(propagatedElement);
+    DartType propagatedType = _overrideManager.getType(propagatedElement);
     if (propagatedElement is MethodElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
       Expression realTarget = node.realTarget;
-      propagatedType = getTypeOfProperty(propagatedElement, realTarget != null ? realTarget.bestType : null);
+      propagatedType = _getTypeOfProperty(propagatedElement, realTarget != null ? realTarget.bestType : null);
     } else {
     }
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      recordPropagatedType(propertyName, propagatedType);
-      recordPropagatedType(node, propagatedType);
+      _recordPropagatedType(propertyName, propagatedType);
+      _recordPropagatedType(node, propagatedType);
     }
     return null;
   }
@@ -12805,8 +13104,9 @@
    * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
    * bottom.</blockquote>
    */
+  @override
   Object visitRethrowExpression(RethrowExpression node) {
-    recordStaticType(node, _typeProvider.bottomType);
+    _recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
 
@@ -12848,17 +13148,18 @@
    * * Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
    * </blockquote>
    */
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
-    Type2 staticType = _dynamicType;
+    DartType staticType = _dynamicType;
     if (element is ClassElement) {
-      if (isNotTypeLiteral(node)) {
+      if (_isNotTypeLiteral(node)) {
         staticType = element.type;
       } else {
         staticType = _typeProvider.typeType;
       }
     } else if (element is FunctionTypeAliasElement) {
-      if (isNotTypeLiteral(node)) {
+      if (_isNotTypeLiteral(node)) {
         staticType = element.type;
       } else {
         staticType = _typeProvider.typeType;
@@ -12866,7 +13167,7 @@
     } else if (element is MethodElement) {
       staticType = element.type;
     } else if (element is PropertyAccessorElement) {
-      staticType = getTypeOfProperty(element, null);
+      staticType = _getTypeOfProperty(element, null);
     } else if (element is ExecutableElement) {
       staticType = element.type;
     } else if (element is TypeParameterElement) {
@@ -12880,12 +13181,12 @@
     } else {
       staticType = _dynamicType;
     }
-    recordStaticType(node, staticType);
+    _recordStaticType(node, staticType);
     // TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element
     // to get another candidate for the propagated type.
-    Type2 propagatedType = _overrideManager.getType(element);
+    DartType propagatedType = _overrideManager.getType(element);
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      recordPropagatedType(node, propagatedType);
+      _recordPropagatedType(node, propagatedType);
     }
     return null;
   }
@@ -12894,8 +13195,9 @@
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
    * `String`.</blockquote>
    */
+  @override
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    recordStaticType(node, _typeProvider.stringType);
+    _recordStaticType(node, _typeProvider.stringType);
     return null;
   }
 
@@ -12903,23 +13205,26 @@
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
    * `String`.</blockquote>
    */
+  @override
   Object visitStringInterpolation(StringInterpolation node) {
-    recordStaticType(node, _typeProvider.stringType);
+    _recordStaticType(node, _typeProvider.stringType);
     return null;
   }
 
+  @override
   Object visitSuperExpression(SuperExpression node) {
     if (_thisType == null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been reported
-      recordStaticType(node, _dynamicType);
+      _recordStaticType(node, _dynamicType);
     } else {
-      recordStaticType(node, _thisType);
+      _recordStaticType(node, _thisType);
     }
     return null;
   }
 
+  @override
   Object visitSymbolLiteral(SymbolLiteral node) {
-    recordStaticType(node, _typeProvider.symbolType);
+    _recordStaticType(node, _typeProvider.symbolType);
     return null;
   }
 
@@ -12927,12 +13232,13 @@
    * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
    * interface of the immediately enclosing class.</blockquote>
    */
+  @override
   Object visitThisExpression(ThisExpression node) {
     if (_thisType == null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been reported
-      recordStaticType(node, _dynamicType);
+      _recordStaticType(node, _dynamicType);
     } else {
-      recordStaticType(node, _thisType);
+      _recordStaticType(node, _thisType);
     }
     return null;
   }
@@ -12941,17 +13247,19 @@
    * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
    * bottom.</blockquote>
    */
+  @override
   Object visitThrowExpression(ThrowExpression node) {
-    recordStaticType(node, _typeProvider.bottomType);
+    _recordStaticType(node, _typeProvider.bottomType);
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
     if (initializer != null) {
-      Type2 rightType = initializer.bestType;
+      DartType rightType = initializer.bestType;
       SimpleIdentifier name = node.name;
-      recordPropagatedType(name, rightType);
+      _recordPropagatedType(name, rightType);
       VariableElement element = name.staticElement as VariableElement;
       if (element != null) {
         _resolver.overrideVariable(element, rightType);
@@ -12966,7 +13274,7 @@
    *
    * @param element the element representing the method invoked by the given node
    */
-  Type2 computeArgumentType(ExecutableElement element) {
+  DartType _computeArgumentType(ExecutableElement element) {
     if (element != null) {
       List<ParameterElement> parameters = element.parameters;
       if (parameters != null && parameters.length == 2) {
@@ -12982,7 +13290,7 @@
    * @param element the element representing the method or function invoked by the given node
    * @return the propagated return type that was computed
    */
-  Type2 computePropagatedReturnType(Element element) {
+  DartType _computePropagatedReturnType(Element element) {
     if (element is ExecutableElement) {
       return _propagatedReturnTypes[element];
     }
@@ -12997,13 +13305,13 @@
    * @param body the boy of the function whose propagated return type is to be computed
    * @return the propagated return type that was computed
    */
-  Type2 computePropagatedReturnTypeOfFunction(FunctionBody body) {
+  DartType _computePropagatedReturnTypeOfFunction(FunctionBody body) {
     if (body is ExpressionFunctionBody) {
       ExpressionFunctionBody expressionBody = body;
       return expressionBody.expression.bestType;
     }
     if (body is BlockFunctionBody) {
-      List<Type2> result = [null];
+      List<DartType> result = [null];
       body.accept(new GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(result));
       return result[0];
     }
@@ -13016,7 +13324,7 @@
    * @param element the element representing the method or function invoked by the given node
    * @return the static return type that was computed
    */
-  Type2 computeStaticReturnType(Element element) {
+  DartType _computeStaticReturnType(Element element) {
     if (element is PropertyAccessorElement) {
       //
       // This is a function invocation expression disguised as something else. We are invoking a
@@ -13024,7 +13332,7 @@
       //
       FunctionType propertyType = element.type;
       if (propertyType != null) {
-        Type2 returnType = propertyType.returnType;
+        DartType returnType = propertyType.returnType;
         if (returnType.isDartCoreFunction) {
           return _dynamicType;
         } else if (returnType is InterfaceType) {
@@ -13033,7 +13341,7 @@
             return callMethod.type.returnType;
           }
         } else if (returnType is FunctionType) {
-          Type2 innerReturnType = returnType.returnType;
+          DartType innerReturnType = returnType.returnType;
           if (innerReturnType != null) {
             return innerReturnType;
           }
@@ -13050,7 +13358,7 @@
       }
     } else if (element is VariableElement) {
       VariableElement variable = element;
-      Type2 variableType = _promoteManager.getStaticType(variable);
+      DartType variableType = _promoteManager.getStaticType(variable);
       if (variableType is FunctionType) {
         return variableType.returnType;
       }
@@ -13066,7 +13374,7 @@
    * @param node the function expression whose static return type is to be computed
    * @return the static return type that was computed
    */
-  Type2 computeStaticReturnTypeOfFunctionDeclaration(FunctionDeclaration node) {
+  DartType _computeStaticReturnTypeOfFunctionDeclaration(FunctionDeclaration node) {
     TypeName returnType = node.returnType;
     if (returnType == null) {
       return _dynamicType;
@@ -13082,10 +13390,10 @@
    * @param node the function expression whose return type is to be computed
    * @return the return type that was computed
    */
-  Type2 computeStaticReturnTypeOfFunctionExpression(FunctionExpression node) {
+  DartType _computeStaticReturnTypeOfFunctionExpression(FunctionExpression node) {
     FunctionBody body = node.body;
     if (body is ExpressionFunctionBody) {
-      return getStaticType(body.expression);
+      return _getStaticType(body.expression);
     }
     return _dynamicType;
   }
@@ -13099,7 +13407,7 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  Type2 getElementNameAsType(LibraryElement library, String elementName, Map<String, String> nameMap) {
+  DartType _getElementNameAsType(LibraryElement library, String elementName, Map<String, String> nameMap) {
     if (elementName != null) {
       if (nameMap != null) {
         elementName = nameMap[elementName.toLowerCase()];
@@ -13121,8 +13429,8 @@
    * @param argumentList the list of arguments from which a type is to be extracted
    * @return the type specified by the first argument in the argument list
    */
-  Type2 getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentList) {
-    String argumentValue = getFirstArgumentAsString(argumentList);
+  DartType _getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentList) {
+    String argumentValue = _getFirstArgumentAsString(argumentList);
     if (argumentValue != null) {
       //
       // If the query has spaces, full parsing is required because it might be:
@@ -13155,7 +13463,7 @@
    * @param argumentList the list of arguments from which a string value is to be extracted
    * @return the string specified by the first argument in the argument list
    */
-  String getFirstArgumentAsString(ArgumentList argumentList) {
+  String _getFirstArgumentAsString(ArgumentList argumentList) {
     NodeList<Expression> arguments = argumentList.arguments;
     if (arguments.length > 0) {
       Expression argument = arguments[0];
@@ -13175,7 +13483,7 @@
    * @param argumentList the list of arguments from which a type is to be extracted
    * @return the type specified by the first argument in the argument list
    */
-  Type2 getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList) => getFirstArgumentAsTypeWithMap(library, argumentList, null);
+  DartType _getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList) => _getFirstArgumentAsTypeWithMap(library, argumentList, null);
 
   /**
    * If the given argument list contains at least one argument, and if the argument is a simple
@@ -13187,7 +13495,7 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  Type2 getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => getElementNameAsType(library, getFirstArgumentAsString(argumentList), nameMap);
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
 
   /**
    * Return the static type of the given expression.
@@ -13195,8 +13503,8 @@
    * @param expression the expression whose type is to be returned
    * @return the static type of the given expression
    */
-  Type2 getStaticType(Expression expression) {
-    Type2 type = expression.staticType;
+  DartType _getStaticType(Expression expression) {
+    DartType type = expression.staticType;
     if (type == null) {
       // TODO(brianwilkerson) Determine the conditions for which the static type is null.
       return _dynamicType;
@@ -13210,8 +13518,8 @@
    * @param typeName the type name representing the type to be returned
    * @return the type represented by the type name
    */
-  Type2 getType(TypeName typeName) {
-    Type2 type = typeName.type;
+  DartType _getType(TypeName typeName) {
+    DartType type = typeName.type;
     if (type == null) {
       //TODO(brianwilkerson) Determine the conditions for which the type is null.
       return _dynamicType;
@@ -13229,7 +13537,7 @@
    *          specific type information
    * @return the type that should be recorded for a node that resolved to the given accessor
    */
-  Type2 getTypeOfProperty(PropertyAccessorElement accessor, Type2 context) {
+  DartType _getTypeOfProperty(PropertyAccessorElement accessor, DartType context) {
     FunctionType functionType = accessor.type;
     if (functionType == null) {
       // TODO(brianwilkerson) Report this internal error. This happens when we are analyzing a
@@ -13238,7 +13546,7 @@
       return _dynamicType;
     }
     if (accessor.isSetter) {
-      List<Type2> parameterTypes = functionType.normalParameterTypes;
+      List<DartType> parameterTypes = functionType.normalParameterTypes;
       if (parameterTypes != null && parameterTypes.length > 0) {
         return parameterTypes[0];
       }
@@ -13251,7 +13559,7 @@
       }
       return _dynamicType;
     }
-    Type2 returnType = functionType.returnType;
+    DartType returnType = functionType.returnType;
     if (returnType is TypeParameterType && context is InterfaceType) {
       // if the return type is a TypeParameter, we try to use the context [that the function is being
       // called on] to get a more accurate returnType type
@@ -13274,7 +13582,7 @@
    * Return `true` if the given [Type] is the `Future` form the 'dart:async'
    * library.
    */
-  bool isAsyncFutureType(Type2 type) => type is InterfaceType && type.name == "Future" && isAsyncLibrary(type.element.library);
+  bool _isAsyncFutureType(DartType type) => type is InterfaceType && type.name == "Future" && _isAsyncLibrary(type.element.library);
 
   /**
    * Return `true` if the given library is the 'dart:async' library.
@@ -13282,7 +13590,7 @@
    * @param library the library being tested
    * @return `true` if the library is 'dart:async'
    */
-  bool isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
+  bool _isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
 
   /**
    * Return `true` if the given library is the 'dart:html' library.
@@ -13290,7 +13598,7 @@
    * @param library the library being tested
    * @return `true` if the library is 'dart:html'
    */
-  bool isHtmlLibrary(LibraryElement library) => library != null && "dart.dom.html" == library.name;
+  bool _isHtmlLibrary(LibraryElement library) => library != null && "dart.dom.html" == library.name;
 
   /**
    * Return `true` if the given node is not a type literal.
@@ -13298,7 +13606,7 @@
    * @param node the node being tested
    * @return `true` if the given node is not a type literal
    */
-  bool isNotTypeLiteral(Identifier node) {
+  bool _isNotTypeLiteral(Identifier node) {
     AstNode parent = node.parent;
     return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(parent.prefix, node))) || (parent is PropertyAccess && identical(parent.target, node)) || (parent is MethodInvocation && identical(node, parent.target));
   }
@@ -13309,7 +13617,7 @@
    * @param expression the node whose type is to be recorded
    * @param type the propagated type of the node
    */
-  void recordPropagatedType(Expression expression, Type2 type) {
+  void _recordPropagatedType(Expression expression, DartType type) {
     if (type != null && !type.isDynamic) {
       expression.propagatedType = type;
     }
@@ -13324,8 +13632,8 @@
    * @return the propagated return type that was computed, may be `null` if it is not more
    *         specific than the static return type.
    */
-  void recordPropagatedTypeOfFunction(ExecutableElement functionElement, FunctionBody body) {
-    Type2 propagatedReturnType = computePropagatedReturnTypeOfFunction(body);
+  void _recordPropagatedTypeOfFunction(ExecutableElement functionElement, FunctionBody body) {
+    DartType propagatedReturnType = _computePropagatedReturnTypeOfFunction(body);
     if (propagatedReturnType == null) {
       return;
     }
@@ -13334,7 +13642,7 @@
       return;
     }
     // Record only if we inferred more specific type.
-    Type2 staticReturnType = functionElement.returnType;
+    DartType staticReturnType = functionElement.returnType;
     if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
       return;
     }
@@ -13348,7 +13656,7 @@
    * @param expression the node whose type is to be recorded
    * @param type the static type of the node
    */
-  void recordStaticType(Expression expression, Type2 type) {
+  void _recordStaticType(Expression expression, DartType type) {
     if (type == null) {
       expression.staticType = _dynamicType;
     } else {
@@ -13363,24 +13671,24 @@
    * @param staticType the static type of the expression as resolved
    * @return the better type guess, or the same static type as given
    */
-  Type2 refineBinaryExpressionType(BinaryExpression node, Type2 staticType) {
+  DartType _refineBinaryExpressionType(BinaryExpression node, DartType staticType) {
     sc.TokenType operator = node.operator.type;
     // bool
     if (identical(operator, sc.TokenType.AMPERSAND_AMPERSAND) || identical(operator, sc.TokenType.BAR_BAR) || identical(operator, sc.TokenType.EQ_EQ) || identical(operator, sc.TokenType.BANG_EQ)) {
       return _typeProvider.boolType;
     }
-    Type2 intType = _typeProvider.intType;
-    if (getStaticType(node.leftOperand) == intType) {
+    DartType intType = _typeProvider.intType;
+    if (_getStaticType(node.leftOperand) == intType) {
       // int op double
       if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenType.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc.TokenType.STAR)) {
-        Type2 doubleType = _typeProvider.doubleType;
-        if (getStaticType(node.rightOperand) == doubleType) {
+        DartType doubleType = _typeProvider.doubleType;
+        if (_getStaticType(node.rightOperand) == doubleType) {
           return doubleType;
         }
       }
       // int op int
       if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenType.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc.TokenType.STAR) || identical(operator, sc.TokenType.TILDE_SLASH)) {
-        if (getStaticType(node.rightOperand) == intType) {
+        if (_getStaticType(node.rightOperand) == intType) {
           staticType = intType;
         }
       }
@@ -13395,15 +13703,17 @@
 }
 
 class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
-  List<Type2> result;
+  List<DartType> result;
 
   GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.result) : super();
 
+  @override
   Object visitExpression(Expression node) => null;
 
+  @override
   Object visitReturnStatement(ReturnStatement node) {
     // prepare this 'return' type
-    Type2 type;
+    DartType type;
     Expression expression = node.expression;
     if (expression != null) {
       type = expression.bestType;
@@ -13444,10 +13754,10 @@
    */
   Set<ClassElement> computeAllSubtypes(ClassElement classElement) {
     // Ensure that we have generated the subtype map for the library
-    computeSubtypesInLibrary(classElement.library);
+    _computeSubtypesInLibrary(classElement.library);
     // use the subtypeMap to compute the set of all subtypes and subtype's subtypes
     Set<ClassElement> allSubtypes = new Set<ClassElement>();
-    safelyComputeAllSubtypes(classElement, new Set<ClassElement>(), allSubtypes);
+    _safelyComputeAllSubtypes(classElement, new Set<ClassElement>(), allSubtypes);
     return allSubtypes;
   }
 
@@ -13458,7 +13768,7 @@
    * @param libraryElement the library to visit, it it hasn't been visited already
    */
   void ensureLibraryVisited(LibraryElement libraryElement) {
-    computeSubtypesInLibrary(libraryElement);
+    _computeSubtypesInLibrary(libraryElement);
   }
 
   /**
@@ -13467,26 +13777,26 @@
    *
    * @param classElement the class element
    */
-  void computeSubtypesInClass(ClassElement classElement) {
+  void _computeSubtypesInClass(ClassElement classElement) {
     InterfaceType supertypeType = classElement.supertype;
     if (supertypeType != null) {
       ClassElement supertypeElement = supertypeType.element;
       if (supertypeElement != null) {
-        putInSubtypeMap(supertypeElement, classElement);
+        _putInSubtypeMap(supertypeElement, classElement);
       }
     }
     List<InterfaceType> interfaceTypes = classElement.interfaces;
     for (InterfaceType interfaceType in interfaceTypes) {
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null) {
-        putInSubtypeMap(interfaceElement, classElement);
+        _putInSubtypeMap(interfaceElement, classElement);
       }
     }
     List<InterfaceType> mixinTypes = classElement.mixins;
     for (InterfaceType mixinType in mixinTypes) {
       ClassElement mixinElement = mixinType.element;
       if (mixinElement != null) {
-        putInSubtypeMap(mixinElement, classElement);
+        _putInSubtypeMap(mixinElement, classElement);
       }
     }
   }
@@ -13498,10 +13808,10 @@
    *
    * @param unitElement the compilation unit element
    */
-  void computeSubtypesInCompilationUnit(CompilationUnitElement unitElement) {
+  void _computeSubtypesInCompilationUnit(CompilationUnitElement unitElement) {
     List<ClassElement> classElements = unitElement.types;
     for (ClassElement classElement in classElements) {
-      computeSubtypesInClass(classElement);
+      _computeSubtypesInClass(classElement);
     }
   }
 
@@ -13513,23 +13823,23 @@
    *
    * @param libraryElement the library element
    */
-  void computeSubtypesInLibrary(LibraryElement libraryElement) {
+  void _computeSubtypesInLibrary(LibraryElement libraryElement) {
     if (libraryElement == null || _visitedLibraries.contains(libraryElement)) {
       return;
     }
     _visitedLibraries.add(libraryElement);
-    computeSubtypesInCompilationUnit(libraryElement.definingCompilationUnit);
+    _computeSubtypesInCompilationUnit(libraryElement.definingCompilationUnit);
     List<CompilationUnitElement> parts = libraryElement.parts;
     for (CompilationUnitElement part in parts) {
-      computeSubtypesInCompilationUnit(part);
+      _computeSubtypesInCompilationUnit(part);
     }
     List<LibraryElement> imports = libraryElement.importedLibraries;
     for (LibraryElement importElt in imports) {
-      computeSubtypesInLibrary(importElt.library);
+      _computeSubtypesInLibrary(importElt.library);
     }
     List<LibraryElement> exports = libraryElement.exportedLibraries;
     for (LibraryElement exportElt in exports) {
-      computeSubtypesInLibrary(exportElt.library);
+      _computeSubtypesInLibrary(exportElt.library);
     }
   }
 
@@ -13539,7 +13849,7 @@
    * @param supertypeElement the key for the [subtypeMap] map
    * @param subtypeElement the value for the [subtypeMap] map
    */
-  void putInSubtypeMap(ClassElement supertypeElement, ClassElement subtypeElement) {
+  void _putInSubtypeMap(ClassElement supertypeElement, ClassElement subtypeElement) {
     Set<ClassElement> subtypes = _subtypeMap[supertypeElement];
     if (subtypes == null) {
       subtypes = new Set<ClassElement>();
@@ -13556,7 +13866,7 @@
    * @param visitedClasses the set of class elements that this method has already recursively seen
    * @param allSubtypes the computed set of subtypes of the passed class element
    */
-  void safelyComputeAllSubtypes(ClassElement classElement, Set<ClassElement> visitedClasses, Set<ClassElement> allSubtypes) {
+  void _safelyComputeAllSubtypes(ClassElement classElement, Set<ClassElement> visitedClasses, Set<ClassElement> allSubtypes) {
     if (!visitedClasses.add(classElement)) {
       // if this class has already been called on this class element
       return;
@@ -13566,7 +13876,7 @@
       return;
     }
     for (ClassElement subtype in subtypes) {
-      safelyComputeAllSubtypes(subtype, visitedClasses, allSubtypes);
+      _safelyComputeAllSubtypes(subtype, visitedClasses, allSubtypes);
     }
     allSubtypes.addAll(subtypes);
   }
@@ -13587,7 +13897,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, Type2> overrides) {
+  void applyOverrides(Map<Element, DartType> overrides) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot apply overrides without a scope");
     }
@@ -13600,7 +13910,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, Type2> captureLocalOverrides() {
+  Map<Element, DartType> captureLocalOverrides() {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture local overrides without a scope");
     }
@@ -13614,7 +13924,7 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture overrides without a scope");
     }
@@ -13645,7 +13955,7 @@
    * @param element the element whose type might have been overridden
    * @return the overridden type of the given element
    */
-  Type2 getType(Element element) {
+  DartType getType(Element element) {
     if (_currentScope == null) {
       return null;
     }
@@ -13658,7 +13968,7 @@
    * @param element the element whose type might have been overridden
    * @param type the overridden type of the given element
    */
-  void setType(Element element, Type2 type) {
+  void setType(Element element, DartType type) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot override without a scope");
     }
@@ -13679,7 +13989,7 @@
   /**
    * A table mapping elements to the overridden type of that element.
    */
-  Map<Element, Type2> _overridenTypes = new Map<Element, Type2>();
+  Map<Element, DartType> _overridenTypes = new Map<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -13695,8 +14005,8 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, Type2> overrides) {
-    for (MapEntry<Element, Type2> entry in getMapEntrySet(overrides)) {
+  void applyOverrides(Map<Element, DartType> overrides) {
+    for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
   }
@@ -13707,7 +14017,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, Type2> captureLocalOverrides() => _overridenTypes;
+  Map<Element, DartType> captureLocalOverrides() => _overridenTypes;
 
   /**
    * Return a map from the elements for the variables in the given list that have their types
@@ -13716,13 +14026,13 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, Type2> captureOverrides(VariableDeclarationList variableList) {
-    Map<Element, Type2> overrides = new Map<Element, Type2>();
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+    Map<Element, DartType> overrides = new Map<Element, DartType>();
     if (variableList.isConst || variableList.isFinal) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
         if (element != null) {
-          Type2 type = _overridenTypes[element];
+          DartType type = _overridenTypes[element];
           if (type != null) {
             overrides[element] = type;
           }
@@ -13739,8 +14049,8 @@
    * @param element the element whose type might have been overridden
    * @return the overridden type of the given element
    */
-  Type2 getType(Element element) {
-    Type2 type = _overridenTypes[element];
+  DartType getType(Element element) {
+    DartType type = _overridenTypes[element];
     if (type == null && element is PropertyAccessorElement) {
       type = _overridenTypes[element.variable];
     }
@@ -13758,7 +14068,7 @@
    * @param element the element whose type might have been overridden
    * @param type the overridden type of the given element
    */
-  void setType(Element element, Type2 type) {
+  void setType(Element element, DartType type) {
     _overridenTypes[element] = type;
   }
 }
@@ -13800,8 +14110,8 @@
    *
    * @return the static type of the given variable - declared or promoted
    */
-  Type2 getStaticType(VariableElement variable) {
-    Type2 staticType = getType(variable);
+  DartType getStaticType(VariableElement variable) {
+    DartType staticType = getType(variable);
     if (staticType == null) {
       staticType = variable.type;
     }
@@ -13815,7 +14125,7 @@
    * @param element the element whose type might have been promoted
    * @return the promoted type of the given element
    */
-  Type2 getType(Element element) {
+  DartType getType(Element element) {
     if (_currentScope == null) {
       return null;
     }
@@ -13828,7 +14138,7 @@
    * @param element the element whose type might have been promoted
    * @param type the promoted type of the given element
    */
-  void setType(Element element, Type2 type) {
+  void setType(Element element, DartType type) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot promote without a scope");
     }
@@ -13849,7 +14159,7 @@
   /**
    * A table mapping elements to the promoted type of that element.
    */
-  Map<Element, Type2> _promotedTypes = new Map<Element, Type2>();
+  Map<Element, DartType> _promotedTypes = new Map<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -13872,8 +14182,8 @@
    * @param element the element whose type might have been promoted
    * @return the promoted type of the given element
    */
-  Type2 getType(Element element) {
-    Type2 type = _promotedTypes[element];
+  DartType getType(Element element) {
+    DartType type = _promotedTypes[element];
     if (type == null && element is PropertyAccessorElement) {
       type = _promotedTypes[element.variable];
     }
@@ -13891,7 +14201,7 @@
    * @param element the element whose type might have been promoted
    * @param type the promoted type of the given element
    */
-  void setType(Element element, Type2 type) {
+  void setType(Element element, DartType type) {
     _promotedTypes[element] = type;
   }
 }
@@ -13913,7 +14223,7 @@
    *
    * @return the type representing the type 'bottom'
    */
-  Type2 get bottomType;
+  DartType get bottomType;
 
   /**
    * Return the type representing the built-in type 'Deprecated'.
@@ -13934,7 +14244,7 @@
    *
    * @return the type representing the built-in type 'dynamic'
    */
-  Type2 get dynamicType;
+  DartType get dynamicType;
 
   /**
    * Return the type representing the built-in type 'Function'.
@@ -14027,7 +14337,7 @@
   /**
    * The type representing the type 'bottom'.
    */
-  Type2 _bottomType;
+  DartType _bottomType;
 
   /**
    * The type representing the built-in type 'double'.
@@ -14042,7 +14352,7 @@
   /**
    * The type representing the built-in type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The type representing the built-in type 'Function'.
@@ -14105,39 +14415,55 @@
    * @param coreLibrary the element representing the core library (dart:core).
    */
   TypeProviderImpl(LibraryElement coreLibrary) {
-    initializeFrom(coreLibrary);
+    _initializeFrom(coreLibrary);
   }
 
+  @override
   InterfaceType get boolType => _boolType;
 
-  Type2 get bottomType => _bottomType;
+  @override
+  DartType get bottomType => _bottomType;
 
+  @override
   InterfaceType get deprecatedType => _deprecatedType;
 
+  @override
   InterfaceType get doubleType => _doubleType;
 
-  Type2 get dynamicType => _dynamicType;
+  @override
+  DartType get dynamicType => _dynamicType;
 
+  @override
   InterfaceType get functionType => _functionType;
 
+  @override
   InterfaceType get intType => _intType;
 
+  @override
   InterfaceType get listType => _listType;
 
+  @override
   InterfaceType get mapType => _mapType;
 
+  @override
   InterfaceType get nullType => _nullType;
 
+  @override
   InterfaceType get numType => _numType;
 
+  @override
   InterfaceType get objectType => _objectType;
 
+  @override
   InterfaceType get stackTraceType => _stackTraceType;
 
+  @override
   InterfaceType get stringType => _stringType;
 
+  @override
   InterfaceType get symbolType => _symbolType;
 
+  @override
   InterfaceType get typeType => _typeType;
 
   /**
@@ -14148,7 +14474,7 @@
    * @param typeName the name of the type being searched for
    * @return the type that was found
    */
-  InterfaceType getType(Namespace namespace, String typeName) {
+  InterfaceType _getType(Namespace namespace, String typeName) {
     Element element = namespace.get(typeName);
     if (element == null) {
       AnalysisEngine.instance.logger.logInformation("No definition of type ${typeName}");
@@ -14162,24 +14488,24 @@
    *
    * @param library the library containing the definitions of the core types
    */
-  void initializeFrom(LibraryElement library) {
+  void _initializeFrom(LibraryElement library) {
     Namespace namespace = new NamespaceBuilder().createPublicNamespaceForLibrary(library);
-    _boolType = getType(namespace, "bool");
+    _boolType = _getType(namespace, "bool");
     _bottomType = BottomTypeImpl.instance;
-    _deprecatedType = getType(namespace, "Deprecated");
-    _doubleType = getType(namespace, "double");
+    _deprecatedType = _getType(namespace, "Deprecated");
+    _doubleType = _getType(namespace, "double");
     _dynamicType = DynamicTypeImpl.instance;
-    _functionType = getType(namespace, "Function");
-    _intType = getType(namespace, "int");
-    _listType = getType(namespace, "List");
-    _mapType = getType(namespace, "Map");
-    _nullType = getType(namespace, "Null");
-    _numType = getType(namespace, "num");
-    _objectType = getType(namespace, "Object");
-    _stackTraceType = getType(namespace, "StackTrace");
-    _stringType = getType(namespace, "String");
-    _symbolType = getType(namespace, "Symbol");
-    _typeType = getType(namespace, "Type");
+    _functionType = _getType(namespace, "Function");
+    _intType = _getType(namespace, "int");
+    _listType = _getType(namespace, "List");
+    _mapType = _getType(namespace, "Map");
+    _nullType = _getType(namespace, "Null");
+    _numType = _getType(namespace, "num");
+    _objectType = _getType(namespace, "Object");
+    _stackTraceType = _getType(namespace, "StackTrace");
+    _stringType = _getType(namespace, "String");
+    _symbolType = _getType(namespace, "Symbol");
+    _typeType = _getType(namespace, "Type");
   }
 }
 
@@ -14193,7 +14519,7 @@
   /**
    * @return `true` if the name of the given [TypeName] is an built-in identifier.
    */
-  static bool isBuiltInIdentifier(TypeName node) {
+  static bool _isBuiltInIdentifier(TypeName node) {
     sc.Token token = node.name.beginToken;
     return identical(token.type, sc.TokenType.KEYWORD);
   }
@@ -14201,7 +14527,7 @@
   /**
    * @return `true` if given [TypeName] is used as a type annotation.
    */
-  static bool isTypeAnnotation(TypeName node) {
+  static bool _isTypeAnnotation(TypeName node) {
     AstNode parent = node.parent;
     if (parent is VariableDeclarationList) {
       return identical(parent.type, node);
@@ -14218,7 +14544,7 @@
   /**
    * The type representing the type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The flag specifying if currently visited class references 'super' expression.
@@ -14264,6 +14590,7 @@
     _dynamicType = typeProvider.dynamicType;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     super.visitCatchClause(node);
     SimpleIdentifier exception = node.exceptionParameter;
@@ -14271,13 +14598,13 @@
       // If an 'on' clause is provided the type of the exception parameter is the type in the 'on'
       // clause. Otherwise, the type of the exception parameter is 'Object'.
       TypeName exceptionTypeName = node.exceptionType;
-      Type2 exceptionType;
+      DartType exceptionType;
       if (exceptionTypeName == null) {
         exceptionType = typeProvider.dynamicType;
       } else {
-        exceptionType = getType(exceptionTypeName);
+        exceptionType = _getType(exceptionTypeName);
       }
-      recordType(exception, exceptionType);
+      _recordType(exception, exceptionType);
       Element element = exception.staticElement;
       if (element is VariableElementImpl) {
         element.type = exceptionType;
@@ -14286,20 +14613,21 @@
     }
     SimpleIdentifier stackTrace = node.stackTraceParameter;
     if (stackTrace != null) {
-      recordType(stackTrace, typeProvider.stackTraceType);
+      _recordType(stackTrace, typeProvider.stackTraceType);
     }
     return null;
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
-    ClassElementImpl classElement = getClassElement(node.name);
+    ClassElementImpl classElement = _getClassElement(node.name);
     InterfaceType superclassType = null;
     ExtendsClause extendsClause = node.extendsClause;
     if (extendsClause != null) {
       ErrorCode errorCode = (node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
-      superclassType = resolveType(extendsClause.superclass, errorCode, errorCode);
+      superclassType = _resolveType(extendsClause.superclass, errorCode, errorCode);
       if (superclassType != typeProvider.objectType) {
         classElement.validMixin = false;
       }
@@ -14314,15 +14642,16 @@
       classElement.supertype = superclassType;
       classElement.hasReferenceToSuper = _hasReferenceToSuper;
     }
-    resolve(classElement, node.withClause, node.implementsClause);
+    _resolve(classElement, node.withClause, node.implementsClause);
     return null;
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     super.visitClassTypeAlias(node);
-    ClassElementImpl classElement = getClassElement(node.name);
+    ClassElementImpl classElement = _getClassElement(node.name);
     ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
-    InterfaceType superclassType = resolveType(node.superclass, errorCode, errorCode);
+    InterfaceType superclassType = _resolveType(node.superclass, errorCode, errorCode);
     if (superclassType == null) {
       superclassType = typeProvider.objectType;
     }
@@ -14333,24 +14662,25 @@
         List<ConstructorElement> constructors = superclassElement.constructors;
         int count = constructors.length;
         if (count > 0) {
-          List<Type2> parameterTypes = TypeParameterTypeImpl.getTypes(superclassType.typeParameters);
-          List<Type2> argumentTypes = getArgumentTypes(node.superclass.typeArguments, parameterTypes);
+          List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(superclassType.typeParameters);
+          List<DartType> argumentTypes = _getArgumentTypes(node.superclass.typeArguments, parameterTypes);
           InterfaceType classType = classElement.type;
           List<ConstructorElement> implicitConstructors = new List<ConstructorElement>();
           for (int i = 0; i < count; i++) {
             ConstructorElement explicitConstructor = constructors[i];
             if (!explicitConstructor.isFactory) {
-              implicitConstructors.add(createImplicitContructor(classType, explicitConstructor, parameterTypes, argumentTypes));
+              implicitConstructors.add(_createImplicitContructor(classType, explicitConstructor, parameterTypes, argumentTypes));
             }
           }
           classElement.constructors = new List.from(implicitConstructors);
         }
       }
     }
-    resolve(classElement, node.withClause, node.implementsClause);
+    _resolve(classElement, node.withClause, node.implementsClause);
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
@@ -14362,20 +14692,22 @@
     return null;
   }
 
+  @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     super.visitDeclaredIdentifier(node);
-    Type2 declaredType;
+    DartType declaredType;
     TypeName typeName = node.type;
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType(typeName);
+      declaredType = _getType(typeName);
     }
     LocalVariableElementImpl element = node.element as LocalVariableElementImpl;
     element.type = declaredType;
     return null;
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     super.visitFieldFormalParameter(node);
     Element element = node.identifier.staticElement;
@@ -14383,7 +14715,7 @@
       ParameterElementImpl parameter = element;
       FormalParameterList parameterList = node.parameters;
       if (parameterList == null) {
-        Type2 type;
+        DartType type;
         TypeName typeName = node.type;
         if (typeName == null) {
           type = _dynamicType;
@@ -14394,21 +14726,22 @@
             }
           }
         } else {
-          type = getType(typeName);
+          type = _getType(typeName);
         }
         parameter.type = type;
       } else {
-        setFunctionTypedParameterType(parameter, node.type, node.parameters);
+        _setFunctionTypedParameterType(parameter, node.type, node.parameters);
       }
     } else {
     }
     return null;
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    element.returnType = computeReturnType(node.returnType);
+    element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
     ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
     if (definingClass != null) {
@@ -14418,27 +14751,30 @@
     return null;
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     super.visitFunctionTypeAlias(node);
     FunctionTypeAliasElementImpl element = node.element as FunctionTypeAliasElementImpl;
-    element.returnType = computeReturnType(node.returnType);
+    element.returnType = _computeReturnType(node.returnType);
     return null;
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
     Element element = node.identifier.staticElement;
     if (element is ParameterElementImpl) {
-      setFunctionTypedParameterType(element, node.returnType, node.parameters);
+      _setFunctionTypedParameterType(element, node.returnType, node.parameters);
     } else {
     }
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    element.returnType = computeReturnType(node.returnType);
+    element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
     ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
     if (definingClass != null) {
@@ -14451,7 +14787,7 @@
       if (accessor.isGetter) {
         variable.type = type.returnType;
       } else if (variable.type == null) {
-        List<Type2> parameterTypes = type.normalParameterTypes;
+        List<DartType> parameterTypes = type.normalParameterTypes;
         if (parameterTypes != null && parameterTypes.length > 0) {
           variable.type = parameterTypes[0];
         }
@@ -14460,14 +14796,15 @@
     return null;
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
     super.visitSimpleFormalParameter(node);
-    Type2 declaredType;
+    DartType declaredType;
     TypeName typeName = node.type;
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType(typeName);
+      declaredType = _getType(typeName);
     }
     Element element = node.identifier.staticElement;
     if (element is ParameterElement) {
@@ -14477,11 +14814,13 @@
     return null;
   }
 
+  @override
   Object visitSuperExpression(SuperExpression node) {
     _hasReferenceToSuper = true;
     return super.visitSuperExpression(node);
   }
 
+  @override
   Object visitTypeName(TypeName node) {
     super.visitTypeName(node);
     Identifier typeName = node.name;
@@ -14492,12 +14831,12 @@
       // Check to see whether the type name is either 'dynamic' or 'void', neither of which are in
       // the name scope and hence will not be found by normal means.
       //
-      if (typeName.name == this._dynamicType.name) {
-        setElement(typeName, this._dynamicType.element);
+      if (typeName.name == _dynamicType.name) {
+        _setElement(typeName, _dynamicType.element);
         if (argumentList != null) {
         }
-        typeName.staticType = this._dynamicType;
-        node.type = this._dynamicType;
+        typeName.staticType = _dynamicType;
+        node.type = _dynamicType;
         return null;
       }
       VoidTypeImpl voidType = VoidTypeImpl.instance;
@@ -14529,7 +14868,7 @@
               // Else, if this expression is a new expression, report a NEW_WITH_NON_TYPE warning.
               reportErrorForNode(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             }
-            setElement(prefix, element);
+            _setElement(prefix, element);
             return null;
           } else if (element != null) {
             //
@@ -14548,8 +14887,8 @@
     }
     // check element
     bool elementValid = element is! MultiplyDefinedElement;
-    if (elementValid && element is! ClassElement && isTypeNameInInstanceCreationExpression(node)) {
-      SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
+    if (elementValid && element is! ClassElement && _isTypeNameInInstanceCreationExpression(node)) {
+      SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName);
       InstanceCreationExpression creation = node.parent.parent as InstanceCreationExpression;
       if (creation.isConst) {
         if (element == null) {
@@ -14570,22 +14909,22 @@
       // TODO(jwren) Consider moving the check for CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE
       // from the ErrorVerifier, so that we don't have two errors on a built in identifier being
       // used as a class name. See CompileTimeErrorCodeTest.test_builtInIdentifierAsType().
-      SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
+      SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName);
       RedirectingConstructorKind redirectingConstructorKind;
-      if (isBuiltInIdentifier(node) && isTypeAnnotation(node)) {
+      if (_isBuiltInIdentifier(node) && _isTypeAnnotation(node)) {
         reportErrorForNode(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, typeName, [typeName.name]);
       } else if (typeNameSimple.name == "boolean") {
         reportErrorForNode(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
-      } else if (isTypeNameInCatchClause(node)) {
+      } else if (_isTypeNameInCatchClause(node)) {
         reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
-      } else if (isTypeNameInAsExpression(node)) {
+      } else if (_isTypeNameInAsExpression(node)) {
         reportErrorForNode(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
-      } else if (isTypeNameInIsExpression(node)) {
+      } else if (_isTypeNameInIsExpression(node)) {
         reportErrorForNode(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
-      } else if ((redirectingConstructorKind = getRedirectingConstructorKind(node)) != null) {
+      } else if ((redirectingConstructorKind = _getRedirectingConstructorKind(node)) != null) {
         ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
         reportErrorForNode(errorCode, typeName, [typeName.name]);
-      } else if (isTypeNameInTypeArgumentList(node)) {
+      } else if (_isTypeNameInTypeArgumentList(node)) {
         reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
         reportErrorForNode(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
@@ -14594,45 +14933,45 @@
     }
     if (!elementValid) {
       if (element is MultiplyDefinedElement) {
-        setElement(typeName, element);
+        _setElement(typeName, element);
       } else {
-        setElement(typeName, this._dynamicType.element);
+        _setElement(typeName, _dynamicType.element);
       }
-      typeName.staticType = this._dynamicType;
-      node.type = this._dynamicType;
+      typeName.staticType = _dynamicType;
+      node.type = _dynamicType;
       return null;
     }
-    Type2 type = null;
+    DartType type = null;
     if (element is ClassElement) {
-      setElement(typeName, element);
+      _setElement(typeName, element);
       type = (element as ClassElement).type;
     } else if (element is FunctionTypeAliasElement) {
-      setElement(typeName, element);
+      _setElement(typeName, element);
       type = (element as FunctionTypeAliasElement).type;
     } else if (element is TypeParameterElement) {
-      setElement(typeName, element);
+      _setElement(typeName, element);
       type = (element as TypeParameterElement).type;
       if (argumentList != null) {
       }
     } else if (element is MultiplyDefinedElement) {
       List<Element> elements = (element as MultiplyDefinedElement).conflictingElements;
-      type = getTypeWhenMultiplyDefined(elements);
+      type = _getTypeWhenMultiplyDefined(elements);
       if (type != null) {
         node.type = type;
       }
     } else {
       // The name does not represent a type.
       RedirectingConstructorKind redirectingConstructorKind;
-      if (isTypeNameInCatchClause(node)) {
+      if (_isTypeNameInCatchClause(node)) {
         reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
-      } else if (isTypeNameInAsExpression(node)) {
+      } else if (_isTypeNameInAsExpression(node)) {
         reportErrorForNode(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
-      } else if (isTypeNameInIsExpression(node)) {
+      } else if (_isTypeNameInIsExpression(node)) {
         reportErrorForNode(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
-      } else if ((redirectingConstructorKind = getRedirectingConstructorKind(node)) != null) {
+      } else if ((redirectingConstructorKind = _getRedirectingConstructorKind(node)) != null) {
         ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
         reportErrorForNode(errorCode, typeName, [typeName.name]);
-      } else if (isTypeNameInTypeArgumentList(node)) {
+      } else if (_isTypeNameInTypeArgumentList(node)) {
         reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
         AstNode parent = typeName.parent;
@@ -14644,26 +14983,26 @@
           reportErrorForNode(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
         }
       }
-      setElement(typeName, this._dynamicType.element);
-      typeName.staticType = this._dynamicType;
-      node.type = this._dynamicType;
+      _setElement(typeName, _dynamicType.element);
+      typeName.staticType = _dynamicType;
+      node.type = _dynamicType;
       return null;
     }
     if (argumentList != null) {
       NodeList<TypeName> arguments = argumentList.arguments;
       int argumentCount = arguments.length;
-      List<Type2> parameters = getTypeArguments(type);
+      List<DartType> parameters = _getTypeArguments(type);
       int parameterCount = parameters.length;
       int count = Math.min(argumentCount, parameterCount);
-      List<Type2> typeArguments = new List<Type2>();
+      List<DartType> typeArguments = new List<DartType>();
       for (int i = 0; i < count; i++) {
-        Type2 argumentType = getType(arguments[i]);
+        DartType argumentType = _getType(arguments[i]);
         if (argumentType != null) {
           typeArguments.add(argumentType);
         }
       }
       if (argumentCount != parameterCount) {
-        reportErrorForNode(getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
+        reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
       }
       argumentCount = typeArguments.length;
       if (argumentCount < parameterCount) {
@@ -14673,7 +15012,7 @@
         // enough times to make the count equal.
         //
         for (int i = argumentCount; i < parameterCount; i++) {
-          typeArguments.add(this._dynamicType);
+          typeArguments.add(_dynamicType);
         }
       }
       if (type is InterfaceTypeImpl) {
@@ -14688,11 +15027,11 @@
       //
       // Check for the case where there are no type arguments given for a parameterized type.
       //
-      List<Type2> parameters = getTypeArguments(type);
+      List<DartType> parameters = _getTypeArguments(type);
       int parameterCount = parameters.length;
       if (parameterCount > 0) {
         DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
-        List<Type2> arguments = new List<Type2>(parameterCount);
+        List<DartType> arguments = new List<DartType>(parameterCount);
         for (int i = 0; i < parameterCount; i++) {
           arguments[i] = dynamicType;
         }
@@ -14704,6 +15043,7 @@
     return null;
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
     super.visitTypeParameter(node);
     TypeName bound = node.bound;
@@ -14716,14 +15056,15 @@
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
-    Type2 declaredType;
+    DartType declaredType;
     TypeName typeName = (node.parent as VariableDeclarationList).type;
     if (typeName == null) {
       declaredType = _dynamicType;
     } else {
-      declaredType = getType(typeName);
+      declaredType = _getType(typeName);
     }
     Element element = node.name.staticElement;
     if (element is VariableElement) {
@@ -14757,6 +15098,7 @@
     return null;
   }
 
+  @override
   void visitClassDeclarationInScope(ClassDeclaration node) {
     //
     // Process field declarations before constructors and methods so that the types of field formal
@@ -14777,7 +15119,7 @@
    * @param returnType the type name representing the return type of the function
    * @return the return type that was computed
    */
-  Type2 computeReturnType(TypeName returnType) {
+  DartType _computeReturnType(TypeName returnType) {
     if (returnType == null) {
       return _dynamicType;
     } else {
@@ -14795,7 +15137,7 @@
    * @param argumentTypes the types with which the parameters are to be replaced
    * @return the implicit constructor that was created
    */
-  ConstructorElement createImplicitContructor(InterfaceType classType, ConstructorElement explicitConstructor, List<Type2> parameterTypes, List<Type2> argumentTypes) {
+  ConstructorElement _createImplicitContructor(InterfaceType classType, ConstructorElement explicitConstructor, List<DartType> parameterTypes, List<DartType> argumentTypes) {
     ConstructorElementImpl implicitConstructor = new ConstructorElementImpl.con2(explicitConstructor.name, -1);
     implicitConstructor.synthetic = true;
     implicitConstructor.redirectedConstructor = explicitConstructor;
@@ -14831,10 +15173,10 @@
    * @param parameterTypes the parameter types that must be matched by the type arguments
    * @return the argument types that correspond to the parameter types
    */
-  List<Type2> getArgumentTypes(TypeArgumentList typeArguments, List<Type2> parameterTypes) {
+  List<DartType> _getArgumentTypes(TypeArgumentList typeArguments, List<DartType> parameterTypes) {
     DynamicTypeImpl dynamic = DynamicTypeImpl.instance;
     int parameterCount = parameterTypes.length;
-    List<Type2> types = new List<Type2>(parameterCount);
+    List<DartType> types = new List<DartType>(parameterCount);
     if (typeArguments == null) {
       for (int i = 0; i < parameterCount; i++) {
         types[i] = dynamic;
@@ -14858,7 +15200,7 @@
    * @param identifier the name from the declaration of a class
    * @return the class element that represents the class
    */
-  ClassElementImpl getClassElement(SimpleIdentifier identifier) {
+  ClassElementImpl _getClassElement(SimpleIdentifier identifier) {
     // TODO(brianwilkerson) Seems like we should be using ClassDeclaration.getElement().
     if (identifier == null) {
       // TODO(brianwilkerson) Report this
@@ -14881,7 +15223,7 @@
    * @param parameterList the list of parameters whose elements are to be returned
    * @return the elements associated with the parameters
    */
-  List<ParameterElement> getElements(FormalParameterList parameterList) {
+  List<ParameterElement> _getElements(FormalParameterList parameterList) {
     List<ParameterElement> elements = new List<ParameterElement>();
     for (FormalParameter parameter in parameterList.parameters) {
       ParameterElement element = parameter.identifier.staticElement as ParameterElement;
@@ -14902,7 +15244,7 @@
    * @return the error code that should be used to report that the wrong number of type arguments
    *         were provided
    */
-  ErrorCode getInvalidTypeParametersErrorCode(TypeName node) {
+  ErrorCode _getInvalidTypeParametersErrorCode(TypeName node) {
     AstNode parent = node.parent;
     if (parent is ConstructorName) {
       parent = parent.parent;
@@ -14924,7 +15266,7 @@
    * @return some [RedirectingConstructorKind] if the given type name is used as the type in a
    *         redirected constructor, or `null` otherwise
    */
-  RedirectingConstructorKind getRedirectingConstructorKind(TypeName typeName) {
+  RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is ConstructorName) {
       ConstructorName constructorName = parent as ConstructorName;
@@ -14948,8 +15290,8 @@
    * @param typeName the type name representing the type to be returned
    * @return the type represented by the type name
    */
-  Type2 getType(TypeName typeName) {
-    Type2 type = typeName.type;
+  DartType _getType(TypeName typeName) {
+    DartType type = typeName.type;
     if (type == null) {
       return _dynamicType;
     }
@@ -14962,7 +15304,7 @@
    * @param type the type whole type arguments are to be returned
    * @return the type arguments associated with the given type
    */
-  List<Type2> getTypeArguments(Type2 type) {
+  List<DartType> _getTypeArguments(DartType type) {
     if (type is InterfaceType) {
       return type.typeArguments;
     } else if (type is FunctionType) {
@@ -14977,7 +15319,7 @@
    * @param typeName the (may be qualified) qualified type name
    * @return the simple identifier of the given (may be qualified) type name.
    */
-  SimpleIdentifier getTypeSimpleIdentifier(Identifier typeName) {
+  SimpleIdentifier _getTypeSimpleIdentifier(Identifier typeName) {
     if (typeName is SimpleIdentifier) {
       return typeName;
     } else {
@@ -14992,7 +15334,7 @@
    * @param elements the elements to which a single name could potentially be resolved
    * @return the single interface type that should be used for the type name
    */
-  InterfaceType getTypeWhenMultiplyDefined(List<Element> elements) {
+  InterfaceType _getTypeWhenMultiplyDefined(List<Element> elements) {
     InterfaceType type = null;
     for (Element element in elements) {
       if (element is ClassElement) {
@@ -15011,7 +15353,7 @@
    * @param typeName the type name to analyzer
    * @return `true` if the given type name is used as the type in an as expression
    */
-  bool isTypeNameInAsExpression(TypeName typeName) {
+  bool _isTypeNameInAsExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is AsExpression) {
       AsExpression asExpression = parent;
@@ -15026,7 +15368,7 @@
    * @param typeName the type name to analyzer
    * @return `true` if the given type name is used as the exception type in a catch clause
    */
-  bool isTypeNameInCatchClause(TypeName typeName) {
+  bool _isTypeNameInCatchClause(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is CatchClause) {
       CatchClause catchClause = parent;
@@ -15042,7 +15384,7 @@
    * @return `true` if the given type name is used as the type in an instance creation
    *         expression
    */
-  bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
+  bool _isTypeNameInInstanceCreationExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is ConstructorName && parent.parent is InstanceCreationExpression) {
       ConstructorName constructorName = parent;
@@ -15057,7 +15399,7 @@
    * @param typeName the type name to analyzer
    * @return `true` if the given type name is used as the type in an is expression
    */
-  bool isTypeNameInIsExpression(TypeName typeName) {
+  bool _isTypeNameInIsExpression(TypeName typeName) {
     AstNode parent = typeName.parent;
     if (parent is IsExpression) {
       IsExpression isExpression = parent;
@@ -15072,7 +15414,7 @@
    * @param typeName the type name to analyzer
    * @return `true` if the given type name is in a type argument list
    */
-  bool isTypeNameInTypeArgumentList(TypeName typeName) => typeName.parent is TypeArgumentList;
+  bool _isTypeNameInTypeArgumentList(TypeName typeName) => typeName.parent is TypeArgumentList;
 
   /**
    * Record that the static type of the given node is the given type.
@@ -15080,7 +15422,7 @@
    * @param expression the node whose type is to be recorded
    * @param type the static type of the node
    */
-  Object recordType(Expression expression, Type2 type) {
+  Object _recordType(Expression expression, DartType type) {
     if (type == null) {
       expression.staticType = _dynamicType;
     } else {
@@ -15098,16 +15440,16 @@
    * @param withClause the with clause to be resolved
    * @param implementsClause the implements clause to be resolved
    */
-  void resolve(ClassElementImpl classElement, WithClause withClause, ImplementsClause implementsClause) {
+  void _resolve(ClassElementImpl classElement, WithClause withClause, ImplementsClause implementsClause) {
     if (withClause != null) {
-      List<InterfaceType> mixinTypes = resolveTypes(withClause.mixinTypes, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
+      List<InterfaceType> mixinTypes = _resolveTypes(withClause.mixinTypes, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
       if (classElement != null) {
         classElement.mixins = mixinTypes;
       }
     }
     if (implementsClause != null) {
       NodeList<TypeName> interfaces = implementsClause.interfaces;
-      List<InterfaceType> interfaceTypes = resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
+      List<InterfaceType> interfaceTypes = _resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
       if (classElement != null) {
         classElement.interfaces = interfaceTypes;
       }
@@ -15145,8 +15487,8 @@
    * @param dynamicTypeError the error to produce if the type name is "dynamic"
    * @return the type specified by the type name
    */
-  InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
-    Type2 type = typeName.type;
+  InterfaceType _resolveType(TypeName typeName, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
+    DartType type = typeName.type;
     if (type is InterfaceType) {
       return type;
     }
@@ -15169,10 +15511,10 @@
    * @param dynamicTypeError the error to produce if the type name is "dynamic"
    * @return an array containing all of the types that were resolved.
    */
-  List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
+  List<InterfaceType> _resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
     List<InterfaceType> types = new List<InterfaceType>();
     for (TypeName typeName in typeNames) {
-      InterfaceType type = resolveType(typeName, nonTypeError, dynamicTypeError);
+      InterfaceType type = _resolveType(typeName, nonTypeError, dynamicTypeError);
       if (type != null) {
         types.add(type);
       }
@@ -15180,7 +15522,7 @@
     return new List.from(types);
   }
 
-  void setElement(Identifier typeName, Element element) {
+  void _setElement(Identifier typeName, Element element) {
     if (element != null) {
       if (typeName is SimpleIdentifier) {
         typeName.staticElement = element;
@@ -15204,12 +15546,12 @@
    * @param returnType the (possibly `null`) return type of the function
    * @param parameterList the list of parameters to the function
    */
-  void setFunctionTypedParameterType(ParameterElementImpl element, TypeName returnType, FormalParameterList parameterList) {
-    List<ParameterElement> parameters = getElements(parameterList);
+  void _setFunctionTypedParameterType(ParameterElementImpl element, TypeName returnType, FormalParameterList parameterList) {
+    List<ParameterElement> parameters = _getElements(parameterList);
     FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl(null);
     aliasElement.synthetic = true;
     aliasElement.shareParameters(parameters);
-    aliasElement.returnType = computeReturnType(returnType);
+    aliasElement.returnType = _computeReturnType(returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con2(aliasElement);
     ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
     if (definingClass != null) {
@@ -15251,16 +15593,19 @@
 
   UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope(this.TypeResolverVisitor_this, this.nonFields) : super();
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     nonFields.add(node);
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     nonFields.add(node);
     return null;
   }
 
+  @override
   Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
 }
 
@@ -15296,6 +15641,7 @@
    */
   VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) : super.con3(definingLibrary, source, typeProvider, nameScope, errorListener);
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -15306,6 +15652,7 @@
     }
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       ExecutableElement outerFunction = _enclosingFunction;
@@ -15320,6 +15667,7 @@
     }
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     // Ignore if already resolved - declaration or type.
     if (node.staticElement != null) {
@@ -15384,10 +15732,11 @@
    * @param typeElement the element representing the type represented by this scope
    */
   ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new EnclosedScope(enclosingScope)) {
-    defineTypeParameters(typeElement);
-    defineMembers(typeElement);
+    _defineTypeParameters(typeElement);
+    _defineMembers(typeElement);
   }
 
+  @override
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     if (existing is PropertyAccessorElement && duplicate is MethodElement) {
       if (existing.nameOffset < duplicate.nameOffset) {
@@ -15404,7 +15753,7 @@
    *
    * @param typeElement the element representing the type represented by this scope
    */
-  void defineMembers(ClassElement typeElement) {
+  void _defineMembers(ClassElement typeElement) {
     for (PropertyAccessorElement accessor in typeElement.accessors) {
       define(accessor);
     }
@@ -15418,7 +15767,7 @@
    *
    * @param typeElement the element representing the type represented by this scope
    */
-  void defineTypeParameters(ClassElement typeElement) {
+  void _defineTypeParameters(ClassElement typeElement) {
     Scope parameterScope = enclosingScope;
     for (TypeParameterElement typeParameter in typeElement.typeParameters) {
       parameterScope.define(typeParameter);
@@ -15455,6 +15804,7 @@
    */
   EnclosedScope(this.enclosingScope);
 
+  @override
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
 
   /**
@@ -15474,6 +15824,7 @@
     }
   }
 
+  @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element element = localLookup(name, referencingLibrary);
     if (element != null) {
@@ -15550,7 +15901,7 @@
    */
   FunctionTypeScope(Scope enclosingScope, FunctionTypeAliasElement typeElement) : super(new EnclosedScope(enclosingScope)) {
     this._typeElement = typeElement;
-    defineTypeParameters();
+    _defineTypeParameters();
   }
 
   /**
@@ -15573,7 +15924,7 @@
    *
    * @param typeElement the element representing the type represented by this scope
    */
-  void defineTypeParameters() {
+  void _defineTypeParameters() {
     Scope typeParameterScope = enclosingScope;
     for (TypeParameterElement typeParameter in _typeElement.typeParameters) {
       typeParameterScope.define(typeParameter);
@@ -15683,15 +16034,17 @@
    */
   LibraryImportScope(LibraryElement definingLibrary, this.errorListener) {
     this._definingLibrary = definingLibrary;
-    createImportedNamespaces(definingLibrary);
+    _createImportedNamespaces(definingLibrary);
   }
 
+  @override
   void define(Element element) {
     if (!Scope.isPrivateName(element.displayName)) {
       super.define(element);
     }
   }
 
+  @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) {
     Element foundElement = localLookup(name, referencingLibrary);
     if (foundElement != null) {
@@ -15708,13 +16061,13 @@
       }
     }
     if (foundElement is MultiplyDefinedElementImpl) {
-      foundElement = removeSdkElements(identifier, name, foundElement as MultiplyDefinedElementImpl);
+      foundElement = _removeSdkElements(identifier, name, foundElement as MultiplyDefinedElementImpl);
     }
     if (foundElement is MultiplyDefinedElementImpl) {
       String foundEltName = foundElement.displayName;
       List<Element> conflictingMembers = (foundElement as MultiplyDefinedElementImpl).conflictingElements;
-      String libName1 = getLibraryName(conflictingMembers[0], "");
-      String libName2 = getLibraryName(conflictingMembers[1], "");
+      String libName1 = _getLibraryName(conflictingMembers[0], "");
+      String libName2 = _getLibraryName(conflictingMembers[1], "");
       // TODO (jwren) Change the error message to include a list of all library names instead of
       // just the first two
       errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
@@ -15733,7 +16086,7 @@
    * @param definingLibrary the element representing the library that imports the libraries for
    *          which namespaces will be created
    */
-  void createImportedNamespaces(LibraryElement definingLibrary) {
+  void _createImportedNamespaces(LibraryElement definingLibrary) {
     NamespaceBuilder builder = new NamespaceBuilder();
     List<ImportElement> imports = definingLibrary.imports;
     int count = imports.length;
@@ -15750,7 +16103,7 @@
    * @param def the default name to use
    * @return the name of the library that defines given element
    */
-  String getLibraryName(Element element, String def) {
+  String _getLibraryName(Element element, String def) {
     if (element == null) {
       return def;
     }
@@ -15771,7 +16124,7 @@
    * @param foundElement the element encapsulating the collection of elements
    * @return all of the elements that are not defined in the SDK
    */
-  Element removeSdkElements(Identifier identifier, String name, MultiplyDefinedElementImpl foundElement) {
+  Element _removeSdkElements(Identifier identifier, String name, MultiplyDefinedElementImpl foundElement) {
     List<Element> conflictingMembers = foundElement.conflictingElements;
     int length = conflictingMembers.length;
     int to = 0;
@@ -15784,8 +16137,8 @@
       }
     }
     if (sdkElement != null && to > 0) {
-      String sdkLibName = getLibraryName(sdkElement, "");
-      String otherLibName = getLibraryName(conflictingMembers[0], "");
+      String sdkLibName = _getLibraryName(sdkElement, "");
+      String otherLibName = _getLibraryName(conflictingMembers[0], "");
       errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
     }
     if (to == length) {
@@ -15817,9 +16170,10 @@
    * @param errorListener the listener that is to be informed when an error is encountered
    */
   LibraryScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) : super(new LibraryImportScope(definingLibrary, errorListener)) {
-    defineTopLevelNames(definingLibrary);
+    _defineTopLevelNames(definingLibrary);
   }
 
+  @override
   AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
     if (existing is PrefixElement) {
       // TODO(scheglov) consider providing actual 'nameOffset' from the synthetic accessor
@@ -15842,7 +16196,7 @@
    * @param compilationUnit the compilation unit defining the top-level names to be added to this
    *          scope
    */
-  void defineLocalNames(CompilationUnitElement compilationUnit) {
+  void _defineLocalNames(CompilationUnitElement compilationUnit) {
     for (PropertyAccessorElement element in compilationUnit.accessors) {
       define(element);
     }
@@ -15863,13 +16217,13 @@
    * @param definingLibrary the element representing the library that defines the names in this
    *          scope
    */
-  void defineTopLevelNames(LibraryElement definingLibrary) {
+  void _defineTopLevelNames(LibraryElement definingLibrary) {
     for (PrefixElement prefix in definingLibrary.prefixes) {
       define(prefix);
     }
-    defineLocalNames(definingLibrary.definingCompilationUnit);
+    _defineLocalNames(definingLibrary.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in definingLibrary.parts) {
-      defineLocalNames(compilationUnit);
+      _defineLocalNames(compilationUnit);
     }
   }
 }
@@ -15936,8 +16290,8 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = createExportMapping(exportedLibrary, new Set<LibraryElement>());
-    definedNames = applyCombinators(definedNames, element.combinators);
+    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
     return new Namespace(definedNames);
   }
 
@@ -15947,7 +16301,7 @@
    * @param library the library whose export namespace is to be created
    * @return the export namespace that was created
    */
-  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(createExportMapping(library, new Set<LibraryElement>()));
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
 
   /**
    * Create a namespace representing the import namespace of the given library.
@@ -15963,9 +16317,9 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = createExportMapping(importedLibrary, new Set<LibraryElement>());
-    definedNames = applyCombinators(definedNames, element.combinators);
-    definedNames = applyPrefix(definedNames, element.prefix);
+    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
+    definedNames = _applyPrefix(definedNames, element.prefix);
     return new Namespace(definedNames);
   }
 
@@ -15977,9 +16331,9 @@
    */
   Namespace createPublicNamespaceForLibrary(LibraryElement library) {
     Map<String, Element> definedNames = new Map<String, Element>();
-    addPublicNames(definedNames, library.definingCompilationUnit);
+    _addPublicNames(definedNames, library.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in library.parts) {
-      addPublicNames(definedNames, compilationUnit);
+      _addPublicNames(definedNames, compilationUnit);
     }
     return new Namespace(definedNames);
   }
@@ -15990,7 +16344,7 @@
    * @param definedNames the mapping table to which the names in the given namespace are to be added
    * @param namespace the namespace containing the names to be added to this namespace
    */
-  void addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
+  void _addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
     for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
       definedNames[entry.getKey()] = entry.getValue();
     }
@@ -16002,9 +16356,9 @@
    * @param definedNames the mapping table to which the names in the given namespace are to be added
    * @param namespace the namespace containing the names to be added to this namespace
    */
-  void addAllFromNamespace(Map<String, Element> definedNames, Namespace namespace) {
+  void _addAllFromNamespace(Map<String, Element> definedNames, Namespace namespace) {
     if (namespace != null) {
-      addAllFromMap(definedNames, namespace.definedNames);
+      _addAllFromMap(definedNames, namespace.definedNames);
     }
   }
 
@@ -16014,7 +16368,7 @@
    * @param definedNames the mapping table to which the public name is to be added
    * @param element the element to be added
    */
-  void addIfPublic(Map<String, Element> definedNames, Element element) {
+  void _addIfPublic(Map<String, Element> definedNames, Element element) {
     String name = element.name;
     if (name != null && !Scope.isPrivateName(name)) {
       definedNames[name] = element;
@@ -16029,18 +16383,18 @@
    * @param compilationUnit the compilation unit defining the top-level names to be added to this
    *          namespace
    */
-  void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
+  void _addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
     for (PropertyAccessorElement element in compilationUnit.accessors) {
-      addIfPublic(definedNames, element);
+      _addIfPublic(definedNames, element);
     }
     for (FunctionElement element in compilationUnit.functions) {
-      addIfPublic(definedNames, element);
+      _addIfPublic(definedNames, element);
     }
     for (FunctionTypeAliasElement element in compilationUnit.functionTypeAliases) {
-      addIfPublic(definedNames, element);
+      _addIfPublic(definedNames, element);
     }
     for (ClassElement element in compilationUnit.types) {
-      addIfPublic(definedNames, element);
+      _addIfPublic(definedNames, element);
     }
   }
 
@@ -16050,12 +16404,12 @@
    * @param definedNames the mapping table to which the namespace operations are to be applied
    * @param combinators the combinators to be applied
    */
-  Map<String, Element> applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
-        hide(definedNames, combinator.hiddenNames);
+        _hide(definedNames, combinator.hiddenNames);
       } else if (combinator is ShowElementCombinator) {
-        definedNames = show(definedNames, combinator.shownNames);
+        definedNames = _show(definedNames, combinator.shownNames);
       } else {
         // Internal error.
         AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
@@ -16070,7 +16424,7 @@
    * @param definedNames the names that were defined before this operation
    * @param prefixElement the element defining the prefix to be added to the names
    */
-  Map<String, Element> applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
+  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
     if (prefixElement != null) {
       String prefix = prefixElement.name;
       Map<String, Element> newNames = new Map<String, Element>();
@@ -16092,7 +16446,7 @@
    *          be added by another library
    * @return the mapping table that was created
    */
-  Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
+  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
     visitedElements.add(library);
     try {
       Map<String, Element> definedNames = new Map<String, Element>();
@@ -16102,12 +16456,12 @@
           //
           // The exported library will be null if the URI does not reference a valid library.
           //
-          Map<String, Element> exportedNames = createExportMapping(exportedLibrary, visitedElements);
-          exportedNames = applyCombinators(exportedNames, element.combinators);
-          addAllFromMap(definedNames, exportedNames);
+          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
+          exportedNames = _applyCombinators(exportedNames, element.combinators);
+          _addAllFromMap(definedNames, exportedNames);
         }
       }
-      addAllFromNamespace(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
+      _addAllFromNamespace(definedNames, (library.context as InternalAnalysisContext).getPublicNamespace(library));
       return definedNames;
     } finally {
       visitedElements.remove(library);
@@ -16120,7 +16474,7 @@
    * @param definedNames the names that were defined before this operation
    * @param hiddenNames the names to be hidden
    */
-  void hide(Map<String, Element> definedNames, List<String> hiddenNames) {
+  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
     for (String name in hiddenNames) {
       definedNames.remove(name);
       definedNames.remove("${name}=");
@@ -16134,7 +16488,7 @@
    * @param definedNames the names that were defined before this operation
    * @param shownNames the names to be shown
    */
-  Map<String, Element> show(Map<String, Element> definedNames, List<String> shownNames) {
+  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
     Map<String, Element> newNames = new Map<String, Element>();
     for (String name in shownNames) {
       Element element = definedNames[name];
@@ -16201,7 +16555,7 @@
    * @param element the element to be added to this scope
    */
   void define(Element element) {
-    String name = getName(element);
+    String name = _getName(element);
     if (name != null && !name.isEmpty) {
       if (_definedNames.containsKey(name)) {
         errorListener.onError(getErrorForDuplicate(_definedNames[name], element));
@@ -16247,7 +16601,7 @@
    * @param element the element to be added to this scope
    */
   void defineWithoutChecking(Element element) {
-    _definedNames[getName(element)] = element;
+    _definedNames[_getName(element)] = element;
     _hasName = true;
   }
 
@@ -16328,7 +16682,7 @@
    * @param element the element whose look-up name is to be returned
    * @return the name that will be used to look up the given element
    */
-  String getName(Element element) {
+  String _getName(Element element) {
     if (element is MethodElement) {
       MethodElement method = element;
       if (method.name == "-" && method.parameters.length == 0) {
@@ -16358,14 +16712,14 @@
       throw new AnalysisException.con1("Cannot create scope: node is null");
     } else if (node is CompilationUnit) {
       ScopeBuilder builder = new ScopeBuilder(errorListener);
-      return builder.scopeForAstNode(node);
+      return builder._scopeForAstNode(node);
     }
     AstNode parent = node.parent;
     if (parent == null) {
       throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
     }
     ScopeBuilder builder = new ScopeBuilder(errorListener);
-    return builder.scopeForAstNode(parent);
+    return builder._scopeForAstNode(parent);
   }
 
   /**
@@ -16394,15 +16748,15 @@
    * @throws AnalysisException if the AST structure has not been resolved or is not part of a
    *           [CompilationUnit]
    */
-  Scope scopeForAstNode(AstNode node) {
+  Scope _scopeForAstNode(AstNode node) {
     if (node is CompilationUnit) {
-      return scopeForCompilationUnit(node);
+      return _scopeForCompilationUnit(node);
     }
     AstNode parent = node.parent;
     if (parent == null) {
       throw new AnalysisException.con1("Cannot create scope: node is not part of a CompilationUnit");
     }
-    Scope scope = scopeForAstNode(parent);
+    Scope scope = _scopeForAstNode(parent);
     if (node is ClassDeclaration) {
       scope = new ClassScope(scope, node.element);
     } else if (node is ClassTypeAlias) {
@@ -16425,7 +16779,7 @@
     return scope;
   }
 
-  Scope scopeForCompilationUnit(CompilationUnit node) {
+  Scope _scopeForCompilationUnit(CompilationUnit node) {
     CompilationUnitElement unitElement = node.element;
     if (unitElement == null) {
       throw new AnalysisException.con1("Cannot create scope: compilation unit is not resolved");
@@ -16488,6 +16842,7 @@
     this._stringType = typeProvider.stringType;
   }
 
+  @override
   Object visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
     // check annotation creation
@@ -16506,40 +16861,45 @@
         return null;
       }
       // arguments should be constants
-      validateConstantArguments(argumentList);
+      _validateConstantArguments(argumentList);
     }
     return null;
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     if (node.constKeyword != null) {
-      validateInitializers(node);
+      _validateInitializers(node);
     }
-    validateDefaultValues(node.parameters);
+    _validateDefaultValues(node.parameters);
     return super.visitConstructorDeclaration(node);
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     super.visitFunctionExpression(node);
-    validateDefaultValues(node.parameters);
+    _validateDefaultValues(node.parameters);
     return null;
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    validateInstanceCreationArguments(node);
+    _validateInstanceCreationArguments(node);
     return super.visitInstanceCreationExpression(node);
   }
 
+  @override
   Object visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.constKeyword != null) {
       for (Expression element in node.elements) {
-        validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
       }
     }
     return null;
   }
 
+  @override
   Object visitMapLiteral(MapLiteral node) {
     super.visitMapLiteral(node);
     bool isConst = node.constKeyword != null;
@@ -16549,8 +16909,8 @@
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
       if (isConst) {
-        EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
-        validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        EvaluationResultImpl result = _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        _validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
         if (result is ValidResult) {
           DartObject value = result.value;
           if (keys.contains(value)) {
@@ -16581,18 +16941,21 @@
     return null;
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
-    validateDefaultValues(node.parameters);
+    _validateDefaultValues(node.parameters);
     return null;
   }
 
+  @override
   Object visitSwitchCase(SwitchCase node) {
     super.visitSwitchCase(node);
-    validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
+    _validate(node.expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
     return null;
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
@@ -16605,10 +16968,10 @@
         // computed their values. But if we missed it for some reason, this gives us a second
         // chance.
         //
-        result = validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+        result = _validate(initializer, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
         element.evaluationResult = result;
       } else if (result is ErrorResult) {
-        reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+        _reportErrors(result, CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
       }
     }
     return null;
@@ -16621,7 +16984,7 @@
    * @param result the result containing any errors that need to be reported
    * @param errorCode the error code to be used if the result represents an error
    */
-  void reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
+  void _reportErrors(EvaluationResultImpl result, ErrorCode errorCode) {
     if (result is ErrorResult) {
       for (ErrorResult_ErrorData data in result.errorData) {
         ErrorCode dataErrorCode = data.errorCode;
@@ -16634,7 +16997,7 @@
     }
   }
 
-  ValidResult valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
+  ValidResult _valid(InterfaceType type, InstanceState state) => new ValidResult(new DartObjectImpl(type, state));
 
   /**
    * Validate that the given expression is a compile time constant. Return the value of the compile
@@ -16644,9 +17007,9 @@
    * @param errorCode the error code to be used if the expression is not a compile time constant
    * @return the value of the compile time constant
    */
-  EvaluationResultImpl validate(Expression expression, ErrorCode errorCode) {
+  EvaluationResultImpl _validate(Expression expression, ErrorCode errorCode) {
     EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
-    reportErrors(result, errorCode);
+    _reportErrors(result, errorCode);
     return result;
   }
 
@@ -16655,12 +17018,12 @@
    *
    * @param argumentList the argument list to evaluate
    */
-  void validateConstantArguments(ArgumentList argumentList) {
+  void _validateConstantArguments(ArgumentList argumentList) {
     for (Expression argument in argumentList.arguments) {
       if (argument is NamedExpression) {
         argument = (argument as NamedExpression).expression;
       }
-      validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
+      _validate(argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
     }
   }
 
@@ -16670,7 +17033,7 @@
    *
    * @param parameters the list of parameters to be validated
    */
-  void validateDefaultValues(FormalParameterList parameters) {
+  void _validateDefaultValues(FormalParameterList parameters) {
     if (parameters == null) {
       return;
     }
@@ -16679,7 +17042,7 @@
         DefaultFormalParameter defaultParameter = parameter;
         Expression defaultValue = defaultParameter.defaultValue;
         if (defaultValue != null) {
-          EvaluationResultImpl result = validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
+          EvaluationResultImpl result = _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
           VariableElementImpl element = parameter.element as VariableElementImpl;
           element.evaluationResult = result;
         }
@@ -16694,9 +17057,9 @@
    *          considered as a valid potentially constant expressions
    * @param expression the expression to validate
    */
-  void validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
+  void _validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
     EvaluationResultImpl result = expression.accept(new ConstantVisitor_ConstantVerifier_validateInitializerExpression(_typeProvider, this, parameterElements));
-    reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
+    _reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
   }
 
   /**
@@ -16706,12 +17069,12 @@
    *          considered as a valid potentially constant expressions
    * @param argumentList the argument list to validate
    */
-  void validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
+  void _validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
     if (argumentList == null) {
       return;
     }
     for (Expression argument in argumentList.arguments) {
-      validateInitializerExpression(parameterElements, argument);
+      _validateInitializerExpression(parameterElements, argument);
     }
   }
 
@@ -16721,21 +17084,21 @@
    *
    * @param constructor the constant constructor declaration to validate
    */
-  void validateInitializers(ConstructorDeclaration constructor) {
+  void _validateInitializers(ConstructorDeclaration constructor) {
     List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     for (ConstructorInitializer initializer in initializers) {
       if (initializer is ConstructorFieldInitializer) {
         ConstructorFieldInitializer fieldInitializer = initializer;
-        validateInitializerExpression(parameterElements, fieldInitializer.expression);
+        _validateInitializerExpression(parameterElements, fieldInitializer.expression);
       }
       if (initializer is RedirectingConstructorInvocation) {
         RedirectingConstructorInvocation invocation = initializer;
-        validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
       }
       if (initializer is SuperConstructorInvocation) {
         SuperConstructorInvocation invocation = initializer;
-        validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
       }
     }
   }
@@ -16746,7 +17109,7 @@
    *
    * @param node the instance creation evaluate
    */
-  void validateInstanceCreationArguments(InstanceCreationExpression node) {
+  void _validateInstanceCreationArguments(InstanceCreationExpression node) {
     if (!node.isConst) {
       return;
     }
@@ -16754,7 +17117,7 @@
     if (argumentList == null) {
       return;
     }
-    validateConstantArguments(argumentList);
+    _validateConstantArguments(argumentList);
   }
 }
 
@@ -16765,27 +17128,28 @@
 
   ConstantVisitor_ConstantVerifier_validateInitializerExpression(TypeProvider arg0, this.ConstantVerifier_this, this.parameterElements) : super(arg0);
 
+  @override
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
     for (ParameterElement parameterElement in parameterElements) {
       if (identical(parameterElement, element) && parameterElement != null) {
-        Type2 type = parameterElement.type;
+        DartType type = parameterElement.type;
         if (type != null) {
           if (type.isDynamic) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
           } else if (type.isSubtypeOf(ConstantVerifier_this._boolType)) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
           } else if (type.isSubtypeOf(ConstantVerifier_this._typeProvider.doubleType)) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
           } else if (type.isSubtypeOf(ConstantVerifier_this._intType)) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.intType, IntState.UNKNOWN_VALUE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.intType, IntState.UNKNOWN_VALUE);
           } else if (type.isSubtypeOf(ConstantVerifier_this._numType)) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.numType, NumState.UNKNOWN_VALUE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.numType, NumState.UNKNOWN_VALUE);
           } else if (type.isSubtypeOf(ConstantVerifier_this._stringType)) {
-            return ConstantVerifier_this.valid(ConstantVerifier_this._typeProvider.stringType, StringState.UNKNOWN_VALUE);
+            return ConstantVerifier_this._valid(ConstantVerifier_this._typeProvider.stringType, StringState.UNKNOWN_VALUE);
           }
         }
-        return ConstantVerifier_this.valid(type is InterfaceType ? type : ConstantVerifier_this._typeProvider.objectType, GenericState.UNKNOWN_VALUE);
+        return ConstantVerifier_this._valid(type is InterfaceType ? type : ConstantVerifier_this._typeProvider.objectType, GenericState.UNKNOWN_VALUE);
       }
     }
     return super.visitSimpleIdentifier(node);
@@ -16810,7 +17174,7 @@
   /**
    * The type representing the type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The type representing the type 'bool'.
@@ -17006,34 +17370,39 @@
         typeProvider.stringType];
   }
 
+  @override
   Object visitArgumentList(ArgumentList node) {
-    checkForArgumentTypesNotAssignableInList(node);
+    _checkForArgumentTypesNotAssignableInList(node);
     return super.visitArgumentList(node);
   }
 
+  @override
   Object visitAssertStatement(AssertStatement node) {
-    checkForNonBoolExpression(node);
+    _checkForNonBoolExpression(node);
     return super.visitAssertStatement(node);
   }
 
+  @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
     if (identical(operatorType, sc.TokenType.EQ)) {
-      checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
     } else {
-      checkForInvalidCompoundAssignment(node);
+      _checkForInvalidCompoundAssignment(node);
     }
-    checkForAssignmentToFinal(node.leftHandSide);
-    checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
+    _checkForAssignmentToFinal(node.leftHandSide);
+    _checkForArgumentTypeNotAssignableForArgument(node.rightHandSide);
     return super.visitAssignmentExpression(node);
   }
 
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
-    checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
     return super.visitBinaryExpression(node);
   }
 
+  @override
   Object visitBlockFunctionBody(BlockFunctionBody node) {
     List<ReturnStatement> previousReturnsWith = _returnsWith;
     List<ReturnStatement> previousReturnsWithout = _returnsWithout;
@@ -17041,7 +17410,7 @@
       _returnsWith = new List<ReturnStatement>();
       _returnsWithout = new List<ReturnStatement>();
       super.visitBlockFunctionBody(node);
-      checkForMixedReturns(node);
+      _checkForMixedReturns(node);
     } finally {
       _returnsWith = previousReturnsWith;
       _returnsWithout = previousReturnsWithout;
@@ -17049,6 +17418,7 @@
     return null;
   }
 
+  @override
   Object visitBreakStatement(BreakStatement node) {
     SimpleIdentifier labelNode = node.label;
     if (labelNode != null) {
@@ -17060,6 +17430,7 @@
     return null;
   }
 
+  @override
   Object visitCatchClause(CatchClause node) {
     bool previousIsInCatchClause = _isInCatchClause;
     try {
@@ -17070,6 +17441,7 @@
     }
   }
 
+  @override
   Object visitClassDeclaration(ClassDeclaration node) {
     ClassElement outerClass = _enclosingClass;
     try {
@@ -17078,22 +17450,22 @@
       WithClause withClause = node.withClause;
       ImplementsClause implementsClause = node.implementsClause;
       ExtendsClause extendsClause = node.extendsClause;
-      checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
-      checkForMemberWithClassName();
-      checkForNoDefaultSuperConstructorImplicit(node);
-      checkForConflictingTypeVariableErrorCodes(node);
+      _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+      _checkForMemberWithClassName();
+      _checkForNoDefaultSuperConstructorImplicit(node);
+      _checkForConflictingTypeVariableErrorCodes(node);
       // Only do error checks on the clause nodes if there is a non-null clause
       if (implementsClause != null || extendsClause != null || withClause != null) {
         // Only check for all of the inheritance logic around clauses if there isn't an error code
         // such as "Cannot extend double" already on the class.
-        if (!checkForImplementsDisallowedClass(implementsClause) && !checkForExtendsDisallowedClass(extendsClause) && !checkForAllMixinErrorCodes(withClause)) {
-          checkForNonAbstractClassInheritsAbstractMember(node);
-          checkForInconsistentMethodInheritance();
-          checkForRecursiveInterfaceInheritance(_enclosingClass);
-          checkForConflictingGetterAndMethod();
-          checkForConflictingInstanceGetterAndSuperclassMember();
-          checkImplementsSuperClass(node);
-          checkImplementsFunctionWithoutCall(node);
+        if (!_checkForImplementsDisallowedClass(implementsClause) && !_checkForExtendsDisallowedClass(extendsClause) && !_checkForAllMixinErrorCodes(withClause)) {
+          _checkForNonAbstractClassInheritsAbstractMember(node);
+          _checkForInconsistentMethodInheritance();
+          _checkForRecursiveInterfaceInheritance(_enclosingClass);
+          _checkForConflictingGetterAndMethod();
+          _checkForConflictingInstanceGetterAndSuperclassMember();
+          _checkImplementsSuperClass(node);
+          _checkImplementsFunctionWithoutCall(node);
         }
       }
       // initialize initialFieldElementsMap
@@ -17107,9 +17479,9 @@
           }
         }
       }
-      checkForFinalNotInitializedInClass(node);
-      checkForDuplicateDefinitionInheritance();
-      checkForConflictingInstanceMethodSetter(node);
+      _checkForFinalNotInitializedInClass(node);
+      _checkForDuplicateDefinitionInheritance();
+      _checkForConflictingInstanceMethodSetter(node);
       return super.visitClassDeclaration(node);
     } finally {
       _isInNativeClass = false;
@@ -17118,20 +17490,22 @@
     }
   }
 
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
-    checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    checkForAllMixinErrorCodes(node.withClause);
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForAllMixinErrorCodes(node.withClause);
     ClassElement outerClassElement = _enclosingClass;
     try {
       _enclosingClass = node.element;
-      checkForRecursiveInterfaceInheritance(node.element);
-      checkForTypeAliasCannotReferenceItself_mixin(node);
+      _checkForRecursiveInterfaceInheritance(node.element);
+      _checkForTypeAliasCannotReferenceItself_mixin(node);
     } finally {
       _enclosingClass = outerClassElement;
     }
     return super.visitClassTypeAlias(node);
   }
 
+  @override
   Object visitComment(Comment node) {
     _isInComment = true;
     try {
@@ -17141,29 +17515,31 @@
     }
   }
 
+  @override
   Object visitConditionalExpression(ConditionalExpression node) {
-    checkForNonBoolCondition(node.condition);
+    _checkForNonBoolCondition(node.condition);
     return super.visitConditionalExpression(node);
   }
 
+  @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
       _enclosingFunction = node.element;
       _isEnclosingConstructorConst = node.constKeyword != null;
-      checkForConstConstructorWithNonFinalField(node);
-      checkForConstConstructorWithNonConstSuper(node);
-      checkForConflictingConstructorNameAndMember(node);
-      checkForAllFinalInitializedErrorCodes(node);
-      checkForRedirectingConstructorErrorCodes(node);
-      checkForMultipleSuperInitializers(node);
-      checkForRecursiveConstructorRedirect(node);
-      if (!checkForRecursiveFactoryRedirect(node)) {
-        checkForAllRedirectConstructorErrorCodes(node);
+      _checkForConstConstructorWithNonFinalField(node);
+      _checkForConstConstructorWithNonConstSuper(node);
+      _checkForConflictingConstructorNameAndMember(node);
+      _checkForAllFinalInitializedErrorCodes(node);
+      _checkForRedirectingConstructorErrorCodes(node);
+      _checkForMultipleSuperInitializers(node);
+      _checkForRecursiveConstructorRedirect(node);
+      if (!_checkForRecursiveFactoryRedirect(node)) {
+        _checkForAllRedirectConstructorErrorCodes(node);
       }
-      checkForUndefinedConstructorInInitializerImplicit(node);
-      checkForRedirectToNonConstConstructor(node);
-      checkForReturnInGenerativeConstructor(node);
+      _checkForUndefinedConstructorInInitializerImplicit(node);
+      _checkForRedirectToNonConstConstructor(node);
+      _checkForReturnInGenerativeConstructor(node);
       return super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
@@ -17171,17 +17547,19 @@
     }
   }
 
+  @override
   Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     _isInConstructorInitializer = true;
     try {
-      checkForInvalidField(node);
-      checkForFieldInitializerNotAssignable(node);
+      _checkForInvalidField(node);
+      _checkForFieldInitializerNotAssignable(node);
       return super.visitConstructorFieldInitializer(node);
     } finally {
       _isInConstructorInitializer = false;
     }
   }
 
+  @override
   Object visitContinueStatement(ContinueStatement node) {
     SimpleIdentifier labelNode = node.label;
     if (labelNode != null) {
@@ -17193,34 +17571,39 @@
     return null;
   }
 
+  @override
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    checkForInvalidAssignment(node.identifier, node.defaultValue);
-    checkForDefaultValueInFunctionTypedParameter(node);
+    _checkForInvalidAssignment(node.identifier, node.defaultValue);
+    _checkForDefaultValueInFunctionTypedParameter(node);
     return super.visitDefaultFormalParameter(node);
   }
 
+  @override
   Object visitDoStatement(DoStatement node) {
-    checkForNonBoolCondition(node.condition);
+    _checkForNonBoolCondition(node.condition);
     return super.visitDoStatement(node);
   }
 
+  @override
   Object visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
-      checkForAmbiguousExport(node, exportElement);
-      checkForExportDuplicateLibraryName(node, exportElement);
-      checkForExportInternalLibrary(node, exportElement);
+      _checkForAmbiguousExport(node, exportElement);
+      _checkForExportDuplicateLibraryName(node, exportElement);
+      _checkForExportInternalLibrary(node, exportElement);
     }
     return super.visitExportDirective(node);
   }
 
+  @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-    checkForReturnOfInvalidType(node.expression, expectedReturnType);
+    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+    _checkForReturnOfInvalidType(node.expression, expectedReturnType);
     return super.visitExpressionFunctionBody(node);
   }
 
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     _isInStaticVariableDeclaration = node.isStatic;
     _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
@@ -17231,7 +17614,7 @@
       }
     }
     try {
-      checkForAllInvalidOverrideErrorCodesForField(node);
+      _checkForAllInvalidOverrideErrorCodesForField(node);
       return super.visitFieldDeclaration(node);
     } finally {
       _isInStaticVariableDeclaration = false;
@@ -17239,14 +17622,16 @@
     }
   }
 
+  @override
   Object visitFieldFormalParameter(FieldFormalParameter node) {
-    checkForValidField(node);
-    checkForConstFormalParameter(node);
-    checkForPrivateOptionalParameter(node);
-    checkForFieldInitializingFormalRedirectingConstructor(node);
+    _checkForValidField(node);
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForFieldInitializingFormalRedirectingConstructor(node);
     return super.visitFieldFormalParameter(node);
   }
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -17257,14 +17642,14 @@
       }
       _enclosingFunction = node.element;
       if (node.isSetter || node.isGetter) {
-        checkForMismatchedAccessorTypes(node, methodName);
+        _checkForMismatchedAccessorTypes(node, methodName);
         if (node.isSetter) {
           FunctionExpression functionExpression = node.functionExpression;
           if (functionExpression != null) {
-            checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
+            _checkForWrongNumberOfParametersForSetter(node.name, functionExpression.parameters);
           }
           TypeName returnType = node.returnType;
-          checkForNonVoidReturnTypeForSetter(returnType);
+          _checkForNonVoidReturnTypeForSetter(returnType);
         }
       }
       return super.visitFunctionDeclaration(node);
@@ -17273,6 +17658,7 @@
     }
   }
 
+  @override
   Object visitFunctionExpression(FunctionExpression node) {
     // If this function expression is wrapped in a function declaration, don't change the
     // enclosingFunction field.
@@ -17289,22 +17675,25 @@
     }
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression functionExpression = node.function;
-    Type2 expressionType = functionExpression.staticType;
-    if (!isFunctionType(expressionType)) {
+    DartType expressionType = functionExpression.staticType;
+    if (!_isFunctionType(expressionType)) {
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
     }
     return super.visitFunctionExpressionInvocation(node);
   }
 
+  @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    checkForDefaultValueInFunctionTypeAlias(node);
-    checkForTypeAliasCannotReferenceItself_function(node);
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForDefaultValueInFunctionTypeAlias(node);
+    _checkForTypeAliasCannotReferenceItself_function(node);
     return super.visitFunctionTypeAlias(node);
   }
 
+  @override
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     bool old = _isInFunctionTypedFormalParameter;
     _isInFunctionTypedFormalParameter = true;
@@ -17315,40 +17704,44 @@
     }
   }
 
+  @override
   Object visitIfStatement(IfStatement node) {
-    checkForNonBoolCondition(node.condition);
+    _checkForNonBoolCondition(node.condition);
     return super.visitIfStatement(node);
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
     ImportElement importElement = node.element;
     if (importElement != null) {
-      checkForImportDuplicateLibraryName(node, importElement);
-      checkForImportInternalLibrary(node, importElement);
+      _checkForImportDuplicateLibraryName(node, importElement);
+      _checkForImportInternalLibrary(node, importElement);
     }
     return super.visitImportDirective(node);
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
-    checkForArgumentTypeNotAssignableForArgument(node.index);
+    _checkForArgumentTypeNotAssignableForArgument(node.index);
     return super.visitIndexExpression(node);
   }
 
+  @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
     _isInConstInstanceCreation = node.isConst;
     try {
       ConstructorName constructorName = node.constructorName;
       TypeName typeName = constructorName.type;
-      Type2 type = typeName.type;
+      DartType type = typeName.type;
       if (type is InterfaceType) {
         InterfaceType interfaceType = type;
-        checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
         if (_isInConstInstanceCreation) {
-          checkForConstWithNonConst(node);
-          checkForConstWithUndefinedConstructor(node);
-          checkForConstWithTypeParametersInCreation(node);
+          _checkForConstWithNonConst(node);
+          _checkForConstWithUndefinedConstructor(node);
+          _checkForConstWithTypeParametersInCreation(node);
         } else {
-          checkForNewWithUndefinedConstructor(node);
+          _checkForNewWithUndefinedConstructor(node);
         }
       }
       return super.visitInstanceCreationExpression(node);
@@ -17357,38 +17750,41 @@
     }
   }
 
+  @override
   Object visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       TypeArgumentList typeArguments = node.typeArguments;
       if (typeArguments != null) {
         NodeList<TypeName> arguments = typeArguments.arguments;
         if (arguments.length != 0) {
-          checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
         }
       }
     }
-    checkForExpectedOneListTypeArgument(node);
-    checkForListElementTypeNotAssignable(node);
+    _checkForExpectedOneListTypeArgument(node);
+    _checkForListElementTypeNotAssignable(node);
     return super.visitListLiteral(node);
   }
 
+  @override
   Object visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
       NodeList<TypeName> arguments = typeArguments.arguments;
       if (arguments.length != 0) {
         if (node.constKeyword != null) {
-          checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
         }
       }
     }
-    checkExpectedTwoMapTypeArguments(typeArguments);
-    checkForNonConstMapAsExpressionStatement(node);
-    checkForMapTypeNotAssignable(node);
-    checkForConstMapKeyExpressionTypeImplementsEquals(node);
+    _checkExpectedTwoMapTypeArguments(typeArguments);
+    _checkForNonConstMapAsExpressionStatement(node);
+    _checkForMapTypeNotAssignable(node);
+    _checkForConstMapKeyExpressionTypeImplementsEquals(node);
     return super.visitMapLiteral(node);
   }
 
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement previousFunction = _enclosingFunction;
     try {
@@ -17400,21 +17796,21 @@
         methodName = identifier.name;
       }
       if (node.isSetter || node.isGetter) {
-        checkForMismatchedAccessorTypes(node, methodName);
+        _checkForMismatchedAccessorTypes(node, methodName);
       }
       if (node.isGetter) {
-        checkForConflictingStaticGetterAndInstanceSetter(node);
+        _checkForConflictingStaticGetterAndInstanceSetter(node);
       } else if (node.isSetter) {
-        checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
-        checkForNonVoidReturnTypeForSetter(node.returnType);
-        checkForConflictingStaticSetterAndInstanceMember(node);
+        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        _checkForNonVoidReturnTypeForSetter(node.returnType);
+        _checkForConflictingStaticSetterAndInstanceMember(node);
       } else if (node.isOperator) {
-        checkForOptionalParameterInOperator(node);
-        checkForWrongNumberOfParametersForOperator(node);
-        checkForNonVoidReturnTypeForOperator(node);
+        _checkForOptionalParameterInOperator(node);
+        _checkForWrongNumberOfParametersForOperator(node);
+        _checkForNonVoidReturnTypeForOperator(node);
       }
-      checkForConcreteClassWithAbstractMember(node);
-      checkForAllInvalidOverrideErrorCodesForMethod(node);
+      _checkForConcreteClassWithAbstractMember(node);
+      _checkForAllInvalidOverrideErrorCodesForMethod(node);
       return super.visitMethodDeclaration(node);
     } finally {
       _enclosingFunction = previousFunction;
@@ -17422,19 +17818,21 @@
     }
   }
 
+  @override
   Object visitMethodInvocation(MethodInvocation node) {
     Expression target = node.realTarget;
     SimpleIdentifier methodName = node.methodName;
     if (target != null) {
       ClassElement typeReference = ElementResolver.getTypeReference(target);
-      checkForStaticAccessToInstanceMember(typeReference, methodName);
-      checkForInstanceAccessToStaticMember(typeReference, methodName);
+      _checkForStaticAccessToInstanceMember(typeReference, methodName);
+      _checkForInstanceAccessToStaticMember(typeReference, methodName);
     } else {
-      checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
     }
     return super.visitMethodInvocation(node);
   }
 
+  @override
   Object visitNativeClause(NativeClause node) {
     // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
     if (!_isInSystemLibrary) {
@@ -17443,47 +17841,53 @@
     return super.visitNativeClause(node);
   }
 
+  @override
   Object visitNativeFunctionBody(NativeFunctionBody node) {
-    checkForNativeFunctionBodyInNonSDKCode(node);
+    _checkForNativeFunctionBodyInNonSDKCode(node);
     return super.visitNativeFunctionBody(node);
   }
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
-    checkForAssignmentToFinal(node.operand);
-    checkForIntNotAssignable(node.operand);
+    _checkForAssignmentToFinal(node.operand);
+    _checkForIntNotAssignable(node.operand);
     return super.visitPostfixExpression(node);
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.parent is! Annotation) {
       ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
       SimpleIdentifier name = node.identifier;
-      checkForStaticAccessToInstanceMember(typeReference, name);
-      checkForInstanceAccessToStaticMember(typeReference, name);
+      _checkForStaticAccessToInstanceMember(typeReference, name);
+      _checkForInstanceAccessToStaticMember(typeReference, name);
     }
     return super.visitPrefixedIdentifier(node);
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operatorType = node.operator.type;
     Expression operand = node.operand;
     if (identical(operatorType, sc.TokenType.BANG)) {
-      checkForNonBoolNegationExpression(operand);
+      _checkForNonBoolNegationExpression(operand);
     } else if (operatorType.isIncrementOperator) {
-      checkForAssignmentToFinal(operand);
+      _checkForAssignmentToFinal(operand);
     }
-    checkForIntNotAssignable(operand);
+    _checkForIntNotAssignable(operand);
     return super.visitPrefixExpression(node);
   }
 
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
     SimpleIdentifier propertyName = node.propertyName;
-    checkForStaticAccessToInstanceMember(typeReference, propertyName);
-    checkForInstanceAccessToStaticMember(typeReference, propertyName);
+    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
+    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
     return super.visitPropertyAccess(node);
   }
 
+  @override
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
@@ -17493,35 +17897,40 @@
     }
   }
 
+  @override
   Object visitRethrowExpression(RethrowExpression node) {
-    checkForRethrowOutsideCatch(node);
+    _checkForRethrowOutsideCatch(node);
     return super.visitRethrowExpression(node);
   }
 
+  @override
   Object visitReturnStatement(ReturnStatement node) {
     if (node.expression == null) {
       _returnsWithout.add(node);
     } else {
       _returnsWith.add(node);
     }
-    checkForAllReturnStatementErrorCodes(node);
+    _checkForAllReturnStatementErrorCodes(node);
     return super.visitReturnStatement(node);
   }
 
+  @override
   Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    checkForConstFormalParameter(node);
-    checkForPrivateOptionalParameter(node);
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
     return super.visitSimpleFormalParameter(node);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    checkForImplicitThisReferenceInInitializer(node);
-    if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
-      checkForUnqualifiedReferenceToNonLocalStaticMember(node);
+    _checkForImplicitThisReferenceInInitializer(node);
+    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
     }
     return super.visitSimpleIdentifier(node);
   }
 
+  @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
@@ -17531,45 +17940,52 @@
     }
   }
 
+  @override
   Object visitSwitchStatement(SwitchStatement node) {
-    checkForInconsistentCaseExpressionTypes(node);
-    checkForSwitchExpressionNotAssignable(node);
-    checkForCaseBlocksNotTerminated(node);
+    _checkForInconsistentCaseExpressionTypes(node);
+    _checkForSwitchExpressionNotAssignable(node);
+    _checkForCaseBlocksNotTerminated(node);
     return super.visitSwitchStatement(node);
   }
 
+  @override
   Object visitThisExpression(ThisExpression node) {
-    checkForInvalidReferenceToThis(node);
+    _checkForInvalidReferenceToThis(node);
     return super.visitThisExpression(node);
   }
 
+  @override
   Object visitThrowExpression(ThrowExpression node) {
-    checkForConstEvalThrowsException(node);
+    _checkForConstEvalThrowsException(node);
     return super.visitThrowExpression(node);
   }
 
+  @override
   Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    checkForFinalNotInitialized(node.variables);
+    _checkForFinalNotInitialized(node.variables);
     return super.visitTopLevelVariableDeclaration(node);
   }
 
+  @override
   Object visitTypeName(TypeName node) {
-    checkForTypeArgumentNotMatchingBounds(node);
-    checkForTypeParameterReferencedByStatic(node);
+    _checkForTypeArgumentNotMatchingBounds(node);
+    _checkForTypeParameterReferencedByStatic(node);
     return super.visitTypeName(node);
   }
 
+  @override
   Object visitTypeParameter(TypeParameter node) {
-    checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
-    checkForTypeParameterSupertypeOfItsBound(node);
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
+    _checkForTypeParameterSupertypeOfItsBound(node);
     return super.visitTypeParameter(node);
   }
 
+  @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     SimpleIdentifier nameNode = node.name;
     Expression initializerNode = node.initializer;
     // do checks
-    checkForInvalidAssignment(nameNode, initializerNode);
+    _checkForInvalidAssignment(nameNode, initializerNode);
     // visit name
     nameNode.accept(this);
     // visit initializer
@@ -17588,15 +18004,18 @@
     return null;
   }
 
+  @override
   Object visitVariableDeclarationList(VariableDeclarationList node) => super.visitVariableDeclarationList(node);
 
+  @override
   Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    checkForFinalNotInitialized(node.variables);
+    _checkForFinalNotInitialized(node.variables);
     return super.visitVariableDeclarationStatement(node);
   }
 
+  @override
   Object visitWhileStatement(WhileStatement node) {
-    checkForNonBoolCondition(node.condition);
+    _checkForNonBoolCondition(node.condition);
     return super.visitWhileStatement(node);
   }
 
@@ -17607,7 +18026,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
    */
-  bool checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
+  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
     // has type arguments
     if (typeArguments == null) {
       return false;
@@ -17632,7 +18051,7 @@
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
    * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
    */
-  bool checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
+  bool _checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
     if (node.factoryKeyword != null || node.redirectedConstructor != null || node.externalKeyword != null) {
       return false;
     }
@@ -17733,7 +18152,7 @@
    * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
    * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
    */
-  bool checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+  bool _checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
     bool isGetter = false;
     bool isSetter = false;
     if (executableElement is PropertyAccessorElement) {
@@ -17803,14 +18222,14 @@
     if (overridingFT == null || overriddenFT == null) {
       return false;
     }
-    Type2 overridingFTReturnType = overridingFT.returnType;
-    Type2 overriddenFTReturnType = overriddenFT.returnType;
-    List<Type2> overridingNormalPT = overridingFT.normalParameterTypes;
-    List<Type2> overriddenNormalPT = overriddenFT.normalParameterTypes;
-    List<Type2> overridingPositionalPT = overridingFT.optionalParameterTypes;
-    List<Type2> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
-    Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes;
-    Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes;
+    DartType overridingFTReturnType = overridingFT.returnType;
+    DartType overriddenFTReturnType = overriddenFT.returnType;
+    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
+    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
+    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
+    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
+    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
+    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
     // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
     if (overridingNormalPT.length > overriddenNormalPT.length) {
       _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
@@ -17874,10 +18293,10 @@
       parameterIndex++;
     }
     // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    JavaIterator<MapEntry<String, Type2>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
+    JavaIterator<MapEntry<String, DartType>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
     while (overriddenNamedPTIterator.hasNext) {
-      MapEntry<String, Type2> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
-      Type2 overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
+      MapEntry<String, DartType> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
+      DartType overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
       if (overridingType == null) {
         // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been created above if
         // this could be reached.
@@ -17940,7 +18359,7 @@
           ParameterElementImpl parameterElt = parameterElts[i];
           EvaluationResultImpl result = parameterElt.evaluationResult;
           // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (isUserDefinedObject(result)) {
+          if (_isUserDefinedObject(result)) {
             continue;
           }
           String parameterName = parameterElt.name;
@@ -17949,7 +18368,7 @@
             String overriddenParameterName = overriddenParameterElt.name;
             if (parameterName != null && parameterName == overriddenParameterName) {
               EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-              if (isUserDefinedObject(overriddenResult)) {
+              if (_isUserDefinedObject(overriddenResult)) {
                 break;
               }
               if (!result.equalValues(_typeProvider, overriddenResult)) {
@@ -17968,12 +18387,12 @@
           ParameterElementImpl parameterElt = parameterElts[i];
           EvaluationResultImpl result = parameterElt.evaluationResult;
           // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (isUserDefinedObject(result)) {
+          if (_isUserDefinedObject(result)) {
             continue;
           }
           ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
           EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-          if (isUserDefinedObject(overriddenResult)) {
+          if (_isUserDefinedObject(overriddenResult)) {
             continue;
           }
           if (!result.equalValues(_typeProvider, overriddenResult)) {
@@ -18000,7 +18419,7 @@
    * @param errorNameTarget the node to report problems on
    * @return `true` if and only if an error code is generated on the passed node
    */
-  bool checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+  bool _checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
     //
     // Compute the overridden executable from the InheritanceManager
     //
@@ -18013,7 +18432,7 @@
       MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenExecutable;
       List<ExecutableElement> overriddenElement = multiplyInheritedElement.inheritedElements;
       for (int i = 0; i < overriddenElement.length; i++) {
-        if (checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
+        if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
           return true;
         }
       }
@@ -18022,7 +18441,7 @@
     //
     // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
     //
-    return checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
+    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
   }
 
   /**
@@ -18032,7 +18451,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
    */
-  bool checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
+  bool _checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
     if (_enclosingClass == null || node.isStatic) {
       return false;
     }
@@ -18047,10 +18466,10 @@
       PropertyAccessorElement setter = element.setter;
       SimpleIdentifier fieldName = field.name;
       if (getter != null) {
-        hasProblems = javaBooleanOr(hasProblems, checkForAllInvalidOverrideErrorCodesForExecutable(getter, ParameterElementImpl.EMPTY_ARRAY, AstNode.EMPTY_ARRAY, fieldName));
+        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(getter, ParameterElementImpl.EMPTY_ARRAY, AstNode.EMPTY_ARRAY, fieldName));
       }
       if (setter != null) {
-        hasProblems = javaBooleanOr(hasProblems, checkForAllInvalidOverrideErrorCodesForExecutable(setter, setter.parameters, <AstNode> [fieldName], fieldName));
+        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(setter, setter.parameters, <AstNode> [fieldName], fieldName));
       }
     }
     return hasProblems;
@@ -18063,7 +18482,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
    */
-  bool checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
+  bool _checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
     if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
       return false;
     }
@@ -18078,7 +18497,7 @@
     FormalParameterList formalParameterList = node.parameters;
     NodeList<FormalParameter> parameterList = formalParameterList != null ? formalParameterList.parameters : null;
     List<AstNode> parameters = parameterList != null ? new List.from(parameterList) : null;
-    return checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
+    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
   }
 
   /**
@@ -18090,23 +18509,23 @@
    * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
    * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
    */
-  bool checkForAllMixinErrorCodes(WithClause withClause) {
+  bool _checkForAllMixinErrorCodes(WithClause withClause) {
     if (withClause == null) {
       return false;
     }
     bool problemReported = false;
     for (TypeName mixinName in withClause.mixinTypes) {
-      Type2 mixinType = mixinName.type;
+      DartType mixinType = mixinName.type;
       if (mixinType is! InterfaceType) {
         continue;
       }
-      if (checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+      if (_checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
         problemReported = true;
       } else {
         ClassElement mixinElement = (mixinType as InterfaceType).element;
-        problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresConstructor(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotFromObject(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSuper(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinDeclaresConstructor(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinInheritsNotFromObject(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, _checkForMixinReferencesSuper(mixinName, mixinElement));
       }
     }
     return problemReported;
@@ -18121,7 +18540,7 @@
    * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
    * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
    */
-  bool checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
+  bool _checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
     //
     // Prepare redirected constructor node
     //
@@ -18138,7 +18557,7 @@
       // If the element is null, we check for the REDIRECT_TO_MISSING_CONSTRUCTOR case
       //
       TypeName constructorTypeName = redirectedConstructor.type;
-      Type2 redirectedType = constructorTypeName.type;
+      DartType redirectedType = constructorTypeName.type;
       if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
         //
         // Prepare the constructor name
@@ -18154,12 +18573,12 @@
       return false;
     }
     FunctionType redirectedType = redirectedElement.type;
-    Type2 redirectedReturnType = redirectedType.returnType;
+    DartType redirectedReturnType = redirectedType.returnType;
     //
     // Report specific problem when return type is incompatible
     //
     FunctionType constructorType = node.element.type;
-    Type2 constructorReturnType = constructorType.returnType;
+    DartType constructorReturnType = constructorType.returnType;
     if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
       _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
       return true;
@@ -18191,9 +18610,9 @@
    * @see StaticWarningCode#RETURN_WITHOUT_VALUE
    * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
    */
-  bool checkForAllReturnStatementErrorCodes(ReturnStatement node) {
+  bool _checkForAllReturnStatementErrorCodes(ReturnStatement node) {
     FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    Type2 expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
     Expression returnExpression = node.expression;
     // RETURN_IN_GENERATIVE_CONSTRUCTOR
     bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
@@ -18213,7 +18632,7 @@
       return true;
     }
     // RETURN_OF_INVALID_TYPE
-    return checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
   }
 
   /**
@@ -18226,7 +18645,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
    */
-  bool checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
+  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement) {
     // prepare exported library
     LibraryElement exportedLibrary = exportElement.exportedLibrary;
     if (exportedLibrary == null) {
@@ -18264,7 +18683,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForArgumentTypeNotAssignable(Expression expression, Type2 expectedStaticType, Type2 actualStaticType, Type2 expectedPropagatedType, Type2 actualPropagatedType, ErrorCode errorCode) {
+  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, DartType expectedPropagatedType, DartType actualPropagatedType, ErrorCode errorCode) {
     //
     // Test static type information
     //
@@ -18287,15 +18706,15 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
     if (argument == null) {
       return false;
     }
     ParameterElement staticParameterElement = argument.staticParameterElement;
-    Type2 staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
     ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
-    Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
-    return checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, propagatedParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+    DartType propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, propagatedParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
 
   /**
@@ -18307,7 +18726,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, Type2 expectedStaticType, Type2 expectedPropagatedType, ErrorCode errorCode) => checkForArgumentTypeNotAssignable(expression, expectedStaticType, getStaticType(expression), expectedPropagatedType, expression.propagatedType, errorCode);
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, DartType expectedPropagatedType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, _getStaticType(expression), expectedPropagatedType, expression.propagatedType, errorCode);
 
   /**
    * This verifies that the passed arguments can be assigned to their corresponding parameters.
@@ -18316,13 +18735,13 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
     if (argumentList == null) {
       return false;
     }
     bool problemReported = false;
     for (Expression argument in argumentList.arguments) {
-      problemReported = javaBooleanOr(problemReported, checkForArgumentTypeNotAssignableForArgument(argument));
+      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
     }
     // done
     return problemReported;
@@ -18337,7 +18756,7 @@
    * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
    * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
    */
-  bool checkForAssignmentToFinal(Expression expression) {
+  bool _checkForAssignmentToFinal(Expression expression) {
     // prepare element
     Element element = null;
     if (expression is Identifier) {
@@ -18385,7 +18804,7 @@
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
    * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
    */
-  bool checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
+  bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
     sc.Token token = identifier.token;
     if (identical(token.type, sc.TokenType.KEYWORD)) {
       _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
@@ -18402,7 +18821,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
    */
-  bool checkForCaseBlockNotTerminated(SwitchCase node) {
+  bool _checkForCaseBlockNotTerminated(SwitchCase node) {
     NodeList<Statement> statements = node.statements;
     if (statements.isEmpty) {
       // fall-through without statements at all
@@ -18442,14 +18861,14 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
    */
-  bool checkForCaseBlocksNotTerminated(SwitchStatement node) {
+  bool _checkForCaseBlocksNotTerminated(SwitchStatement node) {
     bool foundError = false;
     NodeList<SwitchMember> members = node.members;
     int lastMember = members.length - 1;
     for (int i = 0; i < lastMember; i++) {
       SwitchMember member = members[i];
       if (member is SwitchCase) {
-        foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated(member));
+        foundError = javaBooleanOr(foundError, _checkForCaseBlockNotTerminated(member));
       }
     }
     return foundError;
@@ -18464,8 +18883,8 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
    */
-  bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, Type2 type) {
-    if (!implementsEqualsWhenNotAllowed(type)) {
+  bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, DartType type) {
+    if (!_implementsEqualsWhenNotAllowed(type)) {
       return false;
     }
     // report error
@@ -18481,7 +18900,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
    */
-  bool checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
+  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
     if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
       SimpleIdentifier methodName = node.name;
       _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
@@ -18501,7 +18920,7 @@
    * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
    * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
    */
-  bool checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
+  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node) {
     ConstructorElement constructorElement = node.element;
     SimpleIdentifier constructorName = node.name;
     String name = constructorElement.name;
@@ -18547,7 +18966,7 @@
    * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
    * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
    */
-  bool checkForConflictingGetterAndMethod() {
+  bool _checkForConflictingGetterAndMethod() {
     if (_enclosingClass == null) {
       return false;
     }
@@ -18599,7 +19018,7 @@
    * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
    * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
    */
-  bool checkForConflictingInstanceGetterAndSuperclassMember() {
+  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
     if (_enclosingClass == null) {
       return false;
     }
@@ -18659,7 +19078,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
    */
-  bool checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
+  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
     // Reference all of the class members in this class.
     NodeList<ClassMember> classMembers = node.members;
     if (classMembers.isEmpty) {
@@ -18740,7 +19159,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
    */
-  bool checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
+  bool _checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
     if (!node.isStatic) {
       return false;
     }
@@ -18780,7 +19199,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
    */
-  bool checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
+  bool _checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
     if (!node.isStatic) {
       return false;
     }
@@ -18827,7 +19246,7 @@
    * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_CLASS
    * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_MEMBER
    */
-  bool checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
+  bool _checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
     bool problemReported = false;
     for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
       String name = typeParameter.name;
@@ -18853,7 +19272,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
    */
-  bool checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
+  bool _checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
     if (!_isEnclosingConstructorConst) {
       return false;
     }
@@ -18901,7 +19320,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
    */
-  bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
+  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) {
     if (!_isEnclosingConstructorConst) {
       return false;
     }
@@ -18924,7 +19343,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
    */
-  bool checkForConstEvalThrowsException(ThrowExpression node) {
+  bool _checkForConstEvalThrowsException(ThrowExpression node) {
     if (_isEnclosingConstructorConst) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
       return true;
@@ -18939,7 +19358,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
    */
-  bool checkForConstFormalParameter(NormalFormalParameter node) {
+  bool _checkForConstFormalParameter(NormalFormalParameter node) {
     if (node.isConst) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
       return true;
@@ -18955,7 +19374,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
    */
-  bool checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
+  bool _checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
     // OK, not const.
     if (node.constKeyword == null) {
       return false;
@@ -18964,8 +19383,8 @@
     bool hasProblems = false;
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
-      Type2 type = key.staticType;
-      if (implementsEqualsWhenNotAllowed(type)) {
+      DartType type = key.staticType;
+      if (_implementsEqualsWhenNotAllowed(type)) {
         _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, key, [type.displayName]);
         hasProblems = true;
       }
@@ -18985,7 +19404,7 @@
    * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
    * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
    */
-  bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
+  bool _checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
     if (type.element.isAbstract) {
       ConstructorElement element = node.staticElement;
       if (element != null && !element.isFactory) {
@@ -19010,7 +19429,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
    */
-  bool checkForConstWithNonConst(InstanceCreationExpression node) {
+  bool _checkForConstWithNonConst(InstanceCreationExpression node) {
     ConstructorElement constructorElement = node.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
@@ -19026,7 +19445,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
    */
-  bool checkForConstWithTypeParameters(TypeName typeName) {
+  bool _checkForConstWithTypeParameters(TypeName typeName) {
     // something wrong with AST
     if (typeName == null) {
       return false;
@@ -19044,7 +19463,7 @@
     if (typeArguments != null) {
       bool hasError = false;
       for (TypeName argument in typeArguments.arguments) {
-        hasError = javaBooleanOr(hasError, checkForConstWithTypeParameters(argument));
+        hasError = javaBooleanOr(hasError, _checkForConstWithTypeParameters(argument));
       }
       return hasError;
     }
@@ -19062,13 +19481,13 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
    */
-  bool checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
+  bool _checkForConstWithTypeParametersInCreation(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
     if (constructorName == null) {
       return false;
     }
     TypeName typeName = constructorName.type;
-    return checkForConstWithTypeParameters(typeName);
+    return _checkForConstWithTypeParameters(typeName);
   }
 
   /**
@@ -19082,7 +19501,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
    */
-  bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
+  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
     // OK if resolved
     if (node.staticElement != null) {
       return false;
@@ -19115,7 +19534,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
    */
-  bool checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
+  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
     bool result = false;
     FormalParameterList formalParameterList = node.parameters;
     NodeList<FormalParameter> parameters = formalParameterList.parameters;
@@ -19139,7 +19558,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
    */
-  bool checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
+  bool _checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
     // OK, not in a function typed parameter.
     if (!_isInFunctionTypedFormalParameter) {
       return false;
@@ -19160,7 +19579,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
    */
-  bool checkForDuplicateDefinitionInheritance() {
+  bool _checkForDuplicateDefinitionInheritance() {
     if (_enclosingClass == null) {
       return false;
     }
@@ -19169,13 +19588,13 @@
       if (!member.isStatic) {
         continue;
       }
-      hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionOfMember(member));
+      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
     }
     for (ExecutableElement member in _enclosingClass.accessors) {
       if (!member.isStatic) {
         continue;
       }
-      hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionOfMember(member));
+      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
     }
     return hasProblem;
   }
@@ -19188,7 +19607,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
    */
-  bool checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
+  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
     // prepare name
     String name = staticMember.name;
     if (name == null) {
@@ -19215,7 +19634,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
    */
-  bool checkForExpectedOneListTypeArgument(ListLiteral node) {
+  bool _checkForExpectedOneListTypeArgument(ListLiteral node) {
     // prepare type arguments
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments == null) {
@@ -19240,7 +19659,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
    */
-  bool checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
+  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement) {
     // prepare exported library
     LibraryElement nodeLibrary = exportElement.exportedLibrary;
     if (nodeLibrary == null) {
@@ -19274,7 +19693,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
    */
-  bool checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
+  bool _checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
     if (_isInSystemLibrary) {
       return false;
     }
@@ -19300,11 +19719,11 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
    */
-  bool checkForExtendsDisallowedClass(ExtendsClause node) {
+  bool _checkForExtendsDisallowedClass(ExtendsClause node) {
     if (node == null) {
       return false;
     }
-    return checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
   }
 
   /**
@@ -19318,11 +19737,11 @@
    * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
    * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
    */
-  bool checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
+  bool _checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
     if (typeName.isSynthetic) {
       return false;
     }
-    Type2 superType = typeName.type;
+    DartType superType = typeName.type;
     for (InterfaceType disallowedType in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
       if (superType != null && superType == disallowedType) {
         // if the violating type happens to be 'num', we need to rule out the case where the
@@ -19335,7 +19754,7 @@
           // grandparent node
           if (grandParent is ClassDeclaration) {
             ClassElement classElement = grandParent.element;
-            Type2 classType = classElement.type;
+            DartType classType = classElement.type;
             if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
               return false;
             }
@@ -19358,7 +19777,7 @@
    * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
    * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
    */
-  bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
+  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
     // prepare field element
     Element staticElement = node.fieldName.staticElement;
     if (staticElement is! FieldElement) {
@@ -19366,14 +19785,14 @@
     }
     FieldElement fieldElement = staticElement as FieldElement;
     // prepare field type
-    Type2 fieldType = fieldElement.type;
+    DartType fieldType = fieldElement.type;
     // prepare expression type
     Expression expression = node.expression;
     if (expression == null) {
       return false;
     }
     // test the static type of the expression
-    Type2 staticType = getStaticType(expression);
+    DartType staticType = _getStaticType(expression);
     if (staticType == null) {
       return false;
     }
@@ -19396,7 +19815,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
    */
-  bool checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
+  bool _checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
     ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
     if (constructor == null) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
@@ -19430,7 +19849,7 @@
    * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
    * @see StaticWarningCode#FINAL_NOT_INITIALIZED
    */
-  bool checkForFinalNotInitialized(VariableDeclarationList node) {
+  bool _checkForFinalNotInitialized(VariableDeclarationList node) {
     if (_isInNativeClass) {
       return false;
     }
@@ -19461,7 +19880,7 @@
    * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
    * @see StaticWarningCode#FINAL_NOT_INITIALIZED
    */
-  bool checkForFinalNotInitializedInClass(ClassDeclaration node) {
+  bool _checkForFinalNotInitializedInClass(ClassDeclaration node) {
     NodeList<ClassMember> classMembers = node.members;
     for (ClassMember classMember in classMembers) {
       if (classMember is ConstructorDeclaration) {
@@ -19472,7 +19891,7 @@
     for (ClassMember classMember in classMembers) {
       if (classMember is FieldDeclaration) {
         FieldDeclaration field = classMember;
-        foundError = javaBooleanOr(foundError, checkForFinalNotInitialized(field.fields));
+        foundError = javaBooleanOr(foundError, _checkForFinalNotInitialized(field.fields));
       }
     }
     return foundError;
@@ -19486,13 +19905,13 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
    */
-  bool checkForImplementsDisallowedClass(ImplementsClause node) {
+  bool _checkForImplementsDisallowedClass(ImplementsClause node) {
     if (node == null) {
       return false;
     }
     bool foundError = false;
     for (TypeName type in node.interfaces) {
-      foundError = javaBooleanOr(foundError, checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
+      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
     }
     return foundError;
   }
@@ -19506,7 +19925,7 @@
    * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
    * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
    */
-  bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
+  bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
     if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
       return false;
     }
@@ -19568,7 +19987,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
    */
-  bool checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
+  bool _checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
     // prepare imported library
     LibraryElement nodeLibrary = importElement.importedLibrary;
     if (nodeLibrary == null) {
@@ -19602,7 +20021,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
    */
-  bool checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
+  bool _checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
     if (_isInSystemLibrary) {
       return false;
     }
@@ -19628,11 +20047,11 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
    */
-  bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
+  bool _checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
     // TODO(jwren) Revisit this algorithm, should there up to n-1 errors?
     NodeList<SwitchMember> switchMembers = node.members;
     bool foundError = false;
-    Type2 firstType = null;
+    DartType firstType = null;
     for (SwitchMember switchMember in switchMembers) {
       if (switchMember is SwitchCase) {
         SwitchCase switchCase = switchMember;
@@ -19643,7 +20062,7 @@
           // the variable.
           firstType = expression.bestType;
         } else {
-          Type2 nType = expression.bestType;
+          DartType nType = expression.bestType;
           if (firstType != nType) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
             foundError = true;
@@ -19652,7 +20071,7 @@
       }
     }
     if (!foundError) {
-      checkForCaseExpressionTypeImplementsEquals(node, firstType);
+      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
     }
     return foundError;
   }
@@ -19664,7 +20083,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
    */
-  bool checkForInconsistentMethodInheritance() {
+  bool _checkForInconsistentMethodInheritance() {
     // Ensure that the inheritance manager has a chance to generate all errors we may care about,
     // note that we ensure that the interfaces data since there are no errors.
     _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
@@ -19689,7 +20108,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
    */
-  bool checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
+  bool _checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
     // OK, in comment
     if (_isInComment) {
       return false;
@@ -19726,15 +20145,15 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForIntNotAssignable(Expression argument) {
+  bool _checkForIntNotAssignable(Expression argument) {
     if (argument == null) {
       return false;
     }
     ParameterElement staticParameterElement = argument.staticParameterElement;
-    Type2 staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
     ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
-    Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
-    return checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, propagatedParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+    DartType propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
+    return _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, propagatedParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
 
   /**
@@ -19745,20 +20164,20 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
-  bool checkForInvalidAssignment(Expression lhs, Expression rhs) {
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
     if (lhs == null || rhs == null) {
       return false;
     }
-    VariableElement leftElement = getVariableElement(lhs);
-    Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
-    Type2 staticRightType = getStaticType(rhs);
+    VariableElement leftElement = _getVariableElement(lhs);
+    DartType leftType = (leftElement == null) ? _getStaticType(lhs) : leftElement.type;
+    DartType staticRightType = _getStaticType(rhs);
     bool isStaticAssignable = staticRightType.isAssignableTo(leftType);
     if (!isStaticAssignable) {
       String leftName = leftType.displayName;
       String rightName = staticRightType.displayName;
       if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(staticRightType);
+        leftName = _getExtendedDisplayName(leftType);
+        rightName = _getExtendedDisplayName(staticRightType);
       }
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
       return true;
@@ -19785,18 +20204,18 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
-  bool checkForInvalidCompoundAssignment(AssignmentExpression node) {
+  bool _checkForInvalidCompoundAssignment(AssignmentExpression node) {
     Expression lhs = node.leftHandSide;
     if (lhs == null) {
       return false;
     }
-    VariableElement leftElement = getVariableElement(lhs);
-    Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
+    VariableElement leftElement = _getVariableElement(lhs);
+    DartType leftType = (leftElement == null) ? _getStaticType(lhs) : leftElement.type;
     MethodElement invokedMethod = node.staticElement;
     if (invokedMethod == null) {
       return false;
     }
-    Type2 rightType = invokedMethod.type.returnType;
+    DartType rightType = invokedMethod.type.returnType;
     if (leftType == null || rightType == null) {
       return false;
     }
@@ -19804,8 +20223,8 @@
       String leftName = leftType.displayName;
       String rightName = rightType.displayName;
       if (leftName == rightName) {
-        leftName = getExtendedDisplayName(leftType);
-        rightName = getExtendedDisplayName(rightType);
+        leftName = _getExtendedDisplayName(leftType);
+        rightName = _getExtendedDisplayName(rightType);
       }
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, node.rightHandSide, [rightName, leftName]);
       return true;
@@ -19818,7 +20237,7 @@
    *
    * @param node the field initializer being checked
    */
-  void checkForInvalidField(ConstructorFieldInitializer node) {
+  void _checkForInvalidField(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
     Element staticElement = fieldName.staticElement;
     if (staticElement is FieldElement) {
@@ -19841,8 +20260,8 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
    */
-  bool checkForInvalidReferenceToThis(ThisExpression node) {
-    if (!isThisInValidContext(node)) {
+  bool _checkForInvalidReferenceToThis(ThisExpression node) {
+    if (!_isThisInValidContext(node)) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
       return true;
     }
@@ -19859,7 +20278,7 @@
    *          [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
    * @return `true` if and only if an error code is generated on the passed node
    */
-  bool checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
+  bool _checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
     bool foundError = false;
     for (TypeName typeName in arguments) {
       if (typeName.type is TypeParameterType) {
@@ -19879,7 +20298,7 @@
    * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
    * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForListElementTypeNotAssignable(ListLiteral node) {
+  bool _checkForListElementTypeNotAssignable(ListLiteral node) {
     // Prepare list element type.
     TypeArgumentList typeArgumentList = node.typeArguments;
     if (typeArgumentList == null) {
@@ -19889,7 +20308,7 @@
     if (typeArguments.length < 1) {
       return false;
     }
-    Type2 listElementType = typeArguments[0].type;
+    DartType listElementType = typeArguments[0].type;
     // Prepare problem to report.
     ErrorCode errorCode;
     if (node.constKeyword != null) {
@@ -19900,7 +20319,7 @@
     // Check every list element.
     bool hasProblems = false;
     for (Expression element in node.elements) {
-      hasProblems = javaBooleanOr(hasProblems, checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, null, errorCode));
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, null, errorCode));
     }
     return hasProblems;
   }
@@ -19916,7 +20335,7 @@
    * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
    * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForMapTypeNotAssignable(MapLiteral node) {
+  bool _checkForMapTypeNotAssignable(MapLiteral node) {
     // Prepare maps key/value types.
     TypeArgumentList typeArgumentList = node.typeArguments;
     if (typeArgumentList == null) {
@@ -19926,8 +20345,8 @@
     if (typeArguments.length < 2) {
       return false;
     }
-    Type2 keyType = typeArguments[0].type;
-    Type2 valueType = typeArguments[1].type;
+    DartType keyType = typeArguments[0].type;
+    DartType valueType = typeArguments[1].type;
     // Prepare problem to report.
     ErrorCode keyErrorCode;
     ErrorCode valueErrorCode;
@@ -19944,8 +20363,8 @@
     for (MapLiteralEntry entry in entries) {
       Expression key = entry.key;
       Expression value = entry.value;
-      hasProblems = javaBooleanOr(hasProblems, checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, null, keyErrorCode));
-      hasProblems = javaBooleanOr(hasProblems, checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, null, valueErrorCode));
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, null, keyErrorCode));
+      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, null, valueErrorCode));
     }
     return hasProblems;
   }
@@ -19957,7 +20376,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
    */
-  bool checkForMemberWithClassName() {
+  bool _checkForMemberWithClassName() {
     if (_enclosingClass == null) {
       return false;
     }
@@ -19987,7 +20406,7 @@
    * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES
    * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE
    */
-  bool checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
+  bool _checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
     ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
     if (accessorElement is! PropertyAccessorElement) {
       return false;
@@ -20029,15 +20448,15 @@
       }
     }
     // Default of null == no accessor or no type (dynamic)
-    Type2 getterType = null;
-    Type2 setterType = null;
+    DartType getterType = null;
+    DartType setterType = null;
     // Get an existing counterpart accessor if any.
     if (propertyAccessorElement.isGetter) {
-      getterType = getGetterType(propertyAccessorElement);
-      setterType = getSetterType(counterpartAccessor);
+      getterType = _getGetterType(propertyAccessorElement);
+      setterType = _getSetterType(counterpartAccessor);
     } else if (propertyAccessorElement.isSetter) {
-      setterType = getSetterType(propertyAccessorElement);
-      getterType = getGetterType(counterpartAccessor);
+      setterType = _getSetterType(propertyAccessorElement);
+      getterType = _getGetterType(counterpartAccessor);
     }
     // If either types are not assignable to each other, report an error (if the getter is null,
     // it is dynamic which is assignable to everything).
@@ -20067,7 +20486,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#MIXED_RETURN_TYPES
    */
-  bool checkForMixedReturns(BlockFunctionBody node) {
+  bool _checkForMixedReturns(BlockFunctionBody node) {
     int withCount = _returnsWith.length;
     int withoutCount = _returnsWithout.length;
     if (withCount > 0 && withoutCount > 0) {
@@ -20090,7 +20509,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
    */
-  bool checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
+  bool _checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
       if (!constructor.isSynthetic && !constructor.isFactory) {
         _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
@@ -20108,7 +20527,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
    */
-  bool checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
+  bool _checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
     InterfaceType mixinSupertype = mixinElement.supertype;
     if (mixinSupertype != null) {
       if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
@@ -20127,7 +20546,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
    */
-  bool checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
+  bool _checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
     if (mixinElement.hasReferenceToSuper) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
     }
@@ -20141,7 +20560,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
    */
-  bool checkForMultipleSuperInitializers(ConstructorDeclaration node) {
+  bool _checkForMultipleSuperInitializers(ConstructorDeclaration node) {
     int numSuperInitializers = 0;
     for (ConstructorInitializer initializer in node.initializers) {
       if (initializer is SuperConstructorInvocation) {
@@ -20161,7 +20580,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
    */
-  bool checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
+  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
     if (!_isInSystemLibrary && !_hasExtUri) {
       _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
       return true;
@@ -20178,7 +20597,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
    */
-  bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
+  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
     // OK if resolved
     if (node.staticElement != null) {
       return false;
@@ -20212,7 +20631,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
    */
-  bool checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
+  bool _checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
     // do nothing if there is explicit constructor
     List<ConstructorElement> constructors = _enclosingClass.constructors;
     if (!constructors[0].isSynthetic) {
@@ -20252,7 +20671,7 @@
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
    * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
    */
-  bool checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
+  bool _checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration node) {
     if (_enclosingClass.isAbstract) {
       return false;
     }
@@ -20297,7 +20716,7 @@
       InterfaceType enclosingType = _enclosingClass.type;
       // Check to see if some element is in local enclosing class that matches the name of the
       // required member.
-      if (isMemberInClassOrMixin(executableElt, _enclosingClass)) {
+      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
         // We do not have to verify that this implementation of the found method matches the
         // required function type: the set of StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings
         // break out the different specific situations.
@@ -20382,8 +20801,8 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_CONDITION
    */
-  bool checkForNonBoolCondition(Expression condition) {
-    Type2 conditionType = getStaticType(condition);
+  bool _checkForNonBoolCondition(Expression condition) {
+    DartType conditionType = _getStaticType(condition);
     if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
       return true;
@@ -20398,9 +20817,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
    */
-  bool checkForNonBoolExpression(AssertStatement node) {
+  bool _checkForNonBoolExpression(AssertStatement node) {
     Expression expression = node.condition;
-    Type2 type = getStaticType(expression);
+    DartType type = _getStaticType(expression);
     if (type is InterfaceType) {
       if (!type.isAssignableTo(_boolType)) {
         _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
@@ -20423,8 +20842,8 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#NON_BOOL_NEGATION_EXPRESSION
    */
-  bool checkForNonBoolNegationExpression(Expression expression) {
-    Type2 conditionType = getStaticType(expression);
+  bool _checkForNonBoolNegationExpression(Expression expression) {
+    DartType conditionType = _getStaticType(expression);
     if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
       _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
       return true;
@@ -20442,7 +20861,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
    */
-  bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
+  bool _checkForNonConstMapAsExpressionStatement(MapLiteral node) {
     // "const"
     if (node.constKeyword != null) {
       return false;
@@ -20473,7 +20892,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
    */
-  bool checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
+  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
     // check that []= operator
     SimpleIdentifier name = node.name;
     if (name.name != "[]=") {
@@ -20482,7 +20901,7 @@
     // check return type
     TypeName typeName = node.returnType;
     if (typeName != null) {
-      Type2 type = typeName.type;
+      DartType type = typeName.type;
       if (type != null && !type.isVoid) {
         _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
       }
@@ -20498,9 +20917,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
    */
-  bool checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
     if (typeName != null) {
-      Type2 type = typeName.type;
+      DartType type = typeName.type;
       if (type != null && !type.isVoid) {
         _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
       }
@@ -20518,7 +20937,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
    */
-  bool checkForOptionalParameterInOperator(MethodDeclaration node) {
+  bool _checkForOptionalParameterInOperator(MethodDeclaration node) {
     FormalParameterList parameterList = node.parameters;
     if (parameterList == null) {
       return false;
@@ -20541,7 +20960,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
    */
-  bool checkForPrivateOptionalParameter(FormalParameter node) {
+  bool _checkForPrivateOptionalParameter(FormalParameter node) {
     // should be named parameter
     if (node.kind != ParameterKind.NAMED) {
       return false;
@@ -20564,7 +20983,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
    */
-  bool checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
+  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node) {
     // we check generative constructor here
     if (node.factoryKeyword != null) {
       return false;
@@ -20574,7 +20993,7 @@
       if (initializer is RedirectingConstructorInvocation) {
         // OK if no cycle
         ConstructorElement element = node.element;
-        if (!hasRedirectingFactoryConstructorCycle(element)) {
+        if (!_hasRedirectingFactoryConstructorCycle(element)) {
           return false;
         }
         // report error
@@ -20594,7 +21013,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
    */
-  bool checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
+  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node) {
     // prepare redirected constructor
     ConstructorName redirectedConstructorNode = node.redirectedConstructor;
     if (redirectedConstructorNode == null) {
@@ -20602,7 +21021,7 @@
     }
     // OK if no cycle
     ConstructorElement element = node.element;
-    if (!hasRedirectingFactoryConstructorCycle(element)) {
+    if (!_hasRedirectingFactoryConstructorCycle(element)) {
       return false;
     }
     // report error
@@ -20619,11 +21038,11 @@
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
    */
-  bool checkForRecursiveInterfaceInheritance(ClassElement classElt) {
+  bool _checkForRecursiveInterfaceInheritance(ClassElement classElt) {
     if (classElt == null) {
       return false;
     }
-    return safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
+    return _safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
   }
 
   /**
@@ -20637,7 +21056,7 @@
    * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
    * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
    */
-  bool checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
+  bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
     bool errorReported = false;
     //
     // Check for default values in the parameters
@@ -20687,7 +21106,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
    */
-  bool checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
+  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node) {
     // prepare redirected constructor
     ConstructorName redirectedConstructorNode = node.redirectedConstructor;
     if (redirectedConstructorNode == null) {
@@ -20723,7 +21142,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
    */
-  bool checkForRethrowOutsideCatch(RethrowExpression node) {
+  bool _checkForRethrowOutsideCatch(RethrowExpression node) {
     if (!_isInCatchClause) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
       return true;
@@ -20739,7 +21158,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
    */
-  bool checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
+  bool _checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
     // ignore factory
     if (node.factoryKeyword != null) {
       return false;
@@ -20766,8 +21185,8 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
    */
-  bool checkForReturnOfInvalidType(Expression returnExpression, Type2 expectedReturnType) {
-    Type2 staticReturnType = getStaticType(returnExpression);
+  bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
+    DartType staticReturnType = _getStaticType(returnExpression);
     if (expectedReturnType.isVoid) {
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
         return false;
@@ -20800,7 +21219,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
    */
-  bool checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
+  bool _checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
     // OK, target is not a type
     if (typeReference == null) {
       return false;
@@ -20828,10 +21247,10 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
    */
-  bool checkForSwitchExpressionNotAssignable(SwitchStatement node) {
+  bool _checkForSwitchExpressionNotAssignable(SwitchStatement node) {
     // prepare 'switch' expression type
     Expression expression = node.expression;
-    Type2 expressionType = getStaticType(expression);
+    DartType expressionType = _getStaticType(expression);
     if (expressionType == null) {
       return false;
     }
@@ -20844,7 +21263,7 @@
       SwitchCase switchCase = switchMember as SwitchCase;
       // prepare 'case' type
       Expression caseExpression = switchCase.expression;
-      Type2 caseType = getStaticType(caseExpression);
+      DartType caseType = _getStaticType(caseExpression);
       // check types
       if (expressionType.isAssignableTo(caseType)) {
         return false;
@@ -20863,9 +21282,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
    */
-  bool checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
+  bool _checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
     FunctionTypeAliasElement element = node.element;
-    if (!hasTypedefSelfReference(element)) {
+    if (!_hasTypedefSelfReference(element)) {
       return false;
     }
     _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
@@ -20878,9 +21297,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
    */
-  bool checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
+  bool _checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
     ClassElement element = node.element;
-    if (!hasTypedefSelfReference(element)) {
+    if (!_hasTypedefSelfReference(element)) {
       return false;
     }
     _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
@@ -20894,12 +21313,12 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  bool checkForTypeArgumentNotMatchingBounds(TypeName node) {
+  bool _checkForTypeArgumentNotMatchingBounds(TypeName node) {
     if (node.typeArguments == null) {
       return false;
     }
     // prepare Type
-    Type2 type = node.type;
+    DartType type = node.type;
     if (type == null) {
       return false;
     }
@@ -20910,17 +21329,17 @@
     }
     ClassElement classElement = element as ClassElement;
     // prepare type parameters
-    List<Type2> typeParameters = classElement.type.typeArguments;
+    List<DartType> typeParameters = classElement.type.typeArguments;
     List<TypeParameterElement> boundingElts = classElement.typeParameters;
     // iterate over each bounded type parameter and corresponding argument
     NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
-    List<Type2> typeArguments = (type as InterfaceType).typeArguments;
+    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
     int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
     bool foundError = false;
     for (int i = 0; i < loopThroughIndex; i++) {
       TypeName argTypeName = typeNameArgList[i];
-      Type2 argType = argTypeName.type;
-      Type2 boundType = boundingElts[i].bound;
+      DartType argType = argTypeName.type;
+      DartType boundType = boundingElts[i].bound;
       if (argType != null && boundType != null) {
         boundType = boundType.substitute2(typeArguments, typeParameters);
         if (!argType.isSubtypeOf(boundType)) {
@@ -20946,9 +21365,9 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#TYPE_PARAMETER_REFERENCED_BY_STATIC
    */
-  bool checkForTypeParameterReferencedByStatic(TypeName node) {
+  bool _checkForTypeParameterReferencedByStatic(TypeName node) {
     if (_isInStaticMethod || _isInStaticVariableDeclaration) {
-      Type2 type = node.type;
+      DartType type = node.type;
       if (type is TypeParameterType) {
         _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
         return true;
@@ -20964,10 +21383,10 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
    */
-  bool checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
+  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
     TypeParameterElement element = node.element;
     // prepare bound
-    Type2 bound = element.bound;
+    DartType bound = element.bound;
     if (bound == null) {
       return false;
     }
@@ -20991,7 +21410,7 @@
    * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
    * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
    */
-  bool checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
+  bool _checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
     //
     // Ignore if the constructor is not generative.
     //
@@ -21049,7 +21468,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
    */
-  bool checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
+  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
     Element element = name.staticElement;
     if (element == null || element is TypeParameterElement) {
       return false;
@@ -21068,7 +21487,7 @@
     return true;
   }
 
-  void checkForValidField(FieldFormalParameter node) {
+  void _checkForValidField(FieldFormalParameter node) {
     ParameterElement element = node.element;
     if (element is FieldFormalParameterElement) {
       FieldElement fieldElement = element.field;
@@ -21078,8 +21497,8 @@
         ParameterElement parameterElement = node.element;
         if (parameterElement is FieldFormalParameterElementImpl) {
           FieldFormalParameterElementImpl fieldFormal = parameterElement;
-          Type2 declaredType = fieldFormal.type;
-          Type2 fieldType = fieldElement.type;
+          DartType declaredType = fieldFormal.type;
+          DartType fieldType = fieldElement.type;
           if (fieldElement.isSynthetic) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [node.identifier.name]);
           } else if (fieldElement.isStatic) {
@@ -21108,7 +21527,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
    */
-  bool checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
+  bool _checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
     // prepare number of parameters
     FormalParameterList parameterList = node.parameters;
     if (parameterList == null) {
@@ -21153,7 +21572,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
    */
-  bool checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
+  bool _checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
     if (setterName == null) {
       return false;
     }
@@ -21175,7 +21594,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see StaticWarningCode#FUNCTION_WITHOUT_CALL
    */
-  bool checkImplementsFunctionWithoutCall(ClassDeclaration node) {
+  bool _checkImplementsFunctionWithoutCall(ClassDeclaration node) {
     if (node.abstractKeyword != null) {
       return false;
     }
@@ -21201,7 +21620,7 @@
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#IMPLEMENTS_SUPER_CLASS
    */
-  bool checkImplementsSuperClass(ClassDeclaration node) {
+  bool _checkImplementsSuperClass(ClassDeclaration node) {
     // prepare super type
     InterfaceType superType = _enclosingClass.supertype;
     if (superType == null) {
@@ -21231,7 +21650,7 @@
    * @param type the type for which an extended display name is to be returned
    * @return a display name that can help distiguish between two types with the same name
    */
-  String getExtendedDisplayName(Type2 type) {
+  String _getExtendedDisplayName(DartType type) {
     Element element = type.element;
     if (element != null) {
       Source source = element.source;
@@ -21248,7 +21667,7 @@
    * @param propertyAccessorElement
    * @return The type of the given getter.
    */
-  Type2 getGetterType(PropertyAccessorElement propertyAccessorElement) {
+  DartType _getGetterType(PropertyAccessorElement propertyAccessorElement) {
     FunctionType functionType = propertyAccessorElement.type;
     if (functionType != null) {
       return functionType.returnType;
@@ -21263,7 +21682,7 @@
    * @param propertyAccessorElement
    * @return The type of the given setter.
    */
-  Type2 getSetterType(PropertyAccessorElement propertyAccessorElement) {
+  DartType _getSetterType(PropertyAccessorElement propertyAccessorElement) {
     // Get the parameters for MethodDeclaration or FunctionDeclaration
     List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
     // If there are no setter parameters, return no type.
@@ -21279,8 +21698,8 @@
    * @param expression the expression whose type is to be returned
    * @return the static type of the given expression
    */
-  Type2 getStaticType(Expression expression) {
-    Type2 type = expression.staticType;
+  DartType _getStaticType(Expression expression) {
+    DartType type = expression.staticType;
     if (type == null) {
       // TODO(brianwilkerson) This should never happen.
       return _dynamicType;
@@ -21295,7 +21714,7 @@
    * @param expression the expression whose element is to be returned
    * @return the variable element represented by the expression
    */
-  VariableElement getVariableElement(Expression expression) {
+  VariableElement _getVariableElement(Expression expression) {
     if (expression is Identifier) {
       Element element = expression.staticElement;
       if (element is VariableElement) {
@@ -21308,7 +21727,7 @@
   /**
    * @return `true` if the given constructor redirects to itself, directly or indirectly
    */
-  bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
+  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
     Set<ConstructorElement> constructors = new Set<ConstructorElement>();
     ConstructorElement current = element;
     while (current != null) {
@@ -21328,7 +21747,7 @@
    * @return <code>true</code> if given [Element] has direct or indirect reference to itself
    *         from anywhere except [ClassElement] or type parameter bounds.
    */
-  bool hasTypedefSelfReference(Element target) {
+  bool _hasTypedefSelfReference(Element target) {
     Set<Element> checked = new Set<Element>();
     List<Element> toCheck = new List<Element>();
     toCheck.add(target);
@@ -21365,7 +21784,7 @@
    * @return `true` if given [Type] implements operator <i>==</i>, and it is not
    *         <i>int</i> or <i>String</i>.
    */
-  bool implementsEqualsWhenNotAllowed(Type2 type) {
+  bool _implementsEqualsWhenNotAllowed(DartType type) {
     // ignore int or String
     if (type == null || type == _intType || type == _typeProvider.stringType) {
       return false;
@@ -21385,7 +21804,7 @@
     return true;
   }
 
-  bool isFunctionType(Type2 type) {
+  bool _isFunctionType(DartType type) {
     if (type.isDynamic || type.isBottom) {
       return true;
     } else if (type is FunctionType || type.isDartCoreFunction) {
@@ -21410,7 +21829,7 @@
    * @param classElt the class method to search through the members of
    * @return `true` iff the passed member is found in the passed class element
    */
-  bool isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
+  bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
     ExecutableElement foundElt;
     String executableName = executableElt.name;
     if (executableElt is MethodElement) {
@@ -21451,7 +21870,7 @@
    * @param node the 'this' expression to analyze
    * @return `true` if the given 'this' expression is in the valid context
    */
-  bool isThisInValidContext(ThisExpression node) {
+  bool _isThisInValidContext(ThisExpression node) {
     for (AstNode n = node; n != null; n = n.parent) {
       if (n is CompilationUnit) {
         return false;
@@ -21479,7 +21898,7 @@
    * @return `true` if the given identifier is in a location where it is allowed to resolve to
    *         a static member of a supertype
    */
-  bool isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
+  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
     if (node.inDeclarationContext()) {
       return true;
     }
@@ -21502,7 +21921,7 @@
     return false;
   }
 
-  bool isUserDefinedObject(EvaluationResultImpl result) => result == null || (result is ValidResult && result.isUserDefinedObject);
+  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null || (result is ValidResult && result.isUserDefinedObject);
 
   /**
    * This checks the class declaration is not a superinterface to itself.
@@ -21514,7 +21933,7 @@
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
    */
-  bool safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
+  bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
     // Detect error condition.
     int size = path.length;
     // If this is not the base case (size > 0), and the enclosing class is the passed class
@@ -21546,12 +21965,12 @@
     path.add(classElt);
     // n-case
     InterfaceType supertype = classElt.supertype;
-    if (supertype != null && safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
+    if (supertype != null && _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
       return true;
     }
     List<InterfaceType> interfaceTypes = classElt.interfaces;
     for (InterfaceType interfaceType in interfaceTypes) {
-      if (safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
+      if (_safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
         return true;
       }
     }
@@ -21592,10 +22011,11 @@
 
   bool _inClass = false;
 
+  @override
   Object visitClassElement(ClassElement element) {
-    addTypeToCheck(element.supertype);
+    _addTypeToCheck(element.supertype);
     for (InterfaceType mixin in element.mixins) {
-      addTypeToCheck(mixin);
+      _addTypeToCheck(mixin);
     }
     _inClass = !element.isTypedef;
     try {
@@ -21605,35 +22025,40 @@
     }
   }
 
+  @override
   Object visitExecutableElement(ExecutableElement element) {
     if (element.isSynthetic) {
       return null;
     }
-    addTypeToCheck(element.returnType);
+    _addTypeToCheck(element.returnType);
     return super.visitExecutableElement(element);
   }
 
+  @override
   Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    addTypeToCheck(element.returnType);
+    _addTypeToCheck(element.returnType);
     return super.visitFunctionTypeAliasElement(element);
   }
 
+  @override
   Object visitParameterElement(ParameterElement element) {
-    addTypeToCheck(element.type);
+    _addTypeToCheck(element.type);
     return super.visitParameterElement(element);
   }
 
+  @override
   Object visitTypeParameterElement(TypeParameterElement element) {
-    addTypeToCheck(element.bound);
+    _addTypeToCheck(element.bound);
     return super.visitTypeParameterElement(element);
   }
 
+  @override
   Object visitVariableElement(VariableElement element) {
-    addTypeToCheck(element.type);
+    _addTypeToCheck(element.type);
     return super.visitVariableElement(element);
   }
 
-  void addTypeToCheck(Type2 type) {
+  void _addTypeToCheck(DartType type) {
     if (type == null) {
       return;
     }
@@ -21647,8 +22072,8 @@
     // type arguments
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
-      for (Type2 typeArgument in interfaceType.typeArguments) {
-        addTypeToCheck(typeArgument);
+      for (DartType typeArgument in interfaceType.typeArguments) {
+        _addTypeToCheck(typeArgument);
       }
     }
   }
@@ -21707,7 +22132,9 @@
     this.correction9 = correction;
   }
 
+  @override
   String get correction => correction9;
 
+  @override
   ErrorSeverity get errorSeverity => type.severity;
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 69c91d7..efb01ff 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -28,7 +28,7 @@
   /**
    * The initial state in the state machine.
    */
-  static KeywordState KEYWORD_STATE = createKeywordStateTable();
+  static KeywordState KEYWORD_STATE = _createKeywordStateTable();
 
   /**
    * Create the next state in the state machine where we have already recognized the subset of
@@ -43,7 +43,7 @@
    * @param length the number of strings in the array that pass through the state being built
    * @return the state that was created
    */
-  static KeywordState computeKeywordStateTable(int start, List<String> strings, int offset, int length) {
+  static KeywordState _computeKeywordStateTable(int start, List<String> strings, int offset, int length) {
     List<KeywordState> result = new List<KeywordState>(26);
     assert(length != 0);
     int chunk = 0x0;
@@ -57,7 +57,7 @@
         int c = strings[i].codeUnitAt(start);
         if (chunk != c) {
           if (chunkStart != -1) {
-            result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings, chunkStart, i - chunkStart);
+            result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, i - chunkStart);
           }
           chunkStart = i;
           chunk = c;
@@ -66,7 +66,7 @@
     }
     if (chunkStart != -1) {
       assert(result[chunk - 0x61] == null);
-      result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings, chunkStart, offset + length - chunkStart);
+      result[chunk - 0x61] = _computeKeywordStateTable(start + 1, strings, chunkStart, offset + length - chunkStart);
     } else {
       assert(length == 1);
       return new KeywordState(_EMPTY_TABLE, strings[offset]);
@@ -83,14 +83,14 @@
    *
    * @return the state that was created
    */
-  static KeywordState createKeywordStateTable() {
+  static KeywordState _createKeywordStateTable() {
     List<Keyword> values = Keyword.values;
     List<String> strings = new List<String>(values.length);
     for (int i = 0; i < values.length; i++) {
       strings[i] = values[i].syntax;
     }
     strings.sort();
-    return computeKeywordStateTable(0, strings, 0, strings.length);
+    return _computeKeywordStateTable(0, strings, 0, strings.length);
   }
 
   /**
@@ -103,7 +103,7 @@
    * The keyword that is recognized by this state, or `null` if this state is not a terminal
    * state.
    */
-  Keyword _keyword2;
+  Keyword _keyword;
 
   /**
    * Initialize a newly created state to have the given transitions and to recognize the keyword
@@ -114,7 +114,7 @@
    */
   KeywordState(List<KeywordState> table, String syntax) {
     this._table = table;
-    this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax];
+    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
   }
 
   /**
@@ -123,7 +123,7 @@
    *
    * @return the keyword that was matched by reaching this state
    */
-  Keyword keyword() => _keyword2;
+  Keyword keyword() => _keyword;
 
   /**
    * Return the state that follows this state on a transition of the given character, or
@@ -188,10 +188,13 @@
     this.correction10 = correction;
   }
 
+  @override
   String get correction => correction10;
 
+  @override
   ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
 
+  @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 }
 
@@ -217,10 +220,13 @@
     this._offsetDelta = offsetDelta;
   }
 
+  @override
   int get offset => _offsetDelta + super.offset;
 
+  @override
   String getString(int start, int endDelta) => super.getString(start - _offsetDelta, endDelta);
 
+  @override
   void set offset(int offset) {
     super.offset = offset - _offsetDelta;
   }
@@ -248,10 +254,13 @@
     this._precedingComment = precedingComment;
   }
 
+  @override
   Token copy() => new StringTokenWithComment(type, lexeme, offset, copyComments(_precedingComment));
 
+  @override
   Token get precedingComments => _precedingComment;
 
+  @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -421,19 +430,19 @@
    * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
    * identifiers.
    */
-  bool _isPseudoKeyword2 = false;
+  bool _isPseudoKeyword = false;
 
   /**
    * A table mapping the lexemes of keywords to the corresponding keyword.
    */
-  static Map<String, Keyword> keywords = createKeywordMap();
+  static Map<String, Keyword> keywords = _createKeywordMap();
 
   /**
    * Create a table mapping the lexemes of keywords to the corresponding keyword.
    *
    * @return the table that was created
    */
-  static Map<String, Keyword> createKeywordMap() {
+  static Map<String, Keyword> _createKeywordMap() {
     LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>();
     for (Keyword keyword in values) {
       result[keyword._syntax] = keyword;
@@ -458,7 +467,7 @@
    */
   Keyword.con2(String name, int ordinal, String syntax, bool isPseudoKeyword) : super(name, ordinal) {
     this._syntax = syntax;
-    this._isPseudoKeyword2 = isPseudoKeyword;
+    this._isPseudoKeyword = isPseudoKeyword;
   }
 
   /**
@@ -474,7 +483,7 @@
    *
    * @return `true` if this keyword is a pseudo-keyword
    */
-  bool get isPseudoKeyword => _isPseudoKeyword2;
+  bool get isPseudoKeyword => _isPseudoKeyword;
 }
 
 /**
@@ -508,6 +517,7 @@
     this._charOffset = -1;
   }
 
+  @override
   int advance() {
     if (_charOffset + 1 >= _stringLength) {
       return -1;
@@ -515,10 +525,13 @@
     return _sequence.codeUnitAt(++_charOffset);
   }
 
+  @override
   int get offset => _charOffset;
 
+  @override
   String getString(int start, int endDelta) => _sequence.substring(start, _charOffset + 1 + endDelta).toString();
 
+  @override
   int peek() {
     if (_charOffset + 1 >= _sequence.length) {
       return -1;
@@ -526,6 +539,7 @@
     return _sequence.codeUnitAt(_charOffset + 1);
   }
 
+  @override
   void set offset(int offset) {
     _charOffset = offset;
   }
@@ -544,6 +558,7 @@
    */
   SyntheticStringToken(TokenType type, String value, int offset) : super(type, value, offset);
 
+  @override
   bool get isSynthetic => true;
 }
 
@@ -579,7 +594,7 @@
   /**
    * A flag indicating whether there were any tokens changed as a result of the modification.
    */
-  bool _hasNonWhitespaceChange2 = false;
+  bool _hasNonWhitespaceChange = false;
 
   /**
    * Initialize a newly created scanner.
@@ -623,7 +638,7 @@
    *
    * @return `true` if there were any tokens changed as a result of the modification
    */
-  bool get hasNonWhitespaceChange => _hasNonWhitespaceChange2;
+  bool get hasNonWhitespaceChange => _hasNonWhitespaceChange;
 
   /**
    * Given the stream of tokens scanned from the original source, the modified source (the result of
@@ -644,7 +659,7 @@
     // existing token might have been modified, so we need to rescan it.)
     //
     while (originalStream.type != TokenType.EOF && originalStream.end < index) {
-      originalStream = copyAndAdvance(originalStream, 0);
+      originalStream = _copyAndAdvance(originalStream, 0);
     }
     Token oldFirst = originalStream;
     Token oldLeftToken = originalStream.previous;
@@ -697,16 +712,16 @@
     // Copy the remaining tokens in the original stream, but apply the delta to the token's offset.
     //
     if (identical(originalStream.type, TokenType.EOF)) {
-      copyAndAdvance(originalStream, delta);
+      _copyAndAdvance(originalStream, delta);
       _rightToken = tail;
       _rightToken.setNextWithoutSettingPrevious(_rightToken);
     } else {
-      originalStream = copyAndAdvance(originalStream, delta);
+      originalStream = _copyAndAdvance(originalStream, delta);
       _rightToken = tail;
       while (originalStream.type != TokenType.EOF) {
-        originalStream = copyAndAdvance(originalStream, delta);
+        originalStream = _copyAndAdvance(originalStream, delta);
       }
-      Token eof = copyAndAdvance(originalStream, delta);
+      Token eof = _copyAndAdvance(originalStream, delta);
       eof.setNextWithoutSettingPrevious(eof);
     }
     //
@@ -716,7 +731,7 @@
     // the first new token.
     //
     Token newFirst = _leftToken.next;
-    while (newFirst != _rightToken && oldFirst != oldRightToken && newFirst.type != TokenType.EOF && equalTokens(oldFirst, newFirst)) {
+    while (newFirst != _rightToken && oldFirst != oldRightToken && newFirst.type != TokenType.EOF && _equalTokens(oldFirst, newFirst)) {
       _tokenMap.put(oldFirst, newFirst);
       oldLeftToken = oldFirst;
       oldFirst = oldFirst.next;
@@ -724,14 +739,14 @@
       newFirst = newFirst.next;
     }
     Token newLast = _rightToken.previous;
-    while (newLast != _leftToken && oldLast != oldLeftToken && newLast.type != TokenType.EOF && equalTokens(oldLast, newLast)) {
+    while (newLast != _leftToken && oldLast != oldLeftToken && newLast.type != TokenType.EOF && _equalTokens(oldLast, newLast)) {
       _tokenMap.put(oldLast, newLast);
       oldRightToken = oldLast;
       oldLast = oldLast.previous;
       _rightToken = newLast;
       newLast = newLast.previous;
     }
-    _hasNonWhitespaceChange2 = _leftToken.next != _rightToken || oldLeftToken.next != oldRightToken;
+    _hasNonWhitespaceChange = _leftToken.next != _rightToken || oldLeftToken.next != oldRightToken;
     //
     // TODO(brianwilkerson) Begin tokens are not getting associated with the corresponding end
     //     tokens (because the end tokens have not been copied when we're copying the begin tokens).
@@ -741,7 +756,7 @@
     return firstToken;
   }
 
-  Token copyAndAdvance(Token originalToken, int delta) {
+  Token _copyAndAdvance(Token originalToken, int delta) {
     Token copiedToken = originalToken.copy();
     _tokenMap.put(originalToken, copiedToken);
     copiedToken.applyDelta(delta);
@@ -764,7 +779,7 @@
    * @param newToken the token from the new stream that is being compared
    * @return `true` if the two tokens are equal to each other
    */
-  bool equalTokens(Token oldToken, Token newToken) => identical(oldToken.type, newToken.type) && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
+  bool _equalTokens(Token oldToken, Token newToken) => identical(oldToken.type, newToken.type) && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
 }
 
 /**
@@ -841,7 +856,7 @@
   /**
    * A flag indicating whether any unmatched groups were found during the parse.
    */
-  bool _hasUnmatchedGroups2 = false;
+  bool _hasUnmatchedGroups = false;
 
   /**
    * Initialize a newly created scanner.
@@ -872,7 +887,7 @@
    *
    * @return `true` if any unmatched groups were found during the parse
    */
-  bool get hasUnmatchedGroups => _hasUnmatchedGroups2;
+  bool get hasUnmatchedGroups => _hasUnmatchedGroups;
 
   /**
    * Set whether documentation tokens should be scanned.
@@ -919,7 +934,7 @@
         tokenCounter++;
         next = bigSwitch(next);
       }
-      appendEofToken();
+      _appendEofToken();
       instrumentation.metric2("tokensCount", tokenCounter);
       return firstToken;
     } finally {
@@ -939,7 +954,7 @@
   }
 
   int bigSwitch(int next) {
-    beginToken();
+    _beginToken();
     if (next == 0xD) {
       next = _reader.advance();
       if (next == 0xA) {
@@ -958,124 +973,124 @@
       int peek = _reader.peek();
       if (peek == 0x22 || peek == 0x27) {
         int start = _reader.offset;
-        return tokenizeString(_reader.advance(), start, true);
+        return _tokenizeString(_reader.advance(), start, true);
       }
     }
     if (0x61 <= next && next <= 0x7A) {
-      return tokenizeKeywordOrIdentifier(next, true);
+      return _tokenizeKeywordOrIdentifier(next, true);
     }
     if ((0x41 <= next && next <= 0x5A) || next == 0x5F || next == 0x24) {
-      return tokenizeIdentifier(next, _reader.offset, true);
+      return _tokenizeIdentifier(next, _reader.offset, true);
     }
     if (next == 0x3C) {
-      return tokenizeLessThan(next);
+      return _tokenizeLessThan(next);
     }
     if (next == 0x3E) {
-      return tokenizeGreaterThan(next);
+      return _tokenizeGreaterThan(next);
     }
     if (next == 0x3D) {
-      return tokenizeEquals(next);
+      return _tokenizeEquals(next);
     }
     if (next == 0x21) {
-      return tokenizeExclamation(next);
+      return _tokenizeExclamation(next);
     }
     if (next == 0x2B) {
-      return tokenizePlus(next);
+      return _tokenizePlus(next);
     }
     if (next == 0x2D) {
-      return tokenizeMinus(next);
+      return _tokenizeMinus(next);
     }
     if (next == 0x2A) {
-      return tokenizeMultiply(next);
+      return _tokenizeMultiply(next);
     }
     if (next == 0x25) {
-      return tokenizePercent(next);
+      return _tokenizePercent(next);
     }
     if (next == 0x26) {
-      return tokenizeAmpersand(next);
+      return _tokenizeAmpersand(next);
     }
     if (next == 0x7C) {
-      return tokenizeBar(next);
+      return _tokenizeBar(next);
     }
     if (next == 0x5E) {
-      return tokenizeCaret(next);
+      return _tokenizeCaret(next);
     }
     if (next == 0x5B) {
-      return tokenizeOpenSquareBracket(next);
+      return _tokenizeOpenSquareBracket(next);
     }
     if (next == 0x7E) {
-      return tokenizeTilde(next);
+      return _tokenizeTilde(next);
     }
     if (next == 0x5C) {
-      appendTokenOfType(TokenType.BACKSLASH);
+      _appendTokenOfType(TokenType.BACKSLASH);
       return _reader.advance();
     }
     if (next == 0x23) {
-      return tokenizeTag(next);
+      return _tokenizeTag(next);
     }
     if (next == 0x28) {
-      appendBeginToken(TokenType.OPEN_PAREN);
+      _appendBeginToken(TokenType.OPEN_PAREN);
       return _reader.advance();
     }
     if (next == 0x29) {
-      appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN);
+      _appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN);
       return _reader.advance();
     }
     if (next == 0x2C) {
-      appendTokenOfType(TokenType.COMMA);
+      _appendTokenOfType(TokenType.COMMA);
       return _reader.advance();
     }
     if (next == 0x3A) {
-      appendTokenOfType(TokenType.COLON);
+      _appendTokenOfType(TokenType.COLON);
       return _reader.advance();
     }
     if (next == 0x3B) {
-      appendTokenOfType(TokenType.SEMICOLON);
+      _appendTokenOfType(TokenType.SEMICOLON);
       return _reader.advance();
     }
     if (next == 0x3F) {
-      appendTokenOfType(TokenType.QUESTION);
+      _appendTokenOfType(TokenType.QUESTION);
       return _reader.advance();
     }
     if (next == 0x5D) {
-      appendEndToken(TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACKET);
+      _appendEndToken(TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACKET);
       return _reader.advance();
     }
     if (next == 0x60) {
-      appendTokenOfType(TokenType.BACKPING);
+      _appendTokenOfType(TokenType.BACKPING);
       return _reader.advance();
     }
     if (next == 0x7B) {
-      appendBeginToken(TokenType.OPEN_CURLY_BRACKET);
+      _appendBeginToken(TokenType.OPEN_CURLY_BRACKET);
       return _reader.advance();
     }
     if (next == 0x7D) {
-      appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+      _appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
       return _reader.advance();
     }
     if (next == 0x2F) {
-      return tokenizeSlashOrComment(next);
+      return _tokenizeSlashOrComment(next);
     }
     if (next == 0x40) {
-      appendTokenOfType(TokenType.AT);
+      _appendTokenOfType(TokenType.AT);
       return _reader.advance();
     }
     if (next == 0x22 || next == 0x27) {
-      return tokenizeString(next, _reader.offset, false);
+      return _tokenizeString(next, _reader.offset, false);
     }
     if (next == 0x2E) {
-      return tokenizeDotOrNumber(next);
+      return _tokenizeDotOrNumber(next);
     }
     if (next == 0x30) {
-      return tokenizeHexOrNumber(next);
+      return _tokenizeHexOrNumber(next);
     }
     if (0x31 <= next && next <= 0x39) {
-      return tokenizeNumber(next);
+      return _tokenizeNumber(next);
     }
     if (next == -1) {
       return -1;
     }
-    reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
+    _reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
     return _reader.advance();
   }
 
@@ -1100,7 +1115,7 @@
     _lineStarts.add(_reader.offset);
   }
 
-  void appendBeginToken(TokenType type) {
+  void _appendBeginToken(TokenType type) {
     BeginToken token;
     if (_firstComment == null) {
       token = new BeginToken(type, _tokenStart);
@@ -1114,7 +1129,7 @@
     _stackEnd++;
   }
 
-  void appendCommentToken(TokenType type, String value) {
+  void _appendCommentToken(TokenType type, String value) {
     // Ignore comment tokens if client specified that it doesn't need them.
     if (!_preserveComments) {
       return;
@@ -1128,7 +1143,7 @@
     }
   }
 
-  void appendEndToken(TokenType type, TokenType beginType) {
+  void _appendEndToken(TokenType type, TokenType beginType) {
     Token token;
     if (_firstComment == null) {
       token = new Token(type, _tokenStart);
@@ -1147,7 +1162,7 @@
     }
   }
 
-  void appendEofToken() {
+  void _appendEofToken() {
     Token eofToken;
     if (_firstComment == null) {
       eofToken = new Token(TokenType.EOF, _reader.offset + 1);
@@ -1160,11 +1175,11 @@
     eofToken.setNext(eofToken);
     _tail = _tail.setNext(eofToken);
     if (_stackEnd >= 0) {
-      _hasUnmatchedGroups2 = true;
+      _hasUnmatchedGroups = true;
     }
   }
 
-  void appendKeywordToken(Keyword keyword) {
+  void _appendKeywordToken(Keyword keyword) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
     } else {
@@ -1174,7 +1189,7 @@
     }
   }
 
-  void appendStringToken(TokenType type, String value) {
+  void _appendStringToken(TokenType type, String value) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
     } else {
@@ -1184,7 +1199,7 @@
     }
   }
 
-  void appendStringTokenWithOffset(TokenType type, String value, int offset) {
+  void _appendStringTokenWithOffset(TokenType type, String value, int offset) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
     } else {
@@ -1194,7 +1209,7 @@
     }
   }
 
-  void appendTokenOfType(TokenType type) {
+  void _appendTokenOfType(TokenType type) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new Token(type, _tokenStart));
     } else {
@@ -1204,7 +1219,7 @@
     }
   }
 
-  void appendTokenOfTypeWithOffset(TokenType type, int offset) {
+  void _appendTokenOfTypeWithOffset(TokenType type, int offset) {
     if (_firstComment == null) {
       _tail = _tail.setNext(new Token(type, offset));
     } else {
@@ -1214,7 +1229,7 @@
     }
   }
 
-  void beginToken() {
+  void _beginToken() {
     _tokenStart = _reader.offset;
   }
 
@@ -1225,13 +1240,13 @@
    *
    * @return the token to be paired with the closing brace
    */
-  BeginToken findTokenMatchingClosingBraceInInterpolationExpression() {
+  BeginToken _findTokenMatchingClosingBraceInInterpolationExpression() {
     while (_stackEnd >= 0) {
       BeginToken begin = _groupingStack[_stackEnd];
       if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
         return begin;
       }
-      _hasUnmatchedGroups2 = true;
+      _hasUnmatchedGroups = true;
       _groupingStack.removeAt(_stackEnd--);
     }
     //
@@ -1247,103 +1262,103 @@
    * @param errorCode the error code indicating the nature of the error
    * @param arguments any arguments needed to complete the error message
    */
-  void reportError(ScannerErrorCode errorCode, List<Object> arguments) {
+  void _reportError(ScannerErrorCode errorCode, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(source, _reader.offset, 1, errorCode, arguments));
   }
 
-  int select(int choice, TokenType yesType, TokenType noType) {
+  int _select(int choice, TokenType yesType, TokenType noType) {
     int next = _reader.advance();
     if (next == choice) {
-      appendTokenOfType(yesType);
+      _appendTokenOfType(yesType);
       return _reader.advance();
     } else {
-      appendTokenOfType(noType);
+      _appendTokenOfType(noType);
       return next;
     }
   }
 
-  int selectWithOffset(int choice, TokenType yesType, TokenType noType, int offset) {
+  int _selectWithOffset(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = _reader.advance();
     if (next == choice) {
-      appendTokenOfTypeWithOffset(yesType, offset);
+      _appendTokenOfTypeWithOffset(yesType, offset);
       return _reader.advance();
     } else {
-      appendTokenOfTypeWithOffset(noType, offset);
+      _appendTokenOfTypeWithOffset(noType, offset);
       return next;
     }
   }
 
-  int tokenizeAmpersand(int next) {
+  int _tokenizeAmpersand(int next) {
     // && &= &
     next = _reader.advance();
     if (next == 0x26) {
-      appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
+      _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendTokenOfType(TokenType.AMPERSAND_EQ);
+      _appendTokenOfType(TokenType.AMPERSAND_EQ);
       return _reader.advance();
     } else {
-      appendTokenOfType(TokenType.AMPERSAND);
+      _appendTokenOfType(TokenType.AMPERSAND);
       return next;
     }
   }
 
-  int tokenizeBar(int next) {
+  int _tokenizeBar(int next) {
     // | || |=
     next = _reader.advance();
     if (next == 0x7C) {
-      appendTokenOfType(TokenType.BAR_BAR);
+      _appendTokenOfType(TokenType.BAR_BAR);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendTokenOfType(TokenType.BAR_EQ);
+      _appendTokenOfType(TokenType.BAR_EQ);
       return _reader.advance();
     } else {
-      appendTokenOfType(TokenType.BAR);
+      _appendTokenOfType(TokenType.BAR);
       return next;
     }
   }
 
-  int tokenizeCaret(int next) => select(0x3D, TokenType.CARET_EQ, TokenType.CARET);
+  int _tokenizeCaret(int next) => _select(0x3D, TokenType.CARET_EQ, TokenType.CARET);
 
-  int tokenizeDotOrNumber(int next) {
+  int _tokenizeDotOrNumber(int next) {
     int start = _reader.offset;
     next = _reader.advance();
     if (0x30 <= next && next <= 0x39) {
-      return tokenizeFractionPart(next, start);
+      return _tokenizeFractionPart(next, start);
     } else if (0x2E == next) {
-      return select(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
+      return _select(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
     } else {
-      appendTokenOfType(TokenType.PERIOD);
+      _appendTokenOfType(TokenType.PERIOD);
       return next;
     }
   }
 
-  int tokenizeEquals(int next) {
+  int _tokenizeEquals(int next) {
     // = == =>
     next = _reader.advance();
     if (next == 0x3D) {
-      appendTokenOfType(TokenType.EQ_EQ);
+      _appendTokenOfType(TokenType.EQ_EQ);
       return _reader.advance();
     } else if (next == 0x3E) {
-      appendTokenOfType(TokenType.FUNCTION);
+      _appendTokenOfType(TokenType.FUNCTION);
       return _reader.advance();
     }
-    appendTokenOfType(TokenType.EQ);
+    _appendTokenOfType(TokenType.EQ);
     return next;
   }
 
-  int tokenizeExclamation(int next) {
+  int _tokenizeExclamation(int next) {
     // ! !=
     next = _reader.advance();
     if (next == 0x3D) {
-      appendTokenOfType(TokenType.BANG_EQ);
+      _appendTokenOfType(TokenType.BANG_EQ);
       return _reader.advance();
     }
-    appendTokenOfType(TokenType.BANG);
+    _appendTokenOfType(TokenType.BANG);
     return next;
   }
 
-  int tokenizeExponent(int next) {
+  int _tokenizeExponent(int next) {
     if (next == 0x2B || next == 0x2D) {
       next = _reader.advance();
     }
@@ -1353,7 +1368,7 @@
         hasDigits = true;
       } else {
         if (!hasDigits) {
-          reportError(ScannerErrorCode.MISSING_DIGIT, []);
+          _reportError(ScannerErrorCode.MISSING_DIGIT, []);
         }
         return next;
       }
@@ -1361,7 +1376,7 @@
     }
   }
 
-  int tokenizeFractionPart(int next, int start) {
+  int _tokenizeFractionPart(int next, int start) {
     bool done = false;
     bool hasDigit = false;
     LOOP: while (!done) {
@@ -1369,7 +1384,7 @@
         hasDigit = true;
       } else if (0x65 == next || 0x45 == next) {
         hasDigit = true;
-        next = tokenizeExponent(_reader.advance());
+        next = _tokenizeExponent(_reader.advance());
         done = true;
         continue LOOP;
       } else {
@@ -1379,39 +1394,39 @@
       next = _reader.advance();
     }
     if (!hasDigit) {
-      appendStringToken(TokenType.INT, _reader.getString(start, -2));
+      _appendStringToken(TokenType.INT, _reader.getString(start, -2));
       if (0x2E == next) {
-        return selectWithOffset(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, _reader.offset - 1);
+        return _selectWithOffset(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, _reader.offset - 1);
       }
-      appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
+      _appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
       return bigSwitch(next);
     }
-    appendStringToken(TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
+    _appendStringToken(TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
     return next;
   }
 
-  int tokenizeGreaterThan(int next) {
+  int _tokenizeGreaterThan(int next) {
     // > >= >> >>=
     next = _reader.advance();
     if (0x3D == next) {
-      appendTokenOfType(TokenType.GT_EQ);
+      _appendTokenOfType(TokenType.GT_EQ);
       return _reader.advance();
     } else if (0x3E == next) {
       next = _reader.advance();
       if (0x3D == next) {
-        appendTokenOfType(TokenType.GT_GT_EQ);
+        _appendTokenOfType(TokenType.GT_GT_EQ);
         return _reader.advance();
       } else {
-        appendTokenOfType(TokenType.GT_GT);
+        _appendTokenOfType(TokenType.GT_GT);
         return next;
       }
     } else {
-      appendTokenOfType(TokenType.GT);
+      _appendTokenOfType(TokenType.GT);
       return next;
     }
   }
 
-  int tokenizeHex(int next) {
+  int _tokenizeHex(int next) {
     int start = _reader.offset - 1;
     bool hasDigits = false;
     while (true) {
@@ -1420,53 +1435,53 @@
         hasDigits = true;
       } else {
         if (!hasDigits) {
-          reportError(ScannerErrorCode.MISSING_HEX_DIGIT, []);
+          _reportError(ScannerErrorCode.MISSING_HEX_DIGIT, []);
         }
-        appendStringToken(TokenType.HEXADECIMAL, _reader.getString(start, next < 0 ? 0 : -1));
+        _appendStringToken(TokenType.HEXADECIMAL, _reader.getString(start, next < 0 ? 0 : -1));
         return next;
       }
     }
   }
 
-  int tokenizeHexOrNumber(int next) {
+  int _tokenizeHexOrNumber(int next) {
     int x = _reader.peek();
     if (x == 0x78 || x == 0x58) {
       _reader.advance();
-      return tokenizeHex(x);
+      return _tokenizeHex(x);
     }
-    return tokenizeNumber(next);
+    return _tokenizeNumber(next);
   }
 
-  int tokenizeIdentifier(int next, int start, bool allowDollar) {
+  int _tokenizeIdentifier(int next, int start, bool allowDollar) {
     while ((0x61 <= next && next <= 0x7A) || (0x41 <= next && next <= 0x5A) || (0x30 <= next && next <= 0x39) || next == 0x5F || (next == 0x24 && allowDollar)) {
       next = _reader.advance();
     }
-    appendStringToken(TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
+    _appendStringToken(TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
     return next;
   }
 
-  int tokenizeInterpolatedExpression(int next, int start) {
-    appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
+  int _tokenizeInterpolatedExpression(int next, int start) {
+    _appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
     next = _reader.advance();
     while (next != -1) {
       if (next == 0x7D) {
-        BeginToken begin = findTokenMatchingClosingBraceInInterpolationExpression();
+        BeginToken begin = _findTokenMatchingClosingBraceInInterpolationExpression();
         if (begin == null) {
-          beginToken();
-          appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
+          _beginToken();
+          _appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
           next = _reader.advance();
-          beginToken();
+          _beginToken();
           return next;
         } else if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET)) {
-          beginToken();
-          appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+          _beginToken();
+          _appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
           next = _reader.advance();
-          beginToken();
+          _beginToken();
         } else if (identical(begin.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
-          beginToken();
-          appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.STRING_INTERPOLATION_EXPRESSION);
+          _beginToken();
+          _appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.STRING_INTERPOLATION_EXPRESSION);
           next = _reader.advance();
-          beginToken();
+          _beginToken();
           return next;
         }
       } else {
@@ -1477,21 +1492,21 @@
       return next;
     }
     next = _reader.advance();
-    beginToken();
+    _beginToken();
     return next;
   }
 
-  int tokenizeInterpolatedIdentifier(int next, int start) {
-    appendStringTokenWithOffset(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
+  int _tokenizeInterpolatedIdentifier(int next, int start) {
+    _appendStringTokenWithOffset(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
     if ((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || next == 0x5F) {
-      beginToken();
-      next = tokenizeKeywordOrIdentifier(next, false);
+      _beginToken();
+      next = _tokenizeKeywordOrIdentifier(next, false);
     }
-    beginToken();
+    _beginToken();
     return next;
   }
 
-  int tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
+  int _tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
     KeywordState state = KeywordState.KEYWORD_STATE;
     int start = _reader.offset;
     while (state != null && 0x61 <= next && next <= 0x7A) {
@@ -1499,61 +1514,61 @@
       next = _reader.advance();
     }
     if (state == null || state.keyword() == null) {
-      return tokenizeIdentifier(next, start, allowDollar);
+      return _tokenizeIdentifier(next, start, allowDollar);
     }
     if ((0x41 <= next && next <= 0x5A) || (0x30 <= next && next <= 0x39) || next == 0x5F || next == 0x24) {
-      return tokenizeIdentifier(next, start, allowDollar);
+      return _tokenizeIdentifier(next, start, allowDollar);
     } else if (next < 128) {
-      appendKeywordToken(state.keyword());
+      _appendKeywordToken(state.keyword());
       return next;
     } else {
-      return tokenizeIdentifier(next, start, allowDollar);
+      return _tokenizeIdentifier(next, start, allowDollar);
     }
   }
 
-  int tokenizeLessThan(int next) {
+  int _tokenizeLessThan(int next) {
     // < <= << <<=
     next = _reader.advance();
     if (0x3D == next) {
-      appendTokenOfType(TokenType.LT_EQ);
+      _appendTokenOfType(TokenType.LT_EQ);
       return _reader.advance();
     } else if (0x3C == next) {
-      return select(0x3D, TokenType.LT_LT_EQ, TokenType.LT_LT);
+      return _select(0x3D, TokenType.LT_LT_EQ, TokenType.LT_LT);
     } else {
-      appendTokenOfType(TokenType.LT);
+      _appendTokenOfType(TokenType.LT);
       return next;
     }
   }
 
-  int tokenizeMinus(int next) {
+  int _tokenizeMinus(int next) {
     // - -- -=
     next = _reader.advance();
     if (next == 0x2D) {
-      appendTokenOfType(TokenType.MINUS_MINUS);
+      _appendTokenOfType(TokenType.MINUS_MINUS);
       return _reader.advance();
     } else if (next == 0x3D) {
-      appendTokenOfType(TokenType.MINUS_EQ);
+      _appendTokenOfType(TokenType.MINUS_EQ);
       return _reader.advance();
     } else {
-      appendTokenOfType(TokenType.MINUS);
+      _appendTokenOfType(TokenType.MINUS);
       return next;
     }
   }
 
-  int tokenizeMultiLineComment(int next) {
+  int _tokenizeMultiLineComment(int next) {
     int nesting = 1;
     next = _reader.advance();
     while (true) {
       if (-1 == next) {
-        reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, []);
-        appendCommentToken(TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        _reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, []);
+        _appendCommentToken(TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
         return next;
       } else if (0x2A == next) {
         next = _reader.advance();
         if (0x2F == next) {
           --nesting;
           if (0 == nesting) {
-            appendCommentToken(TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+            _appendCommentToken(TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
             return _reader.advance();
           } else {
             next = _reader.advance();
@@ -1580,7 +1595,7 @@
     }
   }
 
-  int tokenizeMultiLineRawString(int quoteChar, int start) {
+  int _tokenizeMultiLineRawString(int quoteChar, int start) {
     int next = _reader.advance();
     outer: while (next != -1) {
       while (next != quoteChar) {
@@ -1602,26 +1617,26 @@
       if (next == quoteChar) {
         next = _reader.advance();
         if (next == quoteChar) {
-          appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
           return _reader.advance();
         }
       }
     }
-    reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
 
-  int tokenizeMultiLineString(int quoteChar, int start, bool raw) {
+  int _tokenizeMultiLineString(int quoteChar, int start, bool raw) {
     if (raw) {
-      return tokenizeMultiLineRawString(quoteChar, start);
+      return _tokenizeMultiLineRawString(quoteChar, start);
     }
     int next = _reader.advance();
     while (next != -1) {
       if (next == 0x24) {
-        appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        beginToken();
-        next = tokenizeStringInterpolation(start);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        _beginToken();
+        next = _tokenizeStringInterpolation(start);
         start = _reader.offset;
         continue;
       }
@@ -1630,7 +1645,7 @@
         if (next == quoteChar) {
           next = _reader.advance();
           if (next == quoteChar) {
-            appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+            _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
             return _reader.advance();
           }
         }
@@ -1666,179 +1681,179 @@
         next = _reader.advance();
       }
     }
-    reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
 
-  int tokenizeMultiply(int next) => select(0x3D, TokenType.STAR_EQ, TokenType.STAR);
+  int _tokenizeMultiply(int next) => _select(0x3D, TokenType.STAR_EQ, TokenType.STAR);
 
-  int tokenizeNumber(int next) {
+  int _tokenizeNumber(int next) {
     int start = _reader.offset;
     while (true) {
       next = _reader.advance();
       if (0x30 <= next && next <= 0x39) {
         continue;
       } else if (next == 0x2E) {
-        return tokenizeFractionPart(_reader.advance(), start);
+        return _tokenizeFractionPart(_reader.advance(), start);
       } else if (next == 0x65 || next == 0x45) {
-        return tokenizeFractionPart(next, start);
+        return _tokenizeFractionPart(next, start);
       } else {
-        appendStringToken(TokenType.INT, _reader.getString(start, next < 0 ? 0 : -1));
+        _appendStringToken(TokenType.INT, _reader.getString(start, next < 0 ? 0 : -1));
         return next;
       }
     }
   }
 
-  int tokenizeOpenSquareBracket(int next) {
+  int _tokenizeOpenSquareBracket(int next) {
     // [ []  []=
     next = _reader.advance();
     if (next == 0x5D) {
-      return select(0x3D, TokenType.INDEX_EQ, TokenType.INDEX);
+      return _select(0x3D, TokenType.INDEX_EQ, TokenType.INDEX);
     } else {
-      appendBeginToken(TokenType.OPEN_SQUARE_BRACKET);
+      _appendBeginToken(TokenType.OPEN_SQUARE_BRACKET);
       return next;
     }
   }
 
-  int tokenizePercent(int next) => select(0x3D, TokenType.PERCENT_EQ, TokenType.PERCENT);
+  int _tokenizePercent(int next) => _select(0x3D, TokenType.PERCENT_EQ, TokenType.PERCENT);
 
-  int tokenizePlus(int next) {
+  int _tokenizePlus(int next) {
     // + ++ +=
     next = _reader.advance();
     if (0x2B == next) {
-      appendTokenOfType(TokenType.PLUS_PLUS);
+      _appendTokenOfType(TokenType.PLUS_PLUS);
       return _reader.advance();
     } else if (0x3D == next) {
-      appendTokenOfType(TokenType.PLUS_EQ);
+      _appendTokenOfType(TokenType.PLUS_EQ);
       return _reader.advance();
     } else {
-      appendTokenOfType(TokenType.PLUS);
+      _appendTokenOfType(TokenType.PLUS);
       return next;
     }
   }
 
-  int tokenizeSingleLineComment(int next) {
+  int _tokenizeSingleLineComment(int next) {
     while (true) {
       next = _reader.advance();
       if (-1 == next) {
-        appendCommentToken(TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        _appendCommentToken(TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, 0));
         return next;
       } else if (0xA == next || 0xD == next) {
-        appendCommentToken(TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, -1));
+        _appendCommentToken(TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, -1));
         return next;
       }
     }
   }
 
-  int tokenizeSingleLineRawString(int next, int quoteChar, int start) {
+  int _tokenizeSingleLineRawString(int next, int quoteChar, int start) {
     next = _reader.advance();
     while (next != -1) {
       if (next == quoteChar) {
-        appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
         return _reader.advance();
       } else if (next == 0xD || next == 0xA) {
-        reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
         return _reader.advance();
       }
       next = _reader.advance();
     }
-    reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
 
-  int tokenizeSingleLineString(int next, int quoteChar, int start) {
+  int _tokenizeSingleLineString(int next, int quoteChar, int start) {
     while (next != quoteChar) {
       if (next == 0x5C) {
         next = _reader.advance();
       } else if (next == 0x24) {
-        appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        beginToken();
-        next = tokenizeStringInterpolation(start);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        _beginToken();
+        next = _tokenizeStringInterpolation(start);
         start = _reader.offset;
         continue;
       }
       if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) {
-        reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
         return _reader.advance();
       }
       next = _reader.advance();
     }
-    appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
 
-  int tokenizeSlashOrComment(int next) {
+  int _tokenizeSlashOrComment(int next) {
     next = _reader.advance();
     if (0x2A == next) {
-      return tokenizeMultiLineComment(next);
+      return _tokenizeMultiLineComment(next);
     } else if (0x2F == next) {
-      return tokenizeSingleLineComment(next);
+      return _tokenizeSingleLineComment(next);
     } else if (0x3D == next) {
-      appendTokenOfType(TokenType.SLASH_EQ);
+      _appendTokenOfType(TokenType.SLASH_EQ);
       return _reader.advance();
     } else {
-      appendTokenOfType(TokenType.SLASH);
+      _appendTokenOfType(TokenType.SLASH);
       return next;
     }
   }
 
-  int tokenizeString(int next, int start, bool raw) {
+  int _tokenizeString(int next, int start, bool raw) {
     int quoteChar = next;
     next = _reader.advance();
     if (quoteChar == next) {
       next = _reader.advance();
       if (quoteChar == next) {
         // Multiline string.
-        return tokenizeMultiLineString(quoteChar, start, raw);
+        return _tokenizeMultiLineString(quoteChar, start, raw);
       } else {
         // Empty string.
-        appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
         return next;
       }
     }
     if (raw) {
-      return tokenizeSingleLineRawString(next, quoteChar, start);
+      return _tokenizeSingleLineRawString(next, quoteChar, start);
     } else {
-      return tokenizeSingleLineString(next, quoteChar, start);
+      return _tokenizeSingleLineString(next, quoteChar, start);
     }
   }
 
-  int tokenizeStringInterpolation(int start) {
-    beginToken();
+  int _tokenizeStringInterpolation(int start) {
+    _beginToken();
     int next = _reader.advance();
     if (next == 0x7B) {
-      return tokenizeInterpolatedExpression(next, start);
+      return _tokenizeInterpolatedExpression(next, start);
     } else {
-      return tokenizeInterpolatedIdentifier(next, start);
+      return _tokenizeInterpolatedIdentifier(next, start);
     }
   }
 
-  int tokenizeTag(int next) {
+  int _tokenizeTag(int next) {
     // # or #!.*[\n\r]
     if (_reader.offset == 0) {
       if (_reader.peek() == 0x21) {
         do {
           next = _reader.advance();
         } while (next != 0xA && next != 0xD && next > 0);
-        appendStringToken(TokenType.SCRIPT_TAG, _reader.getString(_tokenStart, 0));
+        _appendStringToken(TokenType.SCRIPT_TAG, _reader.getString(_tokenStart, 0));
         return next;
       }
     }
-    appendTokenOfType(TokenType.HASH);
+    _appendTokenOfType(TokenType.HASH);
     return _reader.advance();
   }
 
-  int tokenizeTilde(int next) {
+  int _tokenizeTilde(int next) {
     // ~ ~/ ~/=
     next = _reader.advance();
     if (next == 0x2F) {
-      return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
+      return _select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
     } else {
-      appendTokenOfType(TokenType.TILDE);
+      _appendTokenOfType(TokenType.TILDE);
       return next;
     }
   }
@@ -1852,7 +1867,7 @@
   /**
    * The lexeme represented by this token.
    */
-  String _value2;
+  String _value;
 
   /**
    * Initialize a newly created token to represent a token of the given type with the given value.
@@ -1862,14 +1877,17 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    */
   StringToken(TokenType type, String value, int offset) : super(type, offset) {
-    this._value2 = StringUtilities.intern(value);
+    this._value = StringUtilities.intern(value);
   }
 
-  Token copy() => new StringToken(type, _value2, offset);
+  @override
+  Token copy() => new StringToken(type, _value, offset);
 
-  String get lexeme => _value2;
+  @override
+  String get lexeme => _value;
 
-  String value() => _value2;
+  @override
+  String value() => _value;
 }
 
 /**
@@ -1894,8 +1912,10 @@
     this._precedingComment = precedingComment;
   }
 
+  @override
   Token copy() => new TokenWithComment(type, offset, _precedingComment);
 
+  @override
   Token get precedingComments => _precedingComment;
 }
 
@@ -2004,6 +2024,21 @@
   bool get isUserDefinableOperator => type.isUserDefinableOperator;
 
   /**
+   * Return `true` if this token has any one of the given types.
+   *
+   * @param types the types of token that are being tested for
+   * @return `true` if this token has any of the given types
+   */
+  bool matchesAny(List<TokenType> types) {
+    for (TokenType type in types) {
+      if (identical(this.type, type)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Set the next token in the token stream to the given token. This has the side-effect of setting
    * this token to be the previous token for the given token.
    *
@@ -2028,6 +2063,7 @@
     return token;
   }
 
+  @override
   String toString() => lexeme;
 
   /**
@@ -2138,10 +2174,13 @@
     this._precedingComment = precedingComment;
   }
 
+  @override
   Token copy() => new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
 
+  @override
   Token get precedingComments => _precedingComment;
 
+  @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -2169,10 +2208,13 @@
    */
   KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
 
+  @override
   Token copy() => new KeywordToken(keyword, offset);
 
+  @override
   String get lexeme => keyword.syntax;
 
+  @override
   Keyword value() => keyword;
 }
 
@@ -2196,6 +2238,7 @@
     assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)));
   }
 
+  @override
   Token copy() => new BeginToken(type, offset);
 }
 
@@ -2344,10 +2387,13 @@
     this._precedingComment = precedingComment;
   }
 
+  @override
   Token copy() => new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
 
+  @override
   Token get precedingComments => _precedingComment;
 
+  @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
     Token token = _precedingComment;
@@ -2700,5 +2746,6 @@
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
 
+  @override
   String toString() => "-eof-";
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 46fe71d..b16e31d 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -138,19 +138,25 @@
     this._shortName = name;
   }
 
+  @override
   String get shortName => _shortName;
 
+  @override
   bool get isDart2JsLibrary => (_platforms & DART2JS_PLATFORM) != 0;
 
+  @override
   bool get isDocumented => _documented;
 
+  @override
   bool get isImplementation => _implementation;
 
+  @override
   bool get isInternal => "Internal" == category;
 
   /**
    * Return `true` if library can be used for both client and server
    */
+  @override
   bool get isShared => category == "Shared";
 
   /**
@@ -158,6 +164,7 @@
    *
    * @return `true` if this library can be run on the VM
    */
+  @override
   bool get isVmLibrary => (_platforms & VM_PLATFORM) != 0;
 
   /**
@@ -262,6 +269,7 @@
    */
   LibraryMap get librariesMap => _librariesMap;
 
+  @override
   Object visitMapLiteralEntry(MapLiteralEntry node) {
     String libraryName = null;
     Expression key = node.key;
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 58abe3d..afbf270 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -173,19 +173,12 @@
    * Initialize a newly created SDK to represent the Dart SDK installed in the given directory.
    *
    * @param sdkDirectory the directory containing the SDK
-   */
-  DirectoryBasedDartSdk(JavaFile sdkDirectory) : this.con1(sdkDirectory, false);
-
-  /**
-   * Initialize a newly created SDK to represent the Dart SDK installed in the given directory.
-   *
-   * @param sdkDirectory the directory containing the SDK
    * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
    */
-  DirectoryBasedDartSdk.con1(JavaFile sdkDirectory, bool useDart2jsPaths) {
+  DirectoryBasedDartSdk(JavaFile sdkDirectory, [bool useDart2jsPaths = false]) {
     this._sdkDirectory = sdkDirectory.getAbsoluteFile();
-    initializeSdk();
-    initializeLibraryMap(useDart2jsPaths);
+    _initializeSdk();
+    _initializeLibraryMap(useDart2jsPaths);
     _analysisContext = new AnalysisContextImpl();
     _analysisContext.sourceFactory = new SourceFactory([new DartUriResolver(this)]);
     List<String> uris = this.uris;
@@ -196,8 +189,10 @@
     _analysisContext.applyChanges(changeSet);
   }
 
+  @override
   Source fromEncoding(UriKind kind, Uri uri) => new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
 
+  @override
   AnalysisContext get context => _analysisContext;
 
   /**
@@ -276,8 +271,10 @@
     return file.exists() ? file : null;
   }
 
+  @override
   List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries;
 
+  @override
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
 
   /**
@@ -286,6 +283,7 @@
    *
    * @return the revision number of this SDK
    */
+  @override
   String get sdkVersion {
     if (_sdkVersion == null) {
       _sdkVersion = DartSdk.DEFAULT_VERSION;
@@ -306,6 +304,7 @@
    *
    * @return the library URI's for the libraries defined in this SDK
    */
+  @override
   List<String> get uris => _libraryMap.uris;
 
   /**
@@ -337,6 +336,7 @@
    */
   bool get isDartiumInstalled => dartiumExecutable != null;
 
+  @override
   Source mapDartUri(String dartUri) {
     SdkLibrary library = getSdkLibrary(dartUri);
     if (library == null) {
@@ -349,7 +349,7 @@
    * Ensure that the dart VM is executable. If it is not, make it executable and log that it was
    * necessary for us to do so.
    */
-  void ensureVmIsExecutable() {
+  void _ensureVmIsExecutable() {
   }
 
   /**
@@ -385,7 +385,7 @@
    *
    * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
    */
-  void initializeLibraryMap(bool useDart2jsPaths) {
+  void _initializeLibraryMap(bool useDart2jsPaths) {
     JavaFile librariesFile = new JavaFile.relative(new JavaFile.relative(libraryDirectory, _INTERNAL_DIR), _LIBRARIES_FILE);
     try {
       String contents = librariesFile.readAsStringSync();
@@ -399,9 +399,9 @@
   /**
    * Initialize the state of the SDK.
    */
-  void initializeSdk() {
+  void _initializeSdk() {
     if (!OSUtilities.isWindows()) {
-      ensureVmIsExecutable();
+      _ensureVmIsExecutable();
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 3a2cf31..288677b 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -42,14 +42,17 @@
 }
 
 class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => false;
 }
 
 class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => true;
 }
 
 class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
 }
 
@@ -93,7 +96,7 @@
     try {
       Uri uri = parseUriWithException(absoluteUri);
       if (uri.isAbsolute) {
-        return internalResolveUri(null, uri);
+        return _internalResolveUri(null, uri);
       }
     } on URISyntaxException catch (exception) {
     }
@@ -171,7 +174,7 @@
     }
     try {
       // Force the creation of an escaped URI to deal with spaces, etc.
-      return internalResolveUri(containingSource, parseUriWithException(containedUri));
+      return _internalResolveUri(containingSource, parseUriWithException(containedUri));
     } on URISyntaxException catch (exception) {
       return null;
     }
@@ -212,7 +215,7 @@
    * @param containedUri the (possibly relative) URI to be resolved against the containing source
    * @return the source representing the contained URI
    */
-  Source internalResolveUri(Source containingSource, Uri containedUri) {
+  Source _internalResolveUri(Source containingSource, Uri containedUri) {
     if (containedUri.isAbsolute) {
       for (UriResolver resolver in _resolvers) {
         Source result = resolver.resolveAbsolute(containedUri);
@@ -283,6 +286,7 @@
    *         this source
    * @see Object#equals(Object)
    */
+  @override
   bool operator ==(Object object);
 
   /**
@@ -309,18 +313,6 @@
   TimestampedData<String> get contents;
 
   /**
-   * Get the contents of this source and pass it to the given content receiver.
-   *
-   * Clients should consider using the the method
-   * [AnalysisContext#getContentsToReceiver] because contexts can have local
-   * overrides of the content of a source that the source is not aware of.
-   *
-   * @param receiver the content receiver to which the content of this source will be passed
-   * @throws Exception if the contents of this source could not be accessed
-   */
-  void getContentsToReceiver(Source_ContentReceiver receiver);
-
-  /**
    * Return an encoded representation of this source that can be used to create a source that is
    * equal to this source.
    *
@@ -377,6 +369,7 @@
    * @return a hash code for this source
    * @see Object#hashCode()
    */
+  @override
   int get hashCode;
 
   /**
@@ -570,6 +563,7 @@
     return otherRange.contains(thisEnd);
   }
 
+  @override
   bool operator ==(Object obj) {
     if (obj is! SourceRange) {
       return false;
@@ -599,6 +593,7 @@
    */
   SourceRange getTranslated(int delta) => new SourceRange(offset + delta, length);
 
+  @override
   int get hashCode => 31 * offset + length;
 
   /**
@@ -622,6 +617,7 @@
    */
   bool startsIn(SourceRange otherRange) => otherRange.contains(offset);
 
+  @override
   String toString() {
     JavaStringBuilder builder = new JavaStringBuilder();
     builder.append("[offset=");
@@ -683,6 +679,7 @@
     this._sdk = sdk;
   }
 
+  @override
   Source fromEncoding(UriKind kind, Uri uri) {
     if (identical(kind, UriKind.DART_URI)) {
       return _sdk.fromEncoding(kind, uri);
@@ -697,6 +694,7 @@
    */
   DartSdk get dartSdk => _sdk;
 
+  @override
   Source resolveAbsolute(Uri uri) {
     if (!isDartUri(uri)) {
       return null;
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 640903d..711d7fe 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -45,14 +45,17 @@
 }
 
 class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => false;
 }
 
 class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => true;
 }
 
 class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
   bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
 }
 
@@ -94,10 +97,13 @@
     this._uriKind = uriKind;
   }
 
+  @override
   bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && _file == (object as FileBasedSource)._file;
 
+  @override
   bool exists() => _file.isFile();
 
+  @override
   TimestampedData<String> get contents {
     TimeCounter_TimeCounterHandle handle = PerformanceStatistics.io.start();
     try {
@@ -107,15 +113,7 @@
     }
   }
 
-  void getContentsToReceiver(Source_ContentReceiver receiver) {
-    TimeCounter_TimeCounterHandle handle = PerformanceStatistics.io.start();
-    try {
-      getContentsFromFileToReceiver(receiver);
-    } finally {
-      handle.stop();
-    }
-  }
-
+  @override
   String get encoding {
     if (_encoding == null) {
       _encoding = "${_uriKind.encoding}${_file.toURI().toString()}";
@@ -123,18 +121,25 @@
     return _encoding;
   }
 
+  @override
   String get fullName => _file.getAbsolutePath();
 
+  @override
   int get modificationStamp => _file.lastModified();
 
+  @override
   String get shortName => _file.getName();
 
+  @override
   UriKind get uriKind => _uriKind;
 
+  @override
   int get hashCode => _file.hashCode;
 
+  @override
   bool get isInSystemLibrary => identical(_uriKind, UriKind.DART_URI);
 
+  @override
   Source resolveRelative(Uri containedUri) {
     try {
       Uri resolvedUri = file.toURI().resolveUri(containedUri);
@@ -144,6 +149,7 @@
     return null;
   }
 
+  @override
   String toString() {
     if (_file == null) {
       return "<unknown source>";
@@ -167,17 +173,6 @@
   }
 
   /**
-   * Get the contents of underlying file and pass it to the given receiver.
-   *
-   * @param receiver the content receiver to which the content of this source will be passed
-   * @throws Exception if the contents of this source could not be accessed
-   * @see #getContentsToReceiver(ContentReceiver)
-   */
-  void getContentsFromFileToReceiver(Source_ContentReceiver receiver) {
-    throw new UnsupportedOperationException();
-  }
-
-  /**
    * Return the file represented by this source. This is an internal method that is only intended to
    * be used by subclasses of [UriResolver] that are designed to work with file-based sources.
    *
@@ -232,6 +227,7 @@
     this._packagesDirectories = packagesDirectories;
   }
 
+  @override
   Source fromEncoding(UriKind kind, Uri uri) {
     if (identical(kind, UriKind.PACKAGE_SELF_URI) || identical(kind, UriKind.PACKAGE_URI)) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
@@ -239,6 +235,7 @@
     return null;
   }
 
+  @override
   Source resolveAbsolute(Uri uri) {
     if (!isPackageUri(uri)) {
       return null;
@@ -269,13 +266,14 @@
       JavaFile resolvedFile = new JavaFile.relative(packagesDirectory, path);
       if (resolvedFile.exists()) {
         JavaFile canonicalFile = getCanonicalFile(packagesDirectory, pkgName, relPath);
-        UriKind uriKind = isSelfReference(packagesDirectory, canonicalFile) ? UriKind.PACKAGE_SELF_URI : UriKind.PACKAGE_URI;
+        UriKind uriKind = _isSelfReference(packagesDirectory, canonicalFile) ? UriKind.PACKAGE_SELF_URI : UriKind.PACKAGE_URI;
         return new FileBasedSource.con2(canonicalFile, uriKind);
       }
     }
     return new FileBasedSource.con2(getCanonicalFile(_packagesDirectories[0], pkgName, relPath), UriKind.PACKAGE_URI);
   }
 
+  @override
   Uri restoreAbsolute(Source source) {
     if (source is FileBasedSource) {
       String sourcePath = source.file.getPath();
@@ -326,7 +324,7 @@
    * @return `true` if "file" was found in "packagesDir", and it is part of the "lib" folder
    *         of the application that contains in this "packagesDir".
    */
-  bool isSelfReference(JavaFile packagesDir, JavaFile file) {
+  bool _isSelfReference(JavaFile packagesDir, JavaFile file) {
     JavaFile rootDir = packagesDir.getParentFile();
     if (rootDir == null) {
       return false;
@@ -349,7 +347,7 @@
    * @param path the path to which the file separator is to be added
    * @return a path that ends with the system file separator
    */
-  static String appendFileSeparator(String path) {
+  static String _appendFileSeparator(String path) {
     if (path == null || path.length <= 0 || path.codeUnitAt(path.length - 1) == JavaFile.separatorChar) {
       return path;
     }
@@ -378,11 +376,13 @@
    * @param path the path (not `null` and not empty)
    */
   DirectoryBasedSourceContainer.con2(String path) {
-    this._path = appendFileSeparator(path);
+    this._path = _appendFileSeparator(path);
   }
 
+  @override
   bool contains(Source source) => source.fullName.startsWith(_path);
 
+  @override
   bool operator ==(Object obj) => (obj is DirectoryBasedSourceContainer) && obj.path == path;
 
   /**
@@ -392,8 +392,10 @@
    */
   String get path => _path;
 
+  @override
   int get hashCode => _path.hashCode;
 
+  @override
   String toString() => "SourceContainer[${_path}]";
 }
 
@@ -414,6 +416,7 @@
    */
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
 
+  @override
   Source fromEncoding(UriKind kind, Uri uri) {
     if (identical(kind, UriKind.FILE_URI)) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
@@ -421,6 +424,7 @@
     return null;
   }
 
+  @override
   Source resolveAbsolute(Uri uri) {
     if (!isFileUri(uri)) {
       return null;
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 6a74d97..b8b7890 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -24,7 +24,7 @@
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
   static bool get(int array, int index) {
-    checkIndex(index);
+    _checkIndex(index);
     return (array & (1 << index)) > 0;
   }
 
@@ -48,7 +48,7 @@
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
   static int set(int array, int index, bool value) {
-    checkIndex(index);
+    _checkIndex(index);
     if (value) {
       return array | (1 << index);
     } else {
@@ -73,7 +73,7 @@
    *
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static void checkIndex(int index) {
+  static void _checkIndex(int index) {
     if (index < 0 || index > 30) {
       throw new RangeError("Index not between 0 and 30: ${index}");
     }
@@ -112,6 +112,333 @@
 }
 
 /**
+ * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
+ * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
+ * edge from any node to any other node, including itself, but will not represent multiple edges
+ * between the same pair of nodes.
+ *
+ * @param N the type of the nodes in the graph
+ */
+class DirectedGraph<N> {
+  /**
+   * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
+   * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
+   * the node to an empty set of tails.
+   */
+  Map<N, Set<N>> _edges = new Map<N, Set<N>>();
+
+  /**
+   * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
+   * graph after this method is invoked, whether or not they were before.
+   *
+   * @param head the node at the head of the edge
+   * @param tail the node at the tail of the edge
+   */
+  void addEdge(N head, N tail) {
+    //
+    // First, ensure that the tail is a node known to the graph.
+    //
+    if (_edges[tail] == null) {
+      _edges[tail] = new Set<N>();
+    }
+    //
+    // Then create the edge.
+    //
+    Set<N> tails = _edges[head];
+    if (tails == null) {
+      tails = new Set<N>();
+      _edges[head] = tails;
+    }
+    tails.add(tail);
+  }
+
+  /**
+   * Add the given node to the set of nodes in the graph.
+   *
+   * @param node the node to be added
+   */
+  void addNode(N node) {
+    Set<N> tails = _edges[node];
+    if (tails == null) {
+      _edges[node] = new Set<N>();
+    }
+  }
+
+  /**
+   * Return a list of nodes that form a cycle, or `null` if there are no cycles in this graph.
+   *
+   * @return a list of nodes that form a cycle
+   */
+  List<N> findCycle() => null;
+
+  /**
+   * Return a list of nodes that form a cycle containing the given node. If the node is not part of
+   * this graph, then a list containing only the node itself will be returned.
+   *
+   * @return a list of nodes that form a cycle containing the given node
+   */
+  List<N> findCycleContaining(N node) {
+    if (node == null) {
+      throw new IllegalArgumentException();
+    }
+    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
+    return finder.componentContaining(node);
+  }
+
+  /**
+   * Return the number of nodes in this graph.
+   *
+   * @return the number of nodes in this graph
+   */
+  int get nodeCount => _edges.length;
+
+  /**
+   * Return a set containing the tails of edges that have the given node as their head. The set will
+   * be empty if there are no such edges or if the node is not part of the graph. Clients must not
+   * modify the returned set.
+   *
+   * @param head the node at the head of all of the edges whose tails are to be returned
+   * @return a set containing the tails of edges that have the given node as their head
+   */
+  Set<N> getTails(N head) {
+    Set<N> tails = _edges[head];
+    if (tails == null) {
+      return new Set<N>();
+    }
+    return tails;
+  }
+
+  /**
+   * Return `true` if this graph is empty.
+   *
+   * @return `true` if this graph is empty
+   */
+  bool get isEmpty => _edges.isEmpty;
+
+  /**
+   * Remove all of the given nodes from this graph. As a consequence, any edges for which those
+   * nodes were either a head or a tail will also be removed.
+   *
+   * @param nodes the nodes to be removed
+   */
+  void removeAllNodes(List<N> nodes) {
+    for (N node in nodes) {
+      removeNode(node);
+    }
+  }
+
+  /**
+   * Remove the edge from the given head node to the given tail node. If there was no such edge then
+   * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
+   * the same (neither node will either be added or removed).
+   *
+   * @param head the node at the head of the edge
+   * @param tail the node at the tail of the edge
+   * @return `true` if the graph was modified as a result of this operation
+   */
+  void removeEdge(N head, N tail) {
+    Set<N> tails = _edges[head];
+    if (tails != null) {
+      tails.remove(tail);
+    }
+  }
+
+  /**
+   * Remove the given node from this graph. As a consequence, any edges for which that node was
+   * either a head or a tail will also be removed.
+   *
+   * @param node the node to be removed
+   */
+  void removeNode(N node) {
+    _edges.remove(node);
+    for (Set<N> tails in _edges.values) {
+      tails.remove(node);
+    }
+  }
+
+  /**
+   * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
+   * are no edges that have that node as the head of the edge) and remove it from this graph. Return
+   * the node that was removed, or `null` if there are no such nodes either because the graph
+   * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
+   * removing the node from the graph any edges for which that node was a tail will also be removed.
+   *
+   * @return the sink node that was removed
+   */
+  N removeSink() {
+    N sink = _findSink();
+    if (sink == null) {
+      return null;
+    }
+    removeNode(sink);
+    return sink;
+  }
+
+  /**
+   * Return one node that has no outgoing edges (that is, for which there are no edges that have
+   * that node as the head of the edge), or `null` if there are no such nodes.
+   *
+   * @return a sink node
+   */
+  N _findSink() {
+    for (N key in _edges.keys) {
+      if (_edges[key].isEmpty) return key;
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `NodeInfo` are used by the [SccFinder] to maintain
+ * information about the nodes that have been examined.
+ *
+ * @param N the type of the nodes corresponding to the entries
+ */
+class DirectedGraph_NodeInfo<N> {
+  /**
+   * The depth of this node.
+   */
+  int index = 0;
+
+  /**
+   * The depth of the first node in a cycle.
+   */
+  int lowlink = 0;
+
+  /**
+   * A flag indicating whether the corresponding node is on the stack. Used to remove the need for
+   * searching a collection for the node each time the question needs to be asked.
+   */
+  bool onStack = false;
+
+  /**
+   * The component that contains the corresponding node.
+   */
+  List<N> component;
+
+  /**
+   * Initialize a newly created information holder to represent a node at the given depth.
+   *
+   * @param depth the depth of the node being represented
+   */
+  DirectedGraph_NodeInfo(int depth) {
+    index = depth;
+    lowlink = depth;
+    onStack = false;
+  }
+}
+
+/**
+ * Instances of the class `SccFinder` implement Tarjan's Algorithm for finding the strongly
+ * connected components in a graph.
+ */
+class DirectedGraph_SccFinder<N> {
+  /**
+   * The graph to work with.
+   */
+  DirectedGraph<N> _graph;
+
+  /**
+   * The index used to uniquely identify the depth of nodes.
+   */
+  int _index = 0;
+
+  /**
+   * The stack of nodes that are being visited in order to identify components.
+   */
+  List<N> _stack = new List<N>();
+
+  /**
+   * A table mapping nodes to information about the nodes that is used by this algorithm.
+   */
+  Map<N, DirectedGraph_NodeInfo<N>> _nodeMap = new Map<N, DirectedGraph_NodeInfo<N>>();
+
+  /**
+   * Initialize a newly created finder.
+   */
+  DirectedGraph_SccFinder(DirectedGraph<N> graph) : super() {
+    this._graph = graph;
+  }
+
+  /**
+   * Return a list containing the nodes that are part of the strongly connected component that
+   * contains the given node.
+   *
+   * @param node the node used to identify the strongly connected component to be returned
+   * @return the nodes that are part of the strongly connected component that contains the given
+   *         node
+   */
+  List<N> componentContaining(N node) => _strongConnect(node).component;
+
+  /**
+   * Remove and return the top-most element from the stack.
+   *
+   * @return the element that was removed
+   */
+  N _pop() {
+    N node = _stack.removeAt(_stack.length - 1);
+    _nodeMap[node].onStack = false;
+    return node;
+  }
+
+  /**
+   * Add the given node to the stack.
+   *
+   * @param node the node to be added to the stack
+   */
+  void _push(N node) {
+    _nodeMap[node].onStack = true;
+    _stack.add(node);
+  }
+
+  /**
+   * Compute the strongly connected component that contains the given node as well as any
+   * components containing nodes that are reachable from the given component.
+   *
+   * @param v the node from which the search will begin
+   * @return the information about the given node
+   */
+  DirectedGraph_NodeInfo<N> _strongConnect(N v) {
+    //
+    // Set the depth index for v to the smallest unused index
+    //
+    DirectedGraph_NodeInfo<N> vInfo = new DirectedGraph_NodeInfo<N>(_index++);
+    _nodeMap[v] = vInfo;
+    _push(v);
+    //
+    // Consider successors of v
+    //
+    Set<N> tails = _graph._edges[v];
+    if (tails != null) {
+      for (N w in tails) {
+        DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
+        if (wInfo == null) {
+          // Successor w has not yet been visited; recurse on it
+          wInfo = _strongConnect(w);
+          vInfo.lowlink = Math.min(vInfo.lowlink, wInfo.lowlink);
+        } else if (wInfo.onStack) {
+          // Successor w is in stack S and hence in the current SCC
+          vInfo.lowlink = Math.min(vInfo.lowlink, wInfo.index);
+        }
+      }
+    }
+    //
+    // If v is a root node, pop the stack and generate an SCC
+    //
+    if (vInfo.lowlink == vInfo.index) {
+      List<N> component = new List<N>();
+      N w;
+      do {
+        w = _pop();
+        component.add(w);
+        _nodeMap[w].component = component;
+      } while (w != v);
+    }
+    return vInfo;
+  }
+}
+
+/**
  * The class `ListUtilities` defines utility methods useful for working with [List
  ].
  */
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index 76a711a..aef7473 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -26,21 +26,12 @@
   /**
    * A flag indicating whether this is an optional parameter.
    */
-  bool _isOptional2 = false;
+  final bool isOptional;
 
   /**
    * Initialize a newly created kind with the given state.
    *
    * @param isOptional `true` if this is an optional parameter
    */
-  ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
-    this._isOptional2 = isOptional;
-  }
-
-  /**
-   * Return `true` if this is an optional parameter.
-   *
-   * @return `true` if this is an optional parameter
-   */
-  bool get isOptional => _isOptional2;
+  ParameterKind(String name, int ordinal, this.isOptional) : super(name, ordinal);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index f687e6f..900b1d27 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -302,16 +302,13 @@
 
 }
 
-// Cached parser for testing token types.
-final tokenTester = new Parser(null,null);
+/// Test for token type.
+bool tokenIs(Token token, TokenType type) =>
+    token != null && token.type == type;
 
 /// Test if this token is an EOF token.
 bool isEOF(Token token) => tokenIs(token, TokenType.EOF);
 
-/// Test for token type.
-bool tokenIs(Token token, TokenType type) =>
-    token != null && tokenTester.matchesAny(token, [type]);
-
 /// Test if this token is a GT token.
 bool isGT(Token token) => tokenIs(token, TokenType.GT);
 
@@ -927,7 +924,11 @@
       space();
       token(node.elseKeyword);
       space();
-      printAsBlock(node.elseStatement);
+      if (node.elseStatement is IfStatement) {
+        visit(node.elseStatement);
+      } else {
+        printAsBlock(node.elseStatement);
+      }
     } else {
       visit(node.thenStatement);
     }
diff --git a/pkg/analyzer/lib/src/services/writer.dart b/pkg/analyzer/lib/src/services/writer.dart
index 08cde1f..4e8cef5 100644
--- a/pkg/analyzer/lib/src/services/writer.dart
+++ b/pkg/analyzer/lib/src/services/writer.dart
@@ -35,7 +35,8 @@
 
   bool isEmpty() => tokens.isEmpty;
 
-  bool isWhitespace() => tokens.every((tok) => tok is SpaceToken);
+  bool isWhitespace() => tokens.every(
+      (tok) => tok is SpaceToken || tok is TabToken);
 
   void indent(int n) {
     tokens.insert(0,
@@ -298,12 +299,14 @@
 
   final String lineSeparator;
   int indentCount = 0;
+  final int spacesPerIndent;
+  final bool useTabs;
 
   LinePrinter linePrinter;
   LineToken _lastToken;
 
   SourceWriter({this.indentCount: 0, this.lineSeparator: NEW_LINE,
-      bool useTabs: false, int spacesPerIndent: 2, int maxLineLength: 80}) {
+      this.useTabs: false, this.spacesPerIndent: 2, int maxLineLength: 80}) {
     if (maxLineLength > 0) {
       linePrinter = new SimpleLineBreaker(maxLineLength, (n) =>
           getIndentString(n, useTabs: useTabs, spacesPerIndent: spacesPerIndent));
@@ -368,7 +371,8 @@
     }
   }
 
-  Line newLine() => new Line(indentLevel: indentCount, printer: linePrinter);
+  Line newLine() => new Line(indentLevel: indentCount, useTabs: useTabs,
+      spacesPerIndent: spacesPerIndent, printer: linePrinter);
 
   String toString() {
     var source = new StringBuffer(buffer.toString());
diff --git a/pkg/analyzer/lib/src/string_source.dart b/pkg/analyzer/lib/src/string_source.dart
index e3e91c7..24d55c1 100644
--- a/pkg/analyzer/lib/src/string_source.dart
+++ b/pkg/analyzer/lib/src/string_source.dart
@@ -26,9 +26,6 @@
 
   bool exists() => true;
 
-  void getContentsToReceiver(Source_ContentReceiver receiver) =>
-      receiver.accept(_contents, modificationStamp);
-
   TimestampedData<String> get contents => new TimestampedData(modificationStamp, _contents);
 
   String get encoding => throw new UnsupportedError("StringSource doesn't support "
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index a219901..9b33aa2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.13.0-dev.4
+version: 0.13.0-dev.7
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/error_test.dart b/pkg/analyzer/test/error_test.dart
index 4a513d9..07befe7 100644
--- a/pkg/analyzer/test/error_test.dart
+++ b/pkg/analyzer/test/error_test.dart
@@ -13,50 +13,41 @@
         isNull);
   });
 
+  test("an empty Dart file doesn't throw any errors", () {
+      expect(
+          errorsForFile(''),
+          isNull);
+    });
+
   test("an error on the first line", () {
     expect(errorsForFile('void foo;\n'),
-        equals('Error on line 1 of test.dart: ...\n'
-               'void foo;\n'
-               '^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 
   test("an error on the last line", () {
     expect(errorsForFile('\nvoid foo;'),
-        equals('Error on line 2 of test.dart: ...\n'
-               'void foo;\n'
-               '^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 
   test("an error in the middle", () {
     expect(errorsForFile('\nvoid foo;\n'),
-        equals('Error on line 2 of test.dart: ...\n'
-               'void foo;\n'
-               '^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 
   var veryLongString = new List.filled(107, ' ').join('');
 
   test("an error at the end of a very long line", () {
     expect(errorsForFile('$veryLongString     void foo;'),
-        equals('Error on line 1 of test.dart: ...\n'
-               '...$veryLongString void foo;\n'
-               '$veryLongString    ^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 
   test("an error at the beginning of a very long line", () {
     expect(errorsForFile('void foo;     $veryLongString'),
-        equals('Error on line 1 of test.dart: ...\n'
-               'void foo; $veryLongString...\n'
-               '^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 
   test("an error in the middle of a very long line", () {
     expect(errorsForFile('$veryLongString void foo;$veryLongString'),
-        equals('Error on line 1 of test.dart: ...\n'
-               '...                                                         '
-                   'void foo;                                                '
-                   '...\n'
-               '                                                            '
-                   '^^^^\n'));
+        equals("Error in test.dart: Variables cannot have a type of 'void'\n"));
   });
 }
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index f1f60ae..e215fdb 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -23,7 +23,7 @@
 class NodeLocatorTest extends ParserTestCase {
   void test_range() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
-    assertLocate(unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
+    _assertLocate(unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
   }
 
   void test_searchWithin_null() {
@@ -33,7 +33,7 @@
 
   void test_searchWithin_offset() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library myLib;", []);
-    assertLocate(unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
+    _assertLocate(unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
   }
 
   void test_searchWithin_offsetAfterNode() {
@@ -50,7 +50,7 @@
     JUnitTestCase.assertNull(node);
   }
 
-  void assertLocate(CompilationUnit unit, int start, int end, Predicate<AstNode> predicate, Type expectedClass) {
+  void _assertLocate(CompilationUnit unit, int start, int end, Predicate<AstNode> predicate, Type expectedClass) {
     NodeLocator locator = new NodeLocator.con2(start, end);
     AstNode node = locator.searchWithin(unit);
     JUnitTestCase.assertNotNull(node);
@@ -401,9 +401,10 @@
 
   static ConstructorName constructorName(TypeName type, String name) => new ConstructorName(type, name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD), name == null ? null : identifier3(name));
 
-  static ContinueStatement continueStatement() => new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), null, TokenFactory.tokenFromType(TokenType.SEMICOLON));
-
-  static ContinueStatement continueStatement2(String label) => new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), identifier3(label), TokenFactory.tokenFromType(TokenType.SEMICOLON));
+  static ContinueStatement continueStatement([String label]) {
+    SimpleIdentifier labelNode = label == null ? null : identifier3(label);
+    return new ContinueStatement(TokenFactory.tokenFromKeyword(Keyword.CONTINUE), labelNode, TokenFactory.tokenFromType(TokenType.SEMICOLON));
+  }
 
   static DeclaredIdentifier declaredIdentifier(Keyword keyword, String identifier) => declaredIdentifier2(keyword, null, identifier);
 
@@ -435,11 +436,9 @@
 
   static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword, List<VariableDeclaration> variables) => fieldDeclaration(isStatic, keyword, null, variables);
 
-  static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName type, String identifier) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier), null);
+  static FieldFormalParameter fieldFormalParameter(Keyword keyword, TypeName type, String identifier, [FormalParameterList parameterList]) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier), parameterList);
 
-  static FieldFormalParameter fieldFormalParameter2(Keyword keyword, TypeName type, String identifier, FormalParameterList parameterList) => new FieldFormalParameter(null, null, keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), type, TokenFactory.tokenFromKeyword(Keyword.THIS), TokenFactory.tokenFromType(TokenType.PERIOD), identifier3(identifier), parameterList);
-
-  static FieldFormalParameter fieldFormalParameter3(String identifier) => fieldFormalParameter(null, null, identifier);
+  static FieldFormalParameter fieldFormalParameter2(String identifier) => fieldFormalParameter(null, null, identifier);
 
   static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expression iterator, Statement body) => new ForEachStatement.con1(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), loopVariable, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
@@ -761,7 +760,7 @@
   }
 
   void test_inDeclarationContext_fieldFormalParameter() {
-    SimpleIdentifier identifier = AstFactory.fieldFormalParameter3("p").identifier;
+    SimpleIdentifier identifier = AstFactory.fieldFormalParameter2("p").identifier;
     JUnitTestCase.assertFalse(identifier.inDeclarationContext());
   }
 
@@ -818,14 +817,14 @@
   void test_inGetterContext() {
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
-        SimpleIdentifier identifier = createIdentifier(wrapper, assignment);
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
         if (identical(assignment, AssignmentKind.SIMPLE_LEFT) && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
           if (identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${topMostNode(identifier).toSource()} to be false");
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
         } else {
           if (!identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${topMostNode(identifier).toSource()} to be true");
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
           }
         }
       }
@@ -842,21 +841,21 @@
   void test_inSetterContext() {
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
-        SimpleIdentifier identifier = createIdentifier(wrapper, assignment);
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
         if (identical(wrapper, WrapperKind.PREFIXED_LEFT) || identical(wrapper, WrapperKind.PROPERTY_LEFT) || identical(assignment, AssignmentKind.BINARY) || identical(assignment, AssignmentKind.COMPOUND_RIGHT) || identical(assignment, AssignmentKind.PREFIX_NOT) || identical(assignment, AssignmentKind.SIMPLE_RIGHT) || identical(assignment, AssignmentKind.NONE)) {
           if (identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${topMostNode(identifier).toSource()} to be false");
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
         } else {
           if (!identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${topMostNode(identifier).toSource()} to be true");
+            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
           }
         }
       }
     }
   }
 
-  SimpleIdentifier createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
+  SimpleIdentifier _createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
     SimpleIdentifier identifier = AstFactory.identifier3("a");
     Expression expression = identifier;
     while (true) {
@@ -904,7 +903,7 @@
    * @param identifier the identifier in the AST structure being traversed
    * @return the root of the AST structure containing the identifier
    */
-  AstNode topMostNode(SimpleIdentifier identifier) {
+  AstNode _topMostNode(SimpleIdentifier identifier) {
     AstNode child = identifier;
     AstNode parent = identifier.parent;
     while (parent != null) {
@@ -1105,6 +1104,7 @@
 
   BreadthFirstVisitor_BreadthFirstVisitorTest_testIt(this.nodes) : super();
 
+  @override
   Object visitNode(AstNode node) {
     nodes.add(node);
     return super.visitNode(node);
@@ -1419,234 +1419,234 @@
 
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_class() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_function() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_static() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_staticMethod() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_topLevel() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void fail_identifier_typeParameter() {
-    Object value = getConstantValue("?");
+    Object value = _getConstantValue("?");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void test_binary_bitAnd() {
-    Object value = getConstantValue("74 & 42");
+    Object value = _getConstantValue("74 & 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(74 & 42, value as int);
   }
 
   void test_binary_bitOr() {
-    Object value = getConstantValue("74 | 42");
+    Object value = _getConstantValue("74 | 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(74 | 42, value as int);
   }
 
   void test_binary_bitXor() {
-    Object value = getConstantValue("74 ^ 42");
+    Object value = _getConstantValue("74 ^ 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(74 ^ 42, value as int);
   }
 
   void test_binary_divide_double() {
-    Object value = getConstantValue("3.2 / 2.3");
+    Object value = _getConstantValue("3.2 / 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(3.2 / 2.3, value as double);
   }
 
   void test_binary_divide_integer() {
-    Object value = getConstantValue("3 / 2");
+    Object value = _getConstantValue("3 / 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
 
   void test_binary_equal_boolean() {
-    Object value = getConstantValue("true == false");
+    Object value = _getConstantValue("true == false");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_equal_integer() {
-    Object value = getConstantValue("2 == 3");
+    Object value = _getConstantValue("2 == 3");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_equal_invalidLeft() {
-    Object value = getConstantValue("a == 3");
+    Object value = _getConstantValue("a == 3");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
 
   void test_binary_equal_invalidRight() {
-    Object value = getConstantValue("2 == a");
+    Object value = _getConstantValue("2 == a");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
 
   void test_binary_equal_string() {
-    Object value = getConstantValue("'a' == 'b'");
+    Object value = _getConstantValue("'a' == 'b'");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_greaterThan() {
-    Object value = getConstantValue("2 > 3");
+    Object value = _getConstantValue("2 > 3");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_greaterThanOrEqual() {
-    Object value = getConstantValue("2 >= 3");
+    Object value = _getConstantValue("2 >= 3");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_leftShift() {
-    Object value = getConstantValue("16 << 2");
+    Object value = _getConstantValue("16 << 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(64, value as int);
   }
 
   void test_binary_lessThan() {
-    Object value = getConstantValue("2 < 3");
+    Object value = _getConstantValue("2 < 3");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_lessThanOrEqual() {
-    Object value = getConstantValue("2 <= 3");
+    Object value = _getConstantValue("2 <= 3");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_logicalAnd() {
-    Object value = getConstantValue("true && false");
+    Object value = _getConstantValue("true && false");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_binary_logicalOr() {
-    Object value = getConstantValue("true || false");
+    Object value = _getConstantValue("true || false");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_minus_double() {
-    Object value = getConstantValue("3.2 - 2.3");
+    Object value = _getConstantValue("3.2 - 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(3.2 - 2.3, value as double);
   }
 
   void test_binary_minus_integer() {
-    Object value = getConstantValue("3 - 2");
+    Object value = _getConstantValue("3 - 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
 
   void test_binary_notEqual_boolean() {
-    Object value = getConstantValue("true != false");
+    Object value = _getConstantValue("true != false");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_notEqual_integer() {
-    Object value = getConstantValue("2 != 3");
+    Object value = _getConstantValue("2 != 3");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_notEqual_invalidLeft() {
-    Object value = getConstantValue("a != 3");
+    Object value = _getConstantValue("a != 3");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
 
   void test_binary_notEqual_invalidRight() {
-    Object value = getConstantValue("2 != a");
+    Object value = _getConstantValue("2 != a");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
 
   void test_binary_notEqual_string() {
-    Object value = getConstantValue("'a' != 'b'");
+    Object value = _getConstantValue("'a' != 'b'");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_binary_plus_double() {
-    Object value = getConstantValue("2.3 + 3.2");
+    Object value = _getConstantValue("2.3 + 3.2");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(2.3 + 3.2, value as double);
   }
 
   void test_binary_plus_integer() {
-    Object value = getConstantValue("2 + 3");
+    Object value = _getConstantValue("2 + 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(5, value as int);
   }
 
   void test_binary_remainder_double() {
-    Object value = getConstantValue("3.2 % 2.3");
+    Object value = _getConstantValue("3.2 % 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(3.2 % 2.3, value as double);
   }
 
   void test_binary_remainder_integer() {
-    Object value = getConstantValue("8 % 3");
+    Object value = _getConstantValue("8 % 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(2, value as int);
   }
 
   void test_binary_rightShift() {
-    Object value = getConstantValue("64 >> 2");
+    Object value = _getConstantValue("64 >> 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(16, value as int);
   }
 
   void test_binary_times_double() {
-    Object value = getConstantValue("2.3 * 3.2");
+    Object value = _getConstantValue("2.3 * 3.2");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(2.3 * 3.2, value as double);
   }
 
   void test_binary_times_integer() {
-    Object value = getConstantValue("2 * 3");
+    Object value = _getConstantValue("2 * 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(6, value as int);
   }
 
   void test_binary_truncatingDivide_double() {
-    Object value = getConstantValue("3.2 ~/ 2.3");
+    Object value = _getConstantValue("3.2 ~/ 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(1, value as int);
   }
 
   void test_binary_truncatingDivide_integer() {
-    Object value = getConstantValue("10 ~/ 3");
+    Object value = _getConstantValue("10 ~/ 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(3, value as int);
   }
 
   void test_literal_boolean_false() {
-    Object value = getConstantValue("false");
+    Object value = _getConstantValue("false");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_literal_boolean_true() {
-    Object value = getConstantValue("true");
+    Object value = _getConstantValue("true");
     JUnitTestCase.assertEquals(true, value);
   }
 
   void test_literal_list() {
-    Object value = getConstantValue("['a', 'b', 'c']");
+    Object value = _getConstantValue("['a', 'b', 'c']");
     EngineTestCase.assertInstanceOf((obj) => obj is List, List, value);
     List list = value as List;
     JUnitTestCase.assertEquals(3, list.length);
@@ -1656,7 +1656,7 @@
   }
 
   void test_literal_map() {
-    Object value = getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
+    Object value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
     EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, value);
     Map map = value as Map;
     JUnitTestCase.assertEquals(3, map.length);
@@ -1666,71 +1666,71 @@
   }
 
   void test_literal_null() {
-    Object value = getConstantValue("null");
+    Object value = _getConstantValue("null");
     JUnitTestCase.assertEquals(null, value);
   }
 
   void test_literal_number_double() {
-    Object value = getConstantValue("3.45");
+    Object value = _getConstantValue("3.45");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(3.45, value as double);
   }
 
   void test_literal_number_integer() {
-    Object value = getConstantValue("42");
+    Object value = _getConstantValue("42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(42, value as int);
   }
 
   void test_literal_string_adjacent() {
-    Object value = getConstantValue("'abc' 'def'");
+    Object value = _getConstantValue("'abc' 'def'");
     JUnitTestCase.assertEquals("abcdef", value);
   }
 
   void test_literal_string_interpolation_invalid() {
-    Object value = getConstantValue("'a\${f()}c'");
+    Object value = _getConstantValue("'a\${f()}c'");
     JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
   }
 
   void test_literal_string_interpolation_valid() {
-    Object value = getConstantValue("'a\${3}c'");
+    Object value = _getConstantValue("'a\${3}c'");
     JUnitTestCase.assertEquals("a3c", value);
   }
 
   void test_literal_string_simple() {
-    Object value = getConstantValue("'abc'");
+    Object value = _getConstantValue("'abc'");
     JUnitTestCase.assertEquals("abc", value);
   }
 
   void test_parenthesizedExpression() {
-    Object value = getConstantValue("('a')");
+    Object value = _getConstantValue("('a')");
     JUnitTestCase.assertEquals("a", value);
   }
 
   void test_unary_bitNot() {
-    Object value = getConstantValue("~42");
+    Object value = _getConstantValue("~42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(~42, value as int);
   }
 
   void test_unary_logicalNot() {
-    Object value = getConstantValue("!true");
+    Object value = _getConstantValue("!true");
     JUnitTestCase.assertEquals(false, value);
   }
 
   void test_unary_negated_double() {
-    Object value = getConstantValue("-42.3");
+    Object value = _getConstantValue("-42.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
     JUnitTestCase.assertEquals(-42.3, value as double);
   }
 
   void test_unary_negated_integer() {
-    Object value = getConstantValue("-42");
+    Object value = _getConstantValue("-42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
     JUnitTestCase.assertEquals(-42, value as int);
   }
 
-  Object getConstantValue(String source) => ParserTestCase.parseExpression(source, []).accept(new ConstantEvaluator());
+  Object _getConstantValue(String source) => ParserTestCase.parseExpression(source, []).accept(new ConstantEvaluator());
 
   static dartSuite() {
     _ut.group('ConstantEvaluatorTest', () {
@@ -2001,456 +2001,486 @@
 
 class ToSourceVisitorTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
-    assertSource("'a' 'b'", AstFactory.adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]));
+    _assertSource("'a' 'b'", AstFactory.adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]));
   }
 
   void test_visitAnnotation_constant() {
-    assertSource("@A", AstFactory.annotation(AstFactory.identifier3("A")));
+    _assertSource("@A", AstFactory.annotation(AstFactory.identifier3("A")));
   }
 
   void test_visitAnnotation_constructor() {
-    assertSource("@A.c()", AstFactory.annotation2(AstFactory.identifier3("A"), AstFactory.identifier3("c"), AstFactory.argumentList([])));
+    _assertSource("@A.c()", AstFactory.annotation2(AstFactory.identifier3("A"), AstFactory.identifier3("c"), AstFactory.argumentList([])));
   }
 
   void test_visitArgumentDefinitionTest() {
-    assertSource("?a", AstFactory.argumentDefinitionTest("a"));
+    _assertSource("?a", AstFactory.argumentDefinitionTest("a"));
   }
 
   void test_visitArgumentList() {
-    assertSource("(a, b)", AstFactory.argumentList([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+    _assertSource("(a, b)", AstFactory.argumentList([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
   }
 
   void test_visitAsExpression() {
-    assertSource("e as T", AstFactory.asExpression(AstFactory.identifier3("e"), AstFactory.typeName4("T", [])));
+    _assertSource("e as T", AstFactory.asExpression(AstFactory.identifier3("e"), AstFactory.typeName4("T", [])));
   }
 
   void test_visitAssertStatement() {
-    assertSource("assert (a);", AstFactory.assertStatement(AstFactory.identifier3("a")));
+    _assertSource("assert (a);", AstFactory.assertStatement(AstFactory.identifier3("a")));
   }
 
   void test_visitAssignmentExpression() {
-    assertSource("a = b", AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.EQ, AstFactory.identifier3("b")));
+    _assertSource("a = b", AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.EQ, AstFactory.identifier3("b")));
   }
 
   void test_visitBinaryExpression() {
-    assertSource("a + b", AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b")));
+    _assertSource("a + b", AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b")));
   }
 
   void test_visitBlock_empty() {
-    assertSource("{}", AstFactory.block([]));
+    _assertSource("{}", AstFactory.block([]));
   }
 
   void test_visitBlock_nonEmpty() {
-    assertSource("{break; break;}", AstFactory.block([AstFactory.breakStatement(), AstFactory.breakStatement()]));
+    _assertSource("{break; break;}", AstFactory.block([AstFactory.breakStatement(), AstFactory.breakStatement()]));
   }
 
   void test_visitBlockFunctionBody() {
-    assertSource("{}", AstFactory.blockFunctionBody2([]));
+    _assertSource("{}", AstFactory.blockFunctionBody2([]));
   }
 
   void test_visitBooleanLiteral_false() {
-    assertSource("false", AstFactory.booleanLiteral(false));
+    _assertSource("false", AstFactory.booleanLiteral(false));
   }
 
   void test_visitBooleanLiteral_true() {
-    assertSource("true", AstFactory.booleanLiteral(true));
+    _assertSource("true", AstFactory.booleanLiteral(true));
   }
 
   void test_visitBreakStatement_label() {
-    assertSource("break l;", AstFactory.breakStatement2("l"));
+    _assertSource("break l;", AstFactory.breakStatement2("l"));
   }
 
   void test_visitBreakStatement_noLabel() {
-    assertSource("break;", AstFactory.breakStatement());
+    _assertSource("break;", AstFactory.breakStatement());
   }
 
   void test_visitCascadeExpression_field() {
-    assertSource("a..b..c", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+    _assertSource("a..b..c", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
         AstFactory.cascadedPropertyAccess("b"),
         AstFactory.cascadedPropertyAccess("c")]));
   }
 
   void test_visitCascadeExpression_index() {
-    assertSource("a..[0]..[1]", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+    _assertSource("a..[0]..[1]", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
         AstFactory.cascadedIndexExpression(AstFactory.integer(0)),
         AstFactory.cascadedIndexExpression(AstFactory.integer(1))]));
   }
 
   void test_visitCascadeExpression_method() {
-    assertSource("a..b()..c()", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+    _assertSource("a..b()..c()", AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
         AstFactory.cascadedMethodInvocation("b", []),
         AstFactory.cascadedMethodInvocation("c", [])]));
   }
 
   void test_visitCatchClause_catch_noStack() {
-    assertSource("catch (e) {}", AstFactory.catchClause("e", []));
+    _assertSource("catch (e) {}", AstFactory.catchClause("e", []));
   }
 
   void test_visitCatchClause_catch_stack() {
-    assertSource("catch (e, s) {}", AstFactory.catchClause2("e", "s", []));
+    _assertSource("catch (e, s) {}", AstFactory.catchClause2("e", "s", []));
   }
 
   void test_visitCatchClause_on() {
-    assertSource("on E {}", AstFactory.catchClause3(AstFactory.typeName4("E", []), []));
+    _assertSource("on E {}", AstFactory.catchClause3(AstFactory.typeName4("E", []), []));
   }
 
   void test_visitCatchClause_on_catch() {
-    assertSource("on E catch (e) {}", AstFactory.catchClause4(AstFactory.typeName4("E", []), "e", []));
+    _assertSource("on E catch (e) {}", AstFactory.catchClause4(AstFactory.typeName4("E", []), "e", []));
   }
 
   void test_visitClassDeclaration_abstract() {
-    assertSource("abstract class C {}", AstFactory.classDeclaration(Keyword.ABSTRACT, "C", null, null, null, null, []));
+    _assertSource("abstract class C {}", AstFactory.classDeclaration(Keyword.ABSTRACT, "C", null, null, null, null, []));
   }
 
   void test_visitClassDeclaration_empty() {
-    assertSource("class C {}", AstFactory.classDeclaration(null, "C", null, null, null, null, []));
+    _assertSource("class C {}", AstFactory.classDeclaration(null, "C", null, null, null, null, []));
   }
 
   void test_visitClassDeclaration_extends() {
-    assertSource("class C extends A {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, null, []));
+    _assertSource("class C extends A {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, null, []));
   }
 
   void test_visitClassDeclaration_extends_implements() {
-    assertSource("class C extends A implements B {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C extends A implements B {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_extends_with() {
-    assertSource("class C extends A with M {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), null, []));
+    _assertSource("class C extends A with M {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), null, []));
   }
 
   void test_visitClassDeclaration_extends_with_implements() {
-    assertSource("class C extends A with M implements B {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C extends A with M implements B {}", AstFactory.classDeclaration(null, "C", null, AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_implements() {
-    assertSource("class C implements B {}", AstFactory.classDeclaration(null, "C", null, null, null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C implements B {}", AstFactory.classDeclaration(null, "C", null, null, null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_multipleMember() {
-    assertSource("class C {var a; var b;}", AstFactory.classDeclaration(null, "C", null, null, null, null, [
+    _assertSource("class C {var a; var b;}", AstFactory.classDeclaration(null, "C", null, null, null, null, [
         AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")]),
         AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("b")])]));
   }
 
   void test_visitClassDeclaration_parameters() {
-    assertSource("class C<E> {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), null, null, null, []));
+    _assertSource("class C<E> {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), null, null, null, []));
   }
 
   void test_visitClassDeclaration_parameters_extends() {
-    assertSource("class C<E> extends A {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, null, []));
+    _assertSource("class C<E> extends A {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, null, []));
   }
 
   void test_visitClassDeclaration_parameters_extends_implements() {
-    assertSource("class C<E> extends A implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C<E> extends A implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_parameters_extends_with() {
-    assertSource("class C<E> extends A with M {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), null, []));
+    _assertSource("class C<E> extends A with M {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), null, []));
   }
 
   void test_visitClassDeclaration_parameters_extends_with_implements() {
-    assertSource("class C<E> extends A with M implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C<E> extends A with M implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), AstFactory.extendsClause(AstFactory.typeName4("A", [])), AstFactory.withClause([AstFactory.typeName4("M", [])]), AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_parameters_implements() {
-    assertSource("class C<E> implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), null, null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
+    _assertSource("class C<E> implements B {}", AstFactory.classDeclaration(null, "C", AstFactory.typeParameterList(["E"]), null, null, AstFactory.implementsClause([AstFactory.typeName4("B", [])]), []));
   }
 
   void test_visitClassDeclaration_singleMember() {
-    assertSource("class C {var a;}", AstFactory.classDeclaration(null, "C", null, null, null, null, [AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
+    _assertSource("class C {var a;}", AstFactory.classDeclaration(null, "C", null, null, null, null, [AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
+  }
+
+  void test_visitClassDeclaration_withMetadata() {
+    ClassDeclaration declaration = AstFactory.classDeclaration(null, "C", null, null, null, null, []);
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated class C {}", declaration);
   }
 
   void test_visitClassTypeAlias_abstract() {
-    assertSource("abstract class C = S with M1;", AstFactory.classTypeAlias("C", null, Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
+    _assertSource("abstract class C = S with M1;", AstFactory.classTypeAlias("C", null, Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
   }
 
   void test_visitClassTypeAlias_abstract_implements() {
-    assertSource("abstract class C = S with M1 implements I;", AstFactory.classTypeAlias("C", null, Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+    _assertSource("abstract class C = S with M1 implements I;", AstFactory.classTypeAlias("C", null, Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
   }
 
   void test_visitClassTypeAlias_generic() {
-    assertSource("class C<E> = S<E> with M1<E>;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), null, AstFactory.typeName4("S", [AstFactory.typeName4("E", [])]), AstFactory.withClause([AstFactory.typeName4("M1", [AstFactory.typeName4("E", [])])]), null));
+    _assertSource("class C<E> = S<E> with M1<E>;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), null, AstFactory.typeName4("S", [AstFactory.typeName4("E", [])]), AstFactory.withClause([AstFactory.typeName4("M1", [AstFactory.typeName4("E", [])])]), null));
   }
 
   void test_visitClassTypeAlias_implements() {
-    assertSource("class C = S with M1 implements I;", AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+    _assertSource("class C = S with M1 implements I;", AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
   }
 
   void test_visitClassTypeAlias_minimal() {
-    assertSource("class C = S with M1;", AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
+    _assertSource("class C = S with M1;", AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
   }
 
   void test_visitClassTypeAlias_parameters_abstract() {
-    assertSource("abstract class C<E> = S with M1;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
+    _assertSource("abstract class C<E> = S with M1;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null));
   }
 
   void test_visitClassTypeAlias_parameters_abstract_implements() {
-    assertSource("abstract class C<E> = S with M1 implements I;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+    _assertSource("abstract class C<E> = S with M1 implements I;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), Keyword.ABSTRACT, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
   }
 
   void test_visitClassTypeAlias_parameters_implements() {
-    assertSource("class C<E> = S with M1 implements I;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+    _assertSource("class C<E> = S with M1 implements I;", AstFactory.classTypeAlias("C", AstFactory.typeParameterList(["E"]), null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+  }
+
+  void test_visitClassTypeAlias_withMetadata() {
+    ClassTypeAlias declaration = AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S", []), AstFactory.withClause([AstFactory.typeName4("M1", [])]), null);
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated class C = S with M1;", declaration);
   }
 
   void test_visitComment() {
-    assertSource("", Comment.createBlockComment(<Token> [TokenFactory.tokenFromString("/* comment */")]));
+    _assertSource("", Comment.createBlockComment(<Token> [TokenFactory.tokenFromString("/* comment */")]));
   }
 
   void test_visitCommentReference() {
-    assertSource("", new CommentReference(null, AstFactory.identifier3("a")));
+    _assertSource("", new CommentReference(null, AstFactory.identifier3("a")));
   }
 
   void test_visitCompilationUnit_declaration() {
-    assertSource("var a;", AstFactory.compilationUnit2([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
+    _assertSource("var a;", AstFactory.compilationUnit2([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
   }
 
   void test_visitCompilationUnit_directive() {
-    assertSource("library l;", AstFactory.compilationUnit3([AstFactory.libraryDirective2("l")]));
+    _assertSource("library l;", AstFactory.compilationUnit3([AstFactory.libraryDirective2("l")]));
   }
 
   void test_visitCompilationUnit_directive_declaration() {
-    assertSource("library l; var a;", AstFactory.compilationUnit4(AstFactory.list([AstFactory.libraryDirective2("l")]), AstFactory.list([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])])));
+    _assertSource("library l; var a;", AstFactory.compilationUnit4(AstFactory.list([AstFactory.libraryDirective2("l")]), AstFactory.list([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])])));
   }
 
   void test_visitCompilationUnit_empty() {
-    assertSource("", AstFactory.compilationUnit());
+    _assertSource("", AstFactory.compilationUnit());
   }
 
   void test_visitCompilationUnit_script() {
-    assertSource("!#/bin/dartvm", AstFactory.compilationUnit5("!#/bin/dartvm"));
+    _assertSource("!#/bin/dartvm", AstFactory.compilationUnit5("!#/bin/dartvm"));
   }
 
   void test_visitCompilationUnit_script_declaration() {
-    assertSource("!#/bin/dartvm var a;", AstFactory.compilationUnit6("!#/bin/dartvm", [AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
+    _assertSource("!#/bin/dartvm var a;", AstFactory.compilationUnit6("!#/bin/dartvm", [AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])]));
   }
 
   void test_visitCompilationUnit_script_directive() {
-    assertSource("!#/bin/dartvm library l;", AstFactory.compilationUnit7("!#/bin/dartvm", [AstFactory.libraryDirective2("l")]));
+    _assertSource("!#/bin/dartvm library l;", AstFactory.compilationUnit7("!#/bin/dartvm", [AstFactory.libraryDirective2("l")]));
   }
 
   void test_visitCompilationUnit_script_directives_declarations() {
-    assertSource("!#/bin/dartvm library l; var a;", AstFactory.compilationUnit8("!#/bin/dartvm", AstFactory.list([AstFactory.libraryDirective2("l")]), AstFactory.list([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])])));
+    _assertSource("!#/bin/dartvm library l; var a;", AstFactory.compilationUnit8("!#/bin/dartvm", AstFactory.list([AstFactory.libraryDirective2("l")]), AstFactory.list([AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")])])));
   }
 
   void test_visitConditionalExpression() {
-    assertSource("a ? b : c", AstFactory.conditionalExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"), AstFactory.identifier3("c")));
+    _assertSource("a ? b : c", AstFactory.conditionalExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"), AstFactory.identifier3("c")));
   }
 
   void test_visitConstructorDeclaration_const() {
-    assertSource("const C() {}", AstFactory.constructorDeclaration2(Keyword.CONST, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
+    _assertSource("const C() {}", AstFactory.constructorDeclaration2(Keyword.CONST, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitConstructorDeclaration_external() {
-    assertSource("external C();", AstFactory.constructorDeclaration(AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null));
+    _assertSource("external C();", AstFactory.constructorDeclaration(AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null));
   }
 
   void test_visitConstructorDeclaration_minimal() {
-    assertSource("C() {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
+    _assertSource("C() {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitConstructorDeclaration_multipleInitializers() {
-    assertSource("C() : a = b, c = d {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), AstFactory.list([
+    _assertSource("C() : a = b, c = d {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), AstFactory.list([
         AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b")),
         AstFactory.constructorFieldInitializer(false, "c", AstFactory.identifier3("d"))]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitConstructorDeclaration_multipleParameters() {
-    assertSource("C(var a, var b) {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([
+    _assertSource("C(var a, var b) {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
         AstFactory.simpleFormalParameter(Keyword.VAR, "b")]), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitConstructorDeclaration_named() {
-    assertSource("C.m() {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), "m", AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
+    _assertSource("C.m() {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), "m", AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitConstructorDeclaration_singleInitializer() {
-    assertSource("C() : a = b {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), AstFactory.list([AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b"))]), AstFactory.blockFunctionBody2([])));
+    _assertSource("C() : a = b {}", AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), AstFactory.list([AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b"))]), AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_withMetadata() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(null, null, AstFactory.identifier3("C"), null, AstFactory.formalParameterList([]), null, AstFactory.blockFunctionBody2([]));
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated C() {}", declaration);
   }
 
   void test_visitConstructorFieldInitializer_withoutThis() {
-    assertSource("a = b", AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b")));
+    _assertSource("a = b", AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b")));
   }
 
   void test_visitConstructorFieldInitializer_withThis() {
-    assertSource("this.a = b", AstFactory.constructorFieldInitializer(true, "a", AstFactory.identifier3("b")));
+    _assertSource("this.a = b", AstFactory.constructorFieldInitializer(true, "a", AstFactory.identifier3("b")));
   }
 
   void test_visitConstructorName_named_prefix() {
-    assertSource("p.C.n", AstFactory.constructorName(AstFactory.typeName4("p.C.n", []), null));
+    _assertSource("p.C.n", AstFactory.constructorName(AstFactory.typeName4("p.C.n", []), null));
   }
 
   void test_visitConstructorName_unnamed_noPrefix() {
-    assertSource("C", AstFactory.constructorName(AstFactory.typeName4("C", []), null));
+    _assertSource("C", AstFactory.constructorName(AstFactory.typeName4("C", []), null));
   }
 
   void test_visitConstructorName_unnamed_prefix() {
-    assertSource("p.C", AstFactory.constructorName(AstFactory.typeName3(AstFactory.identifier5("p", "C"), []), null));
+    _assertSource("p.C", AstFactory.constructorName(AstFactory.typeName3(AstFactory.identifier5("p", "C"), []), null));
   }
 
   void test_visitContinueStatement_label() {
-    assertSource("continue l;", AstFactory.continueStatement2("l"));
+    _assertSource("continue l;", AstFactory.continueStatement("l"));
   }
 
   void test_visitContinueStatement_noLabel() {
-    assertSource("continue;", AstFactory.continueStatement());
+    _assertSource("continue;", AstFactory.continueStatement());
   }
 
   void test_visitDefaultFormalParameter_named_noValue() {
-    assertSource("p", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), null));
+    _assertSource("p", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), null));
   }
 
   void test_visitDefaultFormalParameter_named_value() {
-    assertSource("p : 0", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+    _assertSource("p : 0", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
   }
 
   void test_visitDefaultFormalParameter_positional_noValue() {
-    assertSource("p", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), null));
+    _assertSource("p", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), null));
   }
 
   void test_visitDefaultFormalParameter_positional_value() {
-    assertSource("p = 0", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+    _assertSource("p = 0", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
   }
 
   void test_visitDoStatement() {
-    assertSource("do {} while (c);", AstFactory.doStatement(AstFactory.block([]), AstFactory.identifier3("c")));
+    _assertSource("do {} while (c);", AstFactory.doStatement(AstFactory.block([]), AstFactory.identifier3("c")));
   }
 
   void test_visitDoubleLiteral() {
-    assertSource("4.2", AstFactory.doubleLiteral(4.2));
+    _assertSource("4.2", AstFactory.doubleLiteral(4.2));
   }
 
   void test_visitEmptyFunctionBody() {
-    assertSource(";", AstFactory.emptyFunctionBody());
+    _assertSource(";", AstFactory.emptyFunctionBody());
   }
 
   void test_visitEmptyStatement() {
-    assertSource(";", AstFactory.emptyStatement());
+    _assertSource(";", AstFactory.emptyStatement());
   }
 
   void test_visitExportDirective_combinator() {
-    assertSource("export 'a.dart' show A;", AstFactory.exportDirective2("a.dart", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+    _assertSource("export 'a.dart' show A;", AstFactory.exportDirective2("a.dart", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
 
   void test_visitExportDirective_combinators() {
-    assertSource("export 'a.dart' show A hide B;", AstFactory.exportDirective2("a.dart", [
+    _assertSource("export 'a.dart' show A hide B;", AstFactory.exportDirective2("a.dart", [
         AstFactory.showCombinator([AstFactory.identifier3("A")]),
         AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
   }
 
   void test_visitExportDirective_minimal() {
-    assertSource("export 'a.dart';", AstFactory.exportDirective2("a.dart", []));
+    _assertSource("export 'a.dart';", AstFactory.exportDirective2("a.dart", []));
+  }
+
+  void test_visitExportDirective_withMetadata() {
+    ExportDirective directive = AstFactory.exportDirective2("a.dart", []);
+    directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated export 'a.dart';", directive);
   }
 
   void test_visitExpressionFunctionBody() {
-    assertSource("=> a;", AstFactory.expressionFunctionBody(AstFactory.identifier3("a")));
+    _assertSource("=> a;", AstFactory.expressionFunctionBody(AstFactory.identifier3("a")));
   }
 
   void test_visitExpressionStatement() {
-    assertSource("a;", AstFactory.expressionStatement(AstFactory.identifier3("a")));
+    _assertSource("a;", AstFactory.expressionStatement(AstFactory.identifier3("a")));
   }
 
   void test_visitExtendsClause() {
-    assertSource("extends C", AstFactory.extendsClause(AstFactory.typeName4("C", [])));
+    _assertSource("extends C", AstFactory.extendsClause(AstFactory.typeName4("C", [])));
   }
 
   void test_visitFieldDeclaration_instance() {
-    assertSource("var a;", AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+    _assertSource("var a;", AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
   }
 
   void test_visitFieldDeclaration_static() {
-    assertSource("static var a;", AstFactory.fieldDeclaration2(true, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+    _assertSource("static var a;", AstFactory.fieldDeclaration2(true, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_withMetadata() {
+    FieldDeclaration declaration = AstFactory.fieldDeclaration2(false, Keyword.VAR, [AstFactory.variableDeclaration("a")]);
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated var a;", declaration);
   }
 
   void test_visitFieldFormalParameter_functionTyped() {
-    assertSource("A this.a(b)", AstFactory.fieldFormalParameter2(null, AstFactory.typeName4("A", []), "a", AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("b")])));
+    _assertSource("A this.a(b)", AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A", []), "a", AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("b")])));
   }
 
   void test_visitFieldFormalParameter_keyword() {
-    assertSource("var this.a", AstFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
+    _assertSource("var this.a", AstFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
   }
 
   void test_visitFieldFormalParameter_keywordAndType() {
-    assertSource("final A this.a", AstFactory.fieldFormalParameter(Keyword.FINAL, AstFactory.typeName4("A", []), "a"));
+    _assertSource("final A this.a", AstFactory.fieldFormalParameter(Keyword.FINAL, AstFactory.typeName4("A", []), "a"));
   }
 
   void test_visitFieldFormalParameter_type() {
-    assertSource("A this.a", AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A", []), "a"));
+    _assertSource("A this.a", AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A", []), "a"));
   }
 
   void test_visitForEachStatement() {
-    assertSource("for (a in b) {}", AstFactory.forEachStatement(AstFactory.declaredIdentifier3("a"), AstFactory.identifier3("b"), AstFactory.block([])));
+    _assertSource("for (a in b) {}", AstFactory.forEachStatement(AstFactory.declaredIdentifier3("a"), AstFactory.identifier3("b"), AstFactory.block([])));
   }
 
   void test_visitFormalParameterList_empty() {
-    assertSource("()", AstFactory.formalParameterList([]));
+    _assertSource("()", AstFactory.formalParameterList([]));
   }
 
   void test_visitFormalParameterList_n() {
-    assertSource("({a : 0})", AstFactory.formalParameterList([AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))]));
+    _assertSource("({a : 0})", AstFactory.formalParameterList([AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))]));
   }
 
   void test_visitFormalParameterList_nn() {
-    assertSource("({a : 0, b : 1})", AstFactory.formalParameterList([
+    _assertSource("({a : 0, b : 1})", AstFactory.formalParameterList([
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))]));
   }
 
   void test_visitFormalParameterList_p() {
-    assertSource("([a = 0])", AstFactory.formalParameterList([AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))]));
+    _assertSource("([a = 0])", AstFactory.formalParameterList([AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))]));
   }
 
   void test_visitFormalParameterList_pp() {
-    assertSource("([a = 0, b = 1])", AstFactory.formalParameterList([
+    _assertSource("([a = 0, b = 1])", AstFactory.formalParameterList([
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))]));
   }
 
   void test_visitFormalParameterList_r() {
-    assertSource("(a)", AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("a")]));
+    _assertSource("(a)", AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("a")]));
   }
 
   void test_visitFormalParameterList_rn() {
-    assertSource("(a, {b : 1})", AstFactory.formalParameterList([
+    _assertSource("(a, {b : 1})", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))]));
   }
 
   void test_visitFormalParameterList_rnn() {
-    assertSource("(a, {b : 1, c : 2})", AstFactory.formalParameterList([
+    _assertSource("(a, {b : 1, c : 2})", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))]));
   }
 
   void test_visitFormalParameterList_rp() {
-    assertSource("(a, [b = 1])", AstFactory.formalParameterList([
+    _assertSource("(a, [b = 1])", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))]));
   }
 
   void test_visitFormalParameterList_rpp() {
-    assertSource("(a, [b = 1, c = 2])", AstFactory.formalParameterList([
+    _assertSource("(a, [b = 1, c = 2])", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))]));
   }
 
   void test_visitFormalParameterList_rr() {
-    assertSource("(a, b)", AstFactory.formalParameterList([
+    _assertSource("(a, b)", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.simpleFormalParameter3("b")]));
   }
 
   void test_visitFormalParameterList_rrn() {
-    assertSource("(a, b, {c : 3})", AstFactory.formalParameterList([
+    _assertSource("(a, b, {c : 3})", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.simpleFormalParameter3("b"),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))]));
   }
 
   void test_visitFormalParameterList_rrnn() {
-    assertSource("(a, b, {c : 3, d : 4})", AstFactory.formalParameterList([
+    _assertSource("(a, b, {c : 3, d : 4})", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.simpleFormalParameter3("b"),
         AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
@@ -2458,14 +2488,14 @@
   }
 
   void test_visitFormalParameterList_rrp() {
-    assertSource("(a, b, [c = 3])", AstFactory.formalParameterList([
+    _assertSource("(a, b, [c = 3])", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.simpleFormalParameter3("b"),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))]));
   }
 
   void test_visitFormalParameterList_rrpp() {
-    assertSource("(a, b, [c = 3, d = 4])", AstFactory.formalParameterList([
+    _assertSource("(a, b, [c = 3, d = 4])", AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter3("a"),
         AstFactory.simpleFormalParameter3("b"),
         AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
@@ -2473,605 +2503,667 @@
   }
 
   void test_visitForStatement_c() {
-    assertSource("for (; c;) {}", AstFactory.forStatement(null, AstFactory.identifier3("c"), null, AstFactory.block([])));
+    _assertSource("for (; c;) {}", AstFactory.forStatement(null, AstFactory.identifier3("c"), null, AstFactory.block([])));
   }
 
   void test_visitForStatement_cu() {
-    assertSource("for (; c; u) {}", AstFactory.forStatement(null, AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (; c; u) {}", AstFactory.forStatement(null, AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitForStatement_e() {
-    assertSource("for (e;;) {}", AstFactory.forStatement(AstFactory.identifier3("e"), null, null, AstFactory.block([])));
+    _assertSource("for (e;;) {}", AstFactory.forStatement(AstFactory.identifier3("e"), null, null, AstFactory.block([])));
   }
 
   void test_visitForStatement_ec() {
-    assertSource("for (e; c;) {}", AstFactory.forStatement(AstFactory.identifier3("e"), AstFactory.identifier3("c"), null, AstFactory.block([])));
+    _assertSource("for (e; c;) {}", AstFactory.forStatement(AstFactory.identifier3("e"), AstFactory.identifier3("c"), null, AstFactory.block([])));
   }
 
   void test_visitForStatement_ecu() {
-    assertSource("for (e; c; u) {}", AstFactory.forStatement(AstFactory.identifier3("e"), AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (e; c; u) {}", AstFactory.forStatement(AstFactory.identifier3("e"), AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitForStatement_eu() {
-    assertSource("for (e;; u) {}", AstFactory.forStatement(AstFactory.identifier3("e"), null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (e;; u) {}", AstFactory.forStatement(AstFactory.identifier3("e"), null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitForStatement_i() {
-    assertSource("for (var i;;) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), null, null, AstFactory.block([])));
+    _assertSource("for (var i;;) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), null, null, AstFactory.block([])));
   }
 
   void test_visitForStatement_ic() {
-    assertSource("for (var i; c;) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), AstFactory.identifier3("c"), null, AstFactory.block([])));
+    _assertSource("for (var i; c;) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), AstFactory.identifier3("c"), null, AstFactory.block([])));
   }
 
   void test_visitForStatement_icu() {
-    assertSource("for (var i; c; u) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (var i; c; u) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), AstFactory.identifier3("c"), AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitForStatement_iu() {
-    assertSource("for (var i;; u) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (var i;; u) {}", AstFactory.forStatement2(AstFactory.variableDeclarationList2(Keyword.VAR, [AstFactory.variableDeclaration("i")]), null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitForStatement_u() {
-    assertSource("for (;; u) {}", AstFactory.forStatement(null, null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
+    _assertSource("for (;; u) {}", AstFactory.forStatement(null, null, AstFactory.list([AstFactory.identifier3("u")]), AstFactory.block([])));
   }
 
   void test_visitFunctionDeclaration_getter() {
-    assertSource("get f() {}", AstFactory.functionDeclaration(null, Keyword.GET, "f", AstFactory.functionExpression()));
+    _assertSource("get f() {}", AstFactory.functionDeclaration(null, Keyword.GET, "f", AstFactory.functionExpression()));
   }
 
   void test_visitFunctionDeclaration_normal() {
-    assertSource("f() {}", AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression()));
+    _assertSource("f() {}", AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression()));
   }
 
   void test_visitFunctionDeclaration_setter() {
-    assertSource("set f() {}", AstFactory.functionDeclaration(null, Keyword.SET, "f", AstFactory.functionExpression()));
+    _assertSource("set f() {}", AstFactory.functionDeclaration(null, Keyword.SET, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_withMetadata() {
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression());
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated f() {}", declaration);
   }
 
   void test_visitFunctionDeclarationStatement() {
-    assertSource("f() {};", AstFactory.functionDeclarationStatement(null, null, "f", AstFactory.functionExpression()));
+    _assertSource("f() {};", AstFactory.functionDeclarationStatement(null, null, "f", AstFactory.functionExpression()));
   }
 
   void test_visitFunctionExpression() {
-    assertSource("() {}", AstFactory.functionExpression());
+    _assertSource("() {}", AstFactory.functionExpression());
   }
 
   void test_visitFunctionExpressionInvocation() {
-    assertSource("f()", AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []));
+    _assertSource("f()", AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []));
+  }
+
+  void test_visitFunctionTypeAlias_generic() {
+    _assertSource("typedef A F<B>();", AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", AstFactory.typeParameterList(["B"]), AstFactory.formalParameterList([])));
+  }
+
+  void test_visitFunctionTypeAlias_nonGeneric() {
+    _assertSource("typedef A F();", AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", null, AstFactory.formalParameterList([])));
+  }
+
+  void test_visitFunctionTypeAlias_withMetadata() {
+    FunctionTypeAlias declaration = AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", null, AstFactory.formalParameterList([]));
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated typedef A F();", declaration);
   }
 
   void test_visitFunctionTypedFormalParameter_noType() {
-    assertSource("f()", AstFactory.functionTypedFormalParameter(null, "f", []));
+    _assertSource("f()", AstFactory.functionTypedFormalParameter(null, "f", []));
   }
 
   void test_visitFunctionTypedFormalParameter_type() {
-    assertSource("T f()", AstFactory.functionTypedFormalParameter(AstFactory.typeName4("T", []), "f", []));
+    _assertSource("T f()", AstFactory.functionTypedFormalParameter(AstFactory.typeName4("T", []), "f", []));
   }
 
   void test_visitIfStatement_withElse() {
-    assertSource("if (c) {} else {}", AstFactory.ifStatement2(AstFactory.identifier3("c"), AstFactory.block([]), AstFactory.block([])));
+    _assertSource("if (c) {} else {}", AstFactory.ifStatement2(AstFactory.identifier3("c"), AstFactory.block([]), AstFactory.block([])));
   }
 
   void test_visitIfStatement_withoutElse() {
-    assertSource("if (c) {}", AstFactory.ifStatement(AstFactory.identifier3("c"), AstFactory.block([])));
+    _assertSource("if (c) {}", AstFactory.ifStatement(AstFactory.identifier3("c"), AstFactory.block([])));
   }
 
   void test_visitImplementsClause_multiple() {
-    assertSource("implements A, B", AstFactory.implementsClause([
+    _assertSource("implements A, B", AstFactory.implementsClause([
         AstFactory.typeName4("A", []),
         AstFactory.typeName4("B", [])]));
   }
 
   void test_visitImplementsClause_single() {
-    assertSource("implements A", AstFactory.implementsClause([AstFactory.typeName4("A", [])]));
+    _assertSource("implements A", AstFactory.implementsClause([AstFactory.typeName4("A", [])]));
   }
 
   void test_visitImportDirective_combinator() {
-    assertSource("import 'a.dart' show A;", AstFactory.importDirective2("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+    _assertSource("import 'a.dart' show A;", AstFactory.importDirective2("a.dart", null, [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
 
   void test_visitImportDirective_combinators() {
-    assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective2("a.dart", null, [
+    _assertSource("import 'a.dart' show A hide B;", AstFactory.importDirective2("a.dart", null, [
         AstFactory.showCombinator([AstFactory.identifier3("A")]),
         AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
   }
 
   void test_visitImportDirective_minimal() {
-    assertSource("import 'a.dart';", AstFactory.importDirective2("a.dart", null, []));
+    _assertSource("import 'a.dart';", AstFactory.importDirective2("a.dart", null, []));
   }
 
   void test_visitImportDirective_prefix() {
-    assertSource("import 'a.dart' as p;", AstFactory.importDirective2("a.dart", "p", []));
+    _assertSource("import 'a.dart' as p;", AstFactory.importDirective2("a.dart", "p", []));
   }
 
   void test_visitImportDirective_prefix_combinator() {
-    assertSource("import 'a.dart' as p show A;", AstFactory.importDirective2("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+    _assertSource("import 'a.dart' as p show A;", AstFactory.importDirective2("a.dart", "p", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
 
   void test_visitImportDirective_prefix_combinators() {
-    assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective2("a.dart", "p", [
+    _assertSource("import 'a.dart' as p show A hide B;", AstFactory.importDirective2("a.dart", "p", [
         AstFactory.showCombinator([AstFactory.identifier3("A")]),
         AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
   }
 
+  void test_visitImportDirective_withMetadata() {
+    ImportDirective directive = AstFactory.importDirective2("a.dart", null, []);
+    directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated import 'a.dart';", directive);
+  }
+
   void test_visitImportHideCombinator_multiple() {
-    assertSource("hide a, b", AstFactory.hideCombinator([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+    _assertSource("hide a, b", AstFactory.hideCombinator([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
   }
 
   void test_visitImportHideCombinator_single() {
-    assertSource("hide a", AstFactory.hideCombinator([AstFactory.identifier3("a")]));
+    _assertSource("hide a", AstFactory.hideCombinator([AstFactory.identifier3("a")]));
   }
 
   void test_visitImportShowCombinator_multiple() {
-    assertSource("show a, b", AstFactory.showCombinator([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+    _assertSource("show a, b", AstFactory.showCombinator([AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
   }
 
   void test_visitImportShowCombinator_single() {
-    assertSource("show a", AstFactory.showCombinator([AstFactory.identifier3("a")]));
+    _assertSource("show a", AstFactory.showCombinator([AstFactory.identifier3("a")]));
   }
 
   void test_visitIndexExpression() {
-    assertSource("a[i]", AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("i")));
+    _assertSource("a[i]", AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("i")));
   }
 
   void test_visitInstanceCreationExpression_const() {
-    assertSource("const C()", AstFactory.instanceCreationExpression2(Keyword.CONST, AstFactory.typeName4("C", []), []));
+    _assertSource("const C()", AstFactory.instanceCreationExpression2(Keyword.CONST, AstFactory.typeName4("C", []), []));
   }
 
   void test_visitInstanceCreationExpression_named() {
-    assertSource("new C.c()", AstFactory.instanceCreationExpression3(Keyword.NEW, AstFactory.typeName4("C", []), "c", []));
+    _assertSource("new C.c()", AstFactory.instanceCreationExpression3(Keyword.NEW, AstFactory.typeName4("C", []), "c", []));
   }
 
   void test_visitInstanceCreationExpression_unnamed() {
-    assertSource("new C()", AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []));
+    _assertSource("new C()", AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []));
   }
 
   void test_visitIntegerLiteral() {
-    assertSource("42", AstFactory.integer(42));
+    _assertSource("42", AstFactory.integer(42));
   }
 
   void test_visitInterpolationExpression_expression() {
-    assertSource("\${a}", AstFactory.interpolationExpression(AstFactory.identifier3("a")));
+    _assertSource("\${a}", AstFactory.interpolationExpression(AstFactory.identifier3("a")));
   }
 
   void test_visitInterpolationExpression_identifier() {
-    assertSource("\$a", AstFactory.interpolationExpression2("a"));
+    _assertSource("\$a", AstFactory.interpolationExpression2("a"));
   }
 
   void test_visitInterpolationString() {
-    assertSource("'x", AstFactory.interpolationString("'x", "x"));
+    _assertSource("'x", AstFactory.interpolationString("'x", "x"));
   }
 
   void test_visitIsExpression_negated() {
-    assertSource("a is! C", AstFactory.isExpression(AstFactory.identifier3("a"), true, AstFactory.typeName4("C", [])));
+    _assertSource("a is! C", AstFactory.isExpression(AstFactory.identifier3("a"), true, AstFactory.typeName4("C", [])));
   }
 
   void test_visitIsExpression_normal() {
-    assertSource("a is C", AstFactory.isExpression(AstFactory.identifier3("a"), false, AstFactory.typeName4("C", [])));
+    _assertSource("a is C", AstFactory.isExpression(AstFactory.identifier3("a"), false, AstFactory.typeName4("C", [])));
   }
 
   void test_visitLabel() {
-    assertSource("a:", AstFactory.label2("a"));
+    _assertSource("a:", AstFactory.label2("a"));
   }
 
   void test_visitLabeledStatement_multiple() {
-    assertSource("a: b: return;", AstFactory.labeledStatement(AstFactory.list([AstFactory.label2("a"), AstFactory.label2("b")]), AstFactory.returnStatement()));
+    _assertSource("a: b: return;", AstFactory.labeledStatement(AstFactory.list([AstFactory.label2("a"), AstFactory.label2("b")]), AstFactory.returnStatement()));
   }
 
   void test_visitLabeledStatement_single() {
-    assertSource("a: return;", AstFactory.labeledStatement(AstFactory.list([AstFactory.label2("a")]), AstFactory.returnStatement()));
+    _assertSource("a: return;", AstFactory.labeledStatement(AstFactory.list([AstFactory.label2("a")]), AstFactory.returnStatement()));
   }
 
   void test_visitLibraryDirective() {
-    assertSource("library l;", AstFactory.libraryDirective2("l"));
+    _assertSource("library l;", AstFactory.libraryDirective2("l"));
+  }
+
+  void test_visitLibraryDirective_withMetadata() {
+    LibraryDirective directive = AstFactory.libraryDirective2("l");
+    directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated library l;", directive);
   }
 
   void test_visitLibraryIdentifier_multiple() {
-    assertSource("a.b.c", AstFactory.libraryIdentifier([
+    _assertSource("a.b.c", AstFactory.libraryIdentifier([
         AstFactory.identifier3("a"),
         AstFactory.identifier3("b"),
         AstFactory.identifier3("c")]));
   }
 
   void test_visitLibraryIdentifier_single() {
-    assertSource("a", AstFactory.libraryIdentifier([AstFactory.identifier3("a")]));
+    _assertSource("a", AstFactory.libraryIdentifier([AstFactory.identifier3("a")]));
   }
 
   void test_visitListLiteral_const() {
-    assertSource("const []", AstFactory.listLiteral2(Keyword.CONST, null, []));
+    _assertSource("const []", AstFactory.listLiteral2(Keyword.CONST, null, []));
   }
 
   void test_visitListLiteral_empty() {
-    assertSource("[]", AstFactory.listLiteral([]));
+    _assertSource("[]", AstFactory.listLiteral([]));
   }
 
   void test_visitListLiteral_nonEmpty() {
-    assertSource("[a, b, c]", AstFactory.listLiteral([
+    _assertSource("[a, b, c]", AstFactory.listLiteral([
         AstFactory.identifier3("a"),
         AstFactory.identifier3("b"),
         AstFactory.identifier3("c")]));
   }
 
   void test_visitMapLiteral_const() {
-    assertSource("const {}", AstFactory.mapLiteral(Keyword.CONST, null, []));
+    _assertSource("const {}", AstFactory.mapLiteral(Keyword.CONST, null, []));
   }
 
   void test_visitMapLiteral_empty() {
-    assertSource("{}", AstFactory.mapLiteral2([]));
+    _assertSource("{}", AstFactory.mapLiteral2([]));
   }
 
   void test_visitMapLiteral_nonEmpty() {
-    assertSource("{'a' : a, 'b' : b, 'c' : c}", AstFactory.mapLiteral2([
+    _assertSource("{'a' : a, 'b' : b, 'c' : c}", AstFactory.mapLiteral2([
         AstFactory.mapLiteralEntry("a", AstFactory.identifier3("a")),
         AstFactory.mapLiteralEntry("b", AstFactory.identifier3("b")),
         AstFactory.mapLiteralEntry("c", AstFactory.identifier3("c"))]));
   }
 
   void test_visitMapLiteralEntry() {
-    assertSource("'a' : b", AstFactory.mapLiteralEntry("a", AstFactory.identifier3("b")));
+    _assertSource("'a' : b", AstFactory.mapLiteralEntry("a", AstFactory.identifier3("b")));
   }
 
   void test_visitMethodDeclaration_external() {
-    assertSource("external m();", AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([])));
+    _assertSource("external m();", AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([])));
   }
 
   void test_visitMethodDeclaration_external_returnType() {
-    assertSource("external T m();", AstFactory.methodDeclaration(null, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([])));
+    _assertSource("external T m();", AstFactory.methodDeclaration(null, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([])));
   }
 
   void test_visitMethodDeclaration_getter() {
-    assertSource("get m {}", AstFactory.methodDeclaration2(null, null, Keyword.GET, null, AstFactory.identifier3("m"), null, AstFactory.blockFunctionBody2([])));
+    _assertSource("get m {}", AstFactory.methodDeclaration2(null, null, Keyword.GET, null, AstFactory.identifier3("m"), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_getter_returnType() {
-    assertSource("T get m {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), Keyword.GET, null, AstFactory.identifier3("m"), null, AstFactory.blockFunctionBody2([])));
+    _assertSource("T get m {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), Keyword.GET, null, AstFactory.identifier3("m"), null, AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_getter_seturnType() {
-    assertSource("T set m(var v) {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), Keyword.SET, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([AstFactory.simpleFormalParameter(Keyword.VAR, "v")]), AstFactory.blockFunctionBody2([])));
+    _assertSource("T set m(var v) {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), Keyword.SET, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([AstFactory.simpleFormalParameter(Keyword.VAR, "v")]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_minimal() {
-    assertSource("m() {}", AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("m() {}", AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_multipleParameters() {
-    assertSource("m(var a, var b) {}", AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([
+    _assertSource("m(var a, var b) {}", AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([
         AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
         AstFactory.simpleFormalParameter(Keyword.VAR, "b")]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_operator() {
-    assertSource("operator +() {}", AstFactory.methodDeclaration2(null, null, null, Keyword.OPERATOR, AstFactory.identifier3("+"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("operator +() {}", AstFactory.methodDeclaration2(null, null, null, Keyword.OPERATOR, AstFactory.identifier3("+"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_operator_returnType() {
-    assertSource("T operator +() {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), null, Keyword.OPERATOR, AstFactory.identifier3("+"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("T operator +() {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), null, Keyword.OPERATOR, AstFactory.identifier3("+"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_returnType() {
-    assertSource("T m() {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("T m() {}", AstFactory.methodDeclaration2(null, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_setter() {
-    assertSource("set m(var v) {}", AstFactory.methodDeclaration2(null, null, Keyword.SET, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([AstFactory.simpleFormalParameter(Keyword.VAR, "v")]), AstFactory.blockFunctionBody2([])));
+    _assertSource("set m(var v) {}", AstFactory.methodDeclaration2(null, null, Keyword.SET, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([AstFactory.simpleFormalParameter(Keyword.VAR, "v")]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_static() {
-    assertSource("static m() {}", AstFactory.methodDeclaration2(Keyword.STATIC, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("static m() {}", AstFactory.methodDeclaration2(Keyword.STATIC, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
   }
 
   void test_visitMethodDeclaration_static_returnType() {
-    assertSource("static T m() {}", AstFactory.methodDeclaration2(Keyword.STATIC, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+    _assertSource("static T m() {}", AstFactory.methodDeclaration2(Keyword.STATIC, AstFactory.typeName4("T", []), null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_withMetadata() {
+    MethodDeclaration declaration = AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([]));
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated m() {}", declaration);
   }
 
   void test_visitMethodInvocation_noTarget() {
-    assertSource("m()", AstFactory.methodInvocation2("m", []));
+    _assertSource("m()", AstFactory.methodInvocation2("m", []));
   }
 
   void test_visitMethodInvocation_target() {
-    assertSource("t.m()", AstFactory.methodInvocation(AstFactory.identifier3("t"), "m", []));
+    _assertSource("t.m()", AstFactory.methodInvocation(AstFactory.identifier3("t"), "m", []));
   }
 
   void test_visitNamedExpression() {
-    assertSource("a: b", AstFactory.namedExpression2("a", AstFactory.identifier3("b")));
+    _assertSource("a: b", AstFactory.namedExpression2("a", AstFactory.identifier3("b")));
   }
 
   void test_visitNamedFormalParameter() {
-    assertSource("var a : 0", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter(Keyword.VAR, "a"), AstFactory.integer(0)));
+    _assertSource("var a : 0", AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter(Keyword.VAR, "a"), AstFactory.integer(0)));
   }
 
   void test_visitNativeClause() {
-    assertSource("native 'code'", AstFactory.nativeClause("code"));
+    _assertSource("native 'code'", AstFactory.nativeClause("code"));
   }
 
   void test_visitNativeFunctionBody() {
-    assertSource("native 'str';", AstFactory.nativeFunctionBody("str"));
+    _assertSource("native 'str';", AstFactory.nativeFunctionBody("str"));
   }
 
   void test_visitNullLiteral() {
-    assertSource("null", AstFactory.nullLiteral());
+    _assertSource("null", AstFactory.nullLiteral());
   }
 
   void test_visitParenthesizedExpression() {
-    assertSource("(a)", AstFactory.parenthesizedExpression(AstFactory.identifier3("a")));
+    _assertSource("(a)", AstFactory.parenthesizedExpression(AstFactory.identifier3("a")));
   }
 
   void test_visitPartDirective() {
-    assertSource("part 'a.dart';", AstFactory.partDirective2("a.dart"));
+    _assertSource("part 'a.dart';", AstFactory.partDirective2("a.dart"));
+  }
+
+  void test_visitPartDirective_withMetadata() {
+    PartDirective directive = AstFactory.partDirective2("a.dart");
+    directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated part 'a.dart';", directive);
   }
 
   void test_visitPartOfDirective() {
-    assertSource("part of l;", AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"])));
+    _assertSource("part of l;", AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"])));
+  }
+
+  void test_visitPartOfDirective_withMetadata() {
+    PartOfDirective directive = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"]));
+    directive.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated part of l;", directive);
   }
 
   void test_visitPositionalFormalParameter() {
-    assertSource("var a = 0", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter(Keyword.VAR, "a"), AstFactory.integer(0)));
+    _assertSource("var a = 0", AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter(Keyword.VAR, "a"), AstFactory.integer(0)));
   }
 
   void test_visitPostfixExpression() {
-    assertSource("a++", AstFactory.postfixExpression(AstFactory.identifier3("a"), TokenType.PLUS_PLUS));
+    _assertSource("a++", AstFactory.postfixExpression(AstFactory.identifier3("a"), TokenType.PLUS_PLUS));
   }
 
   void test_visitPrefixedIdentifier() {
-    assertSource("a.b", AstFactory.identifier5("a", "b"));
+    _assertSource("a.b", AstFactory.identifier5("a", "b"));
   }
 
   void test_visitPrefixExpression() {
-    assertSource("-a", AstFactory.prefixExpression(TokenType.MINUS, AstFactory.identifier3("a")));
+    _assertSource("-a", AstFactory.prefixExpression(TokenType.MINUS, AstFactory.identifier3("a")));
   }
 
   void test_visitPropertyAccess() {
-    assertSource("a.b", AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"));
+    _assertSource("a.b", AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"));
   }
 
   void test_visitRedirectingConstructorInvocation_named() {
-    assertSource("this.c()", AstFactory.redirectingConstructorInvocation2("c", []));
+    _assertSource("this.c()", AstFactory.redirectingConstructorInvocation2("c", []));
   }
 
   void test_visitRedirectingConstructorInvocation_unnamed() {
-    assertSource("this()", AstFactory.redirectingConstructorInvocation([]));
+    _assertSource("this()", AstFactory.redirectingConstructorInvocation([]));
   }
 
   void test_visitRethrowExpression() {
-    assertSource("rethrow", AstFactory.rethrowExpression());
+    _assertSource("rethrow", AstFactory.rethrowExpression());
   }
 
   void test_visitReturnStatement_expression() {
-    assertSource("return a;", AstFactory.returnStatement2(AstFactory.identifier3("a")));
+    _assertSource("return a;", AstFactory.returnStatement2(AstFactory.identifier3("a")));
   }
 
   void test_visitReturnStatement_noExpression() {
-    assertSource("return;", AstFactory.returnStatement());
+    _assertSource("return;", AstFactory.returnStatement());
   }
 
   void test_visitScriptTag() {
     String scriptTag = "!#/bin/dart.exe";
-    assertSource(scriptTag, AstFactory.scriptTag(scriptTag));
+    _assertSource(scriptTag, AstFactory.scriptTag(scriptTag));
   }
 
   void test_visitSimpleFormalParameter_keyword() {
-    assertSource("var a", AstFactory.simpleFormalParameter(Keyword.VAR, "a"));
+    _assertSource("var a", AstFactory.simpleFormalParameter(Keyword.VAR, "a"));
   }
 
   void test_visitSimpleFormalParameter_keyword_type() {
-    assertSource("final A a", AstFactory.simpleFormalParameter2(Keyword.FINAL, AstFactory.typeName4("A", []), "a"));
+    _assertSource("final A a", AstFactory.simpleFormalParameter2(Keyword.FINAL, AstFactory.typeName4("A", []), "a"));
   }
 
   void test_visitSimpleFormalParameter_type() {
-    assertSource("A a", AstFactory.simpleFormalParameter4(AstFactory.typeName4("A", []), "a"));
+    _assertSource("A a", AstFactory.simpleFormalParameter4(AstFactory.typeName4("A", []), "a"));
   }
 
   void test_visitSimpleIdentifier() {
-    assertSource("a", AstFactory.identifier3("a"));
+    _assertSource("a", AstFactory.identifier3("a"));
   }
 
   void test_visitSimpleStringLiteral() {
-    assertSource("'a'", AstFactory.string2("a"));
+    _assertSource("'a'", AstFactory.string2("a"));
   }
 
   void test_visitStringInterpolation() {
-    assertSource("'a\${e}b'", AstFactory.string([
+    _assertSource("'a\${e}b'", AstFactory.string([
         AstFactory.interpolationString("'a", "a"),
         AstFactory.interpolationExpression(AstFactory.identifier3("e")),
         AstFactory.interpolationString("b'", "b")]));
   }
 
   void test_visitSuperConstructorInvocation() {
-    assertSource("super()", AstFactory.superConstructorInvocation([]));
+    _assertSource("super()", AstFactory.superConstructorInvocation([]));
   }
 
   void test_visitSuperConstructorInvocation_named() {
-    assertSource("super.c()", AstFactory.superConstructorInvocation2("c", []));
+    _assertSource("super.c()", AstFactory.superConstructorInvocation2("c", []));
   }
 
   void test_visitSuperExpression() {
-    assertSource("super", AstFactory.superExpression());
+    _assertSource("super", AstFactory.superExpression());
   }
 
   void test_visitSwitchCase_multipleLabels() {
-    assertSource("l1: l2: case a: {}", AstFactory.switchCase2(AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]), AstFactory.identifier3("a"), [AstFactory.block([])]));
+    _assertSource("l1: l2: case a: {}", AstFactory.switchCase2(AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]), AstFactory.identifier3("a"), [AstFactory.block([])]));
   }
 
   void test_visitSwitchCase_multipleStatements() {
-    assertSource("case a: {} {}", AstFactory.switchCase(AstFactory.identifier3("a"), [AstFactory.block([]), AstFactory.block([])]));
+    _assertSource("case a: {} {}", AstFactory.switchCase(AstFactory.identifier3("a"), [AstFactory.block([]), AstFactory.block([])]));
   }
 
   void test_visitSwitchCase_noLabels() {
-    assertSource("case a: {}", AstFactory.switchCase(AstFactory.identifier3("a"), [AstFactory.block([])]));
+    _assertSource("case a: {}", AstFactory.switchCase(AstFactory.identifier3("a"), [AstFactory.block([])]));
   }
 
   void test_visitSwitchCase_singleLabel() {
-    assertSource("l1: case a: {}", AstFactory.switchCase2(AstFactory.list([AstFactory.label2("l1")]), AstFactory.identifier3("a"), [AstFactory.block([])]));
+    _assertSource("l1: case a: {}", AstFactory.switchCase2(AstFactory.list([AstFactory.label2("l1")]), AstFactory.identifier3("a"), [AstFactory.block([])]));
   }
 
   void test_visitSwitchDefault_multipleLabels() {
-    assertSource("l1: l2: default: {}", AstFactory.switchDefault(AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]), [AstFactory.block([])]));
+    _assertSource("l1: l2: default: {}", AstFactory.switchDefault(AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]), [AstFactory.block([])]));
   }
 
   void test_visitSwitchDefault_multipleStatements() {
-    assertSource("default: {} {}", AstFactory.switchDefault2([AstFactory.block([]), AstFactory.block([])]));
+    _assertSource("default: {} {}", AstFactory.switchDefault2([AstFactory.block([]), AstFactory.block([])]));
   }
 
   void test_visitSwitchDefault_noLabels() {
-    assertSource("default: {}", AstFactory.switchDefault2([AstFactory.block([])]));
+    _assertSource("default: {}", AstFactory.switchDefault2([AstFactory.block([])]));
   }
 
   void test_visitSwitchDefault_singleLabel() {
-    assertSource("l1: default: {}", AstFactory.switchDefault(AstFactory.list([AstFactory.label2("l1")]), [AstFactory.block([])]));
+    _assertSource("l1: default: {}", AstFactory.switchDefault(AstFactory.list([AstFactory.label2("l1")]), [AstFactory.block([])]));
   }
 
   void test_visitSwitchStatement() {
-    assertSource("switch (a) {case 'b': {} default: {}}", AstFactory.switchStatement(AstFactory.identifier3("a"), [
+    _assertSource("switch (a) {case 'b': {} default: {}}", AstFactory.switchStatement(AstFactory.identifier3("a"), [
         AstFactory.switchCase(AstFactory.string2("b"), [AstFactory.block([])]),
         AstFactory.switchDefault2([AstFactory.block([])])]));
   }
 
   void test_visitSymbolLiteral_multiple() {
-    assertSource("#a.b.c", AstFactory.symbolLiteral(["a", "b", "c"]));
+    _assertSource("#a.b.c", AstFactory.symbolLiteral(["a", "b", "c"]));
   }
 
   void test_visitSymbolLiteral_single() {
-    assertSource("#a", AstFactory.symbolLiteral(["a"]));
+    _assertSource("#a", AstFactory.symbolLiteral(["a"]));
   }
 
   void test_visitThisExpression() {
-    assertSource("this", AstFactory.thisExpression());
+    _assertSource("this", AstFactory.thisExpression());
   }
 
   void test_visitThrowStatement() {
-    assertSource("throw e", AstFactory.throwExpression2(AstFactory.identifier3("e")));
+    _assertSource("throw e", AstFactory.throwExpression2(AstFactory.identifier3("e")));
   }
 
   void test_visitTopLevelVariableDeclaration_multiple() {
-    assertSource("var a;", AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+    _assertSource("var a;", AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [AstFactory.variableDeclaration("a")]));
   }
 
   void test_visitTopLevelVariableDeclaration_single() {
-    assertSource("var a, b;", AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [
+    _assertSource("var a, b;", AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [
         AstFactory.variableDeclaration("a"),
         AstFactory.variableDeclaration("b")]));
   }
 
   void test_visitTryStatement_catch() {
-    assertSource("try {} on E {}", AstFactory.tryStatement2(AstFactory.block([]), [AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]));
+    _assertSource("try {} on E {}", AstFactory.tryStatement2(AstFactory.block([]), [AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]));
   }
 
   void test_visitTryStatement_catches() {
-    assertSource("try {} on E {} on F {}", AstFactory.tryStatement2(AstFactory.block([]), [
+    _assertSource("try {} on E {} on F {}", AstFactory.tryStatement2(AstFactory.block([]), [
         AstFactory.catchClause3(AstFactory.typeName4("E", []), []),
         AstFactory.catchClause3(AstFactory.typeName4("F", []), [])]));
   }
 
   void test_visitTryStatement_catchFinally() {
-    assertSource("try {} on E {} finally {}", AstFactory.tryStatement3(AstFactory.block([]), AstFactory.list([AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]), AstFactory.block([])));
+    _assertSource("try {} on E {} finally {}", AstFactory.tryStatement3(AstFactory.block([]), AstFactory.list([AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]), AstFactory.block([])));
   }
 
   void test_visitTryStatement_finally() {
-    assertSource("try {} finally {}", AstFactory.tryStatement(AstFactory.block([]), AstFactory.block([])));
-  }
-
-  void test_visitTypeAlias_generic() {
-    assertSource("typedef A F<B>();", AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", AstFactory.typeParameterList(["B"]), AstFactory.formalParameterList([])));
-  }
-
-  void test_visitTypeAlias_nonGeneric() {
-    assertSource("typedef A F();", AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", null, AstFactory.formalParameterList([])));
+    _assertSource("try {} finally {}", AstFactory.tryStatement(AstFactory.block([]), AstFactory.block([])));
   }
 
   void test_visitTypeArgumentList_multiple() {
-    assertSource("<E, F>", AstFactory.typeArgumentList([
+    _assertSource("<E, F>", AstFactory.typeArgumentList([
         AstFactory.typeName4("E", []),
         AstFactory.typeName4("F", [])]));
   }
 
   void test_visitTypeArgumentList_single() {
-    assertSource("<E>", AstFactory.typeArgumentList([AstFactory.typeName4("E", [])]));
+    _assertSource("<E>", AstFactory.typeArgumentList([AstFactory.typeName4("E", [])]));
   }
 
   void test_visitTypeName_multipleArgs() {
-    assertSource("C<D, E>", AstFactory.typeName4("C", [
+    _assertSource("C<D, E>", AstFactory.typeName4("C", [
         AstFactory.typeName4("D", []),
         AstFactory.typeName4("E", [])]));
   }
 
   void test_visitTypeName_nestedArg() {
-    assertSource("C<D<E>>", AstFactory.typeName4("C", [AstFactory.typeName4("D", [AstFactory.typeName4("E", [])])]));
+    _assertSource("C<D<E>>", AstFactory.typeName4("C", [AstFactory.typeName4("D", [AstFactory.typeName4("E", [])])]));
   }
 
   void test_visitTypeName_noArgs() {
-    assertSource("C", AstFactory.typeName4("C", []));
+    _assertSource("C", AstFactory.typeName4("C", []));
   }
 
   void test_visitTypeName_singleArg() {
-    assertSource("C<D>", AstFactory.typeName4("C", [AstFactory.typeName4("D", [])]));
+    _assertSource("C<D>", AstFactory.typeName4("C", [AstFactory.typeName4("D", [])]));
   }
 
   void test_visitTypeParameter_withExtends() {
-    assertSource("E extends C", AstFactory.typeParameter2("E", AstFactory.typeName4("C", [])));
+    _assertSource("E extends C", AstFactory.typeParameter2("E", AstFactory.typeName4("C", [])));
+  }
+
+  void test_visitTypeParameter_withMetadata() {
+    TypeParameter parameter = AstFactory.typeParameter("E");
+    parameter.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated E", parameter);
   }
 
   void test_visitTypeParameter_withoutExtends() {
-    assertSource("E", AstFactory.typeParameter("E"));
+    _assertSource("E", AstFactory.typeParameter("E"));
   }
 
   void test_visitTypeParameterList_multiple() {
-    assertSource("<E, F>", AstFactory.typeParameterList(["E", "F"]));
+    _assertSource("<E, F>", AstFactory.typeParameterList(["E", "F"]));
   }
 
   void test_visitTypeParameterList_single() {
-    assertSource("<E>", AstFactory.typeParameterList(["E"]));
+    _assertSource("<E>", AstFactory.typeParameterList(["E"]));
   }
 
   void test_visitVariableDeclaration_initialized() {
-    assertSource("a = b", AstFactory.variableDeclaration2("a", AstFactory.identifier3("b")));
+    _assertSource("a = b", AstFactory.variableDeclaration2("a", AstFactory.identifier3("b")));
   }
 
   void test_visitVariableDeclaration_uninitialized() {
-    assertSource("a", AstFactory.variableDeclaration("a"));
+    _assertSource("a", AstFactory.variableDeclaration("a"));
+  }
+
+  void test_visitVariableDeclaration_withMetadata() {
+    VariableDeclaration declaration = AstFactory.variableDeclaration("a");
+    declaration.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated a", declaration);
   }
 
   void test_visitVariableDeclarationList_const_type() {
-    assertSource("const C a, b", AstFactory.variableDeclarationList(Keyword.CONST, AstFactory.typeName4("C", []), [
+    _assertSource("const C a, b", AstFactory.variableDeclarationList(Keyword.CONST, AstFactory.typeName4("C", []), [
         AstFactory.variableDeclaration("a"),
         AstFactory.variableDeclaration("b")]));
   }
 
   void test_visitVariableDeclarationList_final_noType() {
-    assertSource("final a, b", AstFactory.variableDeclarationList2(Keyword.FINAL, [
+    _assertSource("final a, b", AstFactory.variableDeclarationList2(Keyword.FINAL, [
         AstFactory.variableDeclaration("a"),
         AstFactory.variableDeclaration("b")]));
   }
 
+  void test_visitVariableDeclarationList_final_withMetadata() {
+    VariableDeclarationList declarationList = AstFactory.variableDeclarationList2(Keyword.FINAL, [
+        AstFactory.variableDeclaration("a"),
+        AstFactory.variableDeclaration("b")]);
+    declarationList.metadata = AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertSource("@deprecated final a, b", declarationList);
+  }
+
   void test_visitVariableDeclarationList_type() {
-    assertSource("C a, b", AstFactory.variableDeclarationList(null, AstFactory.typeName4("C", []), [
+    _assertSource("C a, b", AstFactory.variableDeclarationList(null, AstFactory.typeName4("C", []), [
         AstFactory.variableDeclaration("a"),
         AstFactory.variableDeclaration("b")]));
   }
 
   void test_visitVariableDeclarationList_var() {
-    assertSource("var a, b", AstFactory.variableDeclarationList2(Keyword.VAR, [
+    _assertSource("var a, b", AstFactory.variableDeclarationList2(Keyword.VAR, [
         AstFactory.variableDeclaration("a"),
         AstFactory.variableDeclaration("b")]));
   }
 
   void test_visitVariableDeclarationStatement() {
-    assertSource("C c;", AstFactory.variableDeclarationStatement(null, AstFactory.typeName4("C", []), [AstFactory.variableDeclaration("c")]));
+    _assertSource("C c;", AstFactory.variableDeclarationStatement(null, AstFactory.typeName4("C", []), [AstFactory.variableDeclaration("c")]));
   }
 
   void test_visitWhileStatement() {
-    assertSource("while (c) {}", AstFactory.whileStatement(AstFactory.identifier3("c"), AstFactory.block([])));
+    _assertSource("while (c) {}", AstFactory.whileStatement(AstFactory.identifier3("c"), AstFactory.block([])));
   }
 
   void test_visitWithClause_multiple() {
-    assertSource("with A, B, C", AstFactory.withClause([
+    _assertSource("with A, B, C", AstFactory.withClause([
         AstFactory.typeName4("A", []),
         AstFactory.typeName4("B", []),
         AstFactory.typeName4("C", [])]));
   }
 
   void test_visitWithClause_single() {
-    assertSource("with A", AstFactory.withClause([AstFactory.typeName4("A", [])]));
+    _assertSource("with A", AstFactory.withClause([AstFactory.typeName4("A", [])]));
   }
 
   /**
@@ -3082,7 +3174,7 @@
    * @param node the AST node being visited to produce the actual source
    * @throws AFE if the visitor does not produce the expected source for the given node
    */
-  void assertSource(String expectedSource, AstNode node) {
+  void _assertSource(String expectedSource, AstNode node) {
     PrintStringWriter writer = new PrintStringWriter();
     node.accept(new ToSourceVisitor(writer));
     JUnitTestCase.assertEquals(expectedSource, writer.toString());
@@ -3242,6 +3334,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitClassDeclaration_singleMember);
       });
+      _ut.test('test_visitClassDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassDeclaration_withMetadata);
+      });
       _ut.test('test_visitClassTypeAlias_abstract', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitClassTypeAlias_abstract);
@@ -3274,6 +3370,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitClassTypeAlias_parameters_implements);
       });
+      _ut.test('test_visitClassTypeAlias_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassTypeAlias_withMetadata);
+      });
       _ut.test('test_visitComment', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitComment);
@@ -3346,6 +3446,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitConstructorDeclaration_singleInitializer);
       });
+      _ut.test('test_visitConstructorDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitConstructorDeclaration_withMetadata);
+      });
       _ut.test('test_visitConstructorFieldInitializer_withThis', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitConstructorFieldInitializer_withThis);
@@ -3418,6 +3522,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitExportDirective_minimal);
       });
+      _ut.test('test_visitExportDirective_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitExportDirective_withMetadata);
+      });
       _ut.test('test_visitExpressionFunctionBody', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitExpressionFunctionBody);
@@ -3438,6 +3546,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFieldDeclaration_static);
       });
+      _ut.test('test_visitFieldDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFieldDeclaration_withMetadata);
+      });
       _ut.test('test_visitFieldFormalParameter_functionTyped', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFieldFormalParameter_functionTyped);
@@ -3578,6 +3690,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionDeclaration_setter);
       });
+      _ut.test('test_visitFunctionDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionDeclaration_withMetadata);
+      });
       _ut.test('test_visitFunctionExpression', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionExpression);
@@ -3586,6 +3702,18 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionExpressionInvocation);
       });
+      _ut.test('test_visitFunctionTypeAlias_generic', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionTypeAlias_generic);
+      });
+      _ut.test('test_visitFunctionTypeAlias_nonGeneric', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionTypeAlias_nonGeneric);
+      });
+      _ut.test('test_visitFunctionTypeAlias_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionTypeAlias_withMetadata);
+      });
       _ut.test('test_visitFunctionTypedFormalParameter_noType', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionTypedFormalParameter_noType);
@@ -3634,6 +3762,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitImportDirective_prefix_combinators);
       });
+      _ut.test('test_visitImportDirective_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitImportDirective_withMetadata);
+      });
       _ut.test('test_visitImportHideCombinator_multiple', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitImportHideCombinator_multiple);
@@ -3706,6 +3838,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitLibraryDirective);
       });
+      _ut.test('test_visitLibraryDirective_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitLibraryDirective_withMetadata);
+      });
       _ut.test('test_visitLibraryIdentifier_multiple', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitLibraryIdentifier_multiple);
@@ -3794,6 +3930,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitMethodDeclaration_static_returnType);
       });
+      _ut.test('test_visitMethodDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitMethodDeclaration_withMetadata);
+      });
       _ut.test('test_visitMethodInvocation_noTarget', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitMethodInvocation_noTarget);
@@ -3830,10 +3970,18 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitPartDirective);
       });
+      _ut.test('test_visitPartDirective_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitPartDirective_withMetadata);
+      });
       _ut.test('test_visitPartOfDirective', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitPartOfDirective);
       });
+      _ut.test('test_visitPartOfDirective_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitPartOfDirective_withMetadata);
+      });
       _ut.test('test_visitPositionalFormalParameter', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitPositionalFormalParameter);
@@ -3990,14 +4138,6 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitTryStatement_finally);
       });
-      _ut.test('test_visitTypeAlias_generic', () {
-        final __test = new ToSourceVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeAlias_generic);
-      });
-      _ut.test('test_visitTypeAlias_nonGeneric', () {
-        final __test = new ToSourceVisitorTest();
-        runJUnitTest(__test, __test.test_visitTypeAlias_nonGeneric);
-      });
       _ut.test('test_visitTypeArgumentList_multiple', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitTypeArgumentList_multiple);
@@ -4034,6 +4174,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitTypeParameter_withExtends);
       });
+      _ut.test('test_visitTypeParameter_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitTypeParameter_withMetadata);
+      });
       _ut.test('test_visitTypeParameter_withoutExtends', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitTypeParameter_withoutExtends);
@@ -4046,6 +4190,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitVariableDeclarationList_final_noType);
       });
+      _ut.test('test_visitVariableDeclarationList_final_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitVariableDeclarationList_final_withMetadata);
+      });
       _ut.test('test_visitVariableDeclarationList_type', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitVariableDeclarationList_type);
@@ -4066,6 +4214,10 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitVariableDeclaration_uninitialized);
       });
+      _ut.test('test_visitVariableDeclaration_withMetadata', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitVariableDeclaration_withMetadata);
+      });
       _ut.test('test_visitWhileStatement', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitWhileStatement);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index f09cd7e..8f4db1f 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -521,14 +521,14 @@
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
-    JUnitTestCase.assertSame(argument, type.substitute2(<Type2> [argument], <Type2> [parameter]));
+    JUnitTestCase.assertSame(argument, type.substitute2(<DartType> [argument], <DartType> [parameter]));
   }
 
   void test_substitute_notEqual() {
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
     InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("F")));
-    JUnitTestCase.assertSame(type, type.substitute2(<Type2> [argument], <Type2> [parameter]));
+    JUnitTestCase.assertSame(type, type.substitute2(<DartType> [argument], <DartType> [parameter]));
   }
 
   static dartSuite() {
@@ -591,6 +591,7 @@
    */
   TestTypeProvider _typeProvider;
 
+  @override
   void setUp() {
     _typeProvider = new TestTypeProvider();
   }
@@ -852,7 +853,7 @@
     // class A<E> { E get g {} }
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
-    Type2 typeE = classA.type.typeArguments[0];
+    DartType typeE = classA.type.typeArguments[0];
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [getterG];
@@ -862,7 +863,7 @@
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
-    typeAI.typeArguments = <Type2> [typeI];
+    typeAI.typeArguments = <DartType> [typeI];
     PropertyAccessorElement getter = typeAI.getGetter(getterName);
     JUnitTestCase.assertNotNull(getter);
     FunctionType getterType = getter.type;
@@ -907,14 +908,14 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
-    typeAF.typeArguments = <Type2> [typeB.typeArguments[0]];
+    typeAF.typeArguments = <DartType> [typeB.typeArguments[0]];
     classB.interfaces = <InterfaceType> [typeAF];
     //
     // B<I>
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
-    typeBI.typeArguments = <Type2> [typeI];
+    typeBI.typeArguments = <DartType> [typeI];
     List<InterfaceType> interfaces = typeBI.interfaces;
     EngineTestCase.assertLength(1, interfaces);
     InterfaceType result = interfaces[0];
@@ -956,7 +957,7 @@
   }
 
   void test_getLeastUpperBound_functionType() {
-    Type2 interfaceType = ElementFactory.classElement2("A", []).type;
+    DartType interfaceType = ElementFactory.classElement2("A", []).type;
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(AstFactory.identifier3("f")));
     JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(functionType));
   }
@@ -985,7 +986,7 @@
   }
 
   void test_getLeastUpperBound_null() {
-    Type2 interfaceType = ElementFactory.classElement2("A", []).type;
+    DartType interfaceType = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(null));
   }
 
@@ -994,7 +995,7 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
-    Type2 typeObject = typeA.element.supertype;
+    DartType typeObject = typeA.element.supertype;
     // assert that object does not have a super type
     JUnitTestCase.assertNull((typeObject.element as ClassElement).supertype);
     // assert that both A and B have the same super type of Object
@@ -1137,9 +1138,9 @@
     InterfaceType listType = _typeProvider.listType;
     InterfaceType intType = _typeProvider.intType;
     InterfaceType doubleType = _typeProvider.doubleType;
-    InterfaceType listOfIntType = listType.substitute4(<Type2> [intType]);
-    InterfaceType listOfDoubleType = listType.substitute4(<Type2> [doubleType]);
-    JUnitTestCase.assertEquals(listType.substitute4(<Type2> [_typeProvider.dynamicType]), listOfIntType.getLeastUpperBound(listOfDoubleType));
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
+    InterfaceType listOfDoubleType = listType.substitute4(<DartType> [doubleType]);
+    JUnitTestCase.assertEquals(listType.substitute4(<DartType> [_typeProvider.dynamicType]), listOfIntType.getLeastUpperBound(listOfDoubleType));
   }
 
   void test_getLeastUpperBound_typeParameters_same() {
@@ -1149,7 +1150,7 @@
     //
     InterfaceType listType = _typeProvider.listType;
     InterfaceType intType = _typeProvider.intType;
-    InterfaceType listOfIntType = listType.substitute4(<Type2> [intType]);
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
     JUnitTestCase.assertEquals(listOfIntType, listOfIntType.getLeastUpperBound(listOfIntType));
   }
 
@@ -1170,7 +1171,7 @@
     // class A<E> { E m(E p) {} }
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
-    Type2 typeE = classA.type.typeArguments[0];
+    DartType typeE = classA.type.typeArguments[0];
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
@@ -1180,12 +1181,12 @@
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
-    typeAI.typeArguments = <Type2> [typeI];
+    typeAI.typeArguments = <DartType> [typeI];
     MethodElement method = typeAI.getMethod(methodName);
     JUnitTestCase.assertNotNull(method);
     FunctionType methodType = method.type;
     JUnitTestCase.assertSame(typeI, methodType.returnType);
-    List<Type2> parameterTypes = methodType.normalParameterTypes;
+    List<DartType> parameterTypes = methodType.normalParameterTypes;
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
@@ -1243,14 +1244,14 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
-    typeAF.typeArguments = <Type2> [typeB.typeArguments[0]];
+    typeAF.typeArguments = <DartType> [typeB.typeArguments[0]];
     classB.mixins = <InterfaceType> [typeAF];
     //
     // B<I>
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
-    typeBI.typeArguments = <Type2> [typeI];
+    typeBI.typeArguments = <DartType> [typeI];
     List<InterfaceType> interfaces = typeBI.mixins;
     EngineTestCase.assertLength(1, interfaces);
     InterfaceType result = interfaces[0];
@@ -1275,7 +1276,7 @@
     // class A<E> { set s(E p) {} }
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
-    Type2 typeE = classA.type.typeArguments[0];
+    DartType typeE = classA.type.typeArguments[0];
     String setterName = "s";
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, typeE);
     classA.accessors = <PropertyAccessorElement> [setterS];
@@ -1285,11 +1286,11 @@
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
-    typeAI.typeArguments = <Type2> [typeI];
+    typeAI.typeArguments = <DartType> [typeI];
     PropertyAccessorElement setter = typeAI.getSetter(setterName);
     JUnitTestCase.assertNotNull(setter);
     FunctionType setterType = setter.type;
-    List<Type2> parameterTypes = setterType.normalParameterTypes;
+    List<DartType> parameterTypes = setterType.normalParameterTypes;
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
@@ -1323,14 +1324,14 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
-    typeAF.typeArguments = <Type2> [typeB.typeArguments[0]];
+    typeAF.typeArguments = <DartType> [typeB.typeArguments[0]];
     classB.supertype = typeAF;
     //
     // B<I>
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
-    typeBI.typeArguments = <Type2> [typeI];
+    typeBI.typeArguments = <DartType> [typeI];
     InterfaceType superclass = typeBI.superclass;
     JUnitTestCase.assertSame(classA, superclass.element);
     JUnitTestCase.assertSame(typeI, superclass.typeArguments[0]);
@@ -1360,9 +1361,9 @@
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classB = ElementFactory.classElement2("B", ["F", "G"]);
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
-    typeAF.typeArguments = <Type2> [classB.typeParameters[0].type];
+    typeAF.typeArguments = <DartType> [classB.typeParameters[0].type];
     InterfaceTypeImpl typeAG = new InterfaceTypeImpl.con1(classA);
-    typeAG.typeArguments = <Type2> [classB.typeParameters[1].type];
+    typeAG.typeArguments = <DartType> [classB.typeParameters[1].type];
     JUnitTestCase.assertFalse(typeAG.isAssignableTo(typeAF));
   }
 
@@ -1406,7 +1407,7 @@
   }
 
   void test_isMoreSpecificThan_bottom() {
-    Type2 type = ElementFactory.classElement2("A", []).type;
+    DartType type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(BottomTypeImpl.instance.isMoreSpecificThan(type));
   }
 
@@ -1416,8 +1417,8 @@
     ClassElement classJ = ElementFactory.classElement("J", classI.type, []);
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     InterfaceTypeImpl typeAJ = new InterfaceTypeImpl.con1(classA);
-    typeAI.typeArguments = <Type2> [classI.type];
-    typeAJ.typeArguments = <Type2> [classJ.type];
+    typeAI.typeArguments = <DartType> [classI.type];
+    typeAJ.typeArguments = <DartType> [classJ.type];
     JUnitTestCase.assertTrue(typeAJ.isMoreSpecificThan(typeAI));
     JUnitTestCase.assertFalse(typeAI.isMoreSpecificThan(typeAJ));
   }
@@ -1513,7 +1514,7 @@
   void test_isSubtypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    Type2 dynamicType = DynamicTypeImpl.instance;
+    DartType dynamicType = DynamicTypeImpl.instance;
     JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(dynamicType));
   }
@@ -1607,19 +1608,19 @@
   }
 
   void test_isSubtypeOf_typeArguments() {
-    Type2 dynamicType = DynamicTypeImpl.instance;
+    DartType dynamicType = DynamicTypeImpl.instance;
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     ClassElement classI = ElementFactory.classElement2("I", []);
     ClassElement classJ = ElementFactory.classElement("J", classI.type, []);
     ClassElement classK = ElementFactory.classElement2("K", []);
     InterfaceType typeA = classA.type;
-    InterfaceType typeA_dynamic = typeA.substitute4(<Type2> [dynamicType]);
+    InterfaceType typeA_dynamic = typeA.substitute4(<DartType> [dynamicType]);
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     InterfaceTypeImpl typeAJ = new InterfaceTypeImpl.con1(classA);
     InterfaceTypeImpl typeAK = new InterfaceTypeImpl.con1(classA);
-    typeAI.typeArguments = <Type2> [classI.type];
-    typeAJ.typeArguments = <Type2> [classJ.type];
-    typeAK.typeArguments = <Type2> [classK.type];
+    typeAI.typeArguments = <DartType> [classI.type];
+    typeAJ.typeArguments = <DartType> [classJ.type];
+    typeAK.typeArguments = <DartType> [classK.type];
     // A<J> <: A<I> since J <: I
     JUnitTestCase.assertTrue(typeAJ.isSubtypeOf(typeAI));
     JUnitTestCase.assertFalse(typeAI.isSubtypeOf(typeAJ));
@@ -1648,7 +1649,7 @@
   void test_isSupertypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    Type2 dynamicType = DynamicTypeImpl.instance;
+    DartType dynamicType = DynamicTypeImpl.instance;
     JUnitTestCase.assertTrue(dynamicType.isSupertypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSupertypeOf(dynamicType));
   }
@@ -1809,7 +1810,7 @@
     // class B<F> extends A<F> {}
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
-    Type2 typeE = classA.type.typeArguments[0];
+    DartType typeE = classA.type.typeArguments[0];
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, typeE, [typeE]);
     classA.methods = <MethodElement> [methodM];
@@ -1817,7 +1818,7 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
     InterfaceType typeB = classB.type;
     InterfaceTypeImpl typeAF = new InterfaceTypeImpl.con1(classA);
-    typeAF.typeArguments = <Type2> [typeB.typeArguments[0]];
+    typeAF.typeArguments = <DartType> [typeB.typeArguments[0]];
     classB.supertype = typeAF;
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
@@ -1827,12 +1828,12 @@
     //
     InterfaceType typeI = ElementFactory.classElement2("I", []).type;
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
-    typeBI.typeArguments = <Type2> [typeI];
+    typeBI.typeArguments = <DartType> [typeI];
     MethodElement method = typeBI.lookUpMethod(methodName, library);
     JUnitTestCase.assertNotNull(method);
     FunctionType methodType = method.type;
     JUnitTestCase.assertSame(typeI, methodType.returnType);
-    List<Type2> parameterTypes = methodType.normalParameterTypes;
+    List<DartType> parameterTypes = methodType.normalParameterTypes;
     EngineTestCase.assertLength(1, parameterTypes);
     JUnitTestCase.assertSame(typeI, parameterTypes[0]);
   }
@@ -1925,7 +1926,7 @@
 
   void test_setTypeArguments() {
     InterfaceTypeImpl type = ElementFactory.classElement2("A", []).type as InterfaceTypeImpl;
-    List<Type2> typeArguments = <Type2> [
+    List<DartType> typeArguments = <DartType> [
         ElementFactory.classElement2("B", []).type,
         ElementFactory.classElement2("C", []).type];
     type.typeArguments = typeArguments;
@@ -1937,11 +1938,11 @@
     TypeParameterElementImpl parameterElement = new TypeParameterElementImpl(AstFactory.identifier3("E"));
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(parameterElement);
-    type.typeArguments = <Type2> [parameter];
+    type.typeArguments = <DartType> [parameter];
     InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
-    InterfaceType result = type.substitute2(<Type2> [argumentType], <Type2> [parameter]);
+    InterfaceType result = type.substitute2(<DartType> [argumentType], <DartType> [parameter]);
     JUnitTestCase.assertEquals(classA, result.element);
-    List<Type2> resultArguments = result.typeArguments;
+    List<DartType> resultArguments = result.typeArguments;
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertEquals(argumentType, resultArguments[0]);
   }
@@ -1951,7 +1952,7 @@
       ClassElementImpl classA = ElementFactory.classElement2("A", []);
       InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
       InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
-      type.substitute2(<Type2> [argumentType], <Type2> []);
+      type.substitute2(<DartType> [argumentType], <DartType> []);
       JUnitTestCase.fail("Expected to encounter exception, argument and parameter type array lengths not equal.");
     } on JavaException catch (e) {
     }
@@ -1962,12 +1963,12 @@
     TypeParameterElementImpl parameterElement = new TypeParameterElementImpl(AstFactory.identifier3("E"));
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(parameterElement);
-    type.typeArguments = <Type2> [parameter];
+    type.typeArguments = <DartType> [parameter];
     InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
     TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("F")));
-    InterfaceType result = type.substitute2(<Type2> [argumentType], <Type2> [parameterType]);
+    InterfaceType result = type.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
     JUnitTestCase.assertEquals(classA, result.element);
-    List<Type2> resultArguments = result.typeArguments;
+    List<DartType> resultArguments = result.typeArguments;
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertEquals(parameter, resultArguments[0]);
   }
@@ -2386,7 +2387,7 @@
   /**
    * Reference {code VoidTypeImpl.getInstance()}.
    */
-  Type2 _voidType = VoidTypeImpl.instance;
+  DartType _voidType = VoidTypeImpl.instance;
 
   void test_isMoreSpecificThan_void_A() {
     ClassElement classA = ElementFactory.classElement2("A", []);
@@ -2493,8 +2494,8 @@
     return unit;
   }
 
-  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name, bool isConst, List<Type2> argumentTypes) {
-    Type2 type = definingClass.type;
+  static ConstructorElementImpl constructorElement(ClassElement definingClass, String name, bool isConst, List<DartType> argumentTypes) {
+    DartType type = definingClass.type;
     ConstructorElementImpl constructor = new ConstructorElementImpl.con1(name == null ? null : AstFactory.identifier3(name));
     constructor.const2 = isConst;
     int count = argumentTypes.length;
@@ -2512,7 +2513,7 @@
     return constructor;
   }
 
-  static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<Type2> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
+  static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<DartType> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
 
   static ExportElementImpl exportFor(LibraryElement exportedLibrary, List<NamespaceCombinator> combinators) {
     ExportElementImpl spec = new ExportElementImpl();
@@ -2521,7 +2522,7 @@
     return spec;
   }
 
-  static FieldElementImpl fieldElement(String name, bool isStatic, bool isFinal, bool isConst, Type2 type) {
+  static FieldElementImpl fieldElement(String name, bool isStatic, bool isFinal, bool isConst, DartType type) {
     FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
     field.const3 = isConst;
     field.final2 = isFinal;
@@ -2637,7 +2638,7 @@
     return _objectElement;
   }
 
-  static PropertyAccessorElementImpl getterElement(String name, bool isStatic, Type2 type) {
+  static PropertyAccessorElementImpl getterElement(String name, bool isStatic, DartType type) {
     FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
     field.static = isStatic;
     field.synthetic = true;
@@ -2680,7 +2681,7 @@
 
   static LocalVariableElementImpl localVariableElement2(String name) => new LocalVariableElementImpl(AstFactory.identifier3(name));
 
-  static MethodElementImpl methodElement(String methodName, Type2 returnType, List<Type2> argumentTypes) {
+  static MethodElementImpl methodElement(String methodName, DartType returnType, List<DartType> argumentTypes) {
     MethodElementImpl method = new MethodElementImpl.con1(AstFactory.identifier3(methodName));
     int count = argumentTypes.length;
     List<ParameterElement> parameters = new List<ParameterElement>(count);
@@ -2703,7 +2704,7 @@
     return parameter;
   }
 
-  static ParameterElementImpl namedParameter2(String name, Type2 type) {
+  static ParameterElementImpl namedParameter2(String name, DartType type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.NAMED;
     parameter.type = type;
@@ -2716,7 +2717,7 @@
     return parameter;
   }
 
-  static ParameterElementImpl positionalParameter2(String name, Type2 type) {
+  static ParameterElementImpl positionalParameter2(String name, DartType type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.POSITIONAL;
     parameter.type = type;
@@ -2731,14 +2732,14 @@
     return parameter;
   }
 
-  static ParameterElementImpl requiredParameter2(String name, Type2 type) {
+  static ParameterElementImpl requiredParameter2(String name, DartType type) {
     ParameterElementImpl parameter = new ParameterElementImpl.con1(AstFactory.identifier3(name));
     parameter.parameterKind = ParameterKind.REQUIRED;
     parameter.type = type;
     return parameter;
   }
 
-  static PropertyAccessorElementImpl setterElement(String name, bool isStatic, Type2 type) {
+  static PropertyAccessorElementImpl setterElement(String name, bool isStatic, DartType type) {
     FieldElementImpl field = new FieldElementImpl.con1(AstFactory.identifier3(name));
     field.static = isStatic;
     field.synthetic = true;
@@ -2768,7 +2769,7 @@
 
   static TopLevelVariableElementImpl topLevelVariableElement2(String name) => new TopLevelVariableElementImpl.con2(name);
 
-  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, Type2 type) {
+  static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, DartType type) {
     TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl.con2(name);
     variable.const3 = isConst;
     variable.final2 = isFinal;
@@ -2947,6 +2948,53 @@
     JUnitTestCase.assertTrue(classB.hasNonFinalField);
   }
 
+  void test_hasStaticMember_false_empty() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    // no members
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_false_instanceMethod() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElement method = ElementFactory.methodElement("foo", null, []);
+    classA.methods = <MethodElement> [method];
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_instanceGetter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElement getter = ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    JUnitTestCase.assertFalse(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElementImpl getter = ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    // "foo" is static
+    getter.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    MethodElementImpl method = ElementFactory.methodElement("foo", null, []);
+    classA.methods = <MethodElement> [method];
+    // "foo" is static
+    method.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
+  void test_hasStaticMember_true_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    PropertyAccessorElementImpl setter = ElementFactory.setterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    // "foo" is static
+    setter.static = true;
+    JUnitTestCase.assertTrue(classA.hasStaticMember);
+  }
+
   void test_lookUpGetter_declared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
@@ -3108,6 +3156,30 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_hasNonFinalField_true_inherited);
       });
+      _ut.test('test_hasStaticMember_false_empty', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_false_empty);
+      });
+      _ut.test('test_hasStaticMember_false_instanceMethod', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_false_instanceMethod);
+      });
+      _ut.test('test_hasStaticMember_instanceGetter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_instanceGetter);
+      });
+      _ut.test('test_hasStaticMember_true_getter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_getter);
+      });
+      _ut.test('test_hasStaticMember_true_method', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_method);
+      });
+      _ut.test('test_hasStaticMember_true_setter', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_hasStaticMember_true_setter);
+      });
       _ut.test('test_lookUpGetter_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_declared);
@@ -3369,28 +3441,28 @@
 
   void test_getNamedParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(AstFactory.identifier3("f")));
-    Map<String, Type2> types = type.namedParameterTypes;
+    Map<String, DartType> types = type.namedParameterTypes;
     EngineTestCase.assertSizeOfMap(0, types);
   }
 
   void test_getNormalParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(AstFactory.identifier3("f")));
-    List<Type2> types = type.normalParameterTypes;
+    List<DartType> types = type.normalParameterTypes;
     EngineTestCase.assertLength(0, types);
   }
 
   void test_getReturnType() {
-    Type2 expectedReturnType = VoidTypeImpl.instance;
+    DartType expectedReturnType = VoidTypeImpl.instance;
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(AstFactory.identifier3("f"));
     functionElement.returnType = expectedReturnType;
     FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
-    Type2 returnType = type.returnType;
+    DartType returnType = type.returnType;
     JUnitTestCase.assertEquals(expectedReturnType, returnType);
   }
 
   void test_getTypeArguments() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.con1(AstFactory.identifier3("f")));
-    List<Type2> types = type.typeArguments;
+    List<DartType> types = type.typeArguments;
     EngineTestCase.assertLength(0, types);
   }
 
@@ -3734,9 +3806,9 @@
     MethodElementImpl methodElement = new MethodElementImpl.con1(AstFactory.identifier3("m"));
     enclosingClass.methods = <MethodElement> [methodElement];
     FunctionTypeImpl type = new FunctionTypeImpl.con1(methodElement);
-    Type2 expectedType = enclosingClass.typeParameters[0].type;
-    type.typeArguments = <Type2> [expectedType];
-    List<Type2> arguments = type.typeArguments;
+    DartType expectedType = enclosingClass.typeParameters[0].type;
+    type.typeArguments = <DartType> [expectedType];
+    List<DartType> arguments = type.typeArguments;
     EngineTestCase.assertLength(1, arguments);
     JUnitTestCase.assertEquals(expectedType, arguments[0]);
   }
@@ -3753,26 +3825,26 @@
     functionElement.returnType = parameterType;
     definingClass.methods = <MethodElement> [functionElement];
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
-    functionType.typeArguments = <Type2> [parameterType];
+    functionType.typeArguments = <DartType> [parameterType];
     InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
-    FunctionType result = functionType.substitute2(<Type2> [argumentType], <Type2> [parameterType]);
+    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
     JUnitTestCase.assertEquals(argumentType, result.returnType);
-    List<Type2> normalParameters = result.normalParameterTypes;
+    List<DartType> normalParameters = result.normalParameterTypes;
     EngineTestCase.assertLength(1, normalParameters);
     JUnitTestCase.assertEquals(argumentType, normalParameters[0]);
-    List<Type2> optionalParameters = result.optionalParameterTypes;
+    List<DartType> optionalParameters = result.optionalParameterTypes;
     EngineTestCase.assertLength(1, optionalParameters);
     JUnitTestCase.assertEquals(argumentType, optionalParameters[0]);
-    Map<String, Type2> namedParameters = result.namedParameterTypes;
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
     EngineTestCase.assertSizeOfMap(1, namedParameters);
     JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
   }
 
   void test_substitute2_notEqual() {
-    Type2 returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("R")));
-    Type2 normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
-    Type2 optionalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("B")));
-    Type2 namedParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("C")));
+    DartType returnType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("R")));
+    DartType normalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("A")));
+    DartType optionalParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("B")));
+    DartType namedParameterType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("C")));
     FunctionElementImpl functionElement = new FunctionElementImpl.con1(AstFactory.identifier3("f"));
     String namedParameterName = "c";
     functionElement.parameters = <ParameterElement> [
@@ -3783,15 +3855,15 @@
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
     InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl(AstFactory.identifier3("D")));
     TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl(AstFactory.identifier3("E")));
-    FunctionType result = functionType.substitute2(<Type2> [argumentType], <Type2> [parameterType]);
+    FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
     JUnitTestCase.assertEquals(returnType, result.returnType);
-    List<Type2> normalParameters = result.normalParameterTypes;
+    List<DartType> normalParameters = result.normalParameterTypes;
     EngineTestCase.assertLength(1, normalParameters);
     JUnitTestCase.assertEquals(normalParameterType, normalParameters[0]);
-    List<Type2> optionalParameters = result.optionalParameterTypes;
+    List<DartType> optionalParameters = result.optionalParameterTypes;
     EngineTestCase.assertLength(1, optionalParameters);
     JUnitTestCase.assertEquals(optionalParameterType, optionalParameters[0]);
-    Map<String, Type2> namedParameters = result.namedParameterTypes;
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
     EngineTestCase.assertSizeOfMap(1, namedParameters);
     JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
   }
@@ -3977,6 +4049,7 @@
 class InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction extends InterfaceTypeImpl {
   InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(ClassElement arg0) : super.con1(arg0);
 
+  @override
   bool get isDartCoreFunction => true;
 }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index db2264c..a20ce5f 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -41,83 +41,83 @@
   }
 
   void test_computeStringValue_emptyInterpolationPrefix() {
-    JUnitTestCase.assertEquals("", computeStringValue("'''", true, false));
+    JUnitTestCase.assertEquals("", _computeStringValue("'''", true, false));
   }
 
   void test_computeStringValue_escape_b() {
-    JUnitTestCase.assertEquals("\b", computeStringValue("'\\b'", true, true));
+    JUnitTestCase.assertEquals("\b", _computeStringValue("'\\b'", true, true));
   }
 
   void test_computeStringValue_escape_f() {
-    JUnitTestCase.assertEquals("\f", computeStringValue("'\\f'", true, true));
+    JUnitTestCase.assertEquals("\f", _computeStringValue("'\\f'", true, true));
   }
 
   void test_computeStringValue_escape_n() {
-    JUnitTestCase.assertEquals("\n", computeStringValue("'\\n'", true, true));
+    JUnitTestCase.assertEquals("\n", _computeStringValue("'\\n'", true, true));
   }
 
   void test_computeStringValue_escape_notSpecial() {
-    JUnitTestCase.assertEquals(":", computeStringValue("'\\:'", true, true));
+    JUnitTestCase.assertEquals(":", _computeStringValue("'\\:'", true, true));
   }
 
   void test_computeStringValue_escape_r() {
-    JUnitTestCase.assertEquals("\r", computeStringValue("'\\r'", true, true));
+    JUnitTestCase.assertEquals("\r", _computeStringValue("'\\r'", true, true));
   }
 
   void test_computeStringValue_escape_t() {
-    JUnitTestCase.assertEquals("\t", computeStringValue("'\\t'", true, true));
+    JUnitTestCase.assertEquals("\t", _computeStringValue("'\\t'", true, true));
   }
 
   void test_computeStringValue_escape_u_fixed() {
-    JUnitTestCase.assertEquals("\u4321", computeStringValue("'\\u4321'", true, true));
+    JUnitTestCase.assertEquals("\u4321", _computeStringValue("'\\u4321'", true, true));
   }
 
   void test_computeStringValue_escape_u_variable() {
-    JUnitTestCase.assertEquals("\u0123", computeStringValue("'\\u{123}'", true, true));
+    JUnitTestCase.assertEquals("\u0123", _computeStringValue("'\\u{123}'", true, true));
   }
 
   void test_computeStringValue_escape_v() {
-    JUnitTestCase.assertEquals("\u000B", computeStringValue("'\\v'", true, true));
+    JUnitTestCase.assertEquals("\u000B", _computeStringValue("'\\v'", true, true));
   }
 
   void test_computeStringValue_escape_x() {
-    JUnitTestCase.assertEquals("\u00FF", computeStringValue("'\\xFF'", true, true));
+    JUnitTestCase.assertEquals("\u00FF", _computeStringValue("'\\xFF'", true, true));
   }
 
   void test_computeStringValue_noEscape_single() {
-    JUnitTestCase.assertEquals("text", computeStringValue("'text'", true, true));
+    JUnitTestCase.assertEquals("text", _computeStringValue("'text'", true, true));
   }
 
   void test_computeStringValue_noEscape_triple() {
-    JUnitTestCase.assertEquals("text", computeStringValue("'''text'''", true, true));
+    JUnitTestCase.assertEquals("text", _computeStringValue("'''text'''", true, true));
   }
 
   void test_computeStringValue_raw_single() {
-    JUnitTestCase.assertEquals("text", computeStringValue("r'text'", true, true));
+    JUnitTestCase.assertEquals("text", _computeStringValue("r'text'", true, true));
   }
 
   void test_computeStringValue_raw_triple() {
-    JUnitTestCase.assertEquals("text", computeStringValue("r'''text'''", true, true));
+    JUnitTestCase.assertEquals("text", _computeStringValue("r'''text'''", true, true));
   }
 
   void test_computeStringValue_raw_withEscape() {
-    JUnitTestCase.assertEquals("two\\nlines", computeStringValue("r'two\\nlines'", true, true));
+    JUnitTestCase.assertEquals("two\\nlines", _computeStringValue("r'two\\nlines'", true, true));
   }
 
   void test_computeStringValue_triple_internalQuote_first_empty() {
-    JUnitTestCase.assertEquals("'", computeStringValue("''''", true, false));
+    JUnitTestCase.assertEquals("'", _computeStringValue("''''", true, false));
   }
 
   void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
-    JUnitTestCase.assertEquals("'text", computeStringValue("''''text", true, false));
+    JUnitTestCase.assertEquals("'text", _computeStringValue("''''text", true, false));
   }
 
   void test_computeStringValue_triple_internalQuote_last_empty() {
-    JUnitTestCase.assertEquals("", computeStringValue("'''", false, true));
+    JUnitTestCase.assertEquals("", _computeStringValue("'''", false, true));
   }
 
   void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
-    JUnitTestCase.assertEquals("text", computeStringValue("text'''", false, true));
+    JUnitTestCase.assertEquals("text", _computeStringValue("text'''", false, true));
   }
 
   void test_constFactory() {
@@ -125,174 +125,174 @@
   }
 
   void test_createSyntheticIdentifier() {
-    SimpleIdentifier identifier = createSyntheticIdentifier();
+    SimpleIdentifier identifier = _createSyntheticIdentifier();
     JUnitTestCase.assertTrue(identifier.isSynthetic);
   }
 
   void test_createSyntheticStringLiteral() {
-    SimpleStringLiteral literal = createSyntheticStringLiteral();
+    SimpleStringLiteral literal = _createSyntheticStringLiteral();
     JUnitTestCase.assertTrue(literal.isSynthetic);
   }
 
   void test_isFunctionDeclaration_nameButNoReturn_block() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("f() {}"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("f() {}"));
   }
 
   void test_isFunctionDeclaration_nameButNoReturn_expression() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("f() => e"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("f() => e"));
   }
 
   void test_isFunctionDeclaration_normalReturn_block() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("C f() {}"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("C f() {}"));
   }
 
   void test_isFunctionDeclaration_normalReturn_expression() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("C f() => e"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("C f() => e"));
   }
 
   void test_isFunctionDeclaration_voidReturn_block() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("void f() {}"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("void f() {}"));
   }
 
   void test_isFunctionDeclaration_voidReturn_expression() {
-    JUnitTestCase.assertTrue(isFunctionDeclaration("void f() => e"));
+    JUnitTestCase.assertTrue(_isFunctionDeclaration("void f() => e"));
   }
 
   void test_isFunctionExpression_false_noBody() {
-    JUnitTestCase.assertFalse(isFunctionExpression("f();"));
+    JUnitTestCase.assertFalse(_isFunctionExpression("f();"));
   }
 
   void test_isFunctionExpression_false_notParameters() {
-    JUnitTestCase.assertFalse(isFunctionExpression("(a + b) {"));
+    JUnitTestCase.assertFalse(_isFunctionExpression("(a + b) {"));
   }
 
   void test_isFunctionExpression_noName_block() {
-    JUnitTestCase.assertTrue(isFunctionExpression("() {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("() {}"));
   }
 
   void test_isFunctionExpression_noName_expression() {
-    JUnitTestCase.assertTrue(isFunctionExpression("() => e"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("() => e"));
   }
 
   void test_isFunctionExpression_parameter_final() {
-    JUnitTestCase.assertTrue(isFunctionExpression("(final a) {}"));
-    JUnitTestCase.assertTrue(isFunctionExpression("(final a, b) {}"));
-    JUnitTestCase.assertTrue(isFunctionExpression("(final a, final b) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final a, b) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final a, final b) {}"));
   }
 
   void test_isFunctionExpression_parameter_final_typed() {
-    JUnitTestCase.assertTrue(isFunctionExpression("(final int a) {}"));
-    JUnitTestCase.assertTrue(isFunctionExpression("(final prefix.List a) {}"));
-    JUnitTestCase.assertTrue(isFunctionExpression("(final List<int> a) {}"));
-    JUnitTestCase.assertTrue(isFunctionExpression("(final prefix.List<int> a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final int a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final prefix.List a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final List<int> a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(final prefix.List<int> a) {}"));
   }
 
   void test_isFunctionExpression_parameter_multiple() {
-    JUnitTestCase.assertTrue(isFunctionExpression("(a, b) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(a, b) {}"));
   }
 
   void test_isFunctionExpression_parameter_named() {
-    JUnitTestCase.assertTrue(isFunctionExpression("({a}) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("({a}) {}"));
   }
 
   void test_isFunctionExpression_parameter_optional() {
-    JUnitTestCase.assertTrue(isFunctionExpression("([a]) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("([a]) {}"));
   }
 
   void test_isFunctionExpression_parameter_single() {
-    JUnitTestCase.assertTrue(isFunctionExpression("(a) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(a) {}"));
   }
 
   void test_isFunctionExpression_parameter_typed() {
-    JUnitTestCase.assertTrue(isFunctionExpression("(int a, int b) {}"));
+    JUnitTestCase.assertTrue(_isFunctionExpression("(int a, int b) {}"));
   }
 
   void test_isInitializedVariableDeclaration_assignment() {
-    JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a = null;"));
+    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a = null;"));
   }
 
   void test_isInitializedVariableDeclaration_comparison() {
-    JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a < 0;"));
+    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a < 0;"));
   }
 
   void test_isInitializedVariableDeclaration_conditional() {
-    JUnitTestCase.assertFalse(isInitializedVariableDeclaration("a == null ? init() : update();"));
+    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a == null ? init() : update();"));
   }
 
   void test_isInitializedVariableDeclaration_const_noType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const a = 0;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const a = 0;"));
   }
 
   void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const a;"));
   }
 
   void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("const A a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const A a;"));
   }
 
   void test_isInitializedVariableDeclaration_final_noType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final a = 0;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final a = 0;"));
   }
 
   void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final a;"));
   }
 
   void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("final A a = 0;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final A a = 0;"));
   }
 
   void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
-    JUnitTestCase.assertFalse(isInitializedVariableDeclaration("A f() {};"));
+    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("A f() {};"));
   }
 
   void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
-    JUnitTestCase.assertFalse(isInitializedVariableDeclaration("f() {};"));
+    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("f() {};"));
   }
 
   void test_isInitializedVariableDeclaration_noType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("var a = 0;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("var a = 0;"));
   }
 
   void test_isInitializedVariableDeclaration_noType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("var a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("var a;"));
   }
 
   void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("List<int> a = null;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("List<int> a = null;"));
   }
 
   void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("List<int> a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("List<int> a;"));
   }
 
   void test_isInitializedVariableDeclaration_simpleType_initialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("A a = 0;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("A a = 0;"));
   }
 
   void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
-    JUnitTestCase.assertTrue(isInitializedVariableDeclaration("A a;"));
+    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("A a;"));
   }
 
   void test_isSwitchMember_case_labeled() {
-    JUnitTestCase.assertTrue(isSwitchMember("l1: l2: case"));
+    JUnitTestCase.assertTrue(_isSwitchMember("l1: l2: case"));
   }
 
   void test_isSwitchMember_case_unlabeled() {
-    JUnitTestCase.assertTrue(isSwitchMember("case"));
+    JUnitTestCase.assertTrue(_isSwitchMember("case"));
   }
 
   void test_isSwitchMember_default_labeled() {
-    JUnitTestCase.assertTrue(isSwitchMember("l1: l2: default"));
+    JUnitTestCase.assertTrue(_isSwitchMember("l1: l2: default"));
   }
 
   void test_isSwitchMember_default_unlabeled() {
-    JUnitTestCase.assertTrue(isSwitchMember("default"));
+    JUnitTestCase.assertTrue(_isSwitchMember("default"));
   }
 
   void test_isSwitchMember_false() {
-    JUnitTestCase.assertFalse(isSwitchMember("break;"));
+    JUnitTestCase.assertFalse(_isSwitchMember("break;"));
   }
 
   void test_parseAdditiveExpression_normal() {
@@ -1534,7 +1534,7 @@
   }
 
   void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
-    ParserTestCase._parseFunctionBodies = false;
+    ParserTestCase.parseFunctionBodies = false;
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "f() { '\${n}'; }", []);
     JUnitTestCase.assertNull(unit.scriptTag);
     EngineTestCase.assertSizeOfList(1, unit.declarations);
@@ -2567,19 +2567,19 @@
   }
 
   void test_parseFunctionBody_skip_block() {
-    ParserTestCase._parseFunctionBodies = false;
+    ParserTestCase.parseFunctionBodies = false;
     FunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{}");
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
   }
 
   void test_parseFunctionBody_skip_blocks() {
-    ParserTestCase._parseFunctionBodies = false;
+    ParserTestCase.parseFunctionBodies = false;
     FunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{ {} }");
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
   }
 
   void test_parseFunctionBody_skip_expression() {
-    ParserTestCase._parseFunctionBodies = false;
+    ParserTestCase.parseFunctionBodies = false;
     FunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "=> y;");
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
   }
@@ -4352,109 +4352,109 @@
   }
 
   void test_skipPrefixedIdentifier_invalid() {
-    Token following = skip("skipPrefixedIdentifier", "+");
+    Token following = _skip("skipPrefixedIdentifier", "+");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipPrefixedIdentifier_notPrefixed() {
-    Token following = skip("skipPrefixedIdentifier", "a +");
+    Token following = _skip("skipPrefixedIdentifier", "a +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipPrefixedIdentifier_prefixed() {
-    Token following = skip("skipPrefixedIdentifier", "a.b +");
+    Token following = _skip("skipPrefixedIdentifier", "a.b +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipReturnType_invalid() {
-    Token following = skip("skipReturnType", "+");
+    Token following = _skip("skipReturnType", "+");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipReturnType_type() {
-    Token following = skip("skipReturnType", "C +");
+    Token following = _skip("skipReturnType", "C +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipReturnType_void() {
-    Token following = skip("skipReturnType", "void +");
+    Token following = _skip("skipReturnType", "void +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipSimpleIdentifier_identifier() {
-    Token following = skip("skipSimpleIdentifier", "i +");
+    Token following = _skip("skipSimpleIdentifier", "i +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipSimpleIdentifier_invalid() {
-    Token following = skip("skipSimpleIdentifier", "9 +");
+    Token following = _skip("skipSimpleIdentifier", "9 +");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipSimpleIdentifier_pseudoKeyword() {
-    Token following = skip("skipSimpleIdentifier", "as +");
+    Token following = _skip("skipSimpleIdentifier", "as +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipStringLiteral_adjacent() {
-    Token following = skip("skipStringLiteral", "'a' 'b' +");
+    Token following = _skip("skipStringLiteral", "'a' 'b' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipStringLiteral_interpolated() {
-    Token following = skip("skipStringLiteral", "'a\${b}c' +");
+    Token following = _skip("skipStringLiteral", "'a\${b}c' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipStringLiteral_invalid() {
-    Token following = skip("skipStringLiteral", "a");
+    Token following = _skip("skipStringLiteral", "a");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipStringLiteral_single() {
-    Token following = skip("skipStringLiteral", "'a' +");
+    Token following = _skip("skipStringLiteral", "'a' +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipTypeArgumentList_invalid() {
-    Token following = skip("skipTypeArgumentList", "+");
+    Token following = _skip("skipTypeArgumentList", "+");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipTypeArgumentList_multiple() {
-    Token following = skip("skipTypeArgumentList", "<E, F, G> +");
+    Token following = _skip("skipTypeArgumentList", "<E, F, G> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipTypeArgumentList_single() {
-    Token following = skip("skipTypeArgumentList", "<E> +");
+    Token following = _skip("skipTypeArgumentList", "<E> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipTypeName_invalid() {
-    Token following = skip("skipTypeName", "+");
+    Token following = _skip("skipTypeName", "+");
     JUnitTestCase.assertNull(following);
   }
 
   void test_skipTypeName_parameterized() {
-    Token following = skip("skipTypeName", "C<E<F<G>>> +");
+    Token following = _skip("skipTypeName", "C<E<F<G>>> +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
 
   void test_skipTypeName_simple() {
-    Token following = skip("skipTypeName", "C +");
+    Token following = _skip("skipTypeName", "C +");
     JUnitTestCase.assertNotNull(following);
     JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
   }
@@ -4468,7 +4468,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  String computeStringValue(String lexeme, bool first, bool last) {
+  String _computeStringValue(String lexeme, bool first, bool last) {
     AnalysisErrorListener listener = new AnalysisErrorListener_SimpleParserTest_computeStringValue();
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme, first, last], null) as String;
@@ -4482,7 +4482,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  SimpleIdentifier createSyntheticIdentifier() {
+  SimpleIdentifier _createSyntheticIdentifier() {
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("createSyntheticIdentifier", "", listener);
   }
@@ -4495,7 +4495,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  SimpleStringLiteral createSyntheticStringLiteral() {
+  SimpleStringLiteral _createSyntheticStringLiteral() {
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("createSyntheticStringLiteral", "", listener);
   }
@@ -4508,7 +4508,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  bool isFunctionDeclaration(String source) {
+  bool _isFunctionDeclaration(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isFunctionDeclaration", source, listener) as bool;
   }
@@ -4521,7 +4521,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  bool isFunctionExpression(String source) {
+  bool _isFunctionExpression(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     //
     // Scan the source.
@@ -4543,7 +4543,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  bool isInitializedVariableDeclaration(String source) {
+  bool _isInitializedVariableDeclaration(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isInitializedVariableDeclaration", source, listener) as bool;
   }
@@ -4556,7 +4556,7 @@
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  bool isSwitchMember(String source) {
+  bool _isSwitchMember(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     return ParserTestCase.invokeParserMethod2("isSwitchMember", source, listener) as bool;
   }
@@ -4571,7 +4571,7 @@
    * @throws Exception if the method could not be invoked or throws an exception
    * @throws AssertionFailedError if the result is `null`
    */
-  Token skip(String methodName, String source) {
+  Token _skip(String methodName, String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
     //
     // Scan the source.
@@ -6776,6 +6776,7 @@
 }
 
 class AnalysisErrorListener_SimpleParserTest_computeStringValue implements AnalysisErrorListener {
+  @override
   void onError(AnalysisError event) {
     JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
@@ -7284,7 +7285,7 @@
   /**
    * A flag indicating whether parser is to parse function bodies.
    */
-  static bool _parseFunctionBodies = true;
+  static bool parseFunctionBodies = true;
 
   /**
    * Invoke a parse method in [Parser]. The method is assumed to have the given number and
@@ -7477,7 +7478,7 @@
     // Parse the source.
     //
     Parser parser = new Parser(null, listener);
-    parser.parseFunctionBodies = _parseFunctionBodies;
+    parser.parseFunctionBodies = parseFunctionBodies;
     Object result = invokeParserMethodImpl(parser, methodName, objects, tokenStream);
     //
     // Partially test the results.
@@ -7526,9 +7527,10 @@
    */
   CommentAndMetadata emptyCommentAndMetadata() => new CommentAndMetadata(null, new List<Annotation>());
 
+  @override
   void setUp() {
     super.setUp();
-    _parseFunctionBodies = true;
+    parseFunctionBodies = true;
   }
 
   static dartSuite() {
@@ -7563,8 +7565,9 @@
     }
   }
 
+  @override
   Object visitNode(AstNode node) {
-    validate(node);
+    _validate(node);
     return super.visitNode(node);
   }
 
@@ -7573,7 +7576,7 @@
    *
    * @param node the AST node being validated
    */
-  void validate(AstNode node) {
+  void _validate(AstNode node) {
     AstNode parent = node.parent;
     if (node is CompilationUnit) {
       if (parent != null) {
@@ -7623,9 +7626,9 @@
   void test_visitArgumentDefinitionTest() {
     String identifier = "p";
     ArgumentDefinitionTest fromNode = AstFactory.argumentDefinitionTest(identifier);
-    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    DartType propagatedType = ElementFactory.classElement2("A", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    DartType staticType = ElementFactory.classElement2("B", []).type;
     fromNode.staticType = staticType;
     ArgumentDefinitionTest toNode = AstFactory.argumentDefinitionTest(identifier);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7635,9 +7638,9 @@
 
   void test_visitAsExpression() {
     AsExpression fromNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
-    Type2 propagatedType = ElementFactory.classElement2("A", []).type;
+    DartType propagatedType = ElementFactory.classElement2("A", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("B", []).type;
+    DartType staticType = ElementFactory.classElement2("B", []).type;
     fromNode.staticType = staticType;
     AsExpression toNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7647,11 +7650,11 @@
 
   void test_visitAssignmentExpression() {
     AssignmentExpression fromNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
     fromNode.propagatedElement = propagatedElement;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
     fromNode.staticElement = staticElement;
     fromNode.staticType = staticType;
@@ -7665,11 +7668,11 @@
 
   void test_visitBinaryExpression() {
     BinaryExpression fromNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     MethodElement propagatedElement = ElementFactory.methodElement("+", propagatedType, []);
     fromNode.propagatedElement = propagatedElement;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     MethodElement staticElement = ElementFactory.methodElement("+", staticType, []);
     fromNode.staticElement = staticElement;
     fromNode.staticType = staticType;
@@ -7683,9 +7686,9 @@
 
   void test_visitBooleanLiteral() {
     BooleanLiteral fromNode = AstFactory.booleanLiteral(true);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     BooleanLiteral toNode = AstFactory.booleanLiteral(true);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7695,9 +7698,9 @@
 
   void test_visitCascadeExpression() {
     CascadeExpression fromNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     CascadeExpression toNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7716,9 +7719,9 @@
 
   void test_visitConditionalExpression() {
     ConditionalExpression fromNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     ConditionalExpression toNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7748,9 +7751,9 @@
 
   void test_visitDoubleLiteral() {
     DoubleLiteral fromNode = AstFactory.doubleLiteral(1.0);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     DoubleLiteral toNode = AstFactory.doubleLiteral(1.0);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7771,9 +7774,9 @@
     FunctionExpression fromNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
     MethodElement element = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
     fromNode.element = element;
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     FunctionExpression toNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7786,11 +7789,11 @@
     FunctionExpressionInvocation fromNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
     MethodElement propagatedElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
     fromNode.propagatedElement = propagatedElement;
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
     MethodElement staticElement = ElementFactory.methodElement("m", ElementFactory.classElement2("C", []).type, []);
     fromNode.staticElement = staticElement;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     FunctionExpressionInvocation toNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7816,10 +7819,10 @@
     AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
     fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.propagatedElement = propagatedElement;
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
     fromNode.staticElement = staticElement;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     IndexExpression toNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7832,11 +7835,11 @@
 
   void test_visitInstanceCreationExpression() {
     InstanceCreationExpression fromNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
     ConstructorElement staticElement = ElementFactory.constructorElement2(ElementFactory.classElement2("C", []), null, []);
     fromNode.staticElement = staticElement;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     InstanceCreationExpression toNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7847,9 +7850,9 @@
 
   void test_visitIntegerLiteral() {
     IntegerLiteral fromNode = AstFactory.integer(2);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     IntegerLiteral toNode = AstFactory.integer(2);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7859,9 +7862,9 @@
 
   void test_visitIsExpression() {
     IsExpression fromNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     IsExpression toNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7871,9 +7874,9 @@
 
   void test_visitLibraryIdentifier() {
     LibraryIdentifier fromNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     LibraryIdentifier toNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7883,9 +7886,9 @@
 
   void test_visitListLiteral() {
     ListLiteral fromNode = AstFactory.listLiteral([]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     ListLiteral toNode = AstFactory.listLiteral([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7895,9 +7898,9 @@
 
   void test_visitMapLiteral() {
     MapLiteral fromNode = AstFactory.mapLiteral2([]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     MapLiteral toNode = AstFactory.mapLiteral2([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7907,9 +7910,9 @@
 
   void test_visitMethodInvocation() {
     MethodInvocation fromNode = AstFactory.methodInvocation2("m", []);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     MethodInvocation toNode = AstFactory.methodInvocation2("m", []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7919,9 +7922,9 @@
 
   void test_visitNamedExpression() {
     NamedExpression fromNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     NamedExpression toNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7931,9 +7934,9 @@
 
   void test_visitNullLiteral() {
     NullLiteral fromNode = AstFactory.nullLiteral();
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     NullLiteral toNode = AstFactory.nullLiteral();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7943,9 +7946,9 @@
 
   void test_visitParenthesizedExpression() {
     ParenthesizedExpression fromNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     ParenthesizedExpression toNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7976,11 +7979,11 @@
     PostfixExpression fromNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
     MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
     fromNode.propagatedElement = propagatedElement;
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
     MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
     fromNode.staticElement = staticElement;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     PostfixExpression toNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -7992,9 +7995,9 @@
 
   void test_visitPrefixedIdentifier() {
     PrefixedIdentifier fromNode = AstFactory.identifier5("p", "f");
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     PrefixedIdentifier toNode = AstFactory.identifier5("p", "f");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8005,10 +8008,10 @@
   void test_visitPrefixExpression() {
     PrefixExpression fromNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
     MethodElement propagatedElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedElement = propagatedElement;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     MethodElement staticElement = ElementFactory.methodElement("+", ElementFactory.classElement2("C", []).type, []);
     fromNode.staticElement = staticElement;
     fromNode.staticType = staticType;
@@ -8022,9 +8025,9 @@
 
   void test_visitPropertyAccess() {
     PropertyAccess fromNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     PropertyAccess toNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8043,9 +8046,9 @@
 
   void test_visitRethrowExpression() {
     RethrowExpression fromNode = AstFactory.rethrowExpression();
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     RethrowExpression toNode = AstFactory.rethrowExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8060,10 +8063,10 @@
     AuxiliaryElements auxiliaryElements = new AuxiliaryElements(staticElement, propagatedElement);
     fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.propagatedElement = propagatedElement;
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
     fromNode.staticElement = staticElement;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     SimpleIdentifier toNode = AstFactory.identifier3("x");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8076,9 +8079,9 @@
 
   void test_visitSimpleStringLiteral() {
     SimpleStringLiteral fromNode = AstFactory.string2("abc");
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     SimpleStringLiteral toNode = AstFactory.string2("abc");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8088,9 +8091,9 @@
 
   void test_visitStringInterpolation() {
     StringInterpolation fromNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     StringInterpolation toNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8109,9 +8112,9 @@
 
   void test_visitSuperExpression() {
     SuperExpression fromNode = AstFactory.superExpression();
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     SuperExpression toNode = AstFactory.superExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8121,9 +8124,9 @@
 
   void test_visitSymbolLiteral() {
     SymbolLiteral fromNode = AstFactory.symbolLiteral(["s"]);
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     SymbolLiteral toNode = AstFactory.symbolLiteral(["s"]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8133,9 +8136,9 @@
 
   void test_visitThisExpression() {
     ThisExpression fromNode = AstFactory.thisExpression();
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     ThisExpression toNode = AstFactory.thisExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8145,9 +8148,9 @@
 
   void test_visitThrowExpression() {
     ThrowExpression fromNode = AstFactory.throwExpression();
-    Type2 propagatedType = ElementFactory.classElement2("C", []).type;
+    DartType propagatedType = ElementFactory.classElement2("C", []).type;
     fromNode.propagatedType = propagatedType;
-    Type2 staticType = ElementFactory.classElement2("C", []).type;
+    DartType staticType = ElementFactory.classElement2("C", []).type;
     fromNode.staticType = staticType;
     ThrowExpression toNode = AstFactory.throwExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -8157,7 +8160,7 @@
 
   void test_visitTypeName() {
     TypeName fromNode = AstFactory.typeName4("C", []);
-    Type2 type = ElementFactory.classElement2("C", []).type;
+    DartType type = ElementFactory.classElement2("C", []).type;
     fromNode.type = type;
     TypeName toNode = AstFactory.typeName4("C", []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -9277,199 +9280,199 @@
   void test_delete_everything() {
     // "f() => a + b;"
     // ""
-    assertParse("", "f() => a + b;", "", "");
+    _assertParse("", "f() => a + b;", "", "");
   }
 
   void test_delete_identifier_beginning() {
     // "f() => abs + b;"
     // "f() => s + b;"
-    assertParse("f() => ", "ab", "", "s + b;");
+    _assertParse("f() => ", "ab", "", "s + b;");
   }
 
   void test_delete_identifier_end() {
     // "f() => abs + b;"
     // "f() => a + b;"
-    assertParse("f() => a", "bs", "", " + b;");
+    _assertParse("f() => a", "bs", "", " + b;");
   }
 
   void test_delete_identifier_middle() {
     // "f() => abs + b;"
     // "f() => as + b;"
-    assertParse("f() => a", "b", "", "s + b;");
+    _assertParse("f() => a", "b", "", "s + b;");
   }
 
   void test_delete_mergeTokens() {
     // "f() => a + b + c;"
     // "f() => ac;"
-    assertParse("f() => a", " + b + ", "", "c;");
+    _assertParse("f() => a", " + b + ", "", "c;");
   }
 
   void test_insert_afterIdentifier1() {
     // "f() => a + b;"
     // "f() => abs + b;"
-    assertParse("f() => a", "", "bs", " + b;");
+    _assertParse("f() => a", "", "bs", " + b;");
   }
 
   void test_insert_afterIdentifier2() {
     // "f() => a + b;"
     // "f() => a + bar;"
-    assertParse("f() => a + b", "", "ar", ";");
+    _assertParse("f() => a + b", "", "ar", ";");
   }
 
   void test_insert_beforeIdentifier1() {
     // "f() => a + b;"
     // "f() => xa + b;"
-    assertParse("f() => ", "", "x", "a + b;");
+    _assertParse("f() => ", "", "x", "a + b;");
   }
 
   void test_insert_beforeIdentifier2() {
     // "f() => a + b;"
     // "f() => a + xb;"
-    assertParse("f() => a + ", "", "x", "b;");
+    _assertParse("f() => a + ", "", "x", "b;");
   }
 
   void test_insert_convertOneFunctionToTwo() {
     // "f() {}"
     // "f() => 0; g() {}"
-    assertParse("f()", "", " => 0; g()", " {}");
+    _assertParse("f()", "", " => 0; g()", " {}");
   }
 
   void test_insert_end() {
     // "class A {}"
     // "class A {} class B {}"
-    assertParse("class A {}", "", " class B {}", "");
+    _assertParse("class A {}", "", " class B {}", "");
   }
 
   void test_insert_insideClassBody() {
     // "class C {C(); }"
     // "class C { C(); }"
-    assertParse("class C {", "", " ", "C(); }");
+    _assertParse("class C {", "", " ", "C(); }");
   }
 
   void test_insert_insideIdentifier() {
     // "f() => cob;"
     // "f() => cow.b;"
-    assertParse("f() => co", "", "w.", "b;");
+    _assertParse("f() => co", "", "w.", "b;");
   }
 
   void test_insert_newIdentifier1() {
     // "f() => a; c;"
     // "f() => a; b c;"
-    assertParse("f() => a;", "", " b", " c;");
+    _assertParse("f() => a;", "", " b", " c;");
   }
 
   void test_insert_newIdentifier2() {
     // "f() => a;  c;"
     // "f() => a;b  c;"
-    assertParse("f() => a;", "", "b", "  c;");
+    _assertParse("f() => a;", "", "b", "  c;");
   }
 
   void test_insert_newIdentifier3() {
     // "/** A simple function. */ f() => a; c;"
     // "/** A simple function. */ f() => a; b c;"
-    assertParse("/** A simple function. */ f() => a;", "", " b", " c;");
+    _assertParse("/** A simple function. */ f() => a;", "", " b", " c;");
   }
 
   void test_insert_newIdentifier4() {
     // "/** An [A]. */ class A {} class B { m() { return 1; } }"
     // "/** An [A]. */ class A {} class B { m() { return 1 + 2; } }"
-    assertParse("/** An [A]. */ class A {} class B { m() { return 1", "", " + 2", "; } }");
+    _assertParse("/** An [A]. */ class A {} class B { m() { return 1", "", " + 2", "; } }");
   }
 
   void test_insert_period() {
     // "f() => a + b;"
     // "f() => a + b.;"
-    assertParse("f() => a + b", "", ".", ";");
+    _assertParse("f() => a + b", "", ".", ";");
   }
 
   void test_insert_period_betweenIdentifiers1() {
     // "f() => a b;"
     // "f() => a. b;"
-    assertParse("f() => a", "", ".", " b;");
+    _assertParse("f() => a", "", ".", " b;");
   }
 
   void test_insert_period_betweenIdentifiers2() {
     // "f() => a b;"
     // "f() => a .b;"
-    assertParse("f() => a ", "", ".", "b;");
+    _assertParse("f() => a ", "", ".", "b;");
   }
 
   void test_insert_period_betweenIdentifiers3() {
     // "f() => a  b;"
     // "f() => a . b;"
-    assertParse("f() => a ", "", ".", " b;");
+    _assertParse("f() => a ", "", ".", " b;");
   }
 
   void test_insert_period_insideExistingIdentifier() {
     // "f() => ab;"
     // "f() => a.b;"
-    assertParse("f() => a", "", ".", "b;");
+    _assertParse("f() => a", "", ".", "b;");
   }
 
   void test_insert_periodAndIdentifier() {
     // "f() => a + b;"
     // "f() => a + b.x;"
-    assertParse("f() => a + b", "", ".x", ";");
+    _assertParse("f() => a + b", "", ".x", ";");
   }
 
   void test_insert_simpleToComplexExression() {
     // "/** An [A]. */ class A {} class B { m() => 1; }"
     // "/** An [A]. */ class A {} class B { m() => 1 + 2; }"
-    assertParse("/** An [A]. */ class A {} class B { m() => 1", "", " + 2", "; }");
+    _assertParse("/** An [A]. */ class A {} class B { m() => 1", "", " + 2", "; }");
   }
 
   void test_insert_whitespace_end() {
     // "f() => a + b;"
     // "f() => a + b; "
-    assertParse("f() => a + b;", "", " ", "");
+    _assertParse("f() => a + b;", "", " ", "");
   }
 
   void test_insert_whitespace_end_multiple() {
     // "f() => a + b;"
     // "f() => a + b;  "
-    assertParse("f() => a + b;", "", "  ", "");
+    _assertParse("f() => a + b;", "", "  ", "");
   }
 
   void test_insert_whitespace_middle() {
     // "f() => a + b;"
     // "f() => a  + b;"
-    assertParse("f() => a", "", " ", " + b;");
+    _assertParse("f() => a", "", " ", " + b;");
   }
 
   void test_replace_identifier_beginning() {
     // "f() => bell + b;"
     // "f() => fell + b;"
-    assertParse("f() => ", "b", "f", "ell + b;");
+    _assertParse("f() => ", "b", "f", "ell + b;");
   }
 
   void test_replace_identifier_end() {
     // "f() => bell + b;"
     // "f() => belt + b;"
-    assertParse("f() => bel", "l", "t", " + b;");
+    _assertParse("f() => bel", "l", "t", " + b;");
   }
 
   void test_replace_identifier_middle() {
     // "f() => first + b;"
     // "f() => frost + b;"
-    assertParse("f() => f", "ir", "ro", "st + b;");
+    _assertParse("f() => f", "ir", "ro", "st + b;");
   }
 
   void test_replace_multiple_partialFirstAndLast() {
     // "f() => aa + bb;"
     // "f() => ab * ab;"
-    assertParse("f() => a", "a + b", "b * a", "b;");
+    _assertParse("f() => a", "a + b", "b * a", "b;");
   }
 
   void test_replace_operator_oneForMany() {
     // "f() => a + b;"
     // "f() => a * c - b;"
-    assertParse("f() => a ", "+", "* c -", " b;");
+    _assertParse("f() => a ", "+", "* c -", " b;");
   }
 
   void test_replace_operator_oneForOne() {
     // "f() => a + b;"
     // "f() => a * b;"
-    assertParse("f() => a ", "+", "*", " b;");
+    _assertParse("f() => a ", "+", "*", " b;");
   }
 
   /**
@@ -9481,7 +9484,7 @@
    * @param added the text that was added to the modified contents
    * @param suffix the unchanged text after the edit region
    */
-  void assertParse(String prefix, String removed, String added, String suffix) {
+  void _assertParse(String prefix, String removed, String added, String suffix) {
     //
     // Compute the information needed to perform the test.
     //
@@ -11728,195 +11731,4 @@
   RecoveryParserTest.dartSuite();
   ResolutionCopierTest.dartSuite();
   SimpleParserTest.dartSuite();
-}
-Map<String, MethodTrampoline> _methodTable_Parser = <String, MethodTrampoline> {
-  'parseCompilationUnit_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCompilationUnit(arg0)),
-  'parseExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExpression(arg0)),
-  'parseStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatement(arg0)),
-  'parseStatements_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatements(arg0)),
-  'parseAnnotation_0': new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
-  'parseArgument_0': new MethodTrampoline(0, (Parser target) => target.parseArgument()),
-  'parseArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
-  'parseBitwiseOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseOrExpression()),
-  'parseBlock_0': new MethodTrampoline(0, (Parser target) => target.parseBlock()),
-  'parseClassMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseClassMember(arg0)),
-  'parseCompilationUnit_0': new MethodTrampoline(0, (Parser target) => target.parseCompilationUnit2()),
-  'parseConditionalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConditionalExpression()),
-  'parseConstructorName_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
-  'parseExpression_0': new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
-  'parseExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionWithoutCascade()),
-  'parseExtendsClause_0': new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
-  'parseFormalParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseFormalParameterList()),
-  'parseFunctionExpression_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionExpression()),
-  'parseImplementsClause_0': new MethodTrampoline(0, (Parser target) => target.parseImplementsClause()),
-  'parseLabel_0': new MethodTrampoline(0, (Parser target) => target.parseLabel()),
-  'parseLibraryIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseLibraryIdentifier()),
-  'parseLogicalOrExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalOrExpression()),
-  'parseMapLiteralEntry_0': new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
-  'parseNormalFormalParameter_0': new MethodTrampoline(0, (Parser target) => target.parseNormalFormalParameter()),
-  'parsePrefixedIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parsePrefixedIdentifier()),
-  'parseReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
-  'parseSimpleIdentifier_0': new MethodTrampoline(0, (Parser target) => target.parseSimpleIdentifier()),
-  'parseStatement_0': new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
-  'parseStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
-  'parseTypeArgumentList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeArgumentList()),
-  'parseTypeName_0': new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
-  'parseTypeParameter_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
-  'parseTypeParameterList_0': new MethodTrampoline(0, (Parser target) => target.parseTypeParameterList()),
-  'parseWithClause_0': new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
-  'advance_0': new MethodTrampoline(0, (Parser target) => target.advance()),
-  'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target.appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
-  'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.computeStringValue(arg0, arg1, arg2)),
-  'convertToFunctionDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target.convertToFunctionDeclaration(arg0)),
-  'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(0, (Parser target) => target.couldBeStartOfCompilationUnitMember()),
-  'createSyntheticIdentifier_0': new MethodTrampoline(0, (Parser target) => target.createSyntheticIdentifier()),
-  'createSyntheticKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target.createSyntheticKeyword(arg0)),
-  'createSyntheticStringLiteral_0': new MethodTrampoline(0, (Parser target) => target.createSyntheticStringLiteral()),
-  'createSyntheticToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.createSyntheticToken(arg0)),
-  'ensureAssignable_1': new MethodTrampoline(1, (Parser target, arg0) => target.ensureAssignable(arg0)),
-  'expect_1': new MethodTrampoline(1, (Parser target, arg0) => target.expect(arg0)),
-  'expectKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target.expectKeyword(arg0)),
-  'expectSemicolon_0': new MethodTrampoline(0, (Parser target) => target.expectSemicolon()),
-  'findRange_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.findRange(arg0, arg1)),
-  'getCodeBlockRanges_1': new MethodTrampoline(1, (Parser target, arg0) => target.getCodeBlockRanges(arg0)),
-  'getEndToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.getEndToken(arg0)),
-  'injectToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.injectToken(arg0)),
-  'isFunctionDeclaration_0': new MethodTrampoline(0, (Parser target) => target.isFunctionDeclaration()),
-  'isFunctionExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.isFunctionExpression(arg0)),
-  'isHexDigit_1': new MethodTrampoline(1, (Parser target, arg0) => target.isHexDigit(arg0)),
-  'isInitializedVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target.isInitializedVariableDeclaration()),
-  'isLinkText_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.isLinkText(arg0, arg1)),
-  'isOperator_1': new MethodTrampoline(1, (Parser target, arg0) => target.isOperator(arg0)),
-  'isSwitchMember_0': new MethodTrampoline(0, (Parser target) => target.isSwitchMember()),
-  'isTypedIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.isTypedIdentifier(arg0)),
-  'lexicallyFirst_1': new MethodTrampoline(1, (Parser target, arg0) => target.lexicallyFirst(arg0)),
-  'lockErrorListener_0': new MethodTrampoline(0, (Parser target) => target.lockErrorListener()),
-  'matches_1': new MethodTrampoline(1, (Parser target, arg0) => target.matches(arg0)),
-  'matchesAny_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.matchesAny(arg0, arg1)),
-  'matchesIdentifier_0': new MethodTrampoline(0, (Parser target) => target.matchesIdentifier()),
-  'matchesKeyword_1': new MethodTrampoline(1, (Parser target, arg0) => target.matchesKeyword(arg0)),
-  'matchesString_1': new MethodTrampoline(1, (Parser target, arg0) => target.matchesString(arg0)),
-  'optional_1': new MethodTrampoline(1, (Parser target, arg0) => target.optional(arg0)),
-  'parseAdditiveExpression_0': new MethodTrampoline(0, (Parser target) => target.parseAdditiveExpression()),
-  'parseArgumentDefinitionTest_0': new MethodTrampoline(0, (Parser target) => target.parseArgumentDefinitionTest()),
-  'parseAssertStatement_0': new MethodTrampoline(0, (Parser target) => target.parseAssertStatement()),
-  'parseAssignableExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseAssignableExpression(arg0)),
-  'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseAssignableSelector(arg0, arg1)),
-  'parseBitwiseAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseAndExpression()),
-  'parseBitwiseXorExpression_0': new MethodTrampoline(0, (Parser target) => target.parseBitwiseXorExpression()),
-  'parseBreakStatement_0': new MethodTrampoline(0, (Parser target) => target.parseBreakStatement()),
-  'parseCascadeSection_0': new MethodTrampoline(0, (Parser target) => target.parseCascadeSection()),
-  'parseClassDeclaration_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassDeclaration(arg0, arg1)),
-  'parseClassMembers_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseClassMembers(arg0, arg1)),
-  'parseClassTypeAlias_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseClassTypeAlias(arg0, arg1, arg2)),
-  'parseCombinators_0': new MethodTrampoline(0, (Parser target) => target.parseCombinators()),
-  'parseCommentAndMetadata_0': new MethodTrampoline(0, (Parser target) => target.parseCommentAndMetadata()),
-  'parseCommentReference_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseCommentReference(arg0, arg1)),
-  'parseCommentReferences_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCommentReferences(arg0)),
-  'parseCompilationUnitMember_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseCompilationUnitMember(arg0)),
-  'parseConstExpression_0': new MethodTrampoline(0, (Parser target) => target.parseConstExpression()),
-  'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) => target.parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
-  'parseConstructorFieldInitializer_0': new MethodTrampoline(0, (Parser target) => target.parseConstructorFieldInitializer()),
-  'parseContinueStatement_0': new MethodTrampoline(0, (Parser target) => target.parseContinueStatement()),
-  'parseDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseDirective(arg0)),
-  'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) => target.parseDocumentationComment()),
-  'parseDoStatement_0': new MethodTrampoline(0, (Parser target) => target.parseDoStatement()),
-  'parseEmptyStatement_0': new MethodTrampoline(0, (Parser target) => target.parseEmptyStatement()),
-  'parseEqualityExpression_0': new MethodTrampoline(0, (Parser target) => target.parseEqualityExpression()),
-  'parseExportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseExportDirective(arg0)),
-  'parseExpressionList_0': new MethodTrampoline(0, (Parser target) => target.parseExpressionList()),
-  'parseFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFinalConstVarOrType(arg0)),
-  'parseFormalParameter_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseFormalParameter(arg0)),
-  'parseForStatement_0': new MethodTrampoline(0, (Parser target) => target.parseForStatement()),
-  'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionBody(arg0, arg1, arg2)),
-  'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseFunctionDeclaration(arg0, arg1, arg2)),
-  'parseFunctionDeclarationStatement_0': new MethodTrampoline(0, (Parser target) => target.parseFunctionDeclarationStatement()),
-  'parseFunctionDeclarationStatementAfterReturnType_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionDeclarationStatementAfterReturnType(arg0, arg1)),
-  'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseFunctionTypeAlias(arg0, arg1)),
-  'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseGetter(arg0, arg1, arg2, arg3)),
-  'parseIdentifierList_0': new MethodTrampoline(0, (Parser target) => target.parseIdentifierList()),
-  'parseIfStatement_0': new MethodTrampoline(0, (Parser target) => target.parseIfStatement()),
-  'parseImportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseImportDirective(arg0)),
-  'parseInitializedIdentifierList_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseInitializedIdentifierList(arg0, arg1, arg2, arg3)),
-  'parseInstanceCreationExpression_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseInstanceCreationExpression(arg0)),
-  'parseLibraryDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseLibraryDirective(arg0)),
-  'parseLibraryName_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseLibraryName(arg0, arg1)),
-  'parseListLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseListLiteral(arg0, arg1)),
-  'parseListOrMapLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseListOrMapLiteral(arg0)),
-  'parseLogicalAndExpression_0': new MethodTrampoline(0, (Parser target) => target.parseLogicalAndExpression()),
-  'parseMapLiteral_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.parseMapLiteral(arg0, arg1)),
-  'parseMethodDeclarationAfterParameters_6': new MethodTrampoline(6, (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target.parseMethodDeclarationAfterParameters(arg0, arg1, arg2, arg3, arg4, arg5)),
-  'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)),
-  'parseModifiers_0': new MethodTrampoline(0, (Parser target) => target.parseModifiers()),
-  'parseMultiplicativeExpression_0': new MethodTrampoline(0, (Parser target) => target.parseMultiplicativeExpression()),
-  'parseNativeClause_0': new MethodTrampoline(0, (Parser target) => target.parseNativeClause()),
-  'parseNewExpression_0': new MethodTrampoline(0, (Parser target) => target.parseNewExpression()),
-  'parseNonLabeledStatement_0': new MethodTrampoline(0, (Parser target) => target.parseNonLabeledStatement()),
-  'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseOperator(arg0, arg1, arg2)),
-  'parseOptionalReturnType_0': new MethodTrampoline(0, (Parser target) => target.parseOptionalReturnType()),
-  'parsePartDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target.parsePartDirective(arg0)),
-  'parsePostfixExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePostfixExpression()),
-  'parsePrimaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parsePrimaryExpression()),
-  'parseRedirectingConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseRedirectingConstructorInvocation()),
-  'parseRelationalExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRelationalExpression()),
-  'parseRethrowExpression_0': new MethodTrampoline(0, (Parser target) => target.parseRethrowExpression()),
-  'parseReturnStatement_0': new MethodTrampoline(0, (Parser target) => target.parseReturnStatement()),
-  'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2, arg3) => target.parseSetter(arg0, arg1, arg2, arg3)),
-  'parseShiftExpression_0': new MethodTrampoline(0, (Parser target) => target.parseShiftExpression()),
-  'parseStatementList_0': new MethodTrampoline(0, (Parser target) => target.parseStatementList()),
-  'parseStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStringInterpolation(arg0)),
-  'parseSuperConstructorInvocation_0': new MethodTrampoline(0, (Parser target) => target.parseSuperConstructorInvocation()),
-  'parseSwitchStatement_0': new MethodTrampoline(0, (Parser target) => target.parseSwitchStatement()),
-  'parseSymbolLiteral_0': new MethodTrampoline(0, (Parser target) => target.parseSymbolLiteral()),
-  'parseThrowExpression_0': new MethodTrampoline(0, (Parser target) => target.parseThrowExpression()),
-  'parseThrowExpressionWithoutCascade_0': new MethodTrampoline(0, (Parser target) => target.parseThrowExpressionWithoutCascade()),
-  'parseTryStatement_0': new MethodTrampoline(0, (Parser target) => target.parseTryStatement()),
-  'parseTypeAlias_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseTypeAlias(arg0)),
-  'parseUnaryExpression_0': new MethodTrampoline(0, (Parser target) => target.parseUnaryExpression()),
-  'parseVariableDeclaration_0': new MethodTrampoline(0, (Parser target) => target.parseVariableDeclaration()),
-  'parseVariableDeclarationListAfterMetadata_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationListAfterMetadata(arg0)),
-  'parseVariableDeclarationListAfterType_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseVariableDeclarationListAfterType(arg0, arg1, arg2)),
-  'parseVariableDeclarationStatementAfterMetadata_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseVariableDeclarationStatementAfterMetadata(arg0)),
-  'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)),
-  'parseWhileStatement_0': new MethodTrampoline(0, (Parser target) => target.parseWhileStatement()),
-  'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
-  'peekAt_1': new MethodTrampoline(1, (Parser target, arg0) => target.peekAt(arg0)),
-  'reportError_1': new MethodTrampoline(1, (Parser target, arg0) => target.reportError(arg0)),
-  'reportErrorForCurrentToken_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportErrorForCurrentToken(arg0, arg1)),
-  'reportErrorForNode_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportErrorForNode(arg0, arg1, arg2)),
-  'reportErrorForToken_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportErrorForToken(arg0, arg1, arg2)),
-  'skipBlock_0': new MethodTrampoline(0, (Parser target) => target.skipBlock()),
-  'skipFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFinalConstVarOrType(arg0)),
-  'skipFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFormalParameterList(arg0)),
-  'skipPastMatchingToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipPastMatchingToken(arg0)),
-  'skipPrefixedIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipPrefixedIdentifier(arg0)),
-  'skipReturnType_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipReturnType(arg0)),
-  'skipSimpleIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipSimpleIdentifier(arg0)),
-  'skipStringInterpolation_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipStringInterpolation(arg0)),
-  'skipStringLiteral_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipStringLiteral(arg0)),
-  'skipTypeArgumentList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipTypeArgumentList(arg0)),
-  'skipTypeName_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipTypeName(arg0)),
-  'skipTypeParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipTypeParameterList(arg0)),
-  'tokenMatches_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.tokenMatches(arg0, arg1)),
-  'tokenMatchesIdentifier_1': new MethodTrampoline(1, (Parser target, arg0) => target.tokenMatchesIdentifier(arg0)),
-  'tokenMatchesKeyword_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.tokenMatchesKeyword(arg0, arg1)),
-  'translateCharacter_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.translateCharacter(arg0, arg1, arg2)),
-  'unlockErrorListener_0': new MethodTrampoline(0, (Parser target) => target.unlockErrorListener()),
-  'validateFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateFormalParameterList(arg0)),
-  'validateModifiersForClass_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForClass(arg0)),
-  'validateModifiersForConstructor_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForConstructor(arg0)),
-  'validateModifiersForField_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForField(arg0)),
-  'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForFunctionDeclarationStatement(arg0)),
-  'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForGetterOrSetterOrMethod(arg0)),
-  'validateModifiersForOperator_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForOperator(arg0)),
-  'validateModifiersForTopLevelDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForTopLevelDeclaration(arg0)),
-  'validateModifiersForTopLevelFunction_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForTopLevelFunction(arg0)),
-  'validateModifiersForTopLevelVariable_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForTopLevelVariable(arg0)),
-  'validateModifiersForTypedef_1': new MethodTrampoline(1, (Parser target, arg0) => target.validateModifiersForTypedef(arg0)),};
-
-
-Object invokeParserMethodImpl(Parser parser, String methodName, List<Object> objects, Token tokenStream) {
-  parser.currentToken = tokenStream;
-  MethodTrampoline method = _methodTable_Parser['${methodName}_${objects.length}'];
-  return method.invoke(parser, objects);
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 702dae0..d49726d 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -31,7 +31,7 @@
   void fail_propagatedReturnType_functionExpression() {
     // TODO(scheglov) disabled because we don't resolve function expression
     String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_as() {
@@ -148,14 +148,14 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // k
-    Type2 intType = typeProvider.intType;
+    DartType intType = typeProvider.intType;
     FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
     SimpleIdentifier kIdentifier = EngineTestCase.findNode(unit, code, "k;", (node) => node is SimpleIdentifier);
     JUnitTestCase.assertSame(intType, kIdentifier.propagatedType);
     JUnitTestCase.assertSame(typeProvider.dynamicType, kIdentifier.staticType);
     // v
-    Type2 stringType = typeProvider.stringType;
+    DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
@@ -178,11 +178,11 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // k
-    Type2 intType = typeProvider.intType;
+    DartType intType = typeProvider.intType;
     FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
     // v
-    Type2 stringType = typeProvider.stringType;
+    DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
   }
@@ -200,8 +200,8 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // v
-    Type2 dynamicType = typeProvider.dynamicType;
-    Type2 stringType = typeProvider.stringType;
+    DartType dynamicType = typeProvider.dynamicType;
+    DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is FormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
     JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
@@ -226,7 +226,7 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // v
-    Type2 intType = typeProvider.intType;
+    DartType intType = typeProvider.intType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(null, vParameter.identifier.propagatedType);
     JUnitTestCase.assertSame(intType, vParameter.identifier.staticType);
@@ -251,7 +251,7 @@
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // v
-    Type2 stringType = typeProvider.stringType;
+    DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
     JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
     JUnitTestCase.assertSame(typeProvider.objectType, vParameter.identifier.staticType);
@@ -655,7 +655,7 @@
     SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
     InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
     JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
-    List<Type2> typeArguments = propagatedType.typeArguments;
+    List<DartType> typeArguments = propagatedType.typeArguments;
     EngineTestCase.assertLength(2, typeArguments);
     JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
     JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
@@ -677,7 +677,7 @@
     SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
     InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
     JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
-    List<Type2> typeArguments = propagatedType.typeArguments;
+    List<DartType> typeArguments = propagatedType.typeArguments;
     EngineTestCase.assertLength(2, typeArguments);
     JUnitTestCase.assertSame(typeProvider.stringType, typeArguments[0]);
     JUnitTestCase.assertSame(typeProvider.intType, typeArguments[1]);
@@ -685,12 +685,12 @@
 
   void test_propagatedReturnType_function_hasReturnType_returnsNull() {
     String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
   }
 
   void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
     String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
@@ -699,7 +699,7 @@
         "main() {",
         "  var v = f(3);",
         "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
@@ -711,7 +711,7 @@
         "main() {",
         "  var v = f();",
         "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
@@ -723,17 +723,17 @@
         "main() {",
         "  var v = f();",
         "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
     String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_localFunction() {
     String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
-    check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_query() {
@@ -781,7 +781,7 @@
    * @param code the code that assigns the value to the variable "v", no matter how. We check that
    *          "v" has expected static and propagated type.
    */
-  void check_propagatedReturnType(String code, Type2 expectedStaticType, Type2 expectedPropagatedType) {
+  void _check_propagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -4540,26 +4540,26 @@
   }
 
   void test_wrongNumberOfParametersForOperator_minus() {
-    check_wrongNumberOfParametersForOperator("-", "");
-    check_wrongNumberOfParametersForOperator("-", "a");
+    _check_wrongNumberOfParametersForOperator("-", "");
+    _check_wrongNumberOfParametersForOperator("-", "a");
   }
 
   void test_wrongNumberOfParametersForOperator1() {
-    check_wrongNumberOfParametersForOperator1("<");
-    check_wrongNumberOfParametersForOperator1(">");
-    check_wrongNumberOfParametersForOperator1("<=");
-    check_wrongNumberOfParametersForOperator1(">=");
-    check_wrongNumberOfParametersForOperator1("+");
-    check_wrongNumberOfParametersForOperator1("/");
-    check_wrongNumberOfParametersForOperator1("~/");
-    check_wrongNumberOfParametersForOperator1("*");
-    check_wrongNumberOfParametersForOperator1("%");
-    check_wrongNumberOfParametersForOperator1("|");
-    check_wrongNumberOfParametersForOperator1("^");
-    check_wrongNumberOfParametersForOperator1("&");
-    check_wrongNumberOfParametersForOperator1("<<");
-    check_wrongNumberOfParametersForOperator1(">>");
-    check_wrongNumberOfParametersForOperator1("[]");
+    _check_wrongNumberOfParametersForOperator1("<");
+    _check_wrongNumberOfParametersForOperator1(">");
+    _check_wrongNumberOfParametersForOperator1("<=");
+    _check_wrongNumberOfParametersForOperator1(">=");
+    _check_wrongNumberOfParametersForOperator1("+");
+    _check_wrongNumberOfParametersForOperator1("/");
+    _check_wrongNumberOfParametersForOperator1("~/");
+    _check_wrongNumberOfParametersForOperator1("*");
+    _check_wrongNumberOfParametersForOperator1("%");
+    _check_wrongNumberOfParametersForOperator1("|");
+    _check_wrongNumberOfParametersForOperator1("^");
+    _check_wrongNumberOfParametersForOperator1("&");
+    _check_wrongNumberOfParametersForOperator1("<<");
+    _check_wrongNumberOfParametersForOperator1(">>");
+    _check_wrongNumberOfParametersForOperator1("[]");
   }
 
   void test_wrongNumberOfParametersForSetter() {
@@ -4569,7 +4569,7 @@
     verify([source]);
   }
 
-  void check_wrongNumberOfParametersForOperator(String name, String parameters) {
+  void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
     resolve(source);
     assertNoErrors(source);
@@ -4577,8 +4577,8 @@
     reset();
   }
 
-  void check_wrongNumberOfParametersForOperator1(String name) {
-    check_wrongNumberOfParametersForOperator(name, "a");
+  void _check_wrongNumberOfParametersForOperator1(String name) {
+    _check_wrongNumberOfParametersForOperator(name, "a");
   }
 
   static dartSuite() {
@@ -5868,12 +5868,13 @@
    */
   Library _library;
 
+  @override
   void setUp() {
     _sourceFactory = new SourceFactory([new FileUriResolver()]);
     _analysisContext = new AnalysisContextImpl();
     _analysisContext.sourceFactory = _sourceFactory;
     _errorListener = new GatheringErrorListener();
-    _library = createLibrary("/lib.dart");
+    _library = _createLibrary("/lib.dart");
   }
 
   void test_getExplicitlyImportsCore() {
@@ -5892,8 +5893,8 @@
   }
 
   void test_getImportsAndExports() {
-    _library.importedLibraries = <Library> [createLibrary("/imported.dart")];
-    _library.exportedLibraries = <Library> [createLibrary("/exported.dart")];
+    _library.importedLibraries = <Library> [_createLibrary("/imported.dart")];
+    _library.exportedLibraries = <Library> [_createLibrary("/exported.dart")];
     EngineTestCase.assertLength(2, _library.importsAndExports);
     _errorListener.assertNoErrors();
   }
@@ -5917,7 +5918,7 @@
   }
 
   void test_setExportedLibraries() {
-    Library exportLibrary = createLibrary("/exported.dart");
+    Library exportLibrary = _createLibrary("/exported.dart");
     _library.exportedLibraries = <Library> [exportLibrary];
     List<Library> exports = _library.exports;
     EngineTestCase.assertLength(1, exports);
@@ -5926,7 +5927,7 @@
   }
 
   void test_setImportedLibraries() {
-    Library importLibrary = createLibrary("/imported.dart");
+    Library importLibrary = _createLibrary("/imported.dart");
     _library.importedLibraries = <Library> [importLibrary];
     List<Library> imports = _library.imports;
     EngineTestCase.assertLength(1, imports);
@@ -5940,7 +5941,7 @@
     JUnitTestCase.assertSame(element, _library.libraryElement);
   }
 
-  Library createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
+  Library _createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
 
   static dartSuite() {
     _ut.group('LibraryTest', () {
@@ -5990,7 +5991,7 @@
 
 class DeclarationMatcherTest extends ResolverTestCase {
   void test_compilationUnitMatches_false_topLevelVariable() {
-    assertCompilationUnitMatches(false, EngineTestCase.createSource([
+    _assertCompilationUnitMatches(false, EngineTestCase.createSource([
         "class C {",
         "  int m(int p) {",
         "    return p + p;",
@@ -6005,7 +6006,7 @@
   }
 
   void test_compilationUnitMatches_true_different() {
-    assertCompilationUnitMatches(true, EngineTestCase.createSource([
+    _assertCompilationUnitMatches(true, EngineTestCase.createSource([
         "class C {",
         "  int m(int p) {",
         "    return p + p;",
@@ -6025,11 +6026,11 @@
         "    return p + p;",
         "  }",
         "}"]);
-    assertCompilationUnitMatches(true, content, content);
+    _assertCompilationUnitMatches(true, content, content);
   }
 
   void test_methodDeclarationMatches_false_localVariable() {
-    assertMethodMatches(false, EngineTestCase.createSource([
+    _assertMethodMatches(false, EngineTestCase.createSource([
         "class C {",
         "  int m(int p) {",
         "    return p + p;",
@@ -6044,7 +6045,7 @@
   }
 
   void test_methodDeclarationMatches_false_parameter() {
-    assertMethodMatches(false, EngineTestCase.createSource([
+    _assertMethodMatches(false, EngineTestCase.createSource([
         "class C {",
         "  int m(int p) {",
         "    return p + p;",
@@ -6058,7 +6059,7 @@
   }
 
   void test_methodDeclarationMatches_true_different() {
-    assertMethodMatches(true, EngineTestCase.createSource([
+    _assertMethodMatches(true, EngineTestCase.createSource([
         "class C {",
         "  int m(int p) {",
         "    return p + p;",
@@ -6078,10 +6079,10 @@
         "    return p + p;",
         "  }",
         "}"]);
-    assertMethodMatches(true, content, content);
+    _assertMethodMatches(true, content, content);
   }
 
-  void assertCompilationUnitMatches(bool expectMatch, String oldContent, String newContent) {
+  void _assertCompilationUnitMatches(bool expectMatch, String oldContent, String newContent) {
     Source source = addSource(oldContent);
     LibraryElement library = resolve(source);
     CompilationUnit oldUnit = resolveCompilationUnit(source, library);
@@ -6092,20 +6093,20 @@
     JUnitTestCase.assertEquals(expectMatch, matcher.matches(newUnit, oldUnit.element));
   }
 
-  void assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
+  void _assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
     Source source = addSource(oldContent);
     LibraryElement library = resolve(source);
     CompilationUnit oldUnit = resolveCompilationUnit(source, library);
-    MethodElement element = getFirstMethod(oldUnit).element as MethodElement;
+    MethodElement element = _getFirstMethod(oldUnit).element as MethodElement;
     AnalysisContext context = analysisContext;
     context.setContents(source, newContent);
     CompilationUnit newUnit = context.parseCompilationUnit(source);
-    MethodDeclaration newMethod = getFirstMethod(newUnit);
+    MethodDeclaration newMethod = _getFirstMethod(newUnit);
     DeclarationMatcher matcher = new DeclarationMatcher();
     JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
   }
 
-  MethodDeclaration getFirstMethod(CompilationUnit unit) {
+  MethodDeclaration _getFirstMethod(CompilationUnit unit) {
     ClassDeclaration classNode = unit.declarations[0] as ClassDeclaration;
     return classNode.members[0] as MethodDeclaration;
   }
@@ -9013,6 +9014,7 @@
     _listener.assertNoErrors();
   }
 
+  @override
   void setUp() {
     _listener = new GatheringErrorListener();
     SourceFactory factory = new SourceFactory([new FileUriResolver()]);
@@ -9032,7 +9034,7 @@
     CatchClause clause = AstFactory.catchClause("e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    resolveCatchClause(clause, _typeProvider.dynamicType, null, []);
+    _resolveCatchClause(clause, _typeProvider.dynamicType, null, []);
     _listener.assertNoErrors();
   }
 
@@ -9043,7 +9045,7 @@
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
     stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    resolveCatchClause(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
+    _resolveCatchClause(clause, _typeProvider.dynamicType, _typeProvider.stackTraceType, []);
     _listener.assertNoErrors();
   }
 
@@ -9054,7 +9056,7 @@
     CatchClause clause = AstFactory.catchClause4(exceptionType, "e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
-    resolveCatchClause(clause, exceptionElement.type, null, [exceptionElement]);
+    _resolveCatchClause(clause, exceptionElement.type, null, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
@@ -9068,7 +9070,7 @@
     exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
     stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
-    resolveCatchClause(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
+    _resolveCatchClause(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
     _listener.assertNoErrors();
   }
 
@@ -9083,7 +9085,7 @@
     ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
     ClassDeclaration declaration = AstFactory.classDeclaration(null, "A", null, extendsClause, withClause, implementsClause, []);
     declaration.name.staticElement = elementA;
-    resolveNode(declaration, [elementA, elementB, elementC, elementD]);
+    _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
     JUnitTestCase.assertSame(elementB.type, elementA.supertype);
     List<InterfaceType> mixins = elementA.mixins;
     EngineTestCase.assertLength(1, mixins);
@@ -9104,7 +9106,7 @@
     ImplementsClause implementsClause = AstFactory.implementsClause([AstFactory.typeName(elementD, [])]);
     ClassTypeAlias alias = AstFactory.classTypeAlias("A", null, null, AstFactory.typeName(elementB, []), withClause, implementsClause);
     alias.name.staticElement = elementA;
-    resolveNode(alias, [elementA, elementB, elementC, elementD]);
+    _resolveNode(alias, [elementA, elementB, elementC, elementD]);
     JUnitTestCase.assertSame(elementB.type, elementA.supertype);
     List<InterfaceType> mixins = elementA.mixins;
     EngineTestCase.assertLength(1, mixins);
@@ -9122,9 +9124,9 @@
     SimpleFormalParameter parameter = AstFactory.simpleFormalParameter3(innerParameterName);
     parameter.identifier.staticElement = ElementFactory.requiredParameter(innerParameterName);
     String outerParameterName = "p";
-    FormalParameter node = AstFactory.fieldFormalParameter2(null, intTypeName, outerParameterName, AstFactory.formalParameterList([parameter]));
+    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, outerParameterName, AstFactory.formalParameterList([parameter]));
     node.identifier.staticElement = ElementFactory.requiredParameter(outerParameterName);
-    Type2 parameterType = resolveFormalParameter(node, [intType.element]);
+    DartType parameterType = _resolveFormalParameter(node, [intType.element]);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, parameterType);
     FunctionType functionType = parameterType as FunctionType;
     JUnitTestCase.assertSame(intType, functionType.returnType);
@@ -9136,7 +9138,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolveFormalParameter(node, []));
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
     _listener.assertNoErrors();
   }
 
@@ -9146,7 +9148,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(intType, resolveFormalParameter(node, [intType.element]));
+    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intType.element]));
     _listener.assertNoErrors();
   }
 
@@ -9154,7 +9156,7 @@
     // p
     FormalParameter node = AstFactory.simpleFormalParameter3("p");
     node.identifier.staticElement = new ParameterElementImpl.con1(AstFactory.identifier3("p"));
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, resolveFormalParameter(node, []));
+    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
     _listener.assertNoErrors();
   }
 
@@ -9166,7 +9168,7 @@
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.con1(identifier);
     identifier.staticElement = element;
-    JUnitTestCase.assertSame(intType, resolveFormalParameter(node, [intElement]));
+    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intElement]));
     _listener.assertNoErrors();
   }
 
@@ -9174,7 +9176,7 @@
     ClassElement classA = ElementFactory.classElement2("A", []);
     TypeName typeName = AstFactory.typeName(classA, []);
     typeName.type = null;
-    resolveNode(typeName, [classA]);
+    _resolveNode(typeName, [classA]);
     JUnitTestCase.assertSame(classA.type, typeName.type);
     _listener.assertNoErrors();
   }
@@ -9184,10 +9186,10 @@
     ClassElement classB = ElementFactory.classElement2("B", []);
     TypeName typeName = AstFactory.typeName(classA, [AstFactory.typeName(classB, [])]);
     typeName.type = null;
-    resolveNode(typeName, [classA, classB]);
+    _resolveNode(typeName, [classA, classB]);
     InterfaceType resultType = typeName.type as InterfaceType;
     JUnitTestCase.assertSame(classA, resultType.element);
-    List<Type2> resultArguments = resultType.typeArguments;
+    List<DartType> resultArguments = resultType.typeArguments;
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertSame(classB.type, resultArguments[0]);
     _listener.assertNoErrors();
@@ -9197,10 +9199,10 @@
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     TypeName typeName = AstFactory.typeName(classA, []);
     typeName.type = null;
-    resolveNode(typeName, [classA]);
+    _resolveNode(typeName, [classA]);
     InterfaceType resultType = typeName.type as InterfaceType;
     JUnitTestCase.assertSame(classA, resultType.element);
-    List<Type2> resultArguments = resultType.typeArguments;
+    List<DartType> resultArguments = resultType.typeArguments;
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertSame(DynamicTypeImpl.instance, resultArguments[0]);
     _listener.assertNoErrors();
@@ -9209,7 +9211,7 @@
   void test_visitTypeName_void() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     TypeName typeName = AstFactory.typeName4("void", []);
-    resolveNode(typeName, [classA]);
+    _resolveNode(typeName, [classA]);
     JUnitTestCase.assertSame(VoidTypeImpl.instance, typeName.type);
     _listener.assertNoErrors();
   }
@@ -9225,8 +9227,8 @@
    * @param definedElements the elements that are to be defined in the scope in which the element is
    *          being resolved
    */
-  void resolveCatchClause(CatchClause node, Type2 exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
-    resolveNode(node, definedElements);
+  void _resolveCatchClause(CatchClause node, DartType exceptionType, InterfaceType stackTraceType, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
       JUnitTestCase.assertSame(exceptionType, exceptionParameter.staticType);
@@ -9246,8 +9248,8 @@
    *          being resolved
    * @return the type associated with the parameter
    */
-  Type2 resolveFormalParameter(FormalParameter node, List<Element> definedElements) {
-    resolveNode(node, definedElements);
+  DartType _resolveFormalParameter(FormalParameter node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
     return (node.identifier.staticElement as ParameterElement).type;
   }
 
@@ -9260,7 +9262,7 @@
    *          being resolved
    * @return the element to which the expression was resolved
    */
-  void resolveNode(AstNode node, List<Element> definedElements) {
+  void _resolveNode(AstNode node, List<Element> definedElements) {
     for (Element element in definedElements) {
       _library.libraryScope.define(element);
     }
@@ -9339,6 +9341,7 @@
    */
   AnalysisContextImpl _analysisContext;
 
+  @override
   void setUp() {
     reset();
   }
@@ -9433,13 +9436,13 @@
       ClassElementImpl type = new ClassElementImpl(AstFactory.identifier3(typeName));
       String fileName = "${typeName}.dart";
       CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-      compilationUnit.source = createNamedSource(fileName);
+      compilationUnit.source = _createNamedSource(fileName);
       compilationUnit.types = <ClassElement> [type];
       sourcedCompilationUnits[i] = compilationUnit;
     }
     String fileName = "${libraryName}.dart";
     CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
-    compilationUnit.source = createNamedSource(fileName);
+    compilationUnit.source = _createNamedSource(fileName);
     LibraryElementImpl library = new LibraryElementImpl(context, AstFactory.libraryIdentifier2([libraryName]));
     library.definingCompilationUnit = compilationUnit;
     library.parts = sourcedCompilationUnits;
@@ -9508,7 +9511,7 @@
    * @param fileName the name of the file for which a source is to be created
    * @return the source that was created
    */
-  FileBasedSource createNamedSource(String fileName) {
+  FileBasedSource _createNamedSource(String fileName) {
     FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
     _analysisContext.setContents(source, "");
     return source;
@@ -9527,18 +9530,18 @@
     // either ElementFactory or TestTypeProvider (which uses ElementFactory) because we side-effect
     // the elements in ways that would break other tests.
     //
-    InterfaceType objectType = classElement("Object", null, []).type;
-    InterfaceType boolType = classElement("bool", objectType, []).type;
-    InterfaceType numType = classElement("num", objectType, []).type;
-    InterfaceType doubleType = classElement("double", numType, []).type;
-    InterfaceType functionType = classElement("Function", objectType, []).type;
-    InterfaceType intType = classElement("int", numType, []).type;
-    InterfaceType listType = classElement("List", objectType, ["E"]).type;
-    InterfaceType mapType = classElement("Map", objectType, ["K", "V"]).type;
-    InterfaceType stackTraceType = classElement("StackTrace", objectType, []).type;
-    InterfaceType stringType = classElement("String", objectType, []).type;
-    InterfaceType symbolType = classElement("Symbol", objectType, []).type;
-    InterfaceType typeType = classElement("Type", objectType, []).type;
+    InterfaceType objectType = _classElement("Object", null, []).type;
+    InterfaceType boolType = _classElement("bool", objectType, []).type;
+    InterfaceType numType = _classElement("num", objectType, []).type;
+    InterfaceType doubleType = _classElement("double", numType, []).type;
+    InterfaceType functionType = _classElement("Function", objectType, []).type;
+    InterfaceType intType = _classElement("int", numType, []).type;
+    InterfaceType listType = _classElement("List", objectType, ["E"]).type;
+    InterfaceType mapType = _classElement("Map", objectType, ["K", "V"]).type;
+    InterfaceType stackTraceType = _classElement("StackTrace", objectType, []).type;
+    InterfaceType stringType = _classElement("String", objectType, []).type;
+    InterfaceType symbolType = _classElement("Symbol", objectType, []).type;
+    InterfaceType typeType = _classElement("Type", objectType, []).type;
     CompilationUnitElementImpl unit = new CompilationUnitElementImpl("lib.dart");
     unit.types = <ClassElement> [
         boolType.element,
@@ -9573,7 +9576,7 @@
     JUnitTestCase.assertSame(typeType, provider.typeType);
   }
 
-  ClassElement classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
+  ClassElement _classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
     ClassElementImpl element = new ClassElementImpl(AstFactory.identifier3(typeName));
     element.supertype = superclassType;
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(element);
@@ -9625,9 +9628,10 @@
    */
   int _numOfMembersInObject = 0;
 
+  @override
   void setUp() {
     _typeProvider = new TestTypeProvider();
-    _inheritanceManager = createInheritanceManager();
+    _inheritanceManager = _createInheritanceManager();
     InterfaceType objectType = _typeProvider.objectType;
     _numOfMembersInObject = objectType.methods.length + objectType.accessors.length;
   }
@@ -9645,8 +9649,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
@@ -9663,8 +9667,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
     JUnitTestCase.assertNull(mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromClasses_accessor_with() {
@@ -9681,8 +9685,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromClasses_implicitExtends() {
@@ -9690,7 +9694,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromClasses_method_extends() {
@@ -9707,8 +9711,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromClasses_method_implements() {
@@ -9725,8 +9729,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
     JUnitTestCase.assertNull(mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromClasses_method_with() {
@@ -9743,8 +9747,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
@@ -9760,8 +9764,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
@@ -9778,8 +9782,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
@@ -9796,8 +9800,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(getterG, mapB.get(getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() {
@@ -9805,7 +9809,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
@@ -9824,7 +9828,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertNull(mapA.get(methodName));
-    assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
@@ -9843,7 +9847,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertNull(mapA.get(methodName));
-    assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
@@ -9862,7 +9866,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertNull(mapA.get(methodName));
-    assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+    _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
@@ -9898,7 +9902,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertNull(mapA.get(methodName));
-    assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
@@ -9917,7 +9921,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertNull(mapA.get(methodName));
-    assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
@@ -9933,8 +9937,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
@@ -9951,8 +9955,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_method_with() {
@@ -9969,8 +9973,8 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
     JUnitTestCase.assertSame(methodM, mapB.get(methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() {
@@ -9991,7 +9995,7 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject + 2, mapA.size);
     JUnitTestCase.assertSame(methodM1, mapA.get(methodName1));
     JUnitTestCase.assertSame(methodM2, mapA.get(methodName2));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
@@ -10011,7 +10015,7 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
     JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get(accessorName).type);
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
@@ -10039,7 +10043,7 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
     MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
     JUnitTestCase.assertEquals(syntheticMethod.type, mapA.get(methodName).type);
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
@@ -10060,7 +10064,7 @@
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
     syntheticAccessor.returnType = _typeProvider.dynamicType;
     JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get("${accessorName}=").type);
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
@@ -10090,7 +10094,7 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
     JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get(accessorName).type);
-    assertNoErrors(classD);
+    _assertNoErrors(classD);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
@@ -10132,7 +10136,7 @@
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
     MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
     JUnitTestCase.assertEquals(syntheticMethod.type, mapD.get(methodName).type);
-    assertNoErrors(classD);
+    _assertNoErrors(classD);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
@@ -10163,7 +10167,7 @@
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
     syntheticAccessor.returnType = _typeProvider.dynamicType;
     JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get("${accessorName}=").type);
-    assertNoErrors(classD);
+    _assertNoErrors(classD);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
@@ -10186,7 +10190,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
     JUnitTestCase.assertSame(methodM2, mapA.get(methodName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
@@ -10220,7 +10224,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
     JUnitTestCase.assertSame(methodM3, mapA.get(methodName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
@@ -10258,7 +10262,7 @@
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
     JUnitTestCase.assertSame(methodM4, mapA.get(methodName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_interface_getter() {
@@ -10269,8 +10273,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_method() {
@@ -10281,8 +10285,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_setter() {
@@ -10293,8 +10297,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interface_staticMember() {
@@ -10306,15 +10310,15 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interfaces_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_interfaces_infiniteLoop2() {
@@ -10323,8 +10327,8 @@
     classA.interfaces = <InterfaceType> [classB.type];
     classB.interfaces = <InterfaceType> [classA.type];
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_interfaces_union2() {
@@ -10341,9 +10345,9 @@
     classA.interfaces = <InterfaceType> [classI2.type];
     JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
     JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
-    assertNoErrors(classI1);
-    assertNoErrors(classI2);
-    assertNoErrors(classA);
+    _assertNoErrors(classI1);
+    _assertNoErrors(classI2);
+    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_mixin_getter() {
@@ -10354,8 +10358,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_method() {
@@ -10366,8 +10370,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_setter() {
@@ -10378,8 +10382,8 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
     JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_mixin_staticMember() {
@@ -10391,14 +10395,14 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_superclass_getter() {
@@ -10408,15 +10412,15 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.supertype = classA.type;
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupInheritance_superclass_infiniteLoop2() {
@@ -10425,8 +10429,8 @@
     classA.supertype = classB.type;
     classB.supertype = classA.type;
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_method() {
@@ -10436,8 +10440,8 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_setter() {
@@ -10447,8 +10451,8 @@
     classA.accessors = <PropertyAccessorElement> [setterS];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_superclass_staticMember() {
@@ -10459,8 +10463,8 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
-    assertNoErrors(classA);
-    assertNoErrors(classB);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
   }
 
   void test_lookupMember_getter() {
@@ -10469,7 +10473,7 @@
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
     JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_getter_static() {
@@ -10478,7 +10482,7 @@
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_method() {
@@ -10487,7 +10491,7 @@
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classA.methods = <MethodElement> [methodM];
     JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_method_static() {
@@ -10497,13 +10501,13 @@
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_setter() {
@@ -10512,7 +10516,7 @@
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [setterS];
     JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
   void test_lookupMember_setter_static() {
@@ -10521,10 +10525,10 @@
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [setterS];
     JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
-    assertNoErrors(classA);
+    _assertNoErrors(classA);
   }
 
-  void assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
+  void _assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
     if (actualErrors != null) {
@@ -10535,8 +10539,8 @@
     errorListener.assertErrorsWithCodes(expectedErrorCodes);
   }
 
-  void assertNoErrors(ClassElement classElt) {
-    assertErrors(classElt, []);
+  void _assertNoErrors(ClassElement classElt) {
+    _assertErrors(classElt, []);
   }
 
   /**
@@ -10544,7 +10548,7 @@
    *
    * @return the inheritance manager that was created
    */
-  InheritanceManager createInheritanceManager() {
+  InheritanceManager _createInheritanceManager() {
     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
     FileBasedSource source = new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
     CompilationUnitElementImpl definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
@@ -11132,13 +11136,13 @@
   }
 
   void test_constEvalThrowsException_binaryMinus_null() {
-    check_constEvalThrowsException_binary_null("null - 5", false);
-    check_constEvalThrowsException_binary_null("5 - null", true);
+    _check_constEvalThrowsException_binary_null("null - 5", false);
+    _check_constEvalThrowsException_binary_null("5 - null", true);
   }
 
   void test_constEvalThrowsException_binaryPlus_null() {
-    check_constEvalThrowsException_binary_null("null + 5", false);
-    check_constEvalThrowsException_binary_null("5 + null", true);
+    _check_constEvalThrowsException_binary_null("null + 5", false);
+    _check_constEvalThrowsException_binary_null("5 + null", true);
   }
 
   void test_constEvalThrowsException_divisionByZero() {
@@ -11168,8 +11172,8 @@
   }
 
   void test_constEvalTypeBool_binary() {
-    check_constEvalTypeBool_withParameter_binary("p && ''");
-    check_constEvalTypeBool_withParameter_binary("p || ''");
+    _check_constEvalTypeBool_withParameter_binary("p && ''");
+    _check_constEvalTypeBool_withParameter_binary("p || ''");
   }
 
   void test_constEvalTypeBool_binary_leftTrue() {
@@ -11210,24 +11214,24 @@
   }
 
   void test_constEvalTypeInt_binary() {
-    check_constEvalTypeInt_withParameter_binary("p ^ ''");
-    check_constEvalTypeInt_withParameter_binary("p & ''");
-    check_constEvalTypeInt_withParameter_binary("p | ''");
-    check_constEvalTypeInt_withParameter_binary("p >> ''");
-    check_constEvalTypeInt_withParameter_binary("p << ''");
+    _check_constEvalTypeInt_withParameter_binary("p ^ ''");
+    _check_constEvalTypeInt_withParameter_binary("p & ''");
+    _check_constEvalTypeInt_withParameter_binary("p | ''");
+    _check_constEvalTypeInt_withParameter_binary("p >> ''");
+    _check_constEvalTypeInt_withParameter_binary("p << ''");
   }
 
   void test_constEvalTypeNum_binary() {
-    check_constEvalTypeNum_withParameter_binary("p + ''");
-    check_constEvalTypeNum_withParameter_binary("p - ''");
-    check_constEvalTypeNum_withParameter_binary("p * ''");
-    check_constEvalTypeNum_withParameter_binary("p / ''");
-    check_constEvalTypeNum_withParameter_binary("p ~/ ''");
-    check_constEvalTypeNum_withParameter_binary("p > ''");
-    check_constEvalTypeNum_withParameter_binary("p < ''");
-    check_constEvalTypeNum_withParameter_binary("p >= ''");
-    check_constEvalTypeNum_withParameter_binary("p <= ''");
-    check_constEvalTypeNum_withParameter_binary("p % ''");
+    _check_constEvalTypeNum_withParameter_binary("p + ''");
+    _check_constEvalTypeNum_withParameter_binary("p - ''");
+    _check_constEvalTypeNum_withParameter_binary("p * ''");
+    _check_constEvalTypeNum_withParameter_binary("p / ''");
+    _check_constEvalTypeNum_withParameter_binary("p ~/ ''");
+    _check_constEvalTypeNum_withParameter_binary("p > ''");
+    _check_constEvalTypeNum_withParameter_binary("p < ''");
+    _check_constEvalTypeNum_withParameter_binary("p >= ''");
+    _check_constEvalTypeNum_withParameter_binary("p <= ''");
+    _check_constEvalTypeNum_withParameter_binary("p % ''");
   }
 
   void test_constFormalParameter_fieldFormalParameter() {
@@ -13764,26 +13768,26 @@
   }
 
   void test_wrongNumberOfParametersForOperator_tilde() {
-    check_wrongNumberOfParametersForOperator("~", "a");
-    check_wrongNumberOfParametersForOperator("~", "a, b");
+    _check_wrongNumberOfParametersForOperator("~", "a");
+    _check_wrongNumberOfParametersForOperator("~", "a, b");
   }
 
   void test_wrongNumberOfParametersForOperator1() {
-    check_wrongNumberOfParametersForOperator1("<");
-    check_wrongNumberOfParametersForOperator1(">");
-    check_wrongNumberOfParametersForOperator1("<=");
-    check_wrongNumberOfParametersForOperator1(">=");
-    check_wrongNumberOfParametersForOperator1("+");
-    check_wrongNumberOfParametersForOperator1("/");
-    check_wrongNumberOfParametersForOperator1("~/");
-    check_wrongNumberOfParametersForOperator1("*");
-    check_wrongNumberOfParametersForOperator1("%");
-    check_wrongNumberOfParametersForOperator1("|");
-    check_wrongNumberOfParametersForOperator1("^");
-    check_wrongNumberOfParametersForOperator1("&");
-    check_wrongNumberOfParametersForOperator1("<<");
-    check_wrongNumberOfParametersForOperator1(">>");
-    check_wrongNumberOfParametersForOperator1("[]");
+    _check_wrongNumberOfParametersForOperator1("<");
+    _check_wrongNumberOfParametersForOperator1(">");
+    _check_wrongNumberOfParametersForOperator1("<=");
+    _check_wrongNumberOfParametersForOperator1(">=");
+    _check_wrongNumberOfParametersForOperator1("+");
+    _check_wrongNumberOfParametersForOperator1("/");
+    _check_wrongNumberOfParametersForOperator1("~/");
+    _check_wrongNumberOfParametersForOperator1("*");
+    _check_wrongNumberOfParametersForOperator1("%");
+    _check_wrongNumberOfParametersForOperator1("|");
+    _check_wrongNumberOfParametersForOperator1("^");
+    _check_wrongNumberOfParametersForOperator1("&");
+    _check_wrongNumberOfParametersForOperator1("<<");
+    _check_wrongNumberOfParametersForOperator1(">>");
+    _check_wrongNumberOfParametersForOperator1("[]");
   }
 
   void test_wrongNumberOfParametersForSetter_function_named() {
@@ -13842,7 +13846,7 @@
     verify([source]);
   }
 
-  void check_constEvalThrowsException_binary_null(String expr, bool resolved) {
+  void _check_constEvalThrowsException_binary_null(String expr, bool resolved) {
     Source source = addSource("const C = ${expr};");
     resolve(source);
     if (resolved) {
@@ -13854,7 +13858,7 @@
     reset();
   }
 
-  void check_constEvalTypeBool_withParameter_binary(String expr) {
+  void _check_constEvalTypeBool_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  final a;",
@@ -13866,7 +13870,7 @@
     reset();
   }
 
-  void check_constEvalTypeInt_withParameter_binary(String expr) {
+  void _check_constEvalTypeInt_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  final a;",
@@ -13880,7 +13884,7 @@
     reset();
   }
 
-  void check_constEvalTypeNum_withParameter_binary(String expr) {
+  void _check_constEvalTypeNum_withParameter_binary(String expr) {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  final a;",
@@ -13894,7 +13898,7 @@
     reset();
   }
 
-  void check_wrongNumberOfParametersForOperator(String name, String parameters) {
+  void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
@@ -13902,9 +13906,9 @@
     reset();
   }
 
-  void check_wrongNumberOfParametersForOperator1(String name) {
-    check_wrongNumberOfParametersForOperator(name, "");
-    check_wrongNumberOfParametersForOperator(name, "a, b");
+  void _check_wrongNumberOfParametersForOperator1(String name) {
+    _check_wrongNumberOfParametersForOperator(name, "");
+    _check_wrongNumberOfParametersForOperator(name, "a, b");
   }
 
   static dartSuite() {
@@ -15250,7 +15254,7 @@
           writer.print("  ");
           writer.print(identifier.toString());
           writer.print(" (");
-          writer.print(getFileName(identifier));
+          writer.print(_getFileName(identifier));
           writer.print(" : ");
           writer.print(identifier.offset);
           writer.println(")");
@@ -15267,7 +15271,7 @@
           writer.print("  ");
           writer.print(expression.toString());
           writer.print(" (");
-          writer.print(getFileName(expression));
+          writer.print(_getFileName(expression));
           writer.print(" : ");
           writer.print(expression.offset);
           writer.println(")");
@@ -15289,7 +15293,7 @@
           writer.print(expression.propagatedType.displayName);
           writer.println("]");
           writer.print("    ");
-          writer.print(getFileName(expression));
+          writer.print(_getFileName(expression));
           writer.print(" : ");
           writer.print(expression.offset);
           writer.println(")");
@@ -15299,22 +15303,27 @@
     }
   }
 
+  @override
   Object visitBreakStatement(BreakStatement node) => null;
 
+  @override
   Object visitCommentReference(CommentReference node) => null;
 
+  @override
   Object visitContinueStatement(ContinueStatement node) => null;
 
+  @override
   Object visitExportDirective(ExportDirective node) => null;
 
+  @override
   Object visitExpression(Expression node) {
     node.visitChildren(this);
-    Type2 staticType = node.staticType;
+    DartType staticType = node.staticType;
     if (staticType == null) {
       _unresolvedExpressions.add(node);
     } else {
       _resolvedExpressionCount++;
-      Type2 propagatedType = node.propagatedType;
+      DartType propagatedType = node.propagatedType;
       if (propagatedType != null) {
         _propagatedExpressionCount++;
         if (!propagatedType.isMoreSpecificThan(staticType)) {
@@ -15325,12 +15334,16 @@
     return null;
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) => null;
 
+  @override
   Object visitLabel(Label node) => null;
 
+  @override
   Object visitLibraryIdentifier(LibraryIdentifier node) => null;
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     // In cases where we have a prefixed identifier where the prefix is dynamic, we don't want to
     // assert that the node will have a type.
@@ -15340,6 +15353,7 @@
     return super.visitPrefixedIdentifier(node);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     // In cases where identifiers are being used for something other than an expressions,
     // then they can be ignored.
@@ -15361,6 +15375,7 @@
     return super.visitSimpleIdentifier(node);
   }
 
+  @override
   Object visitTypeName(TypeName node) {
     // Note: do not visit children from this node, the child SimpleIdentifier in TypeName
     // (i.e. "String") does not have a static type defined.
@@ -15372,7 +15387,7 @@
     return null;
   }
 
-  String getFileName(AstNode node) {
+  String _getFileName(AstNode node) {
     // TODO (jwren) there are two copies of this method, one here and one in ResolutionVerifier,
     // they should be resolved into a single method
     if (node != null) {
@@ -15409,6 +15424,7 @@
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
+  @override
   void setUp() {
     super.setUp();
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -15626,7 +15642,7 @@
     JUnitTestCase.fail("Not yet tested");
     // Need to set up the exported library so that the identifier can be resolved
     ExportDirective directive = AstFactory.exportDirective2(null, [AstFactory.hideCombinator2(["A"])]);
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15639,7 +15655,7 @@
     JUnitTestCase.fail("Not yet tested");
     // Need to set up the imported library so that the identifier can be resolved
     ImportDirective directive = AstFactory.importDirective2(null, null, [AstFactory.showCombinator2(["A"])]);
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15651,7 +15667,7 @@
     ImportDirective directive = AstFactory.importDirective2(null, prefixName, [
         AstFactory.showCombinator2(["A"]),
         AstFactory.hideCombinator2(["B"])]);
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15660,10 +15676,11 @@
     _listener.assertNoErrors();
   }
 
+  @override
   void setUp() {
     _listener = new GatheringErrorListener();
     _typeProvider = new TestTypeProvider();
-    _resolver = createResolver();
+    _resolver = _createResolver();
   }
 
   void test_lookUpMethodInInterfaces() {
@@ -15695,7 +15712,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classD.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(operator, resolveIndexExpression(expression, []));
+    JUnitTestCase.assertSame(operator, _resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -15704,14 +15721,14 @@
     SimpleIdentifier leftHandSide = AstFactory.identifier3("a");
     leftHandSide.staticType = intType;
     AssignmentExpression assignment = AstFactory.assignmentExpression(leftHandSide, TokenType.PLUS_EQ, AstFactory.integer(1));
-    resolveNode(assignment, []);
+    _resolveNode(assignment, []);
     JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
     _listener.assertNoErrors();
   }
 
   void test_visitAssignmentExpression_simple() {
     AssignmentExpression expression = AstFactory.assignmentExpression(AstFactory.identifier3("x"), TokenType.EQ, AstFactory.integer(0));
-    resolveNode(expression, []);
+    _resolveNode(expression, []);
     JUnitTestCase.assertNull(expression.staticElement);
     _listener.assertNoErrors();
   }
@@ -15721,7 +15738,7 @@
     SimpleIdentifier left = AstFactory.identifier3("i");
     left.staticType = numType;
     BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
-    resolveNode(expression, []);
+    _resolveNode(expression, []);
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
@@ -15730,13 +15747,13 @@
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
     BreakStatement statement = AstFactory.breakStatement2(label);
-    JUnitTestCase.assertSame(labelElement, resolveBreak(statement, labelElement));
+    JUnitTestCase.assertSame(labelElement, _resolveBreak(statement, labelElement));
     _listener.assertNoErrors();
   }
 
   void test_visitBreakStatement_withoutLabel() {
     BreakStatement statement = AstFactory.breakStatement();
-    resolveStatement(statement, null);
+    _resolveStatement(statement, null);
     _listener.assertNoErrors();
   }
 
@@ -15746,7 +15763,7 @@
     ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    resolveNode(name, []);
+    _resolveNode(name, []);
     JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
@@ -15757,7 +15774,7 @@
     ConstructorElement constructor = ElementFactory.constructorElement2(classA, constructorName, []);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
-    resolveNode(name, []);
+    _resolveNode(name, []);
     JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
@@ -15765,21 +15782,21 @@
   void test_visitContinueStatement_withLabel() {
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
-    ContinueStatement statement = AstFactory.continueStatement2(label);
-    JUnitTestCase.assertSame(labelElement, resolveContinue(statement, labelElement));
+    ContinueStatement statement = AstFactory.continueStatement(label);
+    JUnitTestCase.assertSame(labelElement, _resolveContinue(statement, labelElement));
     _listener.assertNoErrors();
   }
 
   void test_visitContinueStatement_withoutLabel() {
     ContinueStatement statement = AstFactory.continueStatement();
-    resolveStatement(statement, null);
+    _resolveStatement(statement, null);
     _listener.assertNoErrors();
   }
 
   void test_visitExportDirective_noCombinators() {
     ExportDirective directive = AstFactory.exportDirective2(null, []);
     directive.element = ElementFactory.exportFor(ElementFactory.library(_definingLibrary.context, "lib"), []);
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15789,19 +15806,19 @@
     FieldElementImpl fieldElement = ElementFactory.fieldElement(fieldName, false, false, false, intType);
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [fieldElement];
-    FieldFormalParameter parameter = AstFactory.fieldFormalParameter3(fieldName);
+    FieldFormalParameter parameter = AstFactory.fieldFormalParameter2(fieldName);
     FieldFormalParameterElementImpl parameterElement = ElementFactory.fieldFormalParameter(parameter.identifier);
     parameterElement.field = fieldElement;
     parameterElement.type = intType;
     parameter.identifier.staticElement = parameterElement;
-    resolveInClass(parameter, classA);
+    _resolveInClass(parameter, classA);
     JUnitTestCase.assertSame(intType, parameter.element.type);
   }
 
   void test_visitImportDirective_noCombinators_noPrefix() {
     ImportDirective directive = AstFactory.importDirective2(null, null, []);
     directive.element = ElementFactory.importFor(ElementFactory.library(_definingLibrary.context, "lib"), null, []);
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15811,7 +15828,7 @@
     _definingLibrary.imports = <ImportElement> [importElement];
     ImportDirective directive = AstFactory.importDirective2(null, prefixName, []);
     directive.element = importElement;
-    resolveNode(directive, []);
+    _resolveNode(directive, []);
     _listener.assertNoErrors();
   }
 
@@ -15823,7 +15840,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(getter, resolveIndexExpression(expression, []));
+    JUnitTestCase.assertSame(getter, _resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -15836,7 +15853,7 @@
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(setter, resolveIndexExpression(expression, []));
+    JUnitTestCase.assertSame(setter, _resolveIndexExpression(expression, []));
     _listener.assertNoErrors();
   }
 
@@ -15848,7 +15865,7 @@
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
-    resolveNode(creation, []);
+    _resolveNode(creation, []);
     JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
@@ -15861,7 +15878,7 @@
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
-    resolveNode(creation, []);
+    _resolveNode(creation, []);
     JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
@@ -15877,7 +15894,7 @@
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    resolveNode(creation, []);
+    _resolveNode(creation, []);
     JUnitTestCase.assertSame(constructor, creation.staticElement);
     JUnitTestCase.assertSame(parameter, (creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
@@ -15889,7 +15906,7 @@
     left.staticType = numType;
     String methodName = "abs";
     MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, []);
-    resolveNode(invocation, []);
+    _resolveNode(invocation, []);
     JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
     _listener.assertNoErrors();
   }
@@ -15905,7 +15922,7 @@
     SimpleIdentifier left = AstFactory.identifier3("i");
     left.staticType = classA.type;
     MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    resolveNode(invocation, []);
+    _resolveNode(invocation, []);
     JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
     JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
@@ -15916,20 +15933,20 @@
     SimpleIdentifier operand = AstFactory.identifier3("i");
     operand.staticType = numType;
     PostfixExpression expression = AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
-    resolveNode(expression, []);
+    _resolveNode(expression, []);
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixedIdentifier_dynamic() {
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     SimpleIdentifier target = AstFactory.identifier3("a");
     VariableElementImpl variable = ElementFactory.localVariableElement(target);
     variable.type = dynamicType;
     target.staticElement = variable;
     target.staticType = dynamicType;
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3("b"));
-    resolveNode(identifier, []);
+    _resolveNode(identifier, []);
     JUnitTestCase.assertNull(identifier.staticElement);
     JUnitTestCase.assertNull(identifier.identifier.staticElement);
     _listener.assertNoErrors();
@@ -15946,7 +15963,7 @@
     target.staticElement = variable;
     target.staticType = classA.type;
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(getterName));
-    resolveNode(identifier, []);
+    _resolveNode(identifier, []);
     JUnitTestCase.assertSame(getter, identifier.staticElement);
     JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
     _listener.assertNoErrors();
@@ -15965,7 +15982,7 @@
     target.staticType = classA.type;
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
     // resolve
-    resolveNode(identifier, []);
+    _resolveNode(identifier, []);
     JUnitTestCase.assertSame(getter, identifier.staticElement);
     JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
     _listener.assertNoErrors();
@@ -15987,7 +16004,7 @@
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
     AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
-    resolveNode(identifier, []);
+    _resolveNode(identifier, []);
     JUnitTestCase.assertSame(method, identifier.staticElement);
     JUnitTestCase.assertSame(method, identifier.identifier.staticElement);
     _listener.assertNoErrors();
@@ -16007,7 +16024,7 @@
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
     AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
-    resolveNode(identifier, []);
+    _resolveNode(identifier, []);
     JUnitTestCase.assertSame(setter, identifier.staticElement);
     JUnitTestCase.assertSame(setter, identifier.identifier.staticElement);
     _listener.assertNoErrors();
@@ -16018,7 +16035,7 @@
     SimpleIdentifier operand = AstFactory.identifier3("i");
     operand.staticType = numType;
     PrefixExpression expression = AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
-    resolveNode(expression, []);
+    _resolveNode(expression, []);
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
@@ -16031,7 +16048,7 @@
     SimpleIdentifier target = AstFactory.identifier3("a");
     target.staticType = classA.type;
     PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
-    resolveNode(access, []);
+    _resolveNode(access, []);
     JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
@@ -16053,7 +16070,7 @@
     target.staticType = ElementFactory.classElement("B", classA.type, []).type;
     PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
     AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.expressionFunctionBody(access));
-    resolveNode(access, []);
+    _resolveNode(access, []);
     JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
@@ -16067,7 +16084,7 @@
     target.staticType = classA.type;
     PropertyAccess access = AstFactory.propertyAccess2(target, setterName);
     AstFactory.assignmentExpression(access, TokenType.EQ, AstFactory.integer(0));
-    resolveNode(access, []);
+    _resolveNode(access, []);
     JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
@@ -16076,14 +16093,14 @@
     InterfaceType doubleType = _typeProvider.doubleType;
     String fieldName = "NAN";
     SimpleIdentifier node = AstFactory.identifier3(fieldName);
-    resolveInClass(node, doubleType.element);
+    _resolveInClass(node, doubleType.element);
     JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
     _listener.assertNoErrors();
   }
 
   void test_visitSimpleIdentifier_dynamic() {
     SimpleIdentifier node = AstFactory.identifier3("dynamic");
-    resolveIdentifier(node, []);
+    _resolveIdentifier(node, []);
     JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
     JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
     _listener.assertNoErrors();
@@ -16092,7 +16109,7 @@
   void test_visitSimpleIdentifier_lexicalScope() {
     SimpleIdentifier node = AstFactory.identifier3("i");
     VariableElementImpl element = ElementFactory.localVariableElement(node);
-    JUnitTestCase.assertSame(element, resolveIdentifier(node, [element]));
+    JUnitTestCase.assertSame(element, _resolveIdentifier(node, [element]));
     _listener.assertNoErrors();
   }
 
@@ -16105,7 +16122,7 @@
     classA.accessors = <PropertyAccessorElement> [field.getter, field.setter];
     SimpleIdentifier node = AstFactory.identifier3(fieldName);
     AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
-    resolveInClass(node, classA);
+    _resolveInClass(node, classA);
     Element element = node.staticElement;
     EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, element);
     JUnitTestCase.assertTrue((element as PropertyAccessorElement).isSetter);
@@ -16120,7 +16137,7 @@
     ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([]);
-    resolveInClass(invocation, subclass);
+    _resolveInClass(invocation, subclass);
     JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
     _listener.assertNoErrors();
   }
@@ -16136,7 +16153,7 @@
     ConstructorElementImpl subConstructor = ElementFactory.constructorElement2(subclass, null, []);
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
-    resolveInClass(invocation, subclass);
+    _resolveInClass(invocation, subclass);
     JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
     JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
     _listener.assertNoErrors();
@@ -16147,7 +16164,7 @@
    *
    * @return the resolver that was created
    */
-  ElementResolver createResolver() {
+  ElementResolver _createResolver() {
     AnalysisContextImpl context = new AnalysisContextImpl();
     SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
     context.sourceFactory = sourceFactory;
@@ -16174,8 +16191,8 @@
    * @param labelElement the label element to be defined in the statement's label scope
    * @return the element to which the statement's label was resolved
    */
-  Element resolveBreak(BreakStatement statement, LabelElementImpl labelElement) {
-    resolveStatement(statement, labelElement);
+  Element _resolveBreak(BreakStatement statement, LabelElementImpl labelElement) {
+    _resolveStatement(statement, labelElement);
     return statement.label.staticElement;
   }
 
@@ -16187,8 +16204,8 @@
    * @param labelElement the label element to be defined in the statement's label scope
    * @return the element to which the statement's label was resolved
    */
-  Element resolveContinue(ContinueStatement statement, LabelElementImpl labelElement) {
-    resolveStatement(statement, labelElement);
+  Element _resolveContinue(ContinueStatement statement, LabelElementImpl labelElement) {
+    _resolveStatement(statement, labelElement);
     return statement.label.staticElement;
   }
 
@@ -16201,8 +16218,8 @@
    *          being resolved
    * @return the element to which the expression was resolved
    */
-  Element resolveIdentifier(Identifier node, List<Element> definedElements) {
-    resolveNode(node, definedElements);
+  Element _resolveIdentifier(Identifier node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
     return node.staticElement;
   }
 
@@ -16214,7 +16231,7 @@
    * @param enclosingClass the element representing the class enclosing the identifier
    * @return the element to which the expression was resolved
    */
-  void resolveInClass(AstNode node, ClassElement enclosingClass) {
+  void _resolveInClass(AstNode node, ClassElement enclosingClass) {
     try {
       Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
       try {
@@ -16240,8 +16257,8 @@
    *          being resolved
    * @return the element to which the expression was resolved
    */
-  Element resolveIndexExpression(IndexExpression node, List<Element> definedElements) {
-    resolveNode(node, definedElements);
+  Element _resolveIndexExpression(IndexExpression node, List<Element> definedElements) {
+    _resolveNode(node, definedElements);
     return node.staticElement;
   }
 
@@ -16254,7 +16271,7 @@
    *          being resolved
    * @return the element to which the expression was resolved
    */
-  void resolveNode(AstNode node, List<Element> definedElements) {
+  void _resolveNode(AstNode node, List<Element> definedElements) {
     try {
       Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
       try {
@@ -16280,7 +16297,7 @@
    * @param labelElement the label element to be defined in the statement's label scope
    * @return the element to which the statement's label was resolved
    */
-  void resolveStatement(Statement statement, LabelElementImpl labelElement) {
+  void _resolveStatement(Statement statement, LabelElementImpl labelElement) {
     try {
       LabelScope outerScope = _visitor.labelScope_J2DAccessor as LabelScope;
       try {
@@ -19954,7 +19971,7 @@
   /**
    * The type representing the type 'bottom'.
    */
-  Type2 _bottomType;
+  DartType _bottomType;
 
   /**
    * The type representing the built-in type 'double'.
@@ -19969,7 +19986,7 @@
   /**
    * The type representing the built-in type 'dynamic'.
    */
-  Type2 _dynamicType;
+  DartType _dynamicType;
 
   /**
    * The type representing the built-in type 'Function'.
@@ -20036,6 +20053,7 @@
    */
   InterfaceType _typeType;
 
+  @override
   InterfaceType get boolType {
     if (_boolType == null) {
       _boolType = ElementFactory.classElement2("bool", []).type;
@@ -20043,13 +20061,15 @@
     return _boolType;
   }
 
-  Type2 get bottomType {
+  @override
+  DartType get bottomType {
     if (_bottomType == null) {
       _bottomType = BottomTypeImpl.instance;
     }
     return _bottomType;
   }
 
+  @override
   InterfaceType get deprecatedType {
     if (_deprecatedType == null) {
       ClassElementImpl deprecatedElement = ElementFactory.classElement2("Deprecated", []);
@@ -20059,20 +20079,23 @@
     return _deprecatedType;
   }
 
+  @override
   InterfaceType get doubleType {
     if (_doubleType == null) {
-      initializeNumericTypes();
+      _initializeNumericTypes();
     }
     return _doubleType;
   }
 
-  Type2 get dynamicType {
+  @override
+  DartType get dynamicType {
     if (_dynamicType == null) {
       _dynamicType = DynamicTypeImpl.instance;
     }
     return _dynamicType;
   }
 
+  @override
   InterfaceType get functionType {
     if (_functionType == null) {
       _functionType = ElementFactory.classElement2("Function", []).type;
@@ -20080,9 +20103,10 @@
     return _functionType;
   }
 
+  @override
   InterfaceType get intType {
     if (_intType == null) {
-      initializeNumericTypes();
+      _initializeNumericTypes();
     }
     return _intType;
   }
@@ -20091,11 +20115,11 @@
     if (_iterableType == null) {
       ClassElementImpl iterableElement = ElementFactory.classElement2("Iterable", ["E"]);
       _iterableType = iterableElement.type;
-      Type2 eType = iterableElement.typeParameters[0].type;
+      DartType eType = iterableElement.typeParameters[0].type;
       iterableElement.accessors = <PropertyAccessorElement> [
-          ElementFactory.getterElement("iterator", false, iteratorType.substitute4(<Type2> [eType])),
+          ElementFactory.getterElement("iterator", false, iteratorType.substitute4(<DartType> [eType])),
           ElementFactory.getterElement("last", false, eType)];
-      propagateTypeArguments(iterableElement);
+      _propagateTypeArguments(iterableElement);
     }
     return _iterableType;
   }
@@ -20104,46 +20128,49 @@
     if (_iteratorType == null) {
       ClassElementImpl iteratorElement = ElementFactory.classElement2("Iterator", ["E"]);
       _iteratorType = iteratorElement.type;
-      Type2 eType = iteratorElement.typeParameters[0].type;
+      DartType eType = iteratorElement.typeParameters[0].type;
       iteratorElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("current", false, eType)];
-      propagateTypeArguments(iteratorElement);
+      _propagateTypeArguments(iteratorElement);
     }
     return _iteratorType;
   }
 
+  @override
   InterfaceType get listType {
     if (_listType == null) {
       ClassElementImpl listElement = ElementFactory.classElement2("List", ["E"]);
       listElement.constructors = <ConstructorElement> [ElementFactory.constructorElement2(listElement, null, [])];
       _listType = listElement.type;
-      Type2 eType = listElement.typeParameters[0].type;
-      InterfaceType iterableType = this.iterableType.substitute4(<Type2> [eType]);
+      DartType eType = listElement.typeParameters[0].type;
+      InterfaceType iterableType = this.iterableType.substitute4(<DartType> [eType]);
       listElement.interfaces = <InterfaceType> [iterableType];
       listElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
       listElement.methods = <MethodElement> [
           ElementFactory.methodElement("[]", eType, [intType]),
           ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [intType, eType]),
           ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])];
-      propagateTypeArguments(listElement);
+      _propagateTypeArguments(listElement);
     }
     return _listType;
   }
 
+  @override
   InterfaceType get mapType {
     if (_mapType == null) {
       ClassElementImpl mapElement = ElementFactory.classElement2("Map", ["K", "V"]);
       _mapType = mapElement.type;
-      Type2 kType = mapElement.typeParameters[0].type;
-      Type2 vType = mapElement.typeParameters[1].type;
+      DartType kType = mapElement.typeParameters[0].type;
+      DartType vType = mapElement.typeParameters[1].type;
       mapElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("length", false, intType)];
       mapElement.methods = <MethodElement> [
           ElementFactory.methodElement("[]", vType, [objectType]),
           ElementFactory.methodElement("[]=", VoidTypeImpl.instance, [kType, vType])];
-      propagateTypeArguments(mapElement);
+      _propagateTypeArguments(mapElement);
     }
     return _mapType;
   }
 
+  @override
   InterfaceType get nullType {
     if (_nullType == null) {
       _nullType = ElementFactory.classElement2("Null", []).type;
@@ -20151,13 +20178,15 @@
     return _nullType;
   }
 
+  @override
   InterfaceType get numType {
     if (_numType == null) {
-      initializeNumericTypes();
+      _initializeNumericTypes();
     }
     return _numType;
   }
 
+  @override
   InterfaceType get objectType {
     if (_objectType == null) {
       ClassElementImpl objectElement = ElementFactory.object;
@@ -20174,6 +20203,7 @@
     return _objectType;
   }
 
+  @override
   InterfaceType get stackTraceType {
     if (_stackTraceType == null) {
       _stackTraceType = ElementFactory.classElement2("StackTrace", []).type;
@@ -20181,6 +20211,7 @@
     return _stackTraceType;
   }
 
+  @override
   InterfaceType get stringType {
     if (_stringType == null) {
       _stringType = ElementFactory.classElement2("String", []).type;
@@ -20188,7 +20219,7 @@
       stringElement.accessors = <PropertyAccessorElement> [
           ElementFactory.getterElement("isEmpty", false, boolType),
           ElementFactory.getterElement("length", false, intType),
-          ElementFactory.getterElement("codeUnits", false, listType.substitute4(<Type2> [intType]))];
+          ElementFactory.getterElement("codeUnits", false, listType.substitute4(<DartType> [intType]))];
       stringElement.methods = <MethodElement> [
           ElementFactory.methodElement("+", _stringType, [_stringType]),
           ElementFactory.methodElement("toLowerCase", _stringType, []),
@@ -20197,6 +20228,7 @@
     return _stringType;
   }
 
+  @override
   InterfaceType get symbolType {
     if (_symbolType == null) {
       _symbolType = ElementFactory.classElement2("Symbol", []).type;
@@ -20204,6 +20236,7 @@
     return _symbolType;
   }
 
+  @override
   InterfaceType get typeType {
     if (_typeType == null) {
       _typeType = ElementFactory.classElement2("Type", []).type;
@@ -20215,7 +20248,7 @@
    * Initialize the numeric types. They are created as a group so that we can (a) create the right
    * hierarchy and (b) add members to them.
    */
-  void initializeNumericTypes() {
+  void _initializeNumericTypes() {
     //
     // Create the type hierarchy.
     //
@@ -20310,8 +20343,8 @@
    *
    * @param classElement the element representing the class with type parameters
    */
-  void propagateTypeArguments(ClassElementImpl classElement) {
-    List<Type2> typeArguments = TypeParameterTypeImpl.getTypes(classElement.typeParameters);
+  void _propagateTypeArguments(ClassElementImpl classElement) {
+    List<DartType> typeArguments = TypeParameterTypeImpl.getTypes(classElement.typeParameters);
     for (PropertyAccessorElement accessor in classElement.accessors) {
       FunctionTypeImpl functionType = accessor.type as FunctionTypeImpl;
       functionType.typeArguments = typeArguments;
@@ -20393,7 +20426,7 @@
     InterfaceType elementType = elementElement.type;
     ClassElementImpl documentElement = ElementFactory.classElement("Document", elementType, []);
     ClassElementImpl htmlDocumentElement = ElementFactory.classElement("HtmlDocument", documentElement.type, []);
-    htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <Type2> [provider.stringType])];
+    htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <DartType> [provider.stringType])];
     htmlUnit.types = <ClassElement> [
         ElementFactory.classElement("AnchorElement", elementType, []),
         ElementFactory.classElement("BodyElement", elementType, []),
@@ -20599,7 +20632,7 @@
 
 class IncrementalResolverTest extends ResolverTestCase {
   void test_resolve() {
-    MethodDeclaration method = resolveMethod(EngineTestCase.createSource([
+    MethodDeclaration method = _resolveMethod(EngineTestCase.createSource([
         "class C {",
         "  int m(int a) {",
         "    return a + a;",
@@ -20616,7 +20649,7 @@
     JUnitTestCase.assertSame(leftElement, rightElement);
   }
 
-  MethodDeclaration resolveMethod(String content) {
+  MethodDeclaration _resolveMethod(String content) {
     Source source = addSource(content);
     LibraryElement library = resolve(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -20689,39 +20722,58 @@
         writer.print("Failed to resolve ");
         writer.print(_unresolvedNodes.length);
         writer.println(" nodes:");
-        printNodes(writer, _unresolvedNodes);
+        _printNodes(writer, _unresolvedNodes);
       }
       if (!_wrongTypedNodes.isEmpty) {
         writer.print("Resolved ");
         writer.print(_wrongTypedNodes.length);
         writer.println(" to the wrong type of element:");
-        printNodes(writer, _wrongTypedNodes);
+        _printNodes(writer, _wrongTypedNodes);
       }
       JUnitTestCase.fail(writer.toString());
     }
   }
 
+  @override
+  Object visitAnnotation(Annotation node) {
+    node.visitChildren(this);
+    ElementAnnotation elementAnnotation = node.elementAnnotation;
+    if (elementAnnotation == null) {
+      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+        _unresolvedNodes.add(node);
+      }
+    } else if (elementAnnotation is! ElementAnnotation) {
+      _wrongTypedNodes.add(node);
+    }
+    return null;
+  }
+
+  @override
   Object visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
       return null;
     }
-    Type2 operandType = node.leftOperand.staticType;
+    DartType operandType = node.leftOperand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.staticElement, (node) => node is MethodElement);
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
+  @override
   Object visitCommentReference(CommentReference node) => null;
 
+  @override
   Object visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
-    return checkResolved(node, node.element, (node) => node is CompilationUnitElement);
+    return _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
   }
 
-  Object visitExportDirective(ExportDirective node) => checkResolved(node, node.element, (node) => node is ExportElement);
+  @override
+  Object visitExportDirective(ExportDirective node) => _checkResolved(node, node.element, (node) => node is ExportElement);
 
+  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     if (node.element is LibraryElement) {
@@ -20730,6 +20782,7 @@
     return null;
   }
 
+  @override
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     // TODO(brianwilkerson) If we start resolving function expressions, then conditionally check to
@@ -20737,77 +20790,88 @@
     return null;
   }
 
+  @override
   Object visitImportDirective(ImportDirective node) {
     // Not sure how to test the combinators given that it isn't an error if the names are not defined.
-    checkResolved(node, node.element, (node) => node is ImportElement);
+    _checkResolved(node, node.element, (node) => node is ImportElement);
     SimpleIdentifier prefix = node.prefix;
     if (prefix == null) {
       return null;
     }
-    return checkResolved(prefix, prefix.staticElement, (node) => node is PrefixElement);
+    return _checkResolved(prefix, prefix.staticElement, (node) => node is PrefixElement);
   }
 
+  @override
   Object visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
-    Type2 targetType = node.realTarget.staticType;
+    DartType targetType = node.realTarget.staticType;
     if (targetType == null || targetType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.staticElement, (node) => node is MethodElement);
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
-  Object visitLibraryDirective(LibraryDirective node) => checkResolved(node, node.element, (node) => node is LibraryElement);
+  @override
+  Object visitLibraryDirective(LibraryDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
 
+  @override
   Object visitNamedExpression(NamedExpression node) => node.expression.accept(this);
 
-  Object visitPartDirective(PartDirective node) => checkResolved(node, node.element, (node) => node is CompilationUnitElement);
+  @override
+  Object visitPartDirective(PartDirective node) => _checkResolved(node, node.element, (node) => node is CompilationUnitElement);
 
-  Object visitPartOfDirective(PartOfDirective node) => checkResolved(node, node.element, (node) => node is LibraryElement);
+  @override
+  Object visitPartOfDirective(PartOfDirective node) => _checkResolved(node, node.element, (node) => node is LibraryElement);
 
+  @override
   Object visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
       return null;
     }
-    Type2 operandType = node.operand.staticType;
+    DartType operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.staticElement, (node) => node is MethodElement);
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
+  @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     prefix.accept(this);
-    Type2 prefixType = prefix.staticType;
+    DartType prefixType = prefix.staticType;
     if (prefixType == null || prefixType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.staticElement, null);
+    return _checkResolved(node, node.staticElement, null);
   }
 
+  @override
   Object visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
       return null;
     }
-    Type2 operandType = node.operand.staticType;
+    DartType operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.staticElement, (node) => node is MethodElement);
+    return _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
+  @override
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     target.accept(this);
-    Type2 targetType = target.staticType;
+    DartType targetType = target.staticType;
     if (targetType == null || targetType.isDynamic) {
       return null;
     }
     return node.propertyName.accept(this);
   }
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.name == "void") {
       return null;
@@ -20817,16 +20881,16 @@
       MethodInvocation invocation = parent;
       if (identical(invocation.methodName, node)) {
         Expression target = invocation.realTarget;
-        Type2 targetType = target == null ? null : target.staticType;
+        DartType targetType = target == null ? null : target.staticType;
         if (targetType == null || targetType.isDynamic) {
           return null;
         }
       }
     }
-    return checkResolved(node, node.staticElement, null);
+    return _checkResolved(node, node.staticElement, null);
   }
 
-  Object checkResolved(AstNode node, Element element, Predicate<Element> predicate) {
+  Object _checkResolved(AstNode node, Element element, Predicate<Element> predicate) {
     if (element == null) {
       if (_knownExceptions == null || !_knownExceptions.contains(node)) {
         _unresolvedNodes.add(node);
@@ -20839,7 +20903,7 @@
     return null;
   }
 
-  String getFileName(AstNode node) {
+  String _getFileName(AstNode node) {
     // TODO (jwren) there are two copies of this method, one here and one in StaticTypeVerifier,
     // they should be resolved into a single method
     if (node != null) {
@@ -20858,12 +20922,12 @@
     return "<unknown file- ASTNode is null>";
   }
 
-  void printNodes(PrintStringWriter writer, List<AstNode> nodes) {
+  void _printNodes(PrintStringWriter writer, List<AstNode> nodes) {
     for (AstNode identifier in nodes) {
       writer.print("  ");
       writer.print(identifier.toString());
       writer.print(" (");
-      writer.print(getFileName(identifier));
+      writer.print(_getFileName(identifier));
       writer.print(" : ");
       writer.print(identifier.offset);
       writer.println(")");
@@ -20877,6 +20941,7 @@
    */
   InterfaceType _nullType;
 
+  @override
   void setUp() {
     _nullType = new TestTypeProvider().nullType;
   }
@@ -21017,23 +21082,24 @@
     _listener.assertNoErrors();
   }
 
+  @override
   void setUp() {
     _listener = new GatheringErrorListener();
     _typeProvider = new TestTypeProvider();
-    _analyzer = createAnalyzer();
+    _analyzer = _createAnalyzer();
   }
 
   void test_visitAdjacentStrings() {
     // "a" "b"
-    Expression node = AstFactory.adjacentStrings([resolvedString("a"), resolvedString("b")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
+    Expression node = AstFactory.adjacentStrings([_resolvedString("a"), _resolvedString("b")]);
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitArgumentDefinitionTest() {
     // ?p
     Expression node = AstFactory.argumentDefinitionTest("p");
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21044,78 +21110,78 @@
     InterfaceType superclassType = superclass.type;
     ClassElement subclass = ElementFactory.classElement("B", superclassType, []);
     Expression node = AstFactory.asExpression(AstFactory.thisExpression(), AstFactory.typeName(subclass, []));
-    JUnitTestCase.assertSame(subclass.type, analyze3(node, superclassType));
+    JUnitTestCase.assertSame(subclass.type, _analyze3(node, superclassType));
     _listener.assertNoErrors();
   }
 
   void test_visitAssignmentExpression_compound() {
     // i += 1
     InterfaceType numType = _typeProvider.numType;
-    SimpleIdentifier identifier = resolvedVariable(_typeProvider.intType, "i");
-    AssignmentExpression node = AstFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, resolvedInteger(1));
+    SimpleIdentifier identifier = _resolvedVariable(_typeProvider.intType, "i");
+    AssignmentExpression node = AstFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
     MethodElement plusMethod = getMethod(numType, "+");
     node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(numType, analyze(node));
+    JUnitTestCase.assertSame(numType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitAssignmentExpression_simple() {
     // i = 0
     InterfaceType intType = _typeProvider.intType;
-    Expression node = AstFactory.assignmentExpression(resolvedVariable(intType, "i"), TokenType.EQ, resolvedInteger(0));
-    JUnitTestCase.assertSame(intType, analyze(node));
+    Expression node = AstFactory.assignmentExpression(_resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0));
+    JUnitTestCase.assertSame(intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_equals() {
     // 2 == 3
-    Expression node = AstFactory.binaryExpression(resolvedInteger(2), TokenType.EQ_EQ, resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_logicalAnd() {
     // false && true
     Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.AMPERSAND_AMPERSAND, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_logicalOr() {
     // false || true
     Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.BAR_BAR, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_notEquals() {
     // 2 != 3
-    Expression node = AstFactory.binaryExpression(resolvedInteger(2), TokenType.BANG_EQ, resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_plusID() {
     // 1 + 2.0
-    BinaryExpression node = AstFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_plusII() {
     // 1 + 2
-    BinaryExpression node = AstFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedInteger(2));
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_slash() {
     // 2 / 2
-    BinaryExpression node = AstFactory.binaryExpression(resolvedInteger(2), TokenType.SLASH, resolvedInteger(2));
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "/");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21128,207 +21194,207 @@
     InterfaceType typeA = classA.type;
     MethodElement operator = ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
     classA.methods = <MethodElement> [operator];
-    BinaryExpression node = AstFactory.binaryExpression(AstFactory.asExpression(AstFactory.identifier3("a"), AstFactory.typeName(classA, [])), TokenType.PLUS, resolvedDouble(2.0));
+    BinaryExpression node = AstFactory.binaryExpression(AstFactory.asExpression(AstFactory.identifier3("a"), AstFactory.typeName(classA, [])), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = operator;
-    JUnitTestCase.assertSame(typeA, analyze(node));
+    JUnitTestCase.assertSame(typeA, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_starID() {
     // 1 * 2.0
-    BinaryExpression node = AstFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
+    BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "*");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBooleanLiteral_false() {
     // false
     Expression node = AstFactory.booleanLiteral(false);
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitBooleanLiteral_true() {
     // true
     Expression node = AstFactory.booleanLiteral(true);
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitCascadeExpression() {
     // a..length
-    Expression node = AstFactory.cascadeExpression(resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
+    Expression node = AstFactory.cascadeExpression(_resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitConditionalExpression_differentTypes() {
     // true ? 1.0 : 0
-    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), resolvedDouble(1.0), resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
+    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedDouble(1.0), _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitConditionalExpression_sameTypes() {
     // true ? 1 : 0
-    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), resolvedInteger(1), resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedInteger(1), _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitDoubleLiteral() {
     // 4.33
     Expression node = AstFactory.doubleLiteral(4.33);
-    JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_named_block() {
     // ({p1 : 0, p2 : 0}) {}
-    Type2 dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p1"), resolvedInteger(0));
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    analyze5(p1);
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    Map<String, Type2> expectedNamedTypes = new Map<String, Type2>();
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p1"] = dynamicType;
     expectedNamedTypes["p2"] = dynamicType;
-    assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
+    _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_named_expression() {
     // ({p : 0}) -> 0;
-    Type2 dynamicType = _typeProvider.dynamicType;
-    FormalParameter p = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), resolvedInteger(0));
-    setType(p, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(resolvedInteger(0)));
-    analyze5(p);
-    Type2 resultType = analyze(node);
-    Map<String, Type2> expectedNamedTypes = new Map<String, Type2>();
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p"] = dynamicType;
-    assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
+    _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normal_block() {
     // (p1, p2) {}
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    setType(p1, dynamicType);
+    _setType(p1, dynamicType);
     FormalParameter p2 = AstFactory.simpleFormalParameter3("p2");
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    analyze5(p1);
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    assertFunctionType(dynamicType, <Type2> [dynamicType, dynamicType], null, null, resultType);
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType> [dynamicType, dynamicType], null, null, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normal_expression() {
     // (p1, p2) -> 0
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p = AstFactory.simpleFormalParameter3("p");
-    setType(p, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(resolvedInteger(0)));
-    analyze5(p);
-    Type2 resultType = analyze(node);
-    assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], null, null, resultType);
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, null, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normalAndNamed_block() {
     // (p1, {p2 : 0}) {}
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    Map<String, Type2> expectedNamedTypes = new Map<String, Type2>();
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
-    assertFunctionType(dynamicType, <Type2> [dynamicType], null, expectedNamedTypes, resultType);
+    _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normalAndNamed_expression() {
     // (p1, {p2 : 0}) -> 0
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(resolvedInteger(0)));
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    Map<String, Type2> expectedNamedTypes = new Map<String, Type2>();
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
-    assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], null, expectedNamedTypes, resultType);
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normalAndPositional_block() {
     // (p1, [p2 = 0]) {}
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    analyze5(p1);
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    assertFunctionType(dynamicType, <Type2> [dynamicType], <Type2> [dynamicType], null, resultType);
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_normalAndPositional_expression() {
     // (p1, [p2 = 0]) -> 0
-    Type2 dynamicType = _typeProvider.dynamicType;
+    DartType dynamicType = _typeProvider.dynamicType;
     FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(resolvedInteger(0)));
-    analyze5(p1);
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    assertFunctionType(_typeProvider.intType, <Type2> [dynamicType], <Type2> [dynamicType], null, resultType);
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], <DartType> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_positional_block() {
     // ([p1 = 0, p2 = 0]) {}
-    Type2 dynamicType = _typeProvider.dynamicType;
-    FormalParameter p1 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p1"), resolvedInteger(0));
-    setType(p1, dynamicType);
-    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), resolvedInteger(0));
-    setType(p2, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
-    analyze5(p1);
-    analyze5(p2);
-    Type2 resultType = analyze(node);
-    assertFunctionType(dynamicType, null, <Type2> [dynamicType, dynamicType], null, resultType);
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, null, <DartType> [dynamicType, dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitFunctionExpression_positional_expression() {
     // ([p1 = 0, p2 = 0]) -> 0
-    Type2 dynamicType = _typeProvider.dynamicType;
-    FormalParameter p = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), resolvedInteger(0));
-    setType(p, dynamicType);
-    FunctionExpression node = resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(resolvedInteger(0)));
-    analyze5(p);
-    Type2 resultType = analyze(node);
-    assertFunctionType(_typeProvider.intType, null, <Type2> [dynamicType], null, resultType);
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.positionalFormalParameter(AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, null, <DartType> [dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
@@ -21336,11 +21402,11 @@
     // List a;
     // a[2]
     InterfaceType listType = _typeProvider.listType;
-    SimpleIdentifier identifier = resolvedVariable(listType, "a");
-    IndexExpression node = AstFactory.indexExpression(identifier, resolvedInteger(2));
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[0];
     node.staticElement = indexMethod;
-    JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
+    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21348,12 +21414,12 @@
     // List a;
     // a[2] = 0
     InterfaceType listType = _typeProvider.listType;
-    SimpleIdentifier identifier = resolvedVariable(listType, "a");
-    IndexExpression node = AstFactory.indexExpression(identifier, resolvedInteger(2));
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[1];
     node.staticElement = indexMethod;
     AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
+    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21366,14 +21432,14 @@
     MethodElement methodElement = getMethod(listType, "[]");
     // "list" has type List<int>
     SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<Type2> [intType]);
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
     // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, analyze(indexExpression));
+    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
     _listener.assertNoErrors();
   }
 
@@ -21386,7 +21452,7 @@
     MethodElement methodElement = getMethod(listType, "[]=");
     // "list" has type List<int>
     SimpleIdentifier identifier = AstFactory.identifier3("list");
-    InterfaceType listOfIntType = listType.substitute4(<Type2> [intType]);
+    InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression = AstFactory.indexExpression(identifier, AstFactory.integer(0));
@@ -21395,7 +21461,7 @@
     // list[0] should be in a setter context
     AstFactory.assignmentExpression(indexExpression, TokenType.EQ, AstFactory.integer(0));
     // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, analyze(indexExpression));
+    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
     _listener.assertNoErrors();
   }
 
@@ -21410,7 +21476,7 @@
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), [AstFactory.identifier3(constructorName)]);
     node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, analyze(node));
+    JUnitTestCase.assertSame(classElement.type, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21424,11 +21490,11 @@
     FunctionTypeImpl constructorType = new FunctionTypeImpl.con1(constructor);
     constructor.type = constructorType;
     TypeName typeName = AstFactory.typeName(elementC, [AstFactory.typeName(elementI, [])]);
-    typeName.type = elementC.type.substitute4(<Type2> [elementI.type]);
+    typeName.type = elementC.type.substitute4(<DartType> [elementI.type]);
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, typeName, []);
     node.staticElement = constructor;
-    InterfaceType interfaceType = analyze(node) as InterfaceType;
-    List<Type2> typeArgs = interfaceType.typeArguments;
+    InterfaceType interfaceType = _analyze(node) as InterfaceType;
+    List<DartType> typeArgs = interfaceType.typeArguments;
     JUnitTestCase.assertEquals(1, typeArgs.length);
     JUnitTestCase.assertEquals(elementI.type, typeArgs[0]);
     _listener.assertNoErrors();
@@ -21444,121 +21510,121 @@
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), []);
     node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, analyze(node));
+    JUnitTestCase.assertSame(classElement.type, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitIntegerLiteral() {
     // 42
-    Expression node = resolvedInteger(42);
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    Expression node = _resolvedInteger(42);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitIsExpression_negated() {
     // a is! String
-    Expression node = AstFactory.isExpression(resolvedString("a"), true, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    Expression node = AstFactory.isExpression(_resolvedString("a"), true, AstFactory.typeName4("String", []));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitIsExpression_notNegated() {
     // a is String
-    Expression node = AstFactory.isExpression(resolvedString("a"), false, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    Expression node = AstFactory.isExpression(_resolvedString("a"), false, AstFactory.typeName4("String", []));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitListLiteral_empty() {
     // []
     Expression node = AstFactory.listLiteral([]);
-    Type2 resultType = analyze(node);
-    assertType2(_typeProvider.listType.substitute4(<Type2> [_typeProvider.dynamicType]), resultType);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitListLiteral_nonEmpty() {
     // [0]
-    Expression node = AstFactory.listLiteral([resolvedInteger(0)]);
-    Type2 resultType = analyze(node);
-    assertType2(_typeProvider.listType.substitute4(<Type2> [_typeProvider.dynamicType]), resultType);
+    Expression node = AstFactory.listLiteral([_resolvedInteger(0)]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.listType.substitute4(<DartType> [_typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitMapLiteral_empty() {
     // {}
     Expression node = AstFactory.mapLiteral2([]);
-    Type2 resultType = analyze(node);
-    assertType2(_typeProvider.mapType.substitute4(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitMapLiteral_nonEmpty() {
     // {"k" : 0}
-    Expression node = AstFactory.mapLiteral2([AstFactory.mapLiteralEntry("k", resolvedInteger(0))]);
-    Type2 resultType = analyze(node);
-    assertType2(_typeProvider.mapType.substitute4(<Type2> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
+    Expression node = AstFactory.mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
+    DartType resultType = _analyze(node);
+    _assertType2(_typeProvider.mapType.substitute4(<DartType> [_typeProvider.dynamicType, _typeProvider.dynamicType]), resultType);
     _listener.assertNoErrors();
   }
 
   void test_visitMethodInvocation_then() {
     // then()
     Expression node = AstFactory.methodInvocation(null, "then", []);
-    analyze(node);
+    _analyze(node);
     _listener.assertNoErrors();
   }
 
   void test_visitNamedExpression() {
     // n: a
-    Expression node = AstFactory.namedExpression2("n", resolvedString("a"));
-    JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
+    Expression node = AstFactory.namedExpression2("n", _resolvedString("a"));
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitNullLiteral() {
     // null
     Expression node = AstFactory.nullLiteral();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitParenthesizedExpression() {
     // (0)
-    Expression node = AstFactory.parenthesizedExpression(resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPostfixExpression_minusMinus() {
     // 0--
-    PostfixExpression node = AstFactory.postfixExpression(resolvedInteger(0), TokenType.MINUS_MINUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.MINUS_MINUS);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPostfixExpression_plusPlus() {
     // 0++
-    PostfixExpression node = AstFactory.postfixExpression(resolvedInteger(0), TokenType.PLUS_PLUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixedIdentifier_getter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, analyze(node));
+    JUnitTestCase.assertSame(boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixedIdentifier_setter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, analyze(node));
+    JUnitTestCase.assertSame(boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21567,102 +21633,102 @@
     variable.type = _typeProvider.boolType;
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = variable;
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_bang() {
     // !0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.BANG, resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_minus() {
     // -0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS, resolvedInteger(0));
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_minusMinus() {
     // --0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS_MINUS, resolvedInteger(0));
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_not() {
     // !true
     Expression node = AstFactory.prefixExpression(TokenType.BANG, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_plusPlus() {
     // ++0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.PLUS_PLUS, resolvedInteger(0));
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
     MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
     node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_tilde() {
     // ~0
-    PrefixExpression node = AstFactory.prefixExpression(TokenType.TILDE, resolvedInteger(0));
+    PrefixExpression node = AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
     MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
     node.staticElement = tildeMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPropertyAccess_propagated_getter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = getter;
-    JUnitTestCase.assertSame(boolType, analyze2(node, false));
+    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
     _listener.assertNoErrors();
   }
 
   void test_visitPropertyAccess_propagated_setter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = setter;
-    JUnitTestCase.assertSame(boolType, analyze2(node, false));
+    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
     _listener.assertNoErrors();
   }
 
   void test_visitPropertyAccess_static_getter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, analyze(node));
+    JUnitTestCase.assertSame(boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitPropertyAccess_static_setter() {
-    Type2 boolType = _typeProvider.boolType;
+    DartType boolType = _typeProvider.boolType;
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, analyze(node));
+    JUnitTestCase.assertSame(boolType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitSimpleStringLiteral() {
     // "a"
-    Expression node = resolvedString("a");
-    JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
+    Expression node = _resolvedString("a");
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21670,9 +21736,9 @@
     // "a${'b'}c"
     Expression node = AstFactory.string([
         AstFactory.interpolationString("a", "a"),
-        AstFactory.interpolationExpression(resolvedString("b")),
+        AstFactory.interpolationExpression(_resolvedString("b")),
         AstFactory.interpolationString("c", "c")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21681,33 +21747,33 @@
     InterfaceType superType = ElementFactory.classElement2("A", []).type;
     InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
     Expression node = AstFactory.superExpression();
-    JUnitTestCase.assertSame(thisType, analyze3(node, thisType));
+    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
     _listener.assertNoErrors();
   }
 
   void test_visitSymbolLiteral() {
-    JUnitTestCase.assertSame(_typeProvider.symbolType, analyze(AstFactory.symbolLiteral(["a"])));
+    JUnitTestCase.assertSame(_typeProvider.symbolType, _analyze(AstFactory.symbolLiteral(["a"])));
   }
 
   void test_visitThisExpression() {
     // this
     InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
     Expression node = AstFactory.thisExpression();
-    JUnitTestCase.assertSame(thisType, analyze3(node, thisType));
+    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
     _listener.assertNoErrors();
   }
 
   void test_visitThrowExpression_withoutValue() {
     // throw
     Expression node = AstFactory.throwExpression();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
     _listener.assertNoErrors();
   }
 
   void test_visitThrowExpression_withValue() {
     // throw 0
-    Expression node = AstFactory.throwExpression2(resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.bottomType, analyze(node));
+    Expression node = AstFactory.throwExpression2(_resolvedInteger(0));
+    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
     _listener.assertNoErrors();
   }
 
@@ -21718,7 +21784,7 @@
    * @param node the expression with which the type is associated
    * @return the type associated with the expression
    */
-  Type2 analyze(Expression node) => analyze4(node, null, true);
+  DartType _analyze(Expression node) => _analyze4(node, null, true);
 
   /**
    * Return the type associated with the given expression after the static or propagated type
@@ -21729,7 +21795,7 @@
    *          the propagated type is being requested
    * @return the type associated with the expression
    */
-  Type2 analyze2(Expression node, bool useStaticType) => analyze4(node, null, useStaticType);
+  DartType _analyze2(Expression node, bool useStaticType) => _analyze4(node, null, useStaticType);
 
   /**
    * Return the type associated with the given expression after the static type analyzer has
@@ -21739,7 +21805,7 @@
    * @param thisType the type of 'this'
    * @return the type associated with the expression
    */
-  Type2 analyze3(Expression node, InterfaceType thisType) => analyze4(node, thisType, true);
+  DartType _analyze3(Expression node, InterfaceType thisType) => _analyze4(node, thisType, true);
 
   /**
    * Return the type associated with the given expression after the static type analyzer has
@@ -21751,7 +21817,7 @@
    *          the propagated type is being requested
    * @return the type associated with the expression
    */
-  Type2 analyze4(Expression node, InterfaceType thisType, bool useStaticType) {
+  DartType _analyze4(Expression node, InterfaceType thisType, bool useStaticType) {
     try {
       _analyzer.thisType_J2DAccessor = thisType;
     } on JavaException catch (exception) {
@@ -21772,7 +21838,7 @@
    * @param node the parameter with which the type is associated
    * @return the type associated with the parameter
    */
-  Type2 analyze5(FormalParameter node) {
+  DartType _analyze5(FormalParameter node) {
     node.accept(_analyzer);
     return (node.identifier.staticElement as ParameterElement).type;
   }
@@ -21786,10 +21852,10 @@
    * @param expectedNamedTypes the expected types of the named parameters
    * @param actualType the type being tested
    */
-  void assertFunctionType(Type2 expectedReturnType, List<Type2> expectedNormalTypes, List<Type2> expectedOptionalTypes, Map<String, Type2> expectedNamedTypes, Type2 actualType) {
+  void _assertFunctionType(DartType expectedReturnType, List<DartType> expectedNormalTypes, List<DartType> expectedOptionalTypes, Map<String, DartType> expectedNamedTypes, DartType actualType) {
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, actualType);
     FunctionType functionType = actualType as FunctionType;
-    List<Type2> normalTypes = functionType.normalParameterTypes;
+    List<DartType> normalTypes = functionType.normalParameterTypes;
     if (expectedNormalTypes == null) {
       EngineTestCase.assertLength(0, normalTypes);
     } else {
@@ -21799,7 +21865,7 @@
         JUnitTestCase.assertSame(expectedNormalTypes[i], normalTypes[i]);
       }
     }
-    List<Type2> optionalTypes = functionType.optionalParameterTypes;
+    List<DartType> optionalTypes = functionType.optionalParameterTypes;
     if (expectedOptionalTypes == null) {
       EngineTestCase.assertLength(0, optionalTypes);
     } else {
@@ -21809,34 +21875,34 @@
         JUnitTestCase.assertSame(expectedOptionalTypes[i], optionalTypes[i]);
       }
     }
-    Map<String, Type2> namedTypes = functionType.namedParameterTypes;
+    Map<String, DartType> namedTypes = functionType.namedParameterTypes;
     if (expectedNamedTypes == null) {
       EngineTestCase.assertSizeOfMap(0, namedTypes);
     } else {
       EngineTestCase.assertSizeOfMap(expectedNamedTypes.length, namedTypes);
-      for (MapEntry<String, Type2> entry in getMapEntrySet(expectedNamedTypes)) {
+      for (MapEntry<String, DartType> entry in getMapEntrySet(expectedNamedTypes)) {
         JUnitTestCase.assertSame(entry.getValue(), namedTypes[entry.getKey()]);
       }
     }
     JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
   }
 
-  void assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
+  void _assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
     JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
     JUnitTestCase.assertEquals(expectedType.element, actualType.element);
-    List<Type2> expectedArguments = expectedType.typeArguments;
+    List<DartType> expectedArguments = expectedType.typeArguments;
     int length = expectedArguments.length;
-    List<Type2> actualArguments = actualType.typeArguments;
+    List<DartType> actualArguments = actualType.typeArguments;
     EngineTestCase.assertLength(length, actualArguments);
     for (int i = 0; i < length; i++) {
-      assertType2(expectedArguments[i], actualArguments[i]);
+      _assertType2(expectedArguments[i], actualArguments[i]);
     }
   }
 
-  void assertType2(Type2 expectedType, Type2 actualType) {
+  void _assertType2(DartType expectedType, DartType actualType) {
     if (expectedType is InterfaceTypeImpl) {
       EngineTestCase.assertInstanceOf((obj) => obj is InterfaceTypeImpl, InterfaceTypeImpl, actualType);
-      assertType(expectedType, actualType as InterfaceTypeImpl);
+      _assertType(expectedType, actualType as InterfaceTypeImpl);
     }
   }
 
@@ -21845,7 +21911,7 @@
    *
    * @return the analyzer to be used by the tests
    */
-  StaticTypeAnalyzer createAnalyzer() {
+  StaticTypeAnalyzer _createAnalyzer() {
     AnalysisContextImpl context = new AnalysisContextImpl();
     SourceFactory sourceFactory = new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
     context.sourceFactory = sourceFactory;
@@ -21871,7 +21937,7 @@
    * @param value the value of the literal
    * @return an integer literal that has been resolved to the correct type
    */
-  DoubleLiteral resolvedDouble(double value) {
+  DoubleLiteral _resolvedDouble(double value) {
     DoubleLiteral literal = AstFactory.doubleLiteral(value);
     literal.staticType = _typeProvider.doubleType;
     return literal;
@@ -21887,7 +21953,7 @@
    * @param body the body of the function
    * @return a resolved function expression
    */
-  FunctionExpression resolvedFunctionExpression(FormalParameterList parameters, FunctionBody body) {
+  FunctionExpression _resolvedFunctionExpression(FormalParameterList parameters, FunctionBody body) {
     List<ParameterElement> parameterElements = new List<ParameterElement>();
     for (FormalParameter parameter in parameters.parameters) {
       ParameterElementImpl element = new ParameterElementImpl.con1(parameter.identifier);
@@ -21910,7 +21976,7 @@
    * @param value the value of the literal
    * @return an integer literal that has been resolved to the correct type
    */
-  IntegerLiteral resolvedInteger(int value) {
+  IntegerLiteral _resolvedInteger(int value) {
     IntegerLiteral literal = AstFactory.integer(value);
     literal.staticType = _typeProvider.intType;
     return literal;
@@ -21922,7 +21988,7 @@
    * @param value the value of the literal
    * @return a string literal that has been resolved to the correct type
    */
-  SimpleStringLiteral resolvedString(String value) {
+  SimpleStringLiteral _resolvedString(String value) {
     SimpleStringLiteral string = AstFactory.string2(value);
     string.staticType = _typeProvider.stringType;
     return string;
@@ -21935,7 +22001,7 @@
    * @param variableName the name of the variable
    * @return a simple identifier that has been resolved to a variable element with the given type
    */
-  SimpleIdentifier resolvedVariable(InterfaceType type, String variableName) {
+  SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) {
     SimpleIdentifier identifier = AstFactory.identifier3(variableName);
     VariableElementImpl element = ElementFactory.localVariableElement(identifier);
     element.type = type;
@@ -21950,7 +22016,7 @@
    * @param parameter the parameter whose type is to be set
    * @param type the new type of the given parameter
    */
-  void setType(FormalParameter parameter, Type2 type) {
+  void _setType(FormalParameter parameter, DartType type) {
     SimpleIdentifier identifier = parameter.identifier;
     Element element = identifier.staticElement;
     if (element is! ParameterElement) {
@@ -23177,8 +23243,10 @@
 
   Scope_EnclosedScopeTest_test_define_duplicate(this.errorListener2) : super();
 
+  @override
   AnalysisErrorListener get errorListener => errorListener2;
 
+  @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 
@@ -23187,8 +23255,10 @@
 
   Scope_EnclosedScopeTest_test_define_normal(this.errorListener3) : super();
 
+  @override
   AnalysisErrorListener get errorListener => errorListener3;
 
+  @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 
@@ -23198,6 +23268,7 @@
    */
   AnalysisContextImpl _context;
 
+  @override
   void setUp() {
     SourceFactory sourceFactory = new SourceFactory([
         new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
@@ -23213,7 +23284,7 @@
         "part 'second.dart';"]));
     addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "int get V => 0;"]));
     addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "void set V(int v) {}"]));
-    LibraryElement element = buildLibrary(librarySource, []);
+    LibraryElement element = _buildLibrary(librarySource, []);
     JUnitTestCase.assertNotNull(element);
     List<CompilationUnitElement> sourcedUnits = element.parts;
     EngineTestCase.assertLength(2, sourcedUnits);
@@ -23226,7 +23297,7 @@
 
   void test_empty() {
     Source librarySource = addSource("/lib.dart", "library lib;");
-    LibraryElement element = buildLibrary(librarySource, []);
+    LibraryElement element = _buildLibrary(librarySource, []);
     JUnitTestCase.assertNotNull(element);
     JUnitTestCase.assertEquals("lib", element.name);
     JUnitTestCase.assertNull(element.entryPoint);
@@ -23248,21 +23319,21 @@
 
   void test_invalidUri_part() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part '\${'a'}.dart';"]));
-    LibraryElement element = buildLibrary(librarySource, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
+    LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
     JUnitTestCase.assertNotNull(element);
   }
 
   void test_missingLibraryDirectiveWithPart() {
     addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
-    LibraryElement element = buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
+    LibraryElement element = _buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
     JUnitTestCase.assertNotNull(element);
   }
 
   void test_missingPartOfDirective() {
     addSource("/a.dart", "class A {}");
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';"]));
-    LibraryElement element = buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
     JUnitTestCase.assertNotNull(element);
   }
 
@@ -23275,25 +23346,25 @@
         "class A {}"]));
     addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "class B {}"]));
     addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "class C {}"]));
-    LibraryElement element = buildLibrary(librarySource, []);
+    LibraryElement element = _buildLibrary(librarySource, []);
     JUnitTestCase.assertNotNull(element);
     List<CompilationUnitElement> sourcedUnits = element.parts;
     EngineTestCase.assertLength(2, sourcedUnits);
-    assertTypes(element.definingCompilationUnit, ["A"]);
+    _assertTypes(element.definingCompilationUnit, ["A"]);
     if (sourcedUnits[0].name == "first.dart") {
-      assertTypes(sourcedUnits[0], ["B"]);
-      assertTypes(sourcedUnits[1], ["C"]);
+      _assertTypes(sourcedUnits[0], ["B"]);
+      _assertTypes(sourcedUnits[1], ["C"]);
     } else {
-      assertTypes(sourcedUnits[0], ["C"]);
-      assertTypes(sourcedUnits[1], ["B"]);
+      _assertTypes(sourcedUnits[0], ["C"]);
+      _assertTypes(sourcedUnits[1], ["B"]);
     }
   }
 
   void test_singleFile() {
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "class A {}"]));
-    LibraryElement element = buildLibrary(librarySource, []);
+    LibraryElement element = _buildLibrary(librarySource, []);
     JUnitTestCase.assertNotNull(element);
-    assertTypes(element.definingCompilationUnit, ["A"]);
+    _assertTypes(element.definingCompilationUnit, ["A"]);
   }
 
   /**
@@ -23315,7 +23386,7 @@
    * @param unit the compilation unit containing the types
    * @param typeNames the names of the types that should be found
    */
-  void assertTypes(CompilationUnitElement unit, List<String> typeNames) {
+  void _assertTypes(CompilationUnitElement unit, List<String> typeNames) {
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> types = unit.types;
     EngineTestCase.assertLength(typeNames.length, types);
@@ -23343,7 +23414,7 @@
    * @return the element model that was built for the library
    * @throws Exception if the element model could not be built
    */
-  LibraryElement buildLibrary(Source librarySource, List<ErrorCode> expectedErrorCodes) {
+  LibraryElement _buildLibrary(Source librarySource, List<ErrorCode> expectedErrorCodes) {
     LibraryResolver resolver = new LibraryResolver(_context);
     LibraryElementBuilder builder = new LibraryElementBuilder(resolver);
     Library library = resolver.createLibrary(librarySource);
@@ -23460,6 +23531,7 @@
 
   ScopeTest_TestScope(this.errorListener);
 
+  @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
 }
 
@@ -23487,7 +23559,7 @@
         "  }",
         "  void g(a, b, c) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2]);
+    _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_required_tooFew() {
@@ -23498,7 +23570,7 @@
         "  }",
         "  void g(a, b, c) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1]);
+    _validateArgumentResolution(source, [0, 1]);
   }
 
   void test_argumentResolution_required_tooMany() {
@@ -23509,7 +23581,7 @@
         "  }",
         "  void g(a, b) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, -1]);
+    _validateArgumentResolution(source, [0, 1, -1]);
   }
 
   void test_argumentResolution_requiredAndNamed_extra() {
@@ -23520,7 +23592,7 @@
         "  }",
         "  void g(a, b, {c}) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2, -1]);
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
   }
 
   void test_argumentResolution_requiredAndNamed_matching() {
@@ -23531,7 +23603,7 @@
         "  }",
         "  void g(a, b, {c}) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2]);
+    _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_requiredAndNamed_missing() {
@@ -23542,7 +23614,7 @@
         "  }",
         "  void g(a, b, {c, d}) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 3]);
+    _validateArgumentResolution(source, [0, 1, 3]);
   }
 
   void test_argumentResolution_requiredAndPositional_fewer() {
@@ -23553,7 +23625,7 @@
         "  }",
         "  void g(a, b, [c, d]) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2]);
+    _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_requiredAndPositional_matching() {
@@ -23564,7 +23636,7 @@
         "  }",
         "  void g(a, b, [c, d]) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2, 3]);
+    _validateArgumentResolution(source, [0, 1, 2, 3]);
   }
 
   void test_argumentResolution_requiredAndPositional_more() {
@@ -23575,7 +23647,7 @@
         "  }",
         "  void g(a, b, [c]) {}",
         "}"]));
-    validateArgumentResolution(source, [0, 1, 2, -1]);
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
   }
 
   void test_class_definesCall() {
@@ -24232,7 +24304,7 @@
    * @throws Exception if the source could not be resolved or if the structure of the source is not
    *           valid
    */
-  void validateArgumentResolution(Source source, List<int> indices) {
+  void _validateArgumentResolution(Source source, List<int> indices) {
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
     ClassElement classElement = library.definingCompilationUnit.types[0];
@@ -24494,12 +24566,13 @@
 
   RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this.SimpleResolverTest_this, this.found, this.thrownException) : super();
 
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.name == "myVar" && node.parent is MethodInvocation) {
       try {
         found[0] = true;
         // check static type
-        Type2 staticType = node.staticType;
+        DartType staticType = node.staticType;
         JUnitTestCase.assertSame(SimpleResolverTest_this.typeProvider.dynamicType, staticType);
         // check propagated type
         FunctionType propagatedType = node.propagatedType as FunctionType;
@@ -24586,6 +24659,7 @@
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
   }
 
+  @override
   void setUp() {
     super.setUp();
     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
@@ -24622,67 +24696,67 @@
 class ScopeBuilderTest extends EngineTestCase {
   void test_scopeFor_ClassDeclaration() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedClassDeclaration(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassDeclaration(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
   }
 
   void test_scopeFor_ClassTypeAlias() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedClassTypeAlias(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedClassTypeAlias(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
   }
 
   void test_scopeFor_CompilationUnit() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedCompilationUnit(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedCompilationUnit(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
   }
 
   void test_scopeFor_ConstructorDeclaration() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedConstructorDeclaration(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
   }
 
   void test_scopeFor_ConstructorDeclaration_parameters() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedConstructorDeclaration().parameters, listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedConstructorDeclaration().parameters, listener);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
   }
 
   void test_scopeFor_FunctionDeclaration() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionDeclaration(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
   }
 
   void test_scopeFor_FunctionDeclaration_parameters() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionDeclaration().functionExpression.parameters, listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionDeclaration().functionExpression.parameters, listener);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
   }
 
   void test_scopeFor_FunctionTypeAlias() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is LibraryScope, LibraryScope, scope);
   }
 
   void test_scopeFor_FunctionTypeAlias_parameters() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias().parameters, listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedFunctionTypeAlias().parameters, listener);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeScope, FunctionTypeScope, scope);
   }
 
   void test_scopeFor_MethodDeclaration() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration(), listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration(), listener);
     EngineTestCase.assertInstanceOf((obj) => obj is ClassScope, ClassScope, scope);
   }
 
   void test_scopeFor_MethodDeclaration_body() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration().body, listener);
+    Scope scope = ScopeBuilder.scopeFor(_createResolvedMethodDeclaration().body, listener);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionScope, FunctionScope, scope);
   }
 
@@ -24713,8 +24787,8 @@
     }
   }
 
-  ClassDeclaration createResolvedClassDeclaration() {
-    CompilationUnit unit = createResolvedCompilationUnit();
+  ClassDeclaration _createResolvedClassDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
     String className = "C";
     ClassDeclaration classNode = AstFactory.classDeclaration(null, className, AstFactory.typeParameterList([]), null, null, null, []);
     unit.declarations.add(classNode);
@@ -24724,8 +24798,8 @@
     return classNode;
   }
 
-  ClassTypeAlias createResolvedClassTypeAlias() {
-    CompilationUnit unit = createResolvedCompilationUnit();
+  ClassTypeAlias _createResolvedClassTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
     String className = "C";
     ClassTypeAlias classNode = AstFactory.classTypeAlias(className, AstFactory.typeParameterList([]), null, null, null, null);
     unit.declarations.add(classNode);
@@ -24735,15 +24809,15 @@
     return classNode;
   }
 
-  CompilationUnit createResolvedCompilationUnit() {
+  CompilationUnit _createResolvedCompilationUnit() {
     CompilationUnit unit = AstFactory.compilationUnit();
     LibraryElementImpl library = ElementFactory.library(AnalysisContextFactory.contextWithCore(), "lib");
     unit.element = library.definingCompilationUnit;
     return unit;
   }
 
-  ConstructorDeclaration createResolvedConstructorDeclaration() {
-    ClassDeclaration classNode = createResolvedClassDeclaration();
+  ConstructorDeclaration _createResolvedConstructorDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
     String constructorName = "f";
     ConstructorDeclaration constructorNode = AstFactory.constructorDeclaration(AstFactory.identifier3(constructorName), null, AstFactory.formalParameterList([]), null);
     classNode.members.add(constructorNode);
@@ -24753,8 +24827,8 @@
     return constructorNode;
   }
 
-  FunctionDeclaration createResolvedFunctionDeclaration() {
-    CompilationUnit unit = createResolvedCompilationUnit();
+  FunctionDeclaration _createResolvedFunctionDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
     String functionName = "f";
     FunctionDeclaration functionNode = AstFactory.functionDeclaration(null, null, functionName, AstFactory.functionExpression());
     unit.declarations.add(functionNode);
@@ -24764,8 +24838,8 @@
     return functionNode;
   }
 
-  FunctionTypeAlias createResolvedFunctionTypeAlias() {
-    CompilationUnit unit = createResolvedCompilationUnit();
+  FunctionTypeAlias _createResolvedFunctionTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
     FunctionTypeAlias aliasNode = AstFactory.typeAlias(AstFactory.typeName4("A", []), "F", AstFactory.typeParameterList([]), AstFactory.formalParameterList([]));
     unit.declarations.add(aliasNode);
     SimpleIdentifier aliasName = aliasNode.name;
@@ -24775,8 +24849,8 @@
     return aliasNode;
   }
 
-  MethodDeclaration createResolvedMethodDeclaration() {
-    ClassDeclaration classNode = createResolvedClassDeclaration();
+  MethodDeclaration _createResolvedMethodDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
     String methodName = "f";
     MethodDeclaration methodNode = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3(methodName), AstFactory.formalParameterList([]));
     classNode.members.add(methodNode);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 4b86c62..a0769fe 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -249,13 +249,13 @@
    */
   void validate(Token token) {
     JavaStringBuilder builder = new JavaStringBuilder();
-    validateStream(builder, token);
+    _validateStream(builder, token);
     if (builder.length > 0) {
       JUnitTestCase.fail(builder.toString());
     }
   }
 
-  void validateStream(JavaStringBuilder builder, Token token) {
+  void _validateStream(JavaStringBuilder builder, Token token) {
     if (token == null) {
       return;
     }
@@ -263,14 +263,14 @@
     int previousEnd = -1;
     Token currentToken = token;
     while (currentToken != null && currentToken.type != TokenType.EOF) {
-      validateStream(builder, currentToken.precedingComments);
+      _validateStream(builder, currentToken.precedingComments);
       TokenType type = currentToken.type;
       if (identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
         if (currentToken is! BeginToken) {
           builder.append("\r\nExpected BeginToken, found ");
           builder.append(currentToken.runtimeType.toString());
           builder.append(" ");
-          writeToken(builder, currentToken);
+          _writeToken(builder, currentToken);
         }
       }
       int currentStart = currentToken.offset;
@@ -278,9 +278,9 @@
       int currentEnd = currentStart + currentLength - 1;
       if (currentStart <= previousEnd) {
         builder.append("\r\nInvalid token sequence: ");
-        writeToken(builder, previousToken);
+        _writeToken(builder, previousToken);
         builder.append(" followed by ");
-        writeToken(builder, currentToken);
+        _writeToken(builder, currentToken);
       }
       previousEnd = currentEnd;
       previousToken = currentToken;
@@ -288,7 +288,7 @@
     }
   }
 
-  void writeToken(JavaStringBuilder builder, Token token) {
+  void _writeToken(JavaStringBuilder builder, Token token) {
     builder.append("[");
     builder.append(token.type);
     builder.append(", '");
@@ -303,75 +303,75 @@
 
 class ScannerTest extends JUnitTestCase {
   void test_ampersand() {
-    assertToken(TokenType.AMPERSAND, "&");
+    _assertToken(TokenType.AMPERSAND, "&");
   }
 
   void test_ampersand_ampersand() {
-    assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
+    _assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
   }
 
   void test_ampersand_eq() {
-    assertToken(TokenType.AMPERSAND_EQ, "&=");
+    _assertToken(TokenType.AMPERSAND_EQ, "&=");
   }
 
   void test_at() {
-    assertToken(TokenType.AT, "@");
+    _assertToken(TokenType.AT, "@");
   }
 
   void test_backping() {
-    assertToken(TokenType.BACKPING, "`");
+    _assertToken(TokenType.BACKPING, "`");
   }
 
   void test_backslash() {
-    assertToken(TokenType.BACKSLASH, "\\");
+    _assertToken(TokenType.BACKSLASH, "\\");
   }
 
   void test_bang() {
-    assertToken(TokenType.BANG, "!");
+    _assertToken(TokenType.BANG, "!");
   }
 
   void test_bang_eq() {
-    assertToken(TokenType.BANG_EQ, "!=");
+    _assertToken(TokenType.BANG_EQ, "!=");
   }
 
   void test_bar() {
-    assertToken(TokenType.BAR, "|");
+    _assertToken(TokenType.BAR, "|");
   }
 
   void test_bar_bar() {
-    assertToken(TokenType.BAR_BAR, "||");
+    _assertToken(TokenType.BAR_BAR, "||");
   }
 
   void test_bar_eq() {
-    assertToken(TokenType.BAR_EQ, "|=");
+    _assertToken(TokenType.BAR_EQ, "|=");
   }
 
   void test_caret() {
-    assertToken(TokenType.CARET, "^");
+    _assertToken(TokenType.CARET, "^");
   }
 
   void test_caret_eq() {
-    assertToken(TokenType.CARET_EQ, "^=");
+    _assertToken(TokenType.CARET_EQ, "^=");
   }
 
   void test_close_curly_bracket() {
-    assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
+    _assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
   }
 
   void test_close_paren() {
-    assertToken(TokenType.CLOSE_PAREN, ")");
+    _assertToken(TokenType.CLOSE_PAREN, ")");
   }
 
   void test_close_quare_bracket() {
-    assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
+    _assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
   }
 
   void test_colon() {
-    assertToken(TokenType.COLON, ":");
+    _assertToken(TokenType.COLON, ":");
   }
 
   void test_comma() {
-    assertToken(TokenType.COMMA, ",");
+    _assertToken(TokenType.COMMA, ",");
   }
 
   void test_comment_disabled_multi() {
@@ -383,316 +383,316 @@
   }
 
   void test_comment_multi() {
-    assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
+    _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
   }
 
   void test_comment_multi_unterminated() {
-    assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
+    _assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
   }
 
   void test_comment_nested() {
-    assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
+    _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
   }
 
   void test_comment_single() {
-    assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
+    _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
   }
 
   void test_double_both_e() {
-    assertToken(TokenType.DOUBLE, "0.123e4");
+    _assertToken(TokenType.DOUBLE, "0.123e4");
   }
 
   void test_double_both_E() {
-    assertToken(TokenType.DOUBLE, "0.123E4");
+    _assertToken(TokenType.DOUBLE, "0.123E4");
   }
 
   void test_double_fraction() {
-    assertToken(TokenType.DOUBLE, ".123");
+    _assertToken(TokenType.DOUBLE, ".123");
   }
 
   void test_double_fraction_e() {
-    assertToken(TokenType.DOUBLE, ".123e4");
+    _assertToken(TokenType.DOUBLE, ".123e4");
   }
 
   void test_double_fraction_E() {
-    assertToken(TokenType.DOUBLE, ".123E4");
+    _assertToken(TokenType.DOUBLE, ".123E4");
   }
 
   void test_double_missingDigitInExponent() {
-    assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
+    _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
   }
 
   void test_double_whole_e() {
-    assertToken(TokenType.DOUBLE, "12e4");
+    _assertToken(TokenType.DOUBLE, "12e4");
   }
 
   void test_double_whole_E() {
-    assertToken(TokenType.DOUBLE, "12E4");
+    _assertToken(TokenType.DOUBLE, "12E4");
   }
 
   void test_eq() {
-    assertToken(TokenType.EQ, "=");
+    _assertToken(TokenType.EQ, "=");
   }
 
   void test_eq_eq() {
-    assertToken(TokenType.EQ_EQ, "==");
+    _assertToken(TokenType.EQ_EQ, "==");
   }
 
   void test_gt() {
-    assertToken(TokenType.GT, ">");
+    _assertToken(TokenType.GT, ">");
   }
 
   void test_gt_eq() {
-    assertToken(TokenType.GT_EQ, ">=");
+    _assertToken(TokenType.GT_EQ, ">=");
   }
 
   void test_gt_gt() {
-    assertToken(TokenType.GT_GT, ">>");
+    _assertToken(TokenType.GT_GT, ">>");
   }
 
   void test_gt_gt_eq() {
-    assertToken(TokenType.GT_GT_EQ, ">>=");
+    _assertToken(TokenType.GT_GT_EQ, ">>=");
   }
 
   void test_hash() {
-    assertToken(TokenType.HASH, "#");
+    _assertToken(TokenType.HASH, "#");
   }
 
   void test_hexidecimal() {
-    assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
+    _assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
   }
 
   void test_hexidecimal_missingDigit() {
-    assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
+    _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
   }
 
   void test_identifier() {
-    assertToken(TokenType.IDENTIFIER, "result");
+    _assertToken(TokenType.IDENTIFIER, "result");
   }
 
   void test_illegalChar_cyrillicLetter_middle() {
-    assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "Shche\u0433lov");
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "Shche\u0433lov");
   }
 
   void test_illegalChar_cyrillicLetter_start() {
-    assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
   }
 
   void test_illegalChar_nbsp() {
-    assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
   }
 
   void test_illegalChar_notLetter() {
-    assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
   }
 
   void test_index() {
-    assertToken(TokenType.INDEX, "[]");
+    _assertToken(TokenType.INDEX, "[]");
   }
 
   void test_index_eq() {
-    assertToken(TokenType.INDEX_EQ, "[]=");
+    _assertToken(TokenType.INDEX_EQ, "[]=");
   }
 
   void test_int() {
-    assertToken(TokenType.INT, "123");
+    _assertToken(TokenType.INT, "123");
   }
 
   void test_int_initialZero() {
-    assertToken(TokenType.INT, "0123");
+    _assertToken(TokenType.INT, "0123");
   }
 
   void test_keyword_abstract() {
-    assertKeywordToken("abstract");
+    _assertKeywordToken("abstract");
   }
 
   void test_keyword_as() {
-    assertKeywordToken("as");
+    _assertKeywordToken("as");
   }
 
   void test_keyword_assert() {
-    assertKeywordToken("assert");
+    _assertKeywordToken("assert");
   }
 
   void test_keyword_break() {
-    assertKeywordToken("break");
+    _assertKeywordToken("break");
   }
 
   void test_keyword_case() {
-    assertKeywordToken("case");
+    _assertKeywordToken("case");
   }
 
   void test_keyword_catch() {
-    assertKeywordToken("catch");
+    _assertKeywordToken("catch");
   }
 
   void test_keyword_class() {
-    assertKeywordToken("class");
+    _assertKeywordToken("class");
   }
 
   void test_keyword_const() {
-    assertKeywordToken("const");
+    _assertKeywordToken("const");
   }
 
   void test_keyword_continue() {
-    assertKeywordToken("continue");
+    _assertKeywordToken("continue");
   }
 
   void test_keyword_default() {
-    assertKeywordToken("default");
+    _assertKeywordToken("default");
   }
 
   void test_keyword_do() {
-    assertKeywordToken("do");
+    _assertKeywordToken("do");
   }
 
   void test_keyword_dynamic() {
-    assertKeywordToken("dynamic");
+    _assertKeywordToken("dynamic");
   }
 
   void test_keyword_else() {
-    assertKeywordToken("else");
+    _assertKeywordToken("else");
   }
 
   void test_keyword_enum() {
-    assertKeywordToken("enum");
+    _assertKeywordToken("enum");
   }
 
   void test_keyword_export() {
-    assertKeywordToken("export");
+    _assertKeywordToken("export");
   }
 
   void test_keyword_extends() {
-    assertKeywordToken("extends");
+    _assertKeywordToken("extends");
   }
 
   void test_keyword_factory() {
-    assertKeywordToken("factory");
+    _assertKeywordToken("factory");
   }
 
   void test_keyword_false() {
-    assertKeywordToken("false");
+    _assertKeywordToken("false");
   }
 
   void test_keyword_final() {
-    assertKeywordToken("final");
+    _assertKeywordToken("final");
   }
 
   void test_keyword_finally() {
-    assertKeywordToken("finally");
+    _assertKeywordToken("finally");
   }
 
   void test_keyword_for() {
-    assertKeywordToken("for");
+    _assertKeywordToken("for");
   }
 
   void test_keyword_get() {
-    assertKeywordToken("get");
+    _assertKeywordToken("get");
   }
 
   void test_keyword_if() {
-    assertKeywordToken("if");
+    _assertKeywordToken("if");
   }
 
   void test_keyword_implements() {
-    assertKeywordToken("implements");
+    _assertKeywordToken("implements");
   }
 
   void test_keyword_import() {
-    assertKeywordToken("import");
+    _assertKeywordToken("import");
   }
 
   void test_keyword_in() {
-    assertKeywordToken("in");
+    _assertKeywordToken("in");
   }
 
   void test_keyword_is() {
-    assertKeywordToken("is");
+    _assertKeywordToken("is");
   }
 
   void test_keyword_library() {
-    assertKeywordToken("library");
+    _assertKeywordToken("library");
   }
 
   void test_keyword_new() {
-    assertKeywordToken("new");
+    _assertKeywordToken("new");
   }
 
   void test_keyword_null() {
-    assertKeywordToken("null");
+    _assertKeywordToken("null");
   }
 
   void test_keyword_operator() {
-    assertKeywordToken("operator");
+    _assertKeywordToken("operator");
   }
 
   void test_keyword_part() {
-    assertKeywordToken("part");
+    _assertKeywordToken("part");
   }
 
   void test_keyword_rethrow() {
-    assertKeywordToken("rethrow");
+    _assertKeywordToken("rethrow");
   }
 
   void test_keyword_return() {
-    assertKeywordToken("return");
+    _assertKeywordToken("return");
   }
 
   void test_keyword_set() {
-    assertKeywordToken("set");
+    _assertKeywordToken("set");
   }
 
   void test_keyword_static() {
-    assertKeywordToken("static");
+    _assertKeywordToken("static");
   }
 
   void test_keyword_super() {
-    assertKeywordToken("super");
+    _assertKeywordToken("super");
   }
 
   void test_keyword_switch() {
-    assertKeywordToken("switch");
+    _assertKeywordToken("switch");
   }
 
   void test_keyword_this() {
-    assertKeywordToken("this");
+    _assertKeywordToken("this");
   }
 
   void test_keyword_throw() {
-    assertKeywordToken("throw");
+    _assertKeywordToken("throw");
   }
 
   void test_keyword_true() {
-    assertKeywordToken("true");
+    _assertKeywordToken("true");
   }
 
   void test_keyword_try() {
-    assertKeywordToken("try");
+    _assertKeywordToken("try");
   }
 
   void test_keyword_typedef() {
-    assertKeywordToken("typedef");
+    _assertKeywordToken("typedef");
   }
 
   void test_keyword_var() {
-    assertKeywordToken("var");
+    _assertKeywordToken("var");
   }
 
   void test_keyword_void() {
-    assertKeywordToken("void");
+    _assertKeywordToken("void");
   }
 
   void test_keyword_while() {
-    assertKeywordToken("while");
+    _assertKeywordToken("while");
   }
 
   void test_keyword_with() {
-    assertKeywordToken("with");
+    _assertKeywordToken("with");
   }
 
   void test_lineInfo_multilineComment() {
     String source = "/*\r *\r */";
-    assertLineInfo(source, [
+    _assertLineInfo(source, [
         new ScannerTest_ExpectedLocation(0, 1, 1),
         new ScannerTest_ExpectedLocation(4, 2, 2),
         new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)]);
@@ -700,7 +700,7 @@
 
   void test_lineInfo_multilineString() {
     String source = "'''a\r\nbc\r\nd'''";
-    assertLineInfo(source, [
+    _assertLineInfo(source, [
         new ScannerTest_ExpectedLocation(0, 1, 1),
         new ScannerTest_ExpectedLocation(7, 2, 2),
         new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)]);
@@ -708,7 +708,7 @@
 
   void test_lineInfo_simpleClass() {
     String source = "class Test {\r\n    String s = '...';\r\n    int get x => s.MISSING_GETTER;\r\n}";
-    assertLineInfo(source, [
+    _assertLineInfo(source, [
         new ScannerTest_ExpectedLocation(0, 1, 1),
         new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20),
         new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)]);
@@ -716,77 +716,77 @@
 
   void test_lineInfo_slashN() {
     String source = "class Test {\n}";
-    assertLineInfo(source, [
+    _assertLineInfo(source, [
         new ScannerTest_ExpectedLocation(0, 1, 1),
         new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)]);
   }
 
   void test_lt() {
-    assertToken(TokenType.LT, "<");
+    _assertToken(TokenType.LT, "<");
   }
 
   void test_lt_eq() {
-    assertToken(TokenType.LT_EQ, "<=");
+    _assertToken(TokenType.LT_EQ, "<=");
   }
 
   void test_lt_lt() {
-    assertToken(TokenType.LT_LT, "<<");
+    _assertToken(TokenType.LT_LT, "<<");
   }
 
   void test_lt_lt_eq() {
-    assertToken(TokenType.LT_LT_EQ, "<<=");
+    _assertToken(TokenType.LT_LT_EQ, "<<=");
   }
 
   void test_minus() {
-    assertToken(TokenType.MINUS, "-");
+    _assertToken(TokenType.MINUS, "-");
   }
 
   void test_minus_eq() {
-    assertToken(TokenType.MINUS_EQ, "-=");
+    _assertToken(TokenType.MINUS_EQ, "-=");
   }
 
   void test_minus_minus() {
-    assertToken(TokenType.MINUS_MINUS, "--");
+    _assertToken(TokenType.MINUS_MINUS, "--");
   }
 
   void test_open_curly_bracket() {
-    assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
+    _assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
   }
 
   void test_open_paren() {
-    assertToken(TokenType.OPEN_PAREN, "(");
+    _assertToken(TokenType.OPEN_PAREN, "(");
   }
 
   void test_open_square_bracket() {
-    assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
+    _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
   }
 
   void test_openSquareBracket() {
-    assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
+    _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
   }
 
   void test_percent() {
-    assertToken(TokenType.PERCENT, "%");
+    _assertToken(TokenType.PERCENT, "%");
   }
 
   void test_percent_eq() {
-    assertToken(TokenType.PERCENT_EQ, "%=");
+    _assertToken(TokenType.PERCENT_EQ, "%=");
   }
 
   void test_period() {
-    assertToken(TokenType.PERIOD, ".");
+    _assertToken(TokenType.PERIOD, ".");
   }
 
   void test_period_period() {
-    assertToken(TokenType.PERIOD_PERIOD, "..");
+    _assertToken(TokenType.PERIOD_PERIOD, "..");
   }
 
   void test_period_period_period() {
-    assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
+    _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
   }
 
   void test_periodAfterNumberNotIncluded_identifier() {
-    assertTokens("42.isEven()", [
+    _assertTokens("42.isEven()", [
         new StringToken(TokenType.INT, "42", 0),
         new Token(TokenType.PERIOD, 2),
         new StringToken(TokenType.IDENTIFIER, "isEven", 3),
@@ -795,7 +795,7 @@
   }
 
   void test_periodAfterNumberNotIncluded_period() {
-    assertTokens("42..isEven()", [
+    _assertTokens("42..isEven()", [
         new StringToken(TokenType.INT, "42", 0),
         new Token(TokenType.PERIOD_PERIOD, 2),
         new StringToken(TokenType.IDENTIFIER, "isEven", 4),
@@ -804,35 +804,35 @@
   }
 
   void test_plus() {
-    assertToken(TokenType.PLUS, "+");
+    _assertToken(TokenType.PLUS, "+");
   }
 
   void test_plus_eq() {
-    assertToken(TokenType.PLUS_EQ, "+=");
+    _assertToken(TokenType.PLUS_EQ, "+=");
   }
 
   void test_plus_plus() {
-    assertToken(TokenType.PLUS_PLUS, "++");
+    _assertToken(TokenType.PLUS_PLUS, "++");
   }
 
   void test_question() {
-    assertToken(TokenType.QUESTION, "?");
+    _assertToken(TokenType.QUESTION, "?");
   }
 
   void test_scriptTag_withArgs() {
-    assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
+    _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
   }
 
   void test_scriptTag_withoutSpace() {
-    assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
+    _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
   }
 
   void test_scriptTag_withSpace() {
-    assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
+    _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
   }
 
   void test_semicolon() {
-    assertToken(TokenType.SEMICOLON, ";");
+    _assertToken(TokenType.SEMICOLON, ";");
   }
 
   void test_setSourceStart() {
@@ -848,23 +848,23 @@
   }
 
   void test_slash() {
-    assertToken(TokenType.SLASH, "/");
+    _assertToken(TokenType.SLASH, "/");
   }
 
   void test_slash_eq() {
-    assertToken(TokenType.SLASH_EQ, "/=");
+    _assertToken(TokenType.SLASH_EQ, "/=");
   }
 
   void test_star() {
-    assertToken(TokenType.STAR, "*");
+    _assertToken(TokenType.STAR, "*");
   }
 
   void test_star_eq() {
-    assertToken(TokenType.STAR_EQ, "*=");
+    _assertToken(TokenType.STAR_EQ, "*=");
   }
 
   void test_startAndEnd() {
-    Token token = scan("a");
+    Token token = _scan("a");
     Token previous = token.previous;
     JUnitTestCase.assertEquals(token, previous.next);
     JUnitTestCase.assertEquals(previous, previous.previous);
@@ -874,19 +874,19 @@
   }
 
   void test_string_multi_double() {
-    assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\"");
+    _assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\"");
   }
 
   void test_string_multi_embeddedQuotes() {
-    assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\"");
+    _assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\"");
   }
 
   void test_string_multi_embeddedQuotes_escapedChar() {
-    assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\"");
+    _assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\"");
   }
 
   void test_string_multi_interpolation_block() {
-    assertTokens("\"Hello \${name}!\"", [
+    _assertTokens("\"Hello \${name}!\"", [
         new StringToken(TokenType.STRING, "\"Hello ", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7),
         new StringToken(TokenType.IDENTIFIER, "name", 9),
@@ -895,7 +895,7 @@
   }
 
   void test_string_multi_interpolation_identifier() {
-    assertTokens("\"Hello \$name!\"", [
+    _assertTokens("\"Hello \$name!\"", [
         new StringToken(TokenType.STRING, "\"Hello ", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7),
         new StringToken(TokenType.IDENTIFIER, "name", 8),
@@ -903,55 +903,55 @@
   }
 
   void test_string_multi_single() {
-    assertToken(TokenType.STRING, "'''string'''");
+    _assertToken(TokenType.STRING, "'''string'''");
   }
 
   void test_string_multi_slashEnter() {
-    assertToken(TokenType.STRING, "'''\\\n'''");
+    _assertToken(TokenType.STRING, "'''\\\n'''");
   }
 
   void test_string_multi_unterminated() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
   }
 
   void test_string_raw_multi_double() {
-    assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\"");
+    _assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\"");
   }
 
   void test_string_raw_multi_single() {
-    assertToken(TokenType.STRING, "r'''string'''");
+    _assertToken(TokenType.STRING, "r'''string'''");
   }
 
   void test_string_raw_multi_unterminated() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
   }
 
   void test_string_raw_simple_double() {
-    assertToken(TokenType.STRING, "r\"string\"");
+    _assertToken(TokenType.STRING, "r\"string\"");
   }
 
   void test_string_raw_simple_single() {
-    assertToken(TokenType.STRING, "r'string'");
+    _assertToken(TokenType.STRING, "r'string'");
   }
 
   void test_string_raw_simple_unterminated_eof() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
   }
 
   void test_string_raw_simple_unterminated_eol() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
   }
 
   void test_string_simple_double() {
-    assertToken(TokenType.STRING, "\"string\"");
+    _assertToken(TokenType.STRING, "\"string\"");
   }
 
   void test_string_simple_escapedDollar() {
-    assertToken(TokenType.STRING, "'a\\\$b'");
+    _assertToken(TokenType.STRING, "'a\\\$b'");
   }
 
   void test_string_simple_interpolation_adjacentIdentifiers() {
-    assertTokens("'\$a\$b'", [
+    _assertTokens("'\$a\$b'", [
         new StringToken(TokenType.STRING, "'", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
         new StringToken(TokenType.IDENTIFIER, "a", 2),
@@ -962,7 +962,7 @@
   }
 
   void test_string_simple_interpolation_block() {
-    assertTokens("'Hello \${name}!'", [
+    _assertTokens("'Hello \${name}!'", [
         new StringToken(TokenType.STRING, "'Hello ", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7),
         new StringToken(TokenType.IDENTIFIER, "name", 9),
@@ -971,7 +971,7 @@
   }
 
   void test_string_simple_interpolation_blockWithNestedMap() {
-    assertTokens("'a \${f({'b' : 'c'})} d'", [
+    _assertTokens("'a \${f({'b' : 'c'})} d'", [
         new StringToken(TokenType.STRING, "'a ", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
         new StringToken(TokenType.IDENTIFIER, "f", 5),
@@ -987,7 +987,7 @@
   }
 
   void test_string_simple_interpolation_firstAndLast() {
-    assertTokens("'\$greeting \$name'", [
+    _assertTokens("'\$greeting \$name'", [
         new StringToken(TokenType.STRING, "'", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
         new StringToken(TokenType.IDENTIFIER, "greeting", 2),
@@ -998,7 +998,7 @@
   }
 
   void test_string_simple_interpolation_identifier() {
-    assertTokens("'Hello \$name!'", [
+    _assertTokens("'Hello \$name!'", [
         new StringToken(TokenType.STRING, "'Hello ", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7),
         new StringToken(TokenType.IDENTIFIER, "name", 8),
@@ -1006,7 +1006,7 @@
   }
 
   void test_string_simple_interpolation_missingIdentifier() {
-    assertTokens("'\$x\$'", [
+    _assertTokens("'\$x\$'", [
         new StringToken(TokenType.STRING, "'", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
         new StringToken(TokenType.IDENTIFIER, "x", 2),
@@ -1016,46 +1016,46 @@
   }
 
   void test_string_simple_interpolation_nonIdentifier() {
-    assertTokens("'\$1'", [
+    _assertTokens("'\$1'", [
         new StringToken(TokenType.STRING, "'", 0),
         new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
         new StringToken(TokenType.STRING, "1'", 2)]);
   }
 
   void test_string_simple_single() {
-    assertToken(TokenType.STRING, "'string'");
+    _assertToken(TokenType.STRING, "'string'");
   }
 
   void test_string_simple_unterminated_eof() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
   }
 
   void test_string_simple_unterminated_eol() {
-    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
   }
 
   void test_tilde() {
-    assertToken(TokenType.TILDE, "~");
+    _assertToken(TokenType.TILDE, "~");
   }
 
   void test_tilde_slash() {
-    assertToken(TokenType.TILDE_SLASH, "~/");
+    _assertToken(TokenType.TILDE_SLASH, "~/");
   }
 
   void test_tilde_slash_eq() {
-    assertToken(TokenType.TILDE_SLASH_EQ, "~/=");
+    _assertToken(TokenType.TILDE_SLASH_EQ, "~/=");
   }
 
   void test_unclosedPairInInterpolation() {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scanWithListener("'\${(}'", listener);
+    _scanWithListener("'\${(}'", listener);
   }
 
-  void assertComment(TokenType commentType, String source) {
+  void _assertComment(TokenType commentType, String source) {
     //
     // Test without a trailing end-of-line marker
     //
-    Token token = scan(source);
+    Token token = _scan(source);
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
     Token comment = token.precedingComments;
@@ -1067,7 +1067,7 @@
     //
     // Test with a trailing end-of-line marker
     //
-    token = scan("${source}\n");
+    token = _scan("${source}\n");
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
     comment = token.precedingComments;
@@ -1085,9 +1085,9 @@
    * @param i
    * @param source the source to be scanned to produce the error
    */
-  void assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
+  void _assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scanWithListener(source, listener);
+    _scanWithListener(source, listener);
     listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expectedError, [source.codeUnitAt(expectedOffset)])]);
   }
 
@@ -1097,8 +1097,8 @@
    *
    * @param source the source to be scanned
    */
-  void assertKeywordToken(String source) {
-    Token token = scan(source);
+  void _assertKeywordToken(String source) {
+    Token token = _scan(source);
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
     JUnitTestCase.assertEquals(0, token.offset);
@@ -1107,7 +1107,7 @@
     Object value = token.value();
     JUnitTestCase.assertTrue(value is Keyword);
     JUnitTestCase.assertEquals(source, (value as Keyword).syntax);
-    token = scan(" ${source} ");
+    token = _scan(" ${source} ");
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
     JUnitTestCase.assertEquals(1, token.offset);
@@ -1119,9 +1119,9 @@
     JUnitTestCase.assertEquals(TokenType.EOF, token.next.type);
   }
 
-  void assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
+  void _assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    scanWithListener(source, listener);
+    _scanWithListener(source, listener);
     listener.assertNoErrors();
     LineInfo info = listener.getLineInfo(new TestSource());
     JUnitTestCase.assertNotNull(info);
@@ -1138,8 +1138,8 @@
    * @param expectedType the expected type of the token
    * @param source the source to be scanned to produce the actual token
    */
-  Token assertToken(TokenType expectedType, String source) {
-    Token originalToken = scan(source);
+  Token _assertToken(TokenType expectedType, String source) {
+    Token originalToken = _scan(source);
     JUnitTestCase.assertNotNull(originalToken);
     JUnitTestCase.assertEquals(expectedType, originalToken.type);
     JUnitTestCase.assertEquals(0, originalToken.offset);
@@ -1150,7 +1150,7 @@
       return originalToken;
     } else if (identical(expectedType, TokenType.SINGLE_LINE_COMMENT)) {
       // Adding space to an end-of-line comment changes the comment.
-      Token tokenWithSpaces = scan(" ${source}");
+      Token tokenWithSpaces = _scan(" ${source}");
       JUnitTestCase.assertNotNull(tokenWithSpaces);
       JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
       JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
@@ -1158,20 +1158,20 @@
       JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
       return originalToken;
     } else if (identical(expectedType, TokenType.INT) || identical(expectedType, TokenType.DOUBLE)) {
-      Token tokenWithLowerD = scan("${source}d");
+      Token tokenWithLowerD = _scan("${source}d");
       JUnitTestCase.assertNotNull(tokenWithLowerD);
       JUnitTestCase.assertEquals(expectedType, tokenWithLowerD.type);
       JUnitTestCase.assertEquals(0, tokenWithLowerD.offset);
       JUnitTestCase.assertEquals(source.length, tokenWithLowerD.length);
       JUnitTestCase.assertEquals(source, tokenWithLowerD.lexeme);
-      Token tokenWithUpperD = scan("${source}D");
+      Token tokenWithUpperD = _scan("${source}D");
       JUnitTestCase.assertNotNull(tokenWithUpperD);
       JUnitTestCase.assertEquals(expectedType, tokenWithUpperD.type);
       JUnitTestCase.assertEquals(0, tokenWithUpperD.offset);
       JUnitTestCase.assertEquals(source.length, tokenWithUpperD.length);
       JUnitTestCase.assertEquals(source, tokenWithUpperD.lexeme);
     }
-    Token tokenWithSpaces = scan(" ${source} ");
+    Token tokenWithSpaces = _scan(" ${source} ");
     JUnitTestCase.assertNotNull(tokenWithSpaces);
     JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
     JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
@@ -1188,8 +1188,8 @@
    * @param source the source to be scanned
    * @param expectedTokens the tokens that are expected to be in the source
    */
-  void assertTokens(String source, List<Token> expectedTokens) {
-    Token token = scan(source);
+  void _assertTokens(String source, List<Token> expectedTokens) {
+    Token token = _scan(source);
     JUnitTestCase.assertNotNull(token);
     for (int i = 0; i < expectedTokens.length; i++) {
       Token expectedToken = expectedTokens[i];
@@ -1203,14 +1203,14 @@
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
   }
 
-  Token scan(String source) {
+  Token _scan(String source) {
     GatheringErrorListener listener = new GatheringErrorListener();
-    Token token = scanWithListener(source, listener);
+    Token token = _scanWithListener(source, listener);
     listener.assertNoErrors();
     return token;
   }
 
-  Token scanWithListener(String source, GatheringErrorListener listener) {
+  Token _scanWithListener(String source, GatheringErrorListener listener) {
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     Token result = scanner.tokenize();
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
@@ -1915,246 +1915,246 @@
   void test_delete_identifier_beginning() {
     // "abs + b;"
     // "s + b;")
-    scan("", "ab", "", "s + b;");
-    assertTokens(-1, 1, ["s", "+", "b", ";"]);
+    _scan("", "ab", "", "s + b;");
+    _assertTokens(-1, 1, ["s", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_identifier_end() {
     // "abs + b;"
     // "a + b;")
-    scan("a", "bs", "", " + b;");
-    assertTokens(-1, 1, ["a", "+", "b", ";"]);
+    _scan("a", "bs", "", " + b;");
+    _assertTokens(-1, 1, ["a", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_identifier_middle() {
     // "abs + b;"
     // "as + b;")
-    scan("a", "b", "", "s + b;");
-    assertTokens(-1, 1, ["as", "+", "b", ";"]);
+    _scan("a", "b", "", "s + b;");
+    _assertTokens(-1, 1, ["as", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_delete_mergeTokens() {
     // "a + b + c;"
     // "ac;")
-    scan("a", " + b + ", "", "c;");
-    assertTokens(-1, 1, ["ac", ";"]);
+    _scan("a", " + b + ", "", "c;");
+    _assertTokens(-1, 1, ["ac", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_afterIdentifier1() {
     // "a + b;"
     // "abs + b;"
-    scan("a", "", "bs", " + b;");
-    assertTokens(-1, 1, ["abs", "+", "b", ";"]);
-    assertReplaced(1, "+");
+    _scan("a", "", "bs", " + b;");
+    _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
+    _assertReplaced(1, "+");
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_afterIdentifier2() {
     // "a + b;"
     // "a + by;"
-    scan("a + b", "", "y", ";");
-    assertTokens(1, 3, ["a", "+", "by", ";"]);
+    _scan("a + b", "", "y", ";");
+    _assertTokens(1, 3, ["a", "+", "by", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_beforeIdentifier() {
     // "a + b;"
     // "a + xb;")
-    scan("a + ", "", "x", "b;");
-    assertTokens(1, 3, ["a", "+", "xb", ";"]);
+    _scan("a + ", "", "x", "b;");
+    _assertTokens(1, 3, ["a", "+", "xb", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_beforeIdentifier_firstToken() {
     // "a + b;"
     // "xa + b;"
-    scan("", "", "x", "a + b;");
-    assertTokens(-1, 1, ["xa", "+", "b", ";"]);
+    _scan("", "", "x", "a + b;");
+    _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_convertOneFunctionToTwo() {
     // "f() {}"
     // "f() => 0; g() {}"
-    scan("f()", "", " => 0; g()", " {}");
-    assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
+    _scan("f()", "", " => 0; g()", " {}");
+    _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_end() {
     // "class A {}"
     // "class A {} class B {}"
-    scan("class A {}", "", " class B {}", "");
-    assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
+    _scan("class A {}", "", " class B {}", "");
+    _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_insideIdentifier() {
     // "cob;"
     // "cow.b;"
-    scan("co", "", "w.", "b;");
-    assertTokens(-1, 3, ["cow", ".", "b", ";"]);
+    _scan("co", "", "w.", "b;");
+    _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_newIdentifier1() {
     // "a;  c;"
     // "a; b c;"
-    scan("a; ", "", "b", " c;");
-    assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    _scan("a; ", "", "b", " c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_newIdentifier2() {
     // "a;  c;"
     // "a;b  c;"
-    scan("a;", "", "b", "  c;");
-    assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
-    assertReplaced(1, ";");
+    _scan("a;", "", "b", "  c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    _assertReplaced(1, ";");
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period() {
     // "a + b;"
     // "a + b.;"
-    scan("a + b", "", ".", ";");
-    assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
+    _scan("a + b", "", ".", ";");
+    _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
   }
 
   void test_insert_period_betweenIdentifiers1() {
     // "a b;"
     // "a. b;"
-    scan("a", "", ".", " b;");
-    assertTokens(0, 2, ["a", ".", "b", ";"]);
+    _scan("a", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period_betweenIdentifiers2() {
     // "a b;"
     // "a .b;"
-    scan("a ", "", ".", "b;");
-    assertTokens(0, 2, ["a", ".", "b", ";"]);
+    _scan("a ", "", ".", "b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
   }
 
   void test_insert_period_betweenIdentifiers3() {
     // "a  b;"
     // "a . b;"
-    scan("a ", "", ".", " b;");
-    assertTokens(0, 2, ["a", ".", "b", ";"]);
+    _scan("a ", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_period_insideExistingIdentifier() {
     // "ab;"
     // "a.b;"
-    scan("a", "", ".", "b;");
-    assertTokens(-1, 3, ["a", ".", "b", ";"]);
+    _scan("a", "", ".", "b;");
+    _assertTokens(-1, 3, ["a", ".", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_periodAndIdentifier() {
     // "a + b;"
     // "a + b.x;"
-    scan("a + b", "", ".x", ";");
-    assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
+    _scan("a + b", "", ".x", ";");
+    _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
   }
 
   void test_insert_whitespace_beginning_beforeToken() {
     // "a + b;"
     // " a + b;"
-    scan("", "", " ", "a + b;");
-    assertTokens(0, 1, ["a", "+", "b", ";"]);
+    _scan("", "", " ", "a + b;");
+    _assertTokens(0, 1, ["a", "+", "b", ";"]);
     JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_betweenTokens() {
     // "a + b;"
     // "a  + b;"
-    scan("a ", "", " ", "+ b;");
-    assertTokens(1, 2, ["a", "+", "b", ";"]);
+    _scan("a ", "", " ", "+ b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
     JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_end_afterToken() {
     // "a + b;"
     // "a + b; "
-    scan("a + b;", "", " ", "");
-    assertTokens(3, 4, ["a", "+", "b", ";"]);
+    _scan("a + b;", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
     JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_end_afterWhitespace() {
     // "a + b; "
     // "a + b;  "
-    scan("a + b; ", "", " ", "");
-    assertTokens(3, 4, ["a", "+", "b", ";"]);
+    _scan("a + b; ", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
     JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_insert_whitespace_withMultipleComments() {
     // "//comment", "//comment2", "a + b;"
     // "//comment", "//comment2", "a  + b;"
-    scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
-    assertTokens(1, 2, ["a", "+", "b", ";"]);
+    _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
     JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_beginning() {
     // "bell + b;"
     // "fell + b;")
-    scan("", "b", "f", "ell + b;");
-    assertTokens(-1, 1, ["fell", "+", "b", ";"]);
+    _scan("", "b", "f", "ell + b;");
+    _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_end() {
     // "bell + b;"
     // "belt + b;")
-    scan("bel", "l", "t", " + b;");
-    assertTokens(-1, 1, ["belt", "+", "b", ";"]);
+    _scan("bel", "l", "t", " + b;");
+    _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_identifier_middle() {
     // "first + b;"
     // "frost + b;")
-    scan("f", "ir", "ro", "st + b;");
-    assertTokens(-1, 1, ["frost", "+", "b", ";"]);
+    _scan("f", "ir", "ro", "st + b;");
+    _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_multiple_partialFirstAndLast() {
     // "aa + bb;"
     // "ab * ab;")
-    scan("a", "a + b", "b * a", "b;");
-    assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
+    _scan("a", "a + b", "b * a", "b;");
+    _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_operator_oneForMany() {
     // "a + b;"
     // "a * c - b;")
-    scan("a ", "+", "* c -", " b;");
-    assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
+    _scan("a ", "+", "* c -", " b;");
+    _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_replace_operator_oneForOne() {
     // "a + b;"
     // "a * b;")
-    scan("a ", "+", "*", " b;");
-    assertTokens(0, 2, ["a", "*", "b", ";"]);
+    _scan("a ", "+", "*", " b;");
+    _assertTokens(0, 2, ["a", "*", "b", ";"]);
     JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
   }
 
   void test_tokenMap() {
     // "main() {a + b;}"
     // "main() { a + b;}"
-    scan("main() {", "", " ", "a + b;}");
+    _scan("main() {", "", " ", "a + b;}");
     TokenMap tokenMap = _incrementalScanner.tokenMap;
     Token oldToken = _originalTokens;
     while (oldToken.type != TokenType.EOF) {
@@ -2174,7 +2174,7 @@
    * @param tokenOffset the offset of the token being tested
    * @param lexeme the expected lexeme of the new token
    */
-  void assertReplaced(int tokenOffset, String lexeme) {
+  void _assertReplaced(int tokenOffset, String lexeme) {
     Token oldToken = _originalTokens;
     for (int i = 0; i < tokenOffset; i++) {
       oldToken = oldToken.next;
@@ -2194,7 +2194,7 @@
    * @param rightIndex the expected index of the right token
    * @param lexemes the expected lexemes of the resulting tokens
    */
-  void assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
+  void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
     int count = lexemes.length;
     JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
     JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
@@ -2238,7 +2238,7 @@
    * @param added the text that was added to the modified contents
    * @param suffix the unchanged text after the edit region
    */
-  void scan(String prefix, String removed, String added, String suffix) {
+  void _scan(String prefix, String removed, String added, String suffix) {
     //
     // Compute the information needed to perform the test.
     //
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index cdcbabb..9bffa5a 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -84,15 +84,15 @@
    */
   void assertErrors(List<AnalysisError> expectedErrors) {
     if (_errors.length != expectedErrors.length) {
-      fail(expectedErrors);
+      _fail(expectedErrors);
     }
     List<AnalysisError> remainingErrors = new List<AnalysisError>();
     for (AnalysisError error in expectedErrors) {
       remainingErrors.add(error);
     }
     for (AnalysisError error in _errors) {
-      if (!foundAndRemoved(remainingErrors, error)) {
-        fail(expectedErrors);
+      if (!_foundAndRemoved(remainingErrors, error)) {
+        _fail(expectedErrors);
       }
     }
   }
@@ -277,6 +277,7 @@
    */
   bool get hasErrors => _errors.length > 0;
 
+  @override
   void onError(AnalysisError error) {
     if (_rawSource != null) {
       int left = error.offset;
@@ -303,7 +304,7 @@
    * @param secondError the second error being compared
    * @return `true` if the two errors are equivalent
    */
-  bool equalErrors(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && equalSources(firstError.source, secondError.source);
+  bool _equalErrors(AnalysisError firstError, AnalysisError secondError) => identical(firstError.errorCode, secondError.errorCode) && firstError.offset == secondError.offset && firstError.length == secondError.length && _equalSources(firstError.source, secondError.source);
 
   /**
    * Return `true` if the two sources are equivalent.
@@ -312,7 +313,7 @@
    * @param secondSource the second source being compared
    * @return `true` if the two sources are equivalent
    */
-  bool equalSources(Source firstSource, Source secondSource) {
+  bool _equalSources(Source firstSource, Source secondSource) {
     if (firstSource == null) {
       return secondSource == null;
     } else if (secondSource == null) {
@@ -329,7 +330,7 @@
    * @param errorCodes the errors that should have been gathered
    * @throws AssertionFailedError with
    */
-  void fail(List<AnalysisError> expectedErrors) {
+  void _fail(List<AnalysisError> expectedErrors) {
     PrintStringWriter writer = new PrintStringWriter();
     writer.print("Expected ");
     writer.print(expectedErrors.length);
@@ -394,9 +395,9 @@
    * @param targetError the error being searched for
    * @return `true` if the error is found and removed from the list
    */
-  bool foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
+  bool _foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
     for (AnalysisError error in errors) {
-      if (equalErrors(error, targetError)) {
+      if (_equalErrors(error, targetError)) {
         errors.remove(error);
         return true;
       }
@@ -465,7 +466,7 @@
     }
     List<bool> found = new List<bool>.filled(expectedSize, false);
     for (int i = 0; i < expectedSize; i++) {
-      privateAssertContains(array, found, expectedElements[i]);
+      _privateAssertContains(array, found, expectedElements[i]);
     }
   }
 
@@ -517,7 +518,7 @@
         JUnitTestCase.assertTrueMsg("Content not as expected: expected 'null' is: ${actual}", false);
       }
     }
-    int diffPos = getDiffPos(expected, actual);
+    int diffPos = _getDiffPos(expected, actual);
     if (diffPos != -1) {
       int diffAhead = Math.max(0, diffPos - _PRINT_RANGE);
       int diffAfter = Math.min(actual.length, diffPos + _PRINT_RANGE);
@@ -731,7 +732,7 @@
    * @param str2 the second String to compare
    * @return the offset at which the strings differ (or <code>-1</code> if they do not)
    */
-  static int getDiffPos(String str1, String str2) {
+  static int _getDiffPos(String str1, String str2) {
     int len1 = Math.min(str1.length, str2.length);
     int diffPos = -1;
     for (int i = 0; i < len1; i++) {
@@ -746,7 +747,7 @@
     return diffPos;
   }
 
-  static void privateAssertContains(List<Object> array, List<bool> found, Object element) {
+  static void _privateAssertContains(List<Object> array, List<bool> found, Object element) {
     if (element == null) {
       for (int i = 0; i < array.length; i++) {
         if (!found[i]) {
@@ -859,31 +860,3 @@
     throw new UnsupportedOperationException();
   }
 }
-
-/**
- * Wrapper around [Function] which should be called with "target" and "arguments".
- */
-class MethodTrampoline {
-  int parameterCount;
-  Function trampoline;
-  MethodTrampoline(this.parameterCount, this.trampoline);
-  Object invoke(target, List arguments) {
-    if (arguments.length != parameterCount) {
-      throw new IllegalArgumentException("${arguments.length} != $parameterCount");
-    }
-    switch (parameterCount) {
-      case 0:
-        return trampoline(target);
-      case 1:
-        return trampoline(target, arguments[0]);
-      case 2:
-        return trampoline(target, arguments[0], arguments[1]);
-      case 3:
-        return trampoline(target, arguments[0], arguments[1], arguments[2]);
-      case 4:
-        return trampoline(target, arguments[0], arguments[1], arguments[2], arguments[3]);
-      default:
-        throw new IllegalArgumentException("Not implemented for > 4 arguments");
-    }
-  }
-}
diff --git a/pkg/analyzer/test/options_test.dart b/pkg/analyzer/test/options_test.dart
index 6dde78b..b9fdfa2 100644
--- a/pkg/analyzer/test/options_test.dart
+++ b/pkg/analyzer/test/options_test.dart
@@ -17,24 +17,40 @@
       expect(options, isNotNull);
       expect(options.shouldBatch, isFalse);
       expect(options.machineFormat, isFalse);
+      expect(options.displayVersion, isFalse);
+      expect(options.disableHints, isFalse);
       expect(options.ignoreUnrecognizedFlags, isFalse);
+      expect(options.perf, isFalse);
       expect(options.showPackageWarnings, isFalse);
       expect(options.showSdkWarnings, isFalse);
       expect(options.warningsAreFatal, isFalse);
       expect(options.dartSdkPath, isNotNull);
+      expect(options.log, isFalse);
       expect(options.sourceFiles, equals(['foo.dart']));
     });
 
+    test('batch', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--batch']);
+      expect(options.shouldBatch, isTrue);
+    });
+
     test('machine format', () {
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', '--format=machine', 'foo.dart']);
       expect(options.machineFormat, isTrue);
     });
 
-    test('package root', () {
+    test('no-hints', () {
       CommandLineOptions options = CommandLineOptions
-          .parse(['--dart-sdk', '.', '-p', 'bar', 'foo.dart']);
-      expect(options.packageRootPath, equals('bar'));
+          .parse(['--dart-sdk', '.', '--no-hints', 'foo.dart']);
+      expect(options.disableHints, isTrue);
+    });
+
+    test('perf', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--perf', 'foo.dart']);
+      expect(options.perf, isTrue);
     });
 
     test('package warnings', () {
@@ -49,6 +65,30 @@
       expect(options.showSdkWarnings, isTrue);
     });
 
+    test('warningsAreFatal', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
+      expect(options.warningsAreFatal, isTrue);
+    });
+
+    test('package root', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '-p', 'bar', 'foo.dart']);
+      expect(options.packageRootPath, equals('bar'));
+    });
+
+    test('log', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--log', 'foo.dart']);
+      expect(options.log, isTrue);
+    });
+
+    test('sourceFiles', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
+      expect(options.sourceFiles, equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
+    });
+
 //    test('notice unrecognized flags', () {
 //      CommandLineOptions options = new CommandLineOptions.parse(['--bar', '--baz',
 //        'foo.dart']);
@@ -65,4 +105,3 @@
   });
 
 }
-
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
index 91bb9e9..4c2ad3b 100644
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ b/pkg/analyzer/test/parse_compilation_unit_test.dart
@@ -17,7 +17,7 @@
           name: 'test.dart');
     }, throwsA(predicate((error) {
       return error is AnalyzerErrorGroup &&
-          error.toString().contains("line 1 of test.dart");
+          error.toString().contains("Error in test.dart: Expected to find ';'");
     })));
   });
 
@@ -26,7 +26,7 @@
       parseCompilationUnit("void main() => print('Hello, world!')");
     }, throwsA(predicate((error) {
       return error is AnalyzerErrorGroup &&
-          error.toString().contains("line 1 of <unknown source>");
+          error.toString().contains("Error in <unknown source>: Expected to find ';'");
     })));
   });
 }
diff --git a/pkg/analyzer/test/services/data/stmt_tests.data b/pkg/analyzer/test/services/data/stmt_tests.data
index 603d8a4..006ca41 100644
--- a/pkg/analyzer/test/services/data/stmt_tests.data
+++ b/pkg/analyzer/test/services/data/stmt_tests.data
@@ -166,4 +166,28 @@
 <<<
 for ( ; ; ) {
   print('!');
+}
+>>>
+main() {
+  var zero = 0;
+  if (0 == 0) {
+    zero = 0;
+  } else if (0 == 1) {
+    zero = 1;
+  } else if (0 == 2) {
+    zero = 2;
+  }
+  print(0);
+}
+<<<
+main() {
+  var zero = 0;
+  if (0 == 0) {
+    zero = 0;
+  } else if (0 == 1) {
+    zero = 1;
+  } else if (0 == 2) {
+    zero = 2;
+  }
+  print(0);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/test/services/formatter_test.dart b/pkg/analyzer/test/services/formatter_test.dart
index c77f6f9..e0a982d 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library formatter_test;
+
 import 'dart:io';
 
 import 'package:path/path.dart';
@@ -49,6 +51,47 @@
                    throwsA(new isInstanceOf<FormatterException>()));
     });
 
+    test('indent', () {
+      var original =
+          'class A {\n'
+          '  var z;\n'
+          '  inc(int x) => ++x;\n'
+          '  foo(int x) {\n'
+          '    if (x == 0) {\n'
+          '      return true;\n'
+          '    }\n'
+          '  }\n'
+          '}\n';
+      expectCUFormatsTo(
+          original,
+          original
+        );
+      expectIndentFormatsTo(3, false,
+          original,
+          'class A {\n'
+          '   var z;\n'
+          '   inc(int x) => ++x;\n'
+          '   foo(int x) {\n'
+          '      if (x == 0) {\n'
+          '         return true;\n'
+          '      }\n'
+          '   }\n'
+          '}\n'
+        );
+      expectIndentFormatsTo(1, true,
+          original,
+          'class A {\n'
+          '\tvar z;\n'
+          '\tinc(int x) => ++x;\n'
+          '\tfoo(int x) {\n'
+          '\t\tif (x == 0) {\n'
+          '\t\t\treturn true;\n'
+          '\t\t}\n'
+          '\t}\n'
+          '}\n'
+        );
+    });
+
     test('CU (1)', () {
       expectCUFormatsTo(
           'class A {\n'
@@ -1417,6 +1460,14 @@
     expect(formatCU(src, options: new FormatterOptions(
         codeTransforms: transforms)).source, equals(expected));
 
+expectIndentFormatsTo(spacesPerIndent, tabsForIndent, src, expected) =>
+    expect(
+      formatCU(src, options: new FormatterOptions(
+          spacesPerIndent: spacesPerIndent,
+          tabsForIndent: tabsForIndent
+        )).source,
+      equals(expected));
+
 expectStmtFormatsTo(src, expected, {transforms: true}) =>
     expect(formatStatement(src, options:
       new FormatterOptions(codeTransforms: transforms)), equals(expected));
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
new file mode 100644
index 0000000..c355a35
--- /dev/null
+++ b/pkg/barback/CHANGELOG.md
@@ -0,0 +1,24 @@
+## 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.
+
+* `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.
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index 173fb53..cbb55fc 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -11,13 +11,13 @@
 export 'src/barback_settings.dart';
 export 'src/base_transform.dart';
 export 'src/build_result.dart';
-export 'src/declaring_transform.dart';
+export 'src/declaring_transform.dart' hide DeclaringTransformController;
 export 'src/declaring_transformer.dart';
 export 'src/errors.dart' hide flattenAggregateExceptions;
 export 'src/lazy_transformer.dart';
 export 'src/log.dart';
 export 'src/package_provider.dart';
-export 'src/transform.dart';
+export 'src/transform.dart' hide TransformController;
 export 'src/transform_logger.dart';
 export 'src/transformer.dart';
 export 'src/transformer_group.dart';
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index 633184a..b87ca39 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -64,7 +64,11 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _phases.any((phase) => phase.isDirty);
+  bool get isDirty {
+    // Just check the last phase, since it will check all the previous phases
+    // itself.
+    return _phases.last.isDirty;
+  }
 
   /// A stream that emits an event whenever [this] is no longer dirty.
   ///
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/base_transform.dart
index 27dc12a..ea85f02 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/base_transform.dart
@@ -11,6 +11,7 @@
 import 'asset_id.dart';
 import 'asset_node.dart';
 import 'errors.dart';
+import 'log.dart';
 import 'transform_logger.dart';
 import 'transform_node.dart';
 import 'utils.dart';
@@ -22,10 +23,29 @@
 /// subclasses to provide a means of emitting outputs.
 abstract class BaseTransform {
   final TransformNode _node;
-  final TransformLogger _logger;
+
+  /// Whether the primary input should be consumed.
+  ///
+  /// This is exposed via [BaseTransformController].
+  bool _consumePrimary = false;
+
+  /// 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;
 
   /// Gets the primary input asset.
   ///
@@ -37,11 +57,11 @@
   /// entrypoint Dart file. All of the other Dart files that that imports
   /// would be secondary inputs.
   ///
-  /// This method may fail at runtime if called asynchronously after the
-  /// transform begins running. The primary input may become unavailable while
-  /// this transformer is running due to asset changes earlier in the graph.
-  /// You can ignore the error if this happens: the transformer will be re-run
-  /// automatically for you.
+  /// This method may fail at runtime with an [AssetNotFoundException] if called
+  /// asynchronously after the transform begins running. The primary input may
+  /// become unavailable while this transformer is running due to asset changes
+  /// earlier in the graph. You can ignore the error if this happens: the
+  /// transformer will be re-run automatically for you.
   Asset get primaryInput {
     if (_node.primary.state != AssetState.AVAILABLE) {
       throw new AssetNotFoundException(_node.primary.id);
@@ -50,22 +70,31 @@
     return _node.primary.asset;
   }
 
-  BaseTransform(this._node, LogFunction logFunction)
-    : _logger = new TransformLogger(logFunction);
+  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.primary.id;
+      var entry = new LogEntry(_node.info, asset, level, message, span);
+      _onLogController.add(entry);
+    });
+  }
 
   /// Gets the asset for an input [id].
   ///
-  /// If an input with that ID cannot be found, throws an
-  /// [AssetNotFoundException].
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) => _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 `readAsString()`.
+  /// 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));
@@ -73,9 +102,51 @@
 
   /// A convenience method to the contents of the input with [id].
   ///
-  /// This is equivalent to calling `getInput()` followed by `read()`.
+  /// 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()));
+
+  /// 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() {
+    _consumePrimary = true;
+  }
+}
+
+/// The base class for controllers of subclasses of [BaseTransform].
+///
+/// Controllers are used so that [TransformNode]s can get values from a
+/// [BaseTransform] without exposing getters in the public API.
+abstract class BaseTransformController {
+  /// The [BaseTransform] controlled by this controller.
+  final BaseTransform transform;
+
+  /// Whether the primary input should be consumed.
+  bool get consumePrimary => transform._consumePrimary;
+
+  /// 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;
+
+  BaseTransformController(this.transform);
+
+  /// Notifies the [BaseTransform] that the transformation has finished being
+  /// applied.
+  ///
+  /// This will close any streams and release any resources that were allocated
+  /// for the duration of the transformation.
+  void close() {
+    transform._onLogController.close();
+  }
 }
diff --git a/pkg/barback/lib/src/declaring_transform.dart b/pkg/barback/lib/src/declaring_transform.dart
index 3e621d9..3f6ecbd 100644
--- a/pkg/barback/lib/src/declaring_transform.dart
+++ b/pkg/barback/lib/src/declaring_transform.dart
@@ -6,18 +6,16 @@
 
 import 'asset_id.dart';
 import 'base_transform.dart';
-import 'transform_logger.dart';
 import 'transform_node.dart';
 
 /// A transform for [DeclaringTransform]ers that allows them to declare the ids
 /// of the outputs they'll generate without generating the concrete bodies of
 /// those outputs.
 class DeclaringTransform extends BaseTransform {
-  final Set<AssetId> _outputIds;
+  final _outputIds = new Set<AssetId>();
 
-  DeclaringTransform(TransformNode node, this._outputIds,
-      LogFunction logFunction)
-    : super(node, logFunction);
+  DeclaringTransform._(TransformNode node)
+    : super(node);
 
   /// Stores [id] as the id of an output that will be created by this
   /// transformation when it's run.
@@ -32,3 +30,15 @@
     _outputIds.add(id);
   }
 }
+
+/// The controller for [DeclaringTransform].
+class DeclaringTransformController extends BaseTransformController {
+  DeclaringTransform get transform => super.transform;
+
+  /// The set of ids that the transformer declares it will emit for the given
+  /// primary input.
+  Set<AssetId> get outputIds => transform._outputIds;
+
+  DeclaringTransformController(TransformNode node)
+      : super(new DeclaringTransform._(node));
+}
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index d62efeb..5303b9d 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -115,25 +115,26 @@
   final error;
   final Chain stackTrace;
 
-  _WrappedException(this.error, StackTrace stackTrace)
-      : this.stackTrace = stackTrace == null ? null :
-            new Chain.forTrace(stackTrace);
+  _WrappedException(error, StackTrace stackTrace)
+      : this.error = error,
+        this.stackTrace = _getChain(error, stackTrace);
 
   String get _message;
 
   String toString() {
     var result = "$_message: $error";
-
-    var stack = stackTrace;
-    if (stack == null && error is Error) stack = error.stackTrace;
-    if (stack != null) {
-      result = "$result\n${stackTrace.terse}";
-    }
-
+    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.
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 69aaaa9..4ef344f 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -27,7 +27,11 @@
   final _phases = new List<Phase>();
 
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _phases.any((phase) => phase.isDirty);
+  bool get isDirty {
+    // Just check the last phase, since it will check all the previous phases
+    // itself.
+    return _phases.last.isDirty;
+  }
 
   /// A stream that emits an event whenever [this] is no longer dirty.
   ///
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index a240f06..b7245f4 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -94,13 +94,14 @@
   final _onAssetController = new StreamController<AssetNode>(sync: true);
 
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _inputs.values.any((input) => input.isDirty) ||
+  ///
+  /// A phase is considered dirty if any of the previous phases in the same
+  /// cascade are dirty, since those phases could emit an asset that this phase
+  /// will then need to process.
+  bool get isDirty => (_previous != null && _previous.isDirty) ||
+      _inputs.values.any((input) => input.isDirty) ||
       _groups.values.any((group) => group.isDirty);
 
-  /// Whether [this] or any previous phase is dirty.
-  bool get _isTransitivelyDirty => isDirty ||
-      (_previous != null && _previous._isTransitivelyDirty);
-
   /// A stream that emits an event whenever any transforms in this phase logs
   /// an entry.
   Stream<LogEntry> get onLog => _onLogPool.stream;
@@ -109,6 +110,9 @@
   /// The previous phase in the cascade, or null if this is the first phase.
   final Phase _previous;
 
+  /// The subscription to [_previous]'s [onDone] stream.
+  StreamSubscription _previousOnDoneSubscription;
+
   /// The phase after this one.
   ///
   /// Outputs from this phase will be passed to it.
@@ -137,22 +141,21 @@
       : this._(cascade, location, 0);
 
   Phase._(this.cascade, this._location, this._index, [this._previous]) {
-    // TODO(nweiz): This does O(n^2) work whenever a phase emits an [onDone]
-    // event, since each phase after it has to check each phase before. Find a
-    // better way to do this.
-    for (var phase = this; phase != null; phase = phase._previous) {
-      phase.onDone.listen((_) {
-        if (_isTransitivelyDirty) return;
-
-        // All the previous phases have finished building. 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();
+    if (_previous != null) {
+      _previousOnDoneSubscription = _previous.onDone.listen((_) {
+        if (!isDirty) _onDoneController.add(null);
       });
     }
+
+    onDone.listen((_) {
+      // All the previous phases have finished building. 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.
@@ -170,14 +173,18 @@
 
     node.force();
 
-    // Each group is one channel along which an asset may be forwarded. Then
-    // there's one additional channel for the non-grouped transformers.
-    var forwarder = new PhaseForwarder(_groups.length + 1);
+    // Each group is one channel along which an asset may be forwarded, as is
+    // each transformer.
+    var forwarder = new PhaseForwarder(
+        node, _transformers.length, _groups.length);
     _forwarders[node.id] = forwarder;
     forwarder.onAsset.listen(_handleOutputWithoutForwarder);
+    if (forwarder.output != null) {
+      _handleOutputWithoutForwarder(forwarder.output);
+    }
 
     _inputOrigins.add(node.origin);
-    var input = new PhaseInput(this, node, _transformers, "$_location.$_index");
+    var input = new PhaseInput(this, node, "$_location.$_index");
     _inputs[node.id] = input;
     input.input.whenRemoved(() {
       _inputOrigins.remove(node.origin);
@@ -191,6 +198,8 @@
       if (!isDirty) _onDoneController.add(null);
     });
 
+    input.updateTransformers(_transformers);
+
     for (var group in _groups.values) {
       group.addInput(node);
     }
@@ -242,7 +251,9 @@
         // if it becomes available. If it's removed before becoming available,
         // try again, since it could be generated again.
         output.force();
-        return output.whenAvailable((_) => output).catchError((error) {
+        return output.whenAvailable((_) {
+          return output;
+        }).catchError((error) {
           if (error is! AssetNotFoundException) throw error;
           return getOutput(id);
         });
@@ -250,7 +261,7 @@
 
       // If neither this phase nor the previous phases are dirty, the requested
       // output won't be generated and we can safely return null.
-      if (!_isTransitivelyDirty) return null;
+      if (!isDirty) return null;
 
       // Otherwise, store a completer for the asset node. If it's generated in
       // the future, we'll complete this completer.
@@ -290,7 +301,7 @@
     }
 
     for (var forwarder in _forwarders.values) {
-      forwarder.numChannels = _groups.length + 1;
+      forwarder.updateTransformers(_transformers.length, _groups.length);
     }
   }
 
@@ -335,6 +346,9 @@
     }
     _onAssetController.close();
     _onLogPool.close();
+    if (_previousOnDoneSubscription != null) {
+      _previousOnDoneSubscription.cancel();
+    }
   }
 
   /// Remove all phases after this one.
diff --git a/pkg/barback/lib/src/phase_forwarder.dart b/pkg/barback/lib/src/phase_forwarder.dart
index 1d5682d..bb275a5 100644
--- a/pkg/barback/lib/src/phase_forwarder.dart
+++ b/pkg/barback/lib/src/phase_forwarder.dart
@@ -11,13 +11,13 @@
 
 /// A class that takes care of forwarding assets within a phase.
 ///
-/// Each phase contains one or more channels that process its input assets. The
-/// non-grouped transformers for that phase are one such channel, and each
-/// [TransformerGroup] in that phase is another. 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].
+/// 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
@@ -30,14 +30,7 @@
 /// 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 through which the asset may have been forwarded.
-  ///
-  /// Each group is a channel, along with one channel for the [PhaseInput] that
-  /// handles all the transformers.
-  set numChannels(int value) {
-    _numChannels = value;
-    _adjustOutput();
-  }
+  /// The number of channels to forward, counting the source node.
   int _numChannels;
 
   /// The intermediate forwarded assets.
@@ -46,7 +39,8 @@
   /// The final forwarded asset.
   ///
   /// This will be null if the asset is not being forwarded.
-  AssetNode get output => _outputController.node;
+  AssetNode get output =>
+      _outputController == null ? null : _outputController.node;
   AssetNodeController _outputController;
 
   /// A stream that emits an event whenever [this] starts producing a final
@@ -55,9 +49,26 @@
   /// Whenever this stream emits an event, the value will be identical to
   /// [output].
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
-  PhaseForwarder(this._numChannels);
+  /// 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].
   ///
@@ -116,10 +127,8 @@
     // 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);
-      }
+    } else if (!_outputController.node.state.isAvailable) {
+      _outputController.setAvailable(_intermediateAssets.first.asset);
     }
   }
 }
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index 5949a84..c6b3826 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -8,14 +8,11 @@
 
 import 'asset_forwarder.dart';
 import 'asset_node.dart';
-import 'asset_node_set.dart';
-import 'errors.dart';
 import 'log.dart';
 import 'phase.dart';
 import 'stream_pool.dart';
 import 'transform_node.dart';
 import 'transformer.dart';
-import 'utils.dart';
 
 /// A class for watching a single [AssetNode] and running any transforms that
 /// take that node as a primary input.
@@ -26,9 +23,6 @@
   /// A string describing the location of [this] in the transformer graph.
   final String _location;
 
-  /// The transformers to (potentially) run against [input].
-  final Set<Transformer> _transformers;
-
   /// The transforms currently applicable to [input].
   ///
   /// These are the transforms that have been "wired up": they represent a
@@ -44,15 +38,6 @@
   /// The asset node for this input.
   AssetNode get input => _inputForwarder.node;
 
-  /// The controller that's used for the output node if [input] isn't
-  /// overwritten by any transformers.
-  ///
-  /// This needs an intervening controller to ensure that the output can be
-  /// marked dirty when determining whether transforms will overwrite it, and be
-  /// marked removed if they do. It's null if the asset is not being passed
-  /// through.
-  AssetNodeController _passThroughController;
-
   /// A stream that emits an event whenever [this] is no longer dirty.
   ///
   /// This is synchronous in order to guarantee that it will emit an event as
@@ -64,45 +49,20 @@
   ///
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
-  Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  Stream<AssetNode> get onAsset => _onAssetPool.stream;
+  final _onAssetPool = new StreamPool<AssetNode>();
 
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _isAdjustingTransformers ||
-      _transforms.any((transform) => transform.isDirty);
-
-  /// The set of assets emitted by the transformers for this input that have the
-  /// same id as [input].
-  final _overwritingOutputs = new AssetNodeSet();
-
-  /// Whether [this] has been rmeoved.
-  bool get _isRemoved => _onAssetController.isClosed;
-
-  /// Whether [input] has become dirty since [_adjustTransformers] last started
-  /// running.
-  bool _hasBecomeDirty = false;
-
-  /// Whether [_isAdjustingTransformers] is currently running.
-  bool _isAdjustingTransformers = false;
+  bool get isDirty => _transforms.any((transform) => transform.isDirty);
 
   /// A stream that emits an event whenever any transforms that use [input] as
   /// their primary input log an entry.
   Stream<LogEntry> get onLog => _onLogPool.stream;
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
-  PhaseInput(this._phase, AssetNode input, Iterable<Transformer> transformers,
-      this._location)
-      : _transformers = transformers.toSet(),
-        _inputForwarder = new AssetForwarder(input) {
-    input.onStateChange.listen((state) {
-      if (state.isRemoved) {
-        remove();
-      } else {
-        _dirty();
-      }
-    });
-
-    _adjustTransformers();
+  PhaseInput(this._phase, AssetNode input, this._location)
+      : _inputForwarder = new AssetForwarder(input) {
+    input.whenRemoved(remove);
   }
 
   /// Removes this input.
@@ -110,40 +70,32 @@
   /// This marks all outputs of the input as removed.
   void remove() {
     _onDoneController.close();
-    _hasBecomeDirty = false;
-    _onAssetController.close();
+    _onAssetPool.close();
     _onLogPool.close();
     _inputForwarder.close();
-    if (_passThroughController != null) {
-      _passThroughController.setRemoved();
-      _passThroughController = null;
-    }
-  }
-
-  /// Mark [this] as dirty and start re-running [_adjustTransformers] if
-  /// necessary.
-  void _dirty() {
-    // If there's a pass-through for this input, mark it dirty until we figure
-    // out if a transformer will emit an asset with that id.
-    if (_passThroughController != null) _passThroughController.setDirty();
-    _hasBecomeDirty = true;
-    if (!_isAdjustingTransformers) _adjustTransformers();
   }
 
   /// Set this input's transformers to [transformers].
   void updateTransformers(Iterable<Transformer> newTransformersIterable) {
     var newTransformers = newTransformersIterable.toSet();
-    var oldTransformers = _transformers.toSet();
-    var removedTransformers = oldTransformers.difference(newTransformers);
-    for (var removedTransformer in removedTransformers) {
-      _transformers.remove(removedTransformer);
+    for (var transform in _transforms.toList()) {
+      if (newTransformers.remove(transform.transformer)) continue;
+      transform.remove();
     }
 
-    var brandNewTransformers = newTransformers.difference(oldTransformers);
-    brandNewTransformers.forEach(_transformers.add);
+    // The remaining [newTransformers] are those for which there are no
+    // transforms in [_transforms].
+    for (var transformer in newTransformers) {
+      var transform = new TransformNode(
+          _phase, transformer, input, _location);
+      _transforms.add(transform);
 
-    if (removedTransformers.isNotEmpty || brandNewTransformers.isNotEmpty) {
-      _dirty();
+      transform.onDone.listen((_) {
+        if (!isDirty) _onDoneController.add(null);
+      }, onDone: () => _transforms.remove(transform));
+
+      _onAssetPool.add(transform.onAsset);
+      _onLogPool.add(transform.onLog);
     }
   }
 
@@ -155,148 +107,5 @@
     }
   }
 
-  /// Asynchronously determines which transformers can consume [input] as a
-  /// primary input and creates transforms for them.
-  ///
-  /// This ensures that if [input] is modified or removed during or after the
-  /// time it takes to adjust its transformers, they're appropriately
-  /// re-adjusted.
-  void _adjustTransformers() {
-    assert(!_isRemoved);
-
-    _isAdjustingTransformers = true;
-    input.whenAvailable((asset) {
-      _hasBecomeDirty = false;
-
-      // Take a snapshot of the existing transformers that apply to this input.
-      // Since [_removeStaleTransforms] will check each of these transformers to
-      // be sure [input] is still primary for them, we use this set to avoid
-      // needlessly re-checking in [_addFreshTransforms].
-      var oldTransformers =
-          _transforms.map((transform) => transform.transformer).toSet();
-
-      return _removeStaleTransforms().then((_) {
-        if (_hasBecomeDirty || _isRemoved) return null;
-        return _addFreshTransforms(oldTransformers);
-      });
-    }).catchError((error, stackTrace) {
-      if (error is! AssetNotFoundException || error.id != input.id) throw error;
-
-      // If the asset is removed, [input.whenAvailable] will throw an
-      // [AssetNotFoundException]. In that case, just remove it.
-      remove();
-    }).then((_) {
-      if (_isRemoved) return;
-
-      _isAdjustingTransformers = false;
-      if (_hasBecomeDirty) {
-        _adjustTransformers();
-      } else if (!isDirty) {
-        _adjustPassThrough();
-        _onDoneController.add(null);
-      }
-    });
-  }
-
-  // Remove any old transforms that used to have [input]'s asset as a primary
-  // asset but no longer apply to its new contents.
-  Future _removeStaleTransforms() {
-    assert(input.state.isAvailable);
-
-    return Future.wait(_transforms.map((transform) {
-      return syncFuture(() {
-        if (!_transformers.contains(transform.transformer)) return false;
-
-        // TODO(rnystrom): Catch all errors from isPrimary() and redirect to
-        // results (issue 16162).
-        return transform.transformer.isPrimary(input.asset);
-      }).then((isPrimary) {
-        if (_hasBecomeDirty) return;
-        if (isPrimary) {
-          transform.markPrimary();
-        } else if (_transforms.remove(transform)) {
-          transform.remove();
-        }
-      });
-    }));
-  }
-
-  // Add new transforms for transformers that consider [input]'s asset to be a
-  // primary input.
-  //
-  // [oldTransformers] is the set of transformers for which there were
-  // transforms that had [input] as a primary input prior to this. They don't
-  // need to be checked, since their transforms were removed or preserved in
-  // [_removeStaleTransforms].
-  Future _addFreshTransforms(Set<Transformer> oldTransformers) {
-    assert(input.state.isAvailable);
-
-    return Future.wait(_transformers.map((transformer) {
-      if (oldTransformers.contains(transformer)) return new Future.value();
-
-      // TODO(rnystrom): Catch all errors from isPrimary() and redirect to
-      // results.
-      return transformer.isPrimary(input.asset).then((isPrimary) {
-        if (_hasBecomeDirty || !isPrimary) return;
-        var transform = new TransformNode(
-            _phase, transformer, input, _location);
-        _transforms.add(transform);
-
-        transform.onStateChange.listen((_) {
-          if (isDirty) {
-            if (_passThroughController == null) return;
-            _passThroughController.setDirty();
-          } else {
-            _adjustPassThrough();
-            _onDoneController.add(null);
-          }
-        });
-
-        transform.onAsset.listen((asset) {
-          if (asset.id == input.id) {
-            _overwritingOutputs.add(asset);
-            asset.whenRemoved(_adjustPassThrough);
-            _adjustPassThrough();
-          }
-
-          _onAssetController.add(asset);
-        }, onDone: () => _transforms.remove(transform));
-
-        _onLogPool.add(transform.onLog);
-      });
-    }));
-  }
-
-  /// Adjust whether [input] is passed through the phase unmodified, based on
-  /// whether it's overwritten by other transforms in this phase.
-  ///
-  /// If [input] was already passed-through, this will update the passed-through
-  /// value.
-  void _adjustPassThrough() {
-    // If [input] is removed, [_adjustPassThrough] can still be called due to
-    // [TransformNode]s marking their outputs as removed.
-    if (!input.state.isAvailable) return;
-
-    // If there's an output with the same id as the primary input, that
-    // overwrites the input so it doesn't get passed through. Otherwise,
-    // create a pass-through controller if none exists, or set the existing
-    // one available.
-    if (_overwritingOutputs.isNotEmpty) {
-      if (_passThroughController != null) {
-        _passThroughController.setRemoved();
-        _passThroughController = null;
-      }
-    } else if (isDirty) {
-      // If the input is dirty, we're still figuring out whether a transform
-      // will overwrite the input. As such, we shouldn't pass through the asset
-      // yet.
-    } else if (_passThroughController == null) {
-      _passThroughController = new AssetNodeController.from(input);
-      _onAssetController.add(_passThroughController.node);
-    } else if (_passThroughController.node.state.isDirty) {
-      _passThroughController.setAvailable(input.asset);
-    }
-  }
-
   String toString() => "phase input in $_location for $input";
 }
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transform.dart
index 26b718d..1695388 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transform.dart
@@ -7,7 +7,6 @@
 import 'asset.dart';
 import 'asset_set.dart';
 import 'base_transform.dart';
-import 'transform_logger.dart';
 import 'transform_node.dart';
 
 /// While a [Transformer] represents a *kind* of transformation, this defines
@@ -18,10 +17,10 @@
 /// the transformation. It lets the [Transformer] access inputs and generate
 /// outputs.
 class Transform extends BaseTransform {
-  final AssetSet _outputs;
+  final _outputs = new AssetSet();
 
-  Transform(TransformNode node, this._outputs, LogFunction logFunction)
-    : super(node, logFunction);
+  Transform._(TransformNode node)
+    : super(node);
 
   /// Stores [output] as the output created by this transformation.
   ///
@@ -32,3 +31,14 @@
     _outputs.add(output);
   }
 }
+
+/// The controller for [Transform].
+class TransformController extends BaseTransformController {
+  Transform get transform => super.transform;
+
+  /// The set of assets that the transformer has emitted.
+  AssetSet get outputs => transform._outputs;
+
+  TransformController(TransformNode node)
+      : super(new Transform._(node));
+}
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 8aeb657..4b0a076 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -6,17 +6,15 @@
 
 import 'dart:async';
 
-import 'package:source_maps/span.dart';
-
 import 'asset.dart';
 import 'asset_id.dart';
 import 'asset_node.dart';
-import 'asset_set.dart';
 import 'declaring_transform.dart';
 import 'errors.dart';
 import 'lazy_transformer.dart';
 import 'log.dart';
 import 'phase.dart';
+import 'stream_pool.dart';
 import 'transform.dart';
 import 'transformer.dart';
 import 'utils.dart';
@@ -42,19 +40,8 @@
   /// The subscription to [primary]'s [AssetNode.onStateChange] stream.
   StreamSubscription _primarySubscription;
 
-  // TODO(nweiz): Remove this and move isPrimary computation into TransformNode.
-  /// Whether the parent [PhaseInput] is currently computing whether its input
-  /// is primary for [this].
-  bool _pendingIsPrimary = false;
-
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => _pendingIsPrimary || _isApplying;
-
-  /// Whether any input has become dirty since [_apply] last started running.
-  var _hasBecomeDirty = false;
-
-  /// Whether [_apply] is currently running.
-  var _isApplying = false;
+  bool get isDirty => !_state.isDone;
 
   /// Whether [transformer] is lazy and this transform has yet to be forced.
   bool _isLazy;
@@ -65,16 +52,21 @@
   /// The controllers for the asset nodes emitted by this node.
   var _outputControllers = new Map<AssetId, AssetNodeController>();
 
-  // TODO(nweiz): It's weird that this is different than the [onDone] stream the
-  // other nodes emit. See if we can make that more consistent.
-  /// A stream that emits an event whenever [onDirty] changes its value.
+  /// The controller that's used to pass [primary] 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. [_passThroughController] will be null
+  /// if the asset is not being passed through.
+  AssetNodeController _passThroughController;
+
+  /// A stream that emits an event whenever [this] is no longer dirty.
   ///
   /// This is synchronous in order to guarantee that it will emit an event as
-  /// soon as [isDirty] changes. It's possible for this to emit multiple events
-  /// while [isDirty] is `true`. However, it will only emit a single event each
-  /// time [isDirty] becomes `false`.
-  Stream get onStateChange => _onStateChangeController.stream;
-  final _onStateChangeController = new StreamController.broadcast(sync: true);
+  /// soon as [isDirty] flips from `true` to `false`.
+  Stream get onDone => _onDoneController.stream;
+  final _onDoneController = new StreamController.broadcast(sync: true);
 
   /// A stream that emits any new assets emitted by [this].
   ///
@@ -88,8 +80,21 @@
   /// 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.
-  Stream<LogEntry> get onLog => _onLogController.stream;
-  final _onLogController = new StreamController<LogEntry>.broadcast(sync: true);
+  Stream<LogEntry> get onLog => _onLogPool.stream;
+  final _onLogPool = new StreamPool<LogEntry>.broadcast();
+
+  /// The current state of [this].
+  var _state = _TransformNodeState.PROCESSING;
+
+  /// Whether [this] has been marked as removed.
+  bool get _isRemoved => _onAssetController.isClosed;
+
+  /// Whether the most recent run of this transform has declared that it
+  /// consumes the primary input.
+  ///
+  /// Defaults to `false`. This is not meaningful unless [_state] is
+  /// [_TransformNodeState.APPLIED].
+  bool _consumePrimary = false;
 
   TransformNode(this.phase, Transformer transformer, this.primary,
       this._location)
@@ -99,12 +104,11 @@
       if (state.isRemoved) {
         remove();
       } else {
-        if (state.isDirty) _pendingIsPrimary = true;
-        _dirty();
+        _dirty(primaryChanged: true);
       }
     });
 
-    _apply();
+    _process();
   }
 
   /// The [TransformInfo] describing this node.
@@ -120,15 +124,14 @@
   /// 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() {
-    _hasBecomeDirty = false;
     _onAssetController.close();
-    _onStateChangeController.close();
+    _onDoneController.close();
     _primarySubscription.cancel();
-    for (var subscription in _inputSubscriptions.values) {
-      subscription.cancel();
-    }
-    for (var controller in _outputControllers.values) {
-      controller.setRemoved();
+    _clearInputSubscriptions();
+    _clearOutputs();
+    if (_passThroughController != null) {
+      _passThroughController.setRemoved();
+      _passThroughController = null;
     }
   }
 
@@ -139,47 +142,81 @@
     // transform's outputs have gone unused, we switch it back to lazy mode.
     if (!_isLazy) return;
     _isLazy = false;
-    _dirty();
-  }
-
-  // TODO(nweiz): remove this and move isPrimary computation into TransformNode.
-  /// Mark that the parent [PhaseInput] has determined that its input is indeed
-  /// primary for [this].
-  void markPrimary() {
-    if (!_pendingIsPrimary) return;
-    _pendingIsPrimary = false;
-    if (!_isApplying) _apply();
+    _dirty(primaryChanged: false);
   }
 
   /// Marks this transform as dirty.
   ///
   /// This causes all of the transform's outputs to be marked as dirty as well.
-  void _dirty() {
+  /// [primaryChanged] should be true if and only if [this] was set dirty
+  /// because [primary] changed.
+  void _dirty({bool primaryChanged: false}) {
+    if (!primaryChanged && _state.isNotPrimary) return;
+
+    if (_passThroughController != null) _passThroughController.setDirty();
     for (var controller in _outputControllers.values) {
       controller.setDirty();
     }
 
-    _hasBecomeDirty = true;
-    _onStateChangeController.add(null);
-    if (!_isApplying && !_pendingIsPrimary) _apply();
+    if (_state.isDone) {
+      if (primaryChanged) {
+        _process();
+      } else {
+        _apply();
+      }
+    } else if (primaryChanged) {
+      _state = _TransformNodeState.NEEDS_IS_PRIMARY;
+    } else if (!_state.needsIsPrimary) {
+      _state = _TransformNodeState.NEEDS_APPLY;
+    }
+  }
+
+  /// Determines whether [primary] is primary for [transformer], and if so runs
+  /// [transformer.apply].
+  void _process() {
+    // Clear all the old input subscriptions. If an input is re-used, we'll
+    // re-subscribe.
+    _clearInputSubscriptions();
+    _state = _TransformNodeState.PROCESSING;
+    primary.whenAvailable((_) {
+      _state = _TransformNodeState.PROCESSING;
+      return transformer.isPrimary(primary.asset);
+    }).catchError((error, stackTrace) {
+      // If the transform became dirty while processing, ignore any errors from
+      // it.
+      if (_state.needsIsPrimary || _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 false;
+    }).then((isPrimary) {
+      if (_isRemoved) return;
+      if (_state.needsIsPrimary) {
+        _process();
+      } else if (isPrimary) {
+        _apply();
+      } else {
+        _clearOutputs();
+        _emitPassThrough();
+        _state = _TransformNodeState.NOT_PRIMARY;
+        _onDoneController.add(null);
+      }
+    });
   }
 
   /// Applies this transform.
   void _apply() {
     assert(!_onAssetController.isClosed);
 
-    // Clear all the old input subscriptions. If an input is re-used, we'll
-    // re-subscribe.
-    for (var subscription in _inputSubscriptions.values) {
-      subscription.cancel();
-    }
-    _inputSubscriptions.clear();
-
-    _isApplying = true;
-    _onStateChangeController.add(null);
+    // Clear input subscriptions here as well as in [_process] because [_apply]
+    // may be restarted independently if only a secondary input changes.
+    _clearInputSubscriptions();
+    _state = _TransformNodeState.PROCESSING;
     primary.whenAvailable((_) {
-      _hasBecomeDirty = false;
-
+      if (_state.needsIsPrimary) return null;
+      _state = _TransformNodeState.PROCESSING;
       // TODO(nweiz): If [transformer] is a [DeclaringTransformer] but not a
       // [LazyTransformer], we can get some mileage out of doing a declarative
       // first so we know how to hook up the assets.
@@ -188,49 +225,45 @@
     }).catchError((error, stackTrace) {
       // If the transform became dirty while processing, ignore any errors from
       // it.
-      if (_hasBecomeDirty || _onAssetController.isClosed) return;
-
-      if (error is! MissingInputException) {
-        error = new TransformerException(info, error, stackTrace);
-      }
+      if (!_state.isProcessing || _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(error);
+      phase.cascade.reportError(_wrapException(error, stackTrace));
+      return true;
+    }).then((hadError) {
+      if (_isRemoved) return;
 
-      // Remove all the previously-emitted assets.
-      for (var controller in _outputControllers.values) {
-        controller.setRemoved();
-      }
-      _outputControllers.clear();
-    }).then((_) {
-      if (_onAssetController.isClosed) return;
-
-      _isApplying = false;
-      if (_hasBecomeDirty) {
-        // Re-apply the transform if it became dirty while applying.
-        if (!_pendingIsPrimary) _apply();
+      if (_state.needsIsPrimary) {
+        _process();
+      } else if (_state.needsApply) {
+        _apply();
       } else {
-        assert(!isDirty);
-        // Otherwise, notify the parent nodes that it's no longer dirty.
-        _onStateChangeController.add(null);
+        assert(_state.isProcessing);
+        if (hadError) {
+          _clearOutputs();
+          _dontEmitPassThrough();
+        }
+
+        _state = _TransformNodeState.APPLIED;
+        _onDoneController.add(null);
       }
     });
   }
 
   /// Gets the asset for an input [id].
   ///
-  /// If an input with that ID cannot be found, throws an
-  /// [AssetNotFoundException].
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
     return phase.getInput(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) throw new MissingInputException(info, id);
+      if (node == null) throw new AssetNotFoundException(id);
 
-      _inputSubscriptions.putIfAbsent(node.id,
-          () => node.onStateChange.listen((_) => _dirty()));
+      _inputSubscriptions.putIfAbsent(node.id, () {
+        return node.onStateChange.listen((_) => _dirty(primaryChanged: false));
+      });
 
       return node.asset;
     });
@@ -238,13 +271,21 @@
 
   /// Applies the transform so that it produces concrete (as opposed to lazy)
   /// outputs.
-  Future _applyImmediate() {
-    var newOutputs = new AssetSet();
-    var transform = new Transform(this, newOutputs, _log);
+  ///
+  /// Returns whether or not the transformer logged an error.
+  Future<bool> _applyImmediate() {
+    var transformController = new TransformController(this);
+    _onLogPool.add(transformController.onLog);
 
-    return syncFuture(() => transformer.apply(transform)).then((_) {
-      if (_hasBecomeDirty || _onAssetController.isClosed) return;
+    return syncFuture(() {
+      return transformer.apply(transformController.transform);
+    }).then((_) {
+      if (!_state.isProcessing || _onAssetController.isClosed) return false;
+      if (transformController.loggedError) return true;
 
+      _consumePrimary = transformController.consumePrimary;
+
+      var newOutputs = transformController.outputs;
       // Any ids that are for a different package are invalid.
       var invalidIds = newOutputs
           .map((asset) => asset.id)
@@ -262,6 +303,14 @@
         _outputControllers.remove(id).setRemoved();
       }
 
+      // Emit or stop emitting the pass-through asset between removing and
+      // adding outputs to ensure there are no collisions.
+      if (!newOutputs.containsId(primary.id)) {
+        _emitPassThrough();
+      } else {
+        _dontEmitPassThrough();
+      }
+
       // Store any new outputs or new contents for existing outputs.
       for (var asset in newOutputs) {
         var controller = _outputControllers[asset.id];
@@ -273,20 +322,28 @@
           _onAssetController.add(controller.node);
         }
       }
+
+      return false;
     });
   }
 
   /// Applies the transform in declarative mode so that it produces lazy
   /// outputs.
-  Future _declareLazy() {
-    var newIds = new Set();
-    var transform = new DeclaringTransform(this, newIds, _log);
+  ///
+  /// Returns whether or not the transformer logged an error.
+  Future<bool> _declareLazy() {
+    var transformController = new DeclaringTransformController(this);
 
     return syncFuture(() {
-      return (transformer as LazyTransformer).declareOutputs(transform);
+      return (transformer as LazyTransformer)
+          .declareOutputs(transformController.transform);
     }).then((_) {
-      if (_hasBecomeDirty || _onAssetController.isClosed) return;
+      if (!_state.isProcessing || _onAssetController.isClosed) return false;
+      if (transformController.loggedError) return true;
 
+      _consumePrimary = transformController.consumePrimary;
+
+      var newIds = transformController.outputIds;
       var invalidIds =
           newIds.where((id) => id.package != phase.cascade.package).toSet();
       for (var id in invalidIds) {
@@ -301,6 +358,14 @@
         _outputControllers.remove(id).setRemoved();
       }
 
+      // Emit or stop emitting the pass-through asset between removing and
+      // adding outputs to ensure there are no collisions.
+      if (!newIds.contains(primary.id)) {
+        _emitPassThrough();
+      } else {
+        _dontEmitPassThrough();
+      }
+
       for (var id in newIds) {
         var controller = _outputControllers[id];
         if (controller != null) {
@@ -311,16 +376,125 @@
           _onAssetController.add(controller.node);
         }
       }
+
+      return false;
     });
   }
 
-  void _log(AssetId asset, LogLevel level, String message, Span span) {
-    // If the log isn't already associated with an asset, use the primary.
-    if (asset == null) asset = primary.id;
-    var entry = new LogEntry(info, asset, level, message, span);
-    _onLogController.add(entry);
+  /// Cancels all subscriptions to secondary input nodes.
+  void _clearInputSubscriptions() {
+    for (var subscription in _inputSubscriptions.values) {
+      subscription.cancel();
+    }
+    _inputSubscriptions.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 asset if it's not being emitted already.
+  void _emitPassThrough() {
+    assert(!_outputControllers.containsKey(primary.id));
+
+    if (_consumePrimary) return;
+    if (_passThroughController == null) {
+      _passThroughController = new AssetNodeController.from(primary);
+      _onAssetController.add(_passThroughController.node);
+    } else {
+      _passThroughController.setAvailable(primary.asset);
+    }
+  }
+
+  /// Stop emitting the pass-through asset if it's being emitted already.
+  void _dontEmitPassThrough() {
+    if (_passThroughController == null) return;
+    _passThroughController.setRemoved();
+    _passThroughController = null;
+  }
+
+  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 $primary";
 }
+
+/// The enum of states that [TransformNode] can be in.
+class _TransformNodeState {
+  /// The transform node is running [Transformer.isPrimary] or
+  /// [Transformer.apply] and doesn't need to re-run them.
+  ///
+  /// If there are no external changes by the time the processing finishes, this
+  /// will transition to [APPLIED] or [NOT_PRIMARY] depending on the result of
+  /// [Transformer.isPrimary]. If the primary input changes, this will
+  /// transition to [NEEDS_IS_PRIMARY]. If a secondary input changes, this will
+  /// transition to [NEEDS_APPLY].
+  static final PROCESSING = const _TransformNodeState._("processing");
+
+  /// The transform is running [Transformer.isPrimary] or [Transformer.apply],
+  /// but since it started the primary input changed, so it will need to re-run
+  /// [Transformer.isPrimary].
+  ///
+  /// This will always transition to [Transformer.PROCESSING].
+  static final NEEDS_IS_PRIMARY =
+    const _TransformNodeState._("needs isPrimary");
+
+  /// The transform is running [Transformer.apply], but since it started a
+  /// secondary input changed, so it will need to re-run [Transformer.apply].
+  ///
+  /// If there are no external changes by the time [Transformer.apply] finishes,
+  /// this will transition to [PROCESSING]. If the primary input changes, this
+  /// will transition to [NEEDS_IS_PRIMARY].
+  static final NEEDS_APPLY = const _TransformNodeState._("needs apply");
+
+  /// The transform has finished running [Transformer.apply], whether or not it
+  /// emitted an error.
+  ///
+  /// If the primary input or a secondary input changes, this will transition to
+  /// [PROCESSING].
+  static final APPLIED = const _TransformNodeState._("applied");
+
+  /// The transform has finished running [Transformer.isPrimary], which returned
+  /// `false`.
+  ///
+  /// If the primary input changes, this will transition to [PROCESSING].
+  static final NOT_PRIMARY = const _TransformNodeState._("not primary");
+
+  /// Whether [this] is [PROCESSING].
+  bool get isProcessing => this == _TransformNodeState.PROCESSING;
+
+  /// Whether [this] is [NEEDS_IS_PRIMARY].
+  bool get needsIsPrimary => this == _TransformNodeState.NEEDS_IS_PRIMARY;
+
+  /// Whether [this] is [NEEDS_APPLY].
+  bool get needsApply => this == _TransformNodeState.NEEDS_APPLY;
+
+  /// Whether [this] is [APPLIED].
+  bool get isApplied => this == _TransformNodeState.APPLIED;
+
+  /// Whether [this] is [NOT_PRIMARY].
+  bool get isNotPrimary => this == _TransformNodeState.NOT_PRIMARY;
+
+  /// Whether the transform has finished running [Transformer.isPrimary] and
+  /// [Transformer.apply].
+  ///
+  /// Specifically, whether [this] is [APPLIED] or [NOT_PRIMARY].
+  bool get isDone => isApplied || isNotPrimary;
+
+  final String name;
+
+  const _TransformNodeState._(this.name);
+
+  String toString() => name;
+}
diff --git a/pkg/barback/lib/src/transformer.dart b/pkg/barback/lib/src/transformer.dart
index 6eed17a..83e2e2b 100644
--- a/pkg/barback/lib/src/transformer.dart
+++ b/pkg/barback/lib/src/transformer.dart
@@ -8,6 +8,7 @@
 
 import 'asset.dart';
 import 'transform.dart';
+import 'utils.dart';
 
 /// A [Transformer] represents a processor that takes in one or more input
 /// assets and uses them to generate one or more output assets.
@@ -19,15 +20,29 @@
 /// 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
-  /// (with leading `.`) that are allowed for the primary inputs to this
-  /// 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 [input] can be a primary input for this transformer.
   ///
   /// While a transformer can read from multiple input files, one must be the
@@ -49,7 +64,7 @@
     if (allowedExtensions == null) return new Future.value(true);
 
     for (var extension in allowedExtensions.split(" ")) {
-      if (input.id.extension == extension) return new Future.value(true);
+      if (input.id.path.endsWith(extension)) return new Future.value(true);
     }
 
     return new Future.value(false);
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index 59c9d4b..d2ce049 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -94,6 +94,25 @@
   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].
diff --git a/pkg/barback/test/package_graph/collisions_test.dart b/pkg/barback/test/package_graph/collisions_test.dart
new file mode 100644
index 0000000..91d00a0
--- /dev/null
+++ b/pkg/barback/test/package_graph/collisions_test.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.source_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("errors if two transformers output the same file", () {
+    initGraph(["app|foo.a"], {"app": [
+      [
+        new RewriteTransformer("a", "b"),
+        new RewriteTransformer("a", "b")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+
+    buildShouldFail([isAssetCollisionException("app|foo.b")]);
+  });
+
+  test("errors if a new transformer outputs the same file as an old "
+      "transformer", () {
+    initGraph(["app|foo.a", "app|foo.b"], {"app": [
+      [
+        new RewriteTransformer("a", "c"),
+        new RewriteTransformer("b", "c")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.b"]);
+    buildShouldFail([isAssetCollisionException("app|foo.c")]);
+  });
+
+  test("a collision returns the first-produced output", () {
+    var rewrite1 = new RewriteTransformer("one", "out");
+    var rewrite2 = new RewriteTransformer("two", "out");
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [[rewrite1, rewrite2]]});
+
+    rewrite1.pauseApply();
+    updateSources(["app|foo.one", "app|foo.two"]);
+    // Wait long enough to ensure that rewrite2 has completed.
+    schedule(pumpEventQueue);
+
+    rewrite1.resumeApply();
+    expectAsset("app|foo.out", "two.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+
+    // Even after the collision is discovered, the first-produced output should
+    // be returned.
+    expectAsset("app|foo.out", "two.out");
+
+    // Even if the other output is updated more recently, the first output
+    // should continue to take precedence.
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+  });
+
+  test("a collision that is later resolved produces an output", () {
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [
+      [
+        new RewriteTransformer("one", "out"),
+        new RewriteTransformer("two", "out")
+      ]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "one.out");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.two"]);
+    expectAsset("app|foo.out", "one.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+    buildShouldSucceed();
+  });
+
+  test("a collision that is later resolved runs transforms", () {
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [
+      [
+        new RewriteTransformer("one", "mid"),
+        new RewriteTransformer("two", "mid")
+      ],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "one.mid.out");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.two"]);
+    expectAsset("app|foo.out", "one.mid.out");
+    buildShouldFail([isAssetCollisionException("app|foo.mid")]);
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.mid.out");
+    buildShouldSucceed();
+  });
+
+  test("a collision that is partially resolved returns the second completed "
+      "output", () {
+    var rewrite1 = new RewriteTransformer("one", "out");
+    var rewrite2 = new RewriteTransformer("two", "out");
+    var rewrite3 = new RewriteTransformer("three", "out");
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two",
+      "app|foo.three": "three"
+    }, {"app": [[rewrite1, rewrite2, rewrite3]]});
+
+    // Make rewrite3 the most-recently-completed transformer from the first run.
+    rewrite2.pauseApply();
+    rewrite3.pauseApply();
+    updateSources(["app|foo.one", "app|foo.two", "app|foo.three"]);
+    schedule(pumpEventQueue);
+    rewrite2.resumeApply();
+    schedule(pumpEventQueue);
+    rewrite3.resumeApply();
+    buildShouldFail([
+      isAssetCollisionException("app|foo.out"),
+      isAssetCollisionException("app|foo.out")
+    ]);
+
+    // Then update rewrite3 in a separate build. rewrite2 should still be the
+    // next version of foo.out in line.
+    // TODO(nweiz): Should this emit a collision error as well? Or should they
+    // only be emitted when a file is added or removed?
+    updateSources(["app|foo.three"]);
+    buildShouldSucceed();
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+  });
+
+  test("a collision with a pass-through asset returns the pass-through asset",
+      () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new pass-through asset that collides returns the previous asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new transform output that collides with a pass-through asset returns "
+      "the pass-through asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+}
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 9b67409..011f69f 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -12,34 +12,6 @@
 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("does not report asset not found errors in results", () {
     initGraph(["app|bar.txt"]);
 
@@ -56,7 +28,12 @@
   });
 
   test("reports an error for an unprovided source", () {
-    initGraph(["app|known.txt"]);
+    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([
@@ -154,7 +131,11 @@
   });
 
   test("an error loading an asset removes the asset from the graph", () {
-    initGraph(["app|foo.txt"]);
+    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"]);
@@ -164,164 +145,35 @@
     ]);
   });
 
-  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]]});
+  test("an asset isn't passed through a transformer with an error", () {
+    initGraph(["app|foo.txt"], {"app": [[new BadTransformer([])]]});
 
-    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");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
   });
 
-  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")
-      ]
+  test("a transformer that logs errors shouldn't produce output", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new BadLogTransformer(["app|out.txt"])]
     ]});
 
-    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();
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    expectNoAsset("app|out.txt");
     buildShouldFail([
-      isAssetCollisionException("app|foo.out"),
-      isAssetCollisionException("app|foo.out")
+      isTransformerException(equals("first error")),
+      isTransformerException(equals("second error"))
     ]);
-
-    // 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")]
+  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", "foo");
+    expectAsset("app|foo.txt", "failed to load app|nothing");
     buildShouldSucceed();
-
-    updateSources(["app|foo.in"]);
-    expectAsset("app|foo.txt", "foo");
-    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
   });
 }
diff --git a/pkg/barback/test/package_graph/group_test.dart b/pkg/barback/test/package_graph/group_test.dart
index 2588ebf..468cb8c2 100644
--- a/pkg/barback/test/package_graph/group_test.dart
+++ b/pkg/barback/test/package_graph/group_test.dart
@@ -191,23 +191,23 @@
       buildShouldSucceed();
     });
 
-    // TODO(nweiz): re-enable this test when a transformer can consume its
-    // primary input (issue 16612).
-    // 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")]
-    //     ]), new TransformerGroup([
-    //       [new RewriteTransformer("x", "b")],
-    //       [new RewriteTransformer("b", "z")]
-    //     ])]
-    //   ]});
-    //   updateSources(["app|foo.a", "app|foo.x"]);
-    //   expectAsset("app|foo.c", "foo.b.c");
-    //   expectAsset("app|foo.z", "foo.b.z");
-    //   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", () {
@@ -299,6 +299,35 @@
       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": [[
diff --git a/pkg/barback/test/package_graph/lazy_transformer_test.dart b/pkg/barback/test/package_graph/lazy_transformer_test.dart
index 1c96e02..df249b3 100644
--- a/pkg/barback/test/package_graph/lazy_transformer_test.dart
+++ b/pkg/barback/test/package_graph/lazy_transformer_test.dart
@@ -175,4 +175,58 @@
     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();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/consume_input_test.dart b/pkg/barback/test/package_graph/transform/consume_input_test.dart
new file mode 100644
index 0000000..2580f5d
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/consume_input_test.dart
@@ -0,0 +1,170 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("a transform consumes its input without overwriting it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new RewriteTransformer("txt", "out")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input while a sibling overwrites it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[
+        new RewriteTransformer("txt", "out")..consumePrimary = true,
+        new RewriteTransformer("txt", "txt")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform stops consuming its input", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new ConditionallyConsumePrimaryTransformer("txt", "out", "yes")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "yes.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "no.out");
+    expectAsset("app|foo.txt", "no");
+    buildShouldSucceed();
+  });
+
+  test("two sibling transforms both consume their input", () {
+    initGraph(["app|foo.txt"], {
+      "app": [[
+        new RewriteTransformer("txt", "one")..consumePrimary = true,
+        new RewriteTransformer("txt", "two")..consumePrimary = true
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "foo.one");
+    expectAsset("app|foo.two", "foo.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform stops consuming its input but a sibling is still "
+      "consuming it", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new RewriteTransformer("txt", "one")..consumePrimary = true,
+        new ConditionallyConsumePrimaryTransformer("txt", "two", "yes")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "yes.one");
+    expectAsset("app|foo.two", "yes.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "no.one");
+    expectAsset("app|foo.two", "no.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input and emits nothing", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new EmitNothingTransformer("txt")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input, then is removed", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new RewriteTransformer("txt", "out")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[]]);
+    expectNoAsset("app|foo.out");
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input and emits nothing, then is removed",
+      () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new EmitNothingTransformer("txt")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[]]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+  });
+
+  test("a transform which consumes its input is added", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[
+      new RewriteTransformer("txt", "out")..consumePrimary = true
+    ]]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/pkg/barback/test/transformer/bad_log.dart b/pkg/barback/test/transformer/bad_log.dart
new file mode 100644
index 0000000..9e49f8b
--- /dev/null
+++ b/pkg/barback/test/transformer/bad_log.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.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);
+
+  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+
+  Future doApply(Transform transform) {
+    return newFuture(() {
+      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/pkg/barback/test/transformer/catch_asset_not_found.dart b/pkg/barback/test/transformer/catch_asset_not_found.dart
new file mode 100644
index 0000000..2e4e24b
--- /dev/null
+++ b/pkg/barback/test/transformer/catch_asset_not_found.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. 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 'package:barback/src/utils.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);
+
+  Future<bool> doIsPrimary(Asset asset) =>
+      new Future.value(asset.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/pkg/barback/test/transformer/conditionally_consume_primary.dart b/pkg/barback/test/transformer/conditionally_consume_primary.dart
new file mode 100644
index 0000000..e37aebf
--- /dev/null
+++ b/pkg/barback/test/transformer/conditionally_consume_primary.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.conditionally_consume_primary;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'rewrite.dart';
+
+/// A transformer that consumes its primary input only if its contents match a
+/// given pattern.
+class ConditionallyConsumePrimaryTransformer extends RewriteTransformer {
+  final Pattern content;
+
+  ConditionallyConsumePrimaryTransformer(String from, String to, this.content)
+      : super(from, to);
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform).then((primary) {
+      return primary.readAsString().then((value) {
+        if (value.contains(content)) transform.consumePrimary();
+        return super.doApply(transform);
+      });
+    });
+  }
+}
diff --git a/pkg/barback/test/transformer/emit_nothing.dart b/pkg/barback/test/transformer/emit_nothing.dart
new file mode 100644
index 0000000..d68fecd
--- /dev/null
+++ b/pkg/barback/test/transformer/emit_nothing.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.emit_nothing;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that emits no assets.
+class EmitNothingTransformer extends MockTransformer {
+  final String extension;
+
+  EmitNothingTransformer(this.extension);
+
+  Future<bool> doIsPrimary(Asset asset) =>
+    new Future.value(asset.id.extension == ".$extension");
+
+  Future doApply(Transform transform) => new Future.value();
+
+  String toString() => "$extension->nothing";
+}
diff --git a/pkg/barback/test/transformer/lazy_rewrite.dart b/pkg/barback/test/transformer/lazy_rewrite.dart
index 61c00e5..f694a0e 100644
--- a/pkg/barback/test/transformer/lazy_rewrite.dart
+++ b/pkg/barback/test/transformer/lazy_rewrite.dart
@@ -18,6 +18,7 @@
       : super(from, to);
 
   Future declareOutputs(DeclaringTransform transform) {
+    if (consumePrimary) transform.consumePrimary();
     for (var extension in to.split(" ")) {
       var id = transform.primaryInput.id.changeExtension(".$extension");
       transform.declareOutput(id);
diff --git a/pkg/barback/test/transformer/mock.dart b/pkg/barback/test/transformer/mock.dart
index 57d3f07..413b5b0 100644
--- a/pkg/barback/test/transformer/mock.dart
+++ b/pkg/barback/test/transformer/mock.dart
@@ -56,6 +56,10 @@
   /// 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");
@@ -176,6 +180,7 @@
     _numRuns++;
     if (_runningTransforms == 0) _started.complete();
     _runningTransforms++;
+    if (consumePrimary) transform.consumePrimary();
     return newFuture(() => doApply(transform)).then((_) {
       if (_apply != null) return _apply.future;
     }).whenComplete(() {
diff --git a/pkg/barback/test/transformer_test.dart b/pkg/barback/test/transformer_test.dart
index 9df3f4a..902e140 100644
--- a/pkg/barback/test/transformer_test.dart
+++ b/pkg/barback/test/transformer_test.dart
@@ -27,6 +27,19 @@
           completion(isFalse));
     });
 
+    test("supports multi-level extensions with allowedExtensions", () {
+      var transformer = new ExtensionTransformer(".dart.js");
+      expect(transformer.isPrimary(makeAsset("foo.dart.js")),
+          completion(isTrue));
+
+      expect(transformer.isPrimary(makeAsset("foo.js")), completion(isFalse));
+      expect(transformer.isPrimary(makeAsset("foo.dart")), completion(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(makeAsset("foo.txt")),
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 53df906..4d72a2b 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -17,9 +17,13 @@
 import 'package:unittest/compact_vm_config.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/emit_nothing.dart';
 export 'transformer/lazy_bad.dart';
 export 'transformer/lazy_many_to_one.dart';
 export 'transformer/lazy_rewrite.dart';
@@ -95,6 +99,8 @@
 
   _provider = new MockProvider(assetMap);
   _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;
 
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 5b4aaef..9322ccd 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -472,10 +472,6 @@
 
   int get hashCode => _proxy.hashCode;
 
-  void getContentsToReceiver(Source_ContentReceiver receiver) {
-    _proxy.getContentsToReceiver(receiver);
-  }
-
   TimestampedData<String> get contents => _proxy.contents;
 
   String get encoding => _proxy.encoding;
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 509fae8..3ff8c5d 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -4,7 +4,7 @@
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: "0.13.0-dev.4"
+  analyzer: "0.13.0-dev.6"
   barback: ">=0.11.0 <0.12.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/compiler_unsupported/changelog.md b/pkg/compiler_unsupported/changelog.md
new file mode 100644
index 0000000..e5d2021
--- /dev/null
+++ b/pkg/compiler_unsupported/changelog.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## Version 0.7.1
+Upgrade to SDK 1.3.0-dev.3.2.
+
diff --git a/pkg/compiler_unsupported/pubspec.yaml b/pkg/compiler_unsupported/pubspec.yaml
index e7d65b1..a228bcd 100644
--- a/pkg/compiler_unsupported/pubspec.yaml
+++ b/pkg/compiler_unsupported/pubspec.yaml
@@ -1,5 +1,5 @@
 name: compiler_unsupported
-version: 0.7.0
+version: 0.7.1
 author: Dart2js Team <compiler-dev@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index f54e757..dab055b 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -5,6 +5,7 @@
 library base_request;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'byte_stream.dart';
 import 'client.dart';
@@ -79,7 +80,9 @@
 
   /// Creates a new HTTP request.
   BaseRequest(this.method, this.url)
-    : headers = <String, String>{};
+    : headers = new LinkedHashMap(
+        equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
+        hashCode: (key) => key.toLowerCase().hashCode);
 
   /// Finalizes the HTTP request in preparation for it being sent. This freezes
   /// all mutable fields and returns a single-subscription [ByteStream] that
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 03288ec..3821bb0 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.9.2+3
+version: 0.9.3-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 929cc63..08e2ef9 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -271,6 +271,13 @@
       expect(request.headers[HttpHeaders.CONTENT_TYPE], isNull);
     });
 
+    test('name is case insensitive', () {
+      var request = new http.Request('POST', dummyUrl);
+      request.headers['CoNtEnT-tYpE'] = 'application/json';
+      expect(request.headers,
+          containsPair('content-type', 'application/json'));
+    });
+
     test('is set to application/x-www-form-urlencoded with charset utf-8 if '
         'bodyFields is set', () {
       var request = new http.Request('POST', dummyUrl);
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index dfaed73..5ed556a 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -5,7 +5,7 @@
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
-  analyzer: "0.13.0-dev.4"
+  analyzer: "0.13.0-dev.6"
   path: ">=0.9.0 <2.0.0"
 dev_dependencies:
   serialization: ">=0.9.0 <0.10.0"
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 460e1b8..fdb276a 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.0-pre.0
+version: 0.10.0-pre.2
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -9,7 +9,7 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.4"
+  analyzer: "0.13.0-dev.6"
   barback: ">=0.9.0 <0.13.0"
   logging: ">=0.9.0 <0.10.0"
   path: ">=0.9.0 <2.0.0"
diff --git a/pkg/observe/test/transformer_test.dart b/pkg/observe/test/transformer_test.dart
index 159cf49..1687d8a 100644
--- a/pkg/observe/test/transformer_test.dart
+++ b/pkg/observe/test/transformer_test.dart
@@ -142,6 +142,7 @@
 }
 
 class _MockTransform implements Transform {
+  bool shouldConsumePrimary = false;
   List<Asset> outs = [];
   Asset _asset;
   TransformLogger logger = new TransformLogger(_mockLogFn);
@@ -157,6 +158,10 @@
     outs.add(output);
   }
 
+  void consumePrimary() {
+    shouldConsumePrimary = true;
+  }
+
   readInput(id) => throw new UnimplementedError();
   readInputAsString(id, {encoding}) => throw new UnimplementedError();
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 00290a7..152c39b 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -16,8 +16,8 @@
 
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
-
 polymer/test/event_path_test: Pass, Fail # Issue 15766
+docgen/test/generate_json_test: Skip # Issue 17430
 
 [ $compiler == dart2js ]
 collection/test/equality_test/01: Fail # Issue 1533
@@ -41,9 +41,6 @@
 [ $runtime == jsshell ]
 analyzer/test/generated/element_test: Pass, Slow # Issue 16473
 
-[ $compiler == dart2js && $checked && $runtime == drt && $nocsp ]
-async/test/stream_zip_test: RuntimeError # Issue 16719
-
 [ $runtime == d8 || $runtime == jsshell ]
 unittest/test/unittest_nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
 stack_trace/test/vm_test: RuntimeError, OK # VM-specific traces
@@ -181,7 +178,7 @@
 intl/test/date_time_format_http_request_test: Fail # TODO(kasperl): Please triage.
 
 [ $browser ]
-analysis_server/test/channel_test: Skip # Uses dart:io.
+analysis_server/test/*: Skip # Uses dart:io.
 analyzer/test/generated/ast_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/parser_test: Fail, OK # Uses dart:io.
@@ -265,6 +262,8 @@
 unittest/test/unittest_correct_callback_test: Fail # 13921
 unittest/test/unittest_exception_test: Fail # 13921
 unittest/test/unittest_excess_callback_test: Fail # 13921
+unittest/test/unittest_expect_async_args_test: Fail # 13921
+unittest/test/unittest_expect_async_test: Fail # 13921
 unittest/test/unittest_group_name_test: Fail # 13921
 unittest/test/unittest_invalid_ops_test: Fail # 13921
 unittest/test/unittest_late_exception_test: Fail # 13921
@@ -281,12 +280,12 @@
 unittest/test/unittest_test_returning_future_test: Fail # 13921
 unittest/test/unittest_test_returning_future_using_runasync_test: Fail # 13921
 unittest/test/unittest_testcases_immutable_test: Fail # 13921
-polymer/test/custom_event_test: Pass, Crash # 14360
-polymer/example/canonicalization/test/deploy_test: Fail, OK # tests deploy only behavior
 polymer/example/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
 polymer/example/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
-polymer/example/canonicalization/test/dir/deploy_test: Fail, OK # tests deploy only behavior
+polymer/example/canonicalization/test/deploy_test: Fail, OK # tests deploy only behavior
 polymer/example/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
+polymer/example/canonicalization/test/dir/deploy_test: Fail, OK # tests deploy only behavior
+polymer/test/custom_event_test: Pass, Crash # 14360
 
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) && $checked ]
 polymer/test/custom_event_test: Skip # http://dartbug.com/15517
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index c8932a9..818b5cc 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -5,6 +5,7 @@
 third_party/pkg/route_hierarchical: Fail
 
 samples/third_party/angular_todo: Pass, Slow
+samples/third_party/dromaeo: Pass, Slow
 samples/third_party/pop-pop-win: Pass, Slow
 samples/searchable_list: Pass, Slow
 pkg/docgen: Pass, Slow
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index f7bf7ea..abaa275 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -318,7 +318,8 @@
         var uri = directive.uri.stringValue;
         var span = _getSpan(file, directive.uri);
 
-        var id = resolve(sourceId, uri, transform.logger, span);
+        var id = resolve(sourceId, uri, transform.logger, span,
+            allowAbsolute: true);
         if (id == null) continue;
 
         var primaryId = transform.primaryInput.id;
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 06004eb..acd9c63 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -244,31 +244,13 @@
     _inPolymerElement = oldValue;
   }
 
-  /// Produces warnings for malformed script tags. In html5 leaving off type= is
-  /// fine, but it defaults to text/javascript. Because this might be a common
-  /// error, we warn about it when  src file ends in .dart, but the type is
-  /// incorrect, or when users write code in an inline script tag of a custom
-  /// element.
-  ///
-  /// The hope is that these cases shouldn't break existing valid code, but that
-  /// they'll help Polymer authors avoid having their Dart code accidentally
-  /// interpreted as JavaScript by the browser.
+  /// Checks for multiple Dart script tags in the same page, which is invalid.
   void _validateScriptElement(Element node) {
     var scriptType = node.attributes['type'];
     var isDart = scriptType == 'application/dart';
     var src = node.attributes['src'];
 
-    if (scriptType == null) {
-      if (src == null && _inPolymerElement) {
-        // TODO(sigmund): revisit this check once we start interop with polymer
-        // elements written in JS. Maybe we need to inspect the contents of the
-        // script to find whether there is an import or something that indicates
-        // that the code is indeed using Dart.
-        _logger.warning('script tag in polymer element with no type will '
-            'be treated as JavaScript. Did you forget type="application/dart"?',
-            span: node.sourceSpan);
-      }
-    } else if (isDart) {
+    if (isDart) {
       if (_dartTagSeen) {
         _logger.warning('Only one "application/dart" script tag per document '
             'is allowed.', span: node.sourceSpan);
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 05f6f56..d9d226f 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.1
+version: 0.10.0-pre.2
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -7,7 +7,7 @@
   browsers.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.4"
+  analyzer: "0.13.0-dev.6"
   args: ">=0.10.0 <0.11.0"
   barback: ">=0.9.0 <0.13.0"
   browser: ">=0.10.0 <0.11.0"
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 57d0e6d..b30b428 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -17,9 +17,13 @@
 
   testPhases('no changes', phases, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
-    }, {
-      'a|web/test.html': '<!DOCTYPE html><html></html>',
-    });
+    }, {}, [
+      'error: To run a polymer application, you need to call "initPolymer". You'
+      ' can either include a generic script tag that does this for you:\'<'
+      'script type="application/dart">export "package:polymer/init.dart";'
+      '</script>\' or add your own script tag and call that function. Make sure'
+      ' the script tag is placed after all HTML imports.'
+    ]);
 
   testPhases('observable changes', phases, {
       'a|web/test.dart': _sampleObservable('A', 'foo'),
@@ -146,7 +150,7 @@
       'a|web/b.dart': _sampleObservable('B', 'bar'),
       'a|web/test2.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<polymer-element>1'
+          '<polymer-element name="x-a">1'
           '<script type="application/dart">'
           '${_sampleObservable("A", "foo")}</script>'
           '</polymer-element></html>',
@@ -155,7 +159,7 @@
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
           '$INTEROP_TAG'
-          '</head><body><polymer-element>1</polymer-element>'
+          '</head><body><polymer-element name="x-a">1</polymer-element>'
           '<script src="index.html_bootstrap.dart.js"></script>'
           '</body></html>',
       'a|web/index.html_bootstrap.dart':
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 6efca44..7db7e4f 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -617,7 +617,7 @@
           '<link rel="stylesheet" href="assets/b/test3.css">'
           '</polymer-element>',
       'b|asset/test3.css':
-          'body {\n  background: #eaeaea url("assets/b/test4.png");\n}\n'
+          'body {\n  background: #eaeaea url("../../assets/b/test4.png");\n}\n'
           '.foo {\n  background: url("../../packages/c/test5.png");\n}',
       'b|asset/test4.png': 'PNG',
       'c|lib/test5.png': 'PNG',
@@ -641,7 +641,7 @@
           '</polymer-element>'
           '</body></html>',
       'b|asset/test3.css':
-          'body {\n  background: #eaeaea url("assets/b/test4.png");\n}\n'
+          'body {\n  background: #eaeaea url("../../assets/b/test4.png");\n}\n'
           '.foo {\n  background: url("../../packages/c/test5.png");\n}',
       'b|asset/test4.png': 'PNG',
       'c|lib/test5.png': 'PNG',
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 4894b55..e302915 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -256,11 +256,7 @@
             <script>foo...</script>
             </polymer-element>
             </html>'''.replaceAll('            ', ''),
-      }, [
-        'warning: script tag in polymer element with no type will '
-        'be treated as JavaScript. Did you forget type="application/dart"?'
-        ' (lib/test.html 2 0)'
-      ]);
+      }, []);
 
     _testLinter('top-level, dart type & .dart url', {
         'a|lib/test.html': '''<html>
@@ -464,6 +460,8 @@
 _testLinter(String name, Map inputFiles, List outputMessages) {
   var linter = new Linter(new TransformOptions());
   var outputFiles = {};
-  inputFiles.forEach((k, v) => outputFiles[k] = v);
+  if (outputMessages.every((m) => m.startsWith('warning:'))) {
+    inputFiles.forEach((k, v) => outputFiles[k] = v);
+  }
   testPhases(name, [[linter]], inputFiles, outputFiles, outputMessages);
 }
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index 9597c4d..199b543 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.10.1
+
+* Add a `StreamMatcher.hasMatch` method.
+
+* The `consumeThrough` and `consumeWhile` matchers for `ScheduledStream` now
+  take `StreamMatcher`s as well as normal `Matcher`s.
+
 ## 0.10.0
 
 * Convert `ScheduledProcess` to expose `stdout` and `stderr` as
diff --git a/pkg/scheduled_test/lib/src/stream_matcher.dart b/pkg/scheduled_test/lib/src/stream_matcher.dart
index f230e10..b5bce1d 100644
--- a/pkg/scheduled_test/lib/src/stream_matcher.dart
+++ b/pkg/scheduled_test/lib/src/stream_matcher.dart
@@ -23,12 +23,24 @@
   factory StreamMatcher.wrap(matcher) =>
       matcher is StreamMatcher ? matcher : nextValue(matcher);
 
+  StreamMatcher();
+
   /// Tries to match [this] against [stream].
   ///
   /// If the match succeeds, this returns `null`. If it fails, this returns a
   /// [Description] describing the failure.
   Future<Description> tryMatch(ScheduledStream stream);
 
+  /// Returns whether [this] would match [stream] without actually consuming
+  /// values from [stream].
+  ///
+  /// If the match succeeds, this returns `null`. If it fails, this returns a
+  /// [Description] describing the failure.
+  Future<Description> hasMatch(ScheduledStream stream) {
+    var fork = stream.fork();
+    return tryMatch(fork).whenComplete(fork.close);
+  }
+
   String toString();
 }
 
@@ -57,20 +69,25 @@
 }
 
 /// A matcher that consumes values emitted by a stream until one matching
-/// [matcher] is emitted.
+/// [streamMatcher] is emitted.
 ///
-/// This will fail if the stream never emits a value that matches [matcher].
+/// This will fail if the stream never emits a value that matches
+/// [streamMatcher].
 ///
-/// [matcher] can be a [Matcher] or an [Object], but not a [StreamMatcher].
-StreamMatcher consumeThrough(matcher) => new _ConsumeThroughMatcher(matcher);
+/// [streamMatcher] can be a [StreamMatcher], a [Matcher] or an [Object].
+StreamMatcher consumeThrough(streamMatcher) =>
+    new _ConsumeThroughMatcher(streamMatcher);
 
 /// A matcher that consumes values emitted by a stream as long as they match
-/// [matcher].
+/// [streamMatcher].
 ///
-/// This matcher will always match a stream. It exists to consume values.
+/// This matcher will always match a stream. It exists to consume values. If
+/// [streamMatcher] consumes more than one value, the next match will begin
+/// after all the consumed values.
 ///
-/// [matcher] can be a [Matcher] or an [Object], but not a [StreamMatcher].
-StreamMatcher consumeWhile(matcher) => new _ConsumeWhileMatcher(matcher);
+/// [streamMatcher] can be a [StreamMatcher], a [Matcher] or an [Object].
+StreamMatcher consumeWhile(streamMatcher) =>
+    new _ConsumeWhileMatcher(streamMatcher);
 
 /// A matcher that matches either [streamMatcher1], [streamMatcher2], or both.
 ///
@@ -102,7 +119,7 @@
 StreamMatcher get isDone => new _IsDoneMatcher();
 
 /// See [nextValue].
-class _NextValueMatcher implements StreamMatcher {
+class _NextValueMatcher extends StreamMatcher {
   final Matcher _matcher;
 
   _NextValueMatcher(matcher)
@@ -126,7 +143,7 @@
 }
 
 /// See [nextValues].
-class _NextValuesMatcher implements StreamMatcher {
+class _NextValuesMatcher extends StreamMatcher {
   final int _n;
   final Matcher _matcher;
 
@@ -165,7 +182,7 @@
 }
 
 /// See [inOrder].
-class _InOrderMatcher implements StreamMatcher {
+class _InOrderMatcher extends StreamMatcher {
   final List<StreamMatcher> _matchers;
 
   _InOrderMatcher(Iterable streamMatchers)
@@ -196,20 +213,20 @@
 }
 
 /// See [consumeThrough].
-class _ConsumeThroughMatcher implements StreamMatcher {
-  final Matcher _matcher;
+class _ConsumeThroughMatcher extends StreamMatcher {
+  final StreamMatcher _matcher;
 
-  _ConsumeThroughMatcher(matcher)
-      : _matcher = wrapMatcher(matcher);
+  _ConsumeThroughMatcher(streamMatcher)
+      : _matcher = new StreamMatcher.wrap(streamMatcher);
 
   Future<Description> tryMatch(ScheduledStream stream) {
     consumeNext() {
       return stream.hasNext.then((hasNext) {
         if (!hasNext) return new StringDescription("unexpected end of stream");
 
-        return stream.next().then((value) {
-          if (_matcher.matches(value, {})) return null;
-          return consumeNext();
+        return _matcher.hasMatch(stream).then((failure) {
+          if (failure != null) return stream.next().then((_) => consumeNext());
+          return _matcher.tryMatch(stream);
         });
       });
     }
@@ -218,26 +235,30 @@
   }
 
   String toString() {
-    return new StringDescription('values followed by ')
-        .addDescriptionOf(_matcher).toString();
+    var matcherString = _matcher.toString();
+    if (matcherString.contains("\n")) {
+      return 'values followed by:\n' + prefixLines(matcherString, prefix: '  ');
+    } else {
+      return 'values followed by $matcherString';
+    }
   }
 }
 
 /// See [consumeWhile].
-class _ConsumeWhileMatcher implements StreamMatcher {
-  final Matcher _matcher;
+class _ConsumeWhileMatcher extends StreamMatcher {
+  final StreamMatcher _matcher;
 
   _ConsumeWhileMatcher(matcher)
-      : _matcher = wrapMatcher(matcher);
+      : _matcher = new StreamMatcher.wrap(matcher);
 
   Future<Description> tryMatch(ScheduledStream stream) {
     consumeNext() {
       return stream.hasNext.then((hasNext) {
         if (!hasNext) return new Future.value();
 
-        return _peek(stream).then((value) {
-          if (!_matcher.matches(value, {})) return null;
-          return stream.next().then((_) => consumeNext());
+        return _matcher.hasMatch(stream).then((failure) {
+          if (failure != null) return new Future.value();
+          return _matcher.tryMatch(stream).then((_) => consumeNext());
         });
       });
     }
@@ -246,13 +267,17 @@
   }
 
   String toString() {
-    return new StringDescription('any number of ')
-        .addDescriptionOf(_matcher).toString();
+    var matcherString = _matcher.toString();
+    if (matcherString.contains("\n")) {
+      return 'any number of\n' + prefixLines(matcherString, prefix: '  ');
+    } else {
+      return 'any number of $matcherString';
+    }
   }
 }
 
 /// See [either].
-class _EitherMatcher implements StreamMatcher {
+class _EitherMatcher extends StreamMatcher {
   final StreamMatcher _matcher1;
   final StreamMatcher _matcher2;
 
@@ -302,15 +327,14 @@
 }
 
 /// See [allow].
-class _AllowMatcher implements StreamMatcher {
+class _AllowMatcher extends StreamMatcher {
   final StreamMatcher _matcher;
 
   _AllowMatcher(streamMatcher)
       : _matcher = new StreamMatcher.wrap(streamMatcher);
 
   Future<Description> tryMatch(ScheduledStream stream) {
-    var fork = stream.fork();
-    return _matcher.tryMatch(fork).whenComplete(fork.close).then((failure) {
+    return _matcher.hasMatch(stream).then((failure) {
       if (failure != null) return null;
       return _matcher.tryMatch(stream);
     });
@@ -324,20 +348,18 @@
 }
 
 /// See [never].
-class _NeverMatcher implements StreamMatcher {
+class _NeverMatcher extends StreamMatcher {
   final StreamMatcher _matcher;
 
   _NeverMatcher(streamMatcher)
-      : _matcher = new StreamMatcher.wrap(streamMatcher);
+    : _matcher = new StreamMatcher.wrap(streamMatcher);
 
   Future<Description> tryMatch(ScheduledStream stream) {
     consumeNext() {
       return stream.hasNext.then((hasNext) {
         if (!hasNext) return new Future.value();
 
-        var fork = stream.fork();
-        return _matcher.tryMatch(fork).whenComplete(fork.close)
-            .then((failure) {
+        return _matcher.hasMatch(stream).then((failure) {
           if (failure != null) {
             return stream.next().then((_) => consumeNext());
           }
@@ -356,7 +378,7 @@
 }
 
 /// See [isDone].
-class _IsDoneMatcher implements StreamMatcher {
+class _IsDoneMatcher extends StreamMatcher {
   _IsDoneMatcher();
 
   Future<Description> tryMatch(ScheduledStream stream) {
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 53f74f7..55fea14 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.10.0
+version: 0.10.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart b/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart
index 93c6b43..d712744 100644
--- a/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart
+++ b/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart
@@ -183,23 +183,25 @@
   expectTestPasses("consumeThrough() consumes values through the given matcher",
       () {
     var stream = createStream();
-    stream.expect(consumeThrough(greaterThan(2)));
+    stream.expect(consumeThrough(inOrder([2, 3])));
     stream.expect(4);
   });
 
   expectTestPasses("consumeThrough() will stop if the first value matches", () {
     var stream = createStream();
-    stream.expect(consumeThrough(1));
-    stream.expect(2);
+    stream.expect(consumeThrough(inOrder([1, 2])));
+    stream.expect(3);
   });
 
   expectTestFails("consumeThrough() will fail if the stream ends before the "
       "value is reached", () {
-    createStream().expect(consumeThrough(100));
+    createStream().expect(consumeThrough(inOrder([5, 6])));
   }, (errors) {
     expect(errors, hasLength(1));
     expect(errors.first.error.message, equals(
-        "Expected: values followed by <100>\n"
+        "Expected: values followed by:\n"
+        "        |   * <5>\n"
+        "        |   * <6>\n"
         " Emitted: * 1\n"
         "          * 2\n"
         "          * 3\n"
@@ -215,10 +217,16 @@
     stream.expect(4);
   });
 
+  expectTestPasses("consumeWhile() consumes values in chunks", () {
+    var stream = createStream();
+    stream.expect(consumeWhile(inOrder([anything, anything])));
+    stream.expect(5);
+  });
+
   expectTestPasses("consumeWhile() will stop if the first value doesn't match",
       () {
     var stream = createStream();
-    stream.expect(consumeWhile(2));
+    stream.expect(consumeWhile(inOrder([2, 3])));
     stream.expect(1);
   });
 
diff --git a/pkg/unittest/lib/src/spread_args_helper.dart b/pkg/unittest/lib/src/spread_args_helper.dart
index 41411b9..b3021eb 100644
--- a/pkg/unittest/lib/src/spread_args_helper.dart
+++ b/pkg/unittest/lib/src/spread_args_helper.dart
@@ -1,5 +1,12 @@
 part of unittest;
 
+const _PLACE_HOLDER = const _ArgPlaceHolder();
+
+/// Used to track unused positional args.
+class _ArgPlaceHolder {
+  const _ArgPlaceHolder();
+}
+
 /** Simulates spread arguments using named arguments. */
 // TODO(sigmund): remove this class and simply use a closure with named
 // arguments (if still applicable).
@@ -14,7 +21,7 @@
   bool complete;
 
   _SpreadArgsHelper(Function callback, int minExpected, int maxExpected,
-      Function isDone, String id)
+      String id, {bool isDone()})
       : this.callback = callback,
         minExpectedCalls = minExpected,
         maxExpectedCalls = (maxExpected == 0 && minExpected > 0)
@@ -90,31 +97,49 @@
     }
   }
 
-  invoke0() {
-    return _guardAsync(
-        () {
-          if (shouldCallBack()) {
-            return callback();
-          }
-        },
-        after, testCase);
+  /// Returns a function that has as many required + positional arguments as
+  /// [callback] (up to a total of 6).
+  ///
+  /// Optional positional arguments are supported by using const place-holders
+  Function get func {
+    if (callback is _Func6) return _max6;
+    if (callback is _Func5) return _max5;
+    if (callback is _Func4) return _max4;
+    if (callback is _Func3) return _max3;
+    if (callback is _Func2) return _max2;
+    if (callback is _Func1) return _max1;
+    if (callback is _Func0) return _max0;
+
+    throw new ArgumentError(
+        'The callback argument has more than 6 required arguments');
   }
 
-  invoke1(arg1) {
-    return _guardAsync(
-        () {
-          if (shouldCallBack()) {
-            return callback(arg1);
-          }
-        },
-        after, testCase);
-  }
+  /// This indirection is critical. It ensures the returned function has an
+  /// argument count of zero.
+  _max0() => _max6();
 
-  invoke2(arg1, arg2) {
+  _max1([a0 = _PLACE_HOLDER]) => _max6(a0);
+
+  _max2([a0 = _PLACE_HOLDER, a1 = _PLACE_HOLDER]) => _max6(a0, a1);
+
+  _max3([a0 = _PLACE_HOLDER, a1 = _PLACE_HOLDER, a2 = _PLACE_HOLDER]) =>
+      _max6(a0, a1, a2);
+
+  _max4([a0 = _PLACE_HOLDER, a1 = _PLACE_HOLDER, a2 = _PLACE_HOLDER,
+      a3 = _PLACE_HOLDER]) => _max6(a0, a1, a2, a3);
+
+  _max5([a0 = _PLACE_HOLDER, a1 = _PLACE_HOLDER, a2 = _PLACE_HOLDER,
+      a3 = _PLACE_HOLDER, a4 = _PLACE_HOLDER]) => _max6(a0, a1, a2, a3, a4);
+
+  _max6([a0 = _PLACE_HOLDER, a1 = _PLACE_HOLDER, a2 = _PLACE_HOLDER,
+      a3 = _PLACE_HOLDER, a4 = _PLACE_HOLDER, a5 = _PLACE_HOLDER]) {
+    var args = [a0, a1, a2, a3, a4, a5];
+    args.removeWhere((a) => a == _PLACE_HOLDER);
+
     return _guardAsync(
         () {
           if (shouldCallBack()) {
-            return callback(arg1, arg2);
+            return Function.apply(callback, args);
           }
         },
         after, testCase);
@@ -131,3 +156,11 @@
     }
   }
 }
+
+typedef _Func0();
+typedef _Func1(a);
+typedef _Func2(a, b);
+typedef _Func3(a, b, c);
+typedef _Func4(a, b, c, d);
+typedef _Func5(a, b, c, d, e);
+typedef _Func6(a, b, c, d, e, f);
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index da95fae..9add42c 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -325,22 +325,8 @@
  * bound.
  */
 Function expectAsync(Function callback,
-                     {int count: 1, int max: 0, String id}) {
-  var minArgs = _minArgs(callback);
-
-  switch(minArgs) {
-    case 0:
-      return new _SpreadArgsHelper(callback, count, max, null, id).invoke0;
-    case 1:
-      return new _SpreadArgsHelper(callback, count, max, null, id).invoke1;
-    case 2:
-      return new _SpreadArgsHelper(callback, count, max, null, id).invoke2;
-    default:
-      // _minArgs throws an argument exception if the arg count is > 2.
-      // this is just for paranoia
-      throw new StateError('Should never get here');
-  }
-}
+    {int count: 1, int max: 0, String id}) =>
+  new _SpreadArgsHelper(callback, count, max, id).func;
 
 /**
  * *Deprecated*
@@ -382,22 +368,8 @@
  * identify the callback in error messages (for example if it is called
  * after the test case is complete).
  */
-Function expectAsyncUntil(Function callback, Function isDone, {String id}) {
-  var minArgs = _minArgs(callback);
-
-  switch(minArgs) {
-    case 0:
-      return new _SpreadArgsHelper(callback, 0, -1, isDone, id).invoke0;
-    case 1:
-      return new _SpreadArgsHelper(callback, 0, -1, isDone, id).invoke1;
-    case 2:
-      return new _SpreadArgsHelper(callback, 0, -1, isDone, id).invoke2;
-    default:
-      // _minArgs throws an argument exception if the arg count is > 2.
-      // this is just for paranoia
-      throw new StateError('Should never get here');
-  }
-}
+Function expectAsyncUntil(Function callback, bool isDone(), {String id}) =>
+    new _SpreadArgsHelper(callback, 0, -1, id, isDone: isDone).func;
 
 /**
  * *Deprecated*
@@ -770,18 +742,3 @@
     return frame.package != 'unittest' || frame.member != 'TestCase._runTest';
   })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore);
 }
-
-typedef _Func0();
-typedef _Func1(a);
-typedef _Func2(a, b);
-
-/**
- * Throws an [ArgumentError] if the callback has more than 2 required arguments.
- */
-int _minArgs(Function callback) {
-  if (callback is _Func0) return 0;
-  if (callback is _Func1) return 1;
-  if (callback is _Func2) return 2;
-  throw new ArgumentError(
-      'The callback argument has more than 2 required arguments.');
-}
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
index 92ab891..19c5b89 100644
--- a/pkg/unittest/test/missing_tick_test.dart
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -10,7 +10,7 @@
   config.timeout = const Duration(seconds: 2);
   group('Broken', () {
     test('test that should time out', () {
-      expectAsync0(() {});
+      expectAsync(() {});
     });
   });
 }
diff --git a/pkg/unittest/test/test_utils.dart b/pkg/unittest/test/test_utils.dart
index de783be..783f71b 100644
--- a/pkg/unittest/test/test_utils.dart
+++ b/pkg/unittest/test/test_utils.dart
@@ -36,7 +36,7 @@
     if (expected is String) {
       expect(errorString, equalsIgnoringWhitespace(expected));
     } else {
-     expect(errorString.replaceAll('\n',''), expected);
+      expect(errorString.replaceAll('\n', ''), expected);
     }
   }
 
diff --git a/pkg/unittest/test/unittest_async_exception_test.dart b/pkg/unittest/test/unittest_async_exception_test.dart
index 34298b7..cc35116 100644
--- a/pkg/unittest/test/unittest_async_exception_test.dart
+++ b/pkg/unittest/test/unittest_async_exception_test.dart
@@ -13,8 +13,8 @@
 
 var testFunction = (_) {
   test(testName, () {
-    expectAsync0(() {});
-    _defer(() => guardAsync(() { throw "error!"; }));
+    expectAsync(() {});
+    _defer(() { throw "error!"; });
   });
 };
 
diff --git a/pkg/unittest/test/unittest_async_setup_teardown_test.dart b/pkg/unittest/test/unittest_async_setup_teardown_test.dart
index a73efc8..067dbf9 100644
--- a/pkg/unittest/test/unittest_async_setup_teardown_test.dart
+++ b/pkg/unittest/test/unittest_async_setup_teardown_test.dart
@@ -19,7 +19,7 @@
     tearDown(() {
       return new Future.value(0);
     });
-    test('foo1', (){});
+    test('foo1', () {});
   });
   group('good setup/bad teardown', () {
     setUp(() {
@@ -28,7 +28,7 @@
     tearDown(() {
       return new Future.error("Failed to complete tearDown");
     });
-    test('foo2', (){});
+    test('foo2', () {});
   });
   group('bad setup/good teardown', () {
     setUp(() {
@@ -37,7 +37,7 @@
     tearDown(() {
       return new Future.value(0);
     });
-    test('foo3', (){});
+    test('foo3', () {});
   });
   group('bad setup/bad teardown', () {
     setUp(() {
@@ -46,7 +46,7 @@
     tearDown(() {
       return new Future.error("Failed to complete tearDown");
     });
-    test('foo4', (){});
+    test('foo4', () {});
   });
   // The next test is just to make sure we make steady progress
   // through the tests.
diff --git a/pkg/unittest/test/unittest_completion_test.dart b/pkg/unittest/test/unittest_completion_test.dart
index 843f9d0..037dee1 100644
--- a/pkg/unittest/test/unittest_completion_test.dart
+++ b/pkg/unittest/test/unittest_completion_test.dart
@@ -14,7 +14,7 @@
 var testFunction = (TestConfiguration testConfig) {
   test(testName, () {
     var _callback;
-    _callback = expectAsyncUntil0(() {
+    _callback = expectAsyncUntil(() {
       if (++testConfig.count < 10) {
         _defer(_callback);
       }
diff --git a/pkg/unittest/test/unittest_correct_callback_test.dart b/pkg/unittest/test/unittest_correct_callback_test.dart
index cd52ba0..43b40ea 100644
--- a/pkg/unittest/test/unittest_correct_callback_test.dart
+++ b/pkg/unittest/test/unittest_correct_callback_test.dart
@@ -13,7 +13,7 @@
 
 var testFunction = (TestConfiguration testConfig) {
   test(testName,
-      () =>_defer(expectAsync0((){ ++testConfig.count;})));
+      () =>_defer(expectAsync((){ ++testConfig.count;})));
 };
 
 var expected = buildStatusString(1, 0, 0, testName, count: 1);
diff --git a/pkg/unittest/test/unittest_excess_callback_test.dart b/pkg/unittest/test/unittest_excess_callback_test.dart
index f3876b5..76a3a9e 100644
--- a/pkg/unittest/test/unittest_excess_callback_test.dart
+++ b/pkg/unittest/test/unittest_excess_callback_test.dart
@@ -13,9 +13,9 @@
 
 var testFunction = (TestConfiguration testConfig) {
   test(testName, () {
-    var _callback0 = expectAsync0(() => ++testConfig.count);
-    var _callback1 = expectAsync0(() => ++testConfig.count);
-    var _callback2 = expectAsync0(() {
+    var _callback0 = expectAsync(() => ++testConfig.count);
+    var _callback1 = expectAsync(() => ++testConfig.count);
+    var _callback2 = expectAsync(() {
       _callback1();
       _callback1();
       _callback0();
diff --git a/pkg/unittest/test/unittest_expect_async_args_test.dart b/pkg/unittest/test/unittest_expect_async_args_test.dart
new file mode 100644
index 0000000..0fd7517
--- /dev/null
+++ b/pkg/unittest/test/unittest_expect_async_args_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittestTest;
+
+import 'dart:isolate';
+import 'dart:async';
+import 'package:unittest/unittest.dart';
+
+part 'unittest_test_utils.dart';
+
+var testFunction = (TestConfiguration testConfig) {
+  List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
+    testConfig.count++;
+    return [a, b, c, d, e, f];
+  }
+
+  test('expect async args', () {
+    expect(expectAsync(_getArgs)(), [0, 0, 0, 0, 0, 0]);
+    expect(expectAsync(_getArgs)(5), [5, 0, 0, 0, 0, 0]);
+    expect(expectAsync(_getArgs)(1, 2, 3, 4, 5, 6), [1, 2, 3, 4, 5, 6]);
+  });
+
+  test('invoked with too many args', () {
+    expectAsync(_getArgs)(1, 2, 3, 4, 5, 6, 7);
+  });
+
+  test('created with too many args', () {
+    expectAsync((a1, a2, a3, a4, a5, a6, a7) {
+      testConfig.count++;
+    })();
+  });
+};
+
+final expected = startsWith('1:0:2:3:3:::null:expect async args::'
+    'invoked with too many args:Test failed:');
diff --git a/pkg/unittest/test/unittest_expect_async_test.dart b/pkg/unittest/test/unittest_expect_async_test.dart
new file mode 100644
index 0000000..a8bbde5
--- /dev/null
+++ b/pkg/unittest/test/unittest_expect_async_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittestTest;
+import 'dart:isolate';
+import 'dart:async';
+import 'package:unittest/unittest.dart';
+
+part 'unittest_test_utils.dart';
+
+var testFunction = (TestConfiguration testConfig) {
+  test('expectAsync zero params', () {
+    _defer(expectAsync(() {
+      ++testConfig.count;
+    }));
+  });
+
+  test('expectAsync 1 param', () {
+    var func = expectAsync((arg) {
+      expect(arg, 0);
+      ++testConfig.count;
+    });
+    _defer(() => func(0));
+  });
+
+  test('expectAsync 2 param', () {
+    var func = expectAsync((arg0, arg1) {
+      expect(arg0, 0);
+      expect(arg1, 1);
+      ++testConfig.count;
+    });
+    _defer(() => func(0, 1));
+  });
+
+  test('single arg to Future.catchError', () {
+    var func = expectAsync((error) {
+      expect(error, isStateError);
+      ++testConfig.count;
+    });
+
+    new Future(() {
+      throw new StateError('test');
+    }).catchError(func);
+  });
+
+  test('2 args to Future.catchError', () {
+    var func = expectAsync((error, stack) {
+      expect(error, isStateError);
+      expect(stack is StackTrace, isTrue);
+      ++testConfig.count;
+    });
+
+    new Future(() {
+      throw new StateError('test');
+    }).catchError(func);
+  });
+
+  test('zero of two optional positional args', () {
+    var func = expectAsync(([arg0 = true, arg1 = true]) {
+      expect(arg0, isTrue);
+      expect(arg1, isTrue);
+      ++testConfig.count;
+    });
+
+    _defer(() => func());
+  });
+
+  test('one of two optional positional args', () {
+    var func = expectAsync(([arg0 = true, arg1 = true]) {
+      expect(arg0, isFalse);
+      expect(arg1, isTrue);
+      ++testConfig.count;
+    });
+
+    _defer(() => func(false));
+  });
+
+  test('two of two optional positional args', () {
+    var func = expectAsync(([arg0 = true, arg1 = true]) {
+      expect(arg0, isFalse);
+      expect(arg1, isNull);
+      ++testConfig.count;
+    });
+
+    _defer(() => func(false, null));
+  });
+};
+
+final expected = '8:0:0:8:8:::null:expectAsync zero params:'
+    ':expectAsync 1 param::expectAsync 2 param:'
+    ':single arg to Future.catchError::2 args to Future.catchError:'
+    ':zero of two optional positional args:'
+    ':one of two optional positional args:'
+    ':two of two optional positional args:';
diff --git a/pkg/unittest/test/unittest_late_exception_test.dart b/pkg/unittest/test/unittest_late_exception_test.dart
index 7a5c3e6..c80de12 100644
--- a/pkg/unittest/test/unittest_late_exception_test.dart
+++ b/pkg/unittest/test/unittest_late_exception_test.dart
@@ -14,11 +14,11 @@
 var testFunction = (_) {
   var f;
   test('testOne', () {
-    f = expectAsync0(() {});
+    f = expectAsync(() {});
     _defer(f);
   });
   test('testTwo', () {
-    _defer(expectAsync0(() { f(); }));
+    _defer(expectAsync(() { f(); }));
   });
 };
 
diff --git a/pkg/unittest/test/unittest_middle_exception_test.dart b/pkg/unittest/test/unittest_middle_exception_test.dart
index d405500..ba77514 100644
--- a/pkg/unittest/test/unittest_middle_exception_test.dart
+++ b/pkg/unittest/test/unittest_middle_exception_test.dart
@@ -15,7 +15,7 @@
   test('testOne', () { expect(true, isTrue); });
   test('testTwo', () { expect(true, isFalse); });
   test('testThree', () {
-    var done = expectAsync0((){});
+    var done = expectAsync(() {});
     _defer(() {
       expect(true, isTrue);
       done();
diff --git a/pkg/unittest/test/unittest_protect_async_test.dart b/pkg/unittest/test/unittest_protect_async_test.dart
index 12ded3c..15d3394 100644
--- a/pkg/unittest/test/unittest_protect_async_test.dart
+++ b/pkg/unittest/test/unittest_protect_async_test.dart
@@ -11,23 +11,23 @@
 
 var testFunction = (_) {
   test('protectAsync0', () {
-    var protected = protectAsync0(() {
+    var protected = () {
       throw new StateError('error during protectAsync0');
-    });
+    };
     new Future(protected);
   });
 
   test('protectAsync1', () {
-    var protected = protectAsync1((arg) {
+    var protected = (arg) {
       throw new StateError('error during protectAsync1: $arg');
-    });
+    };
     new Future(() => protected('one arg'));
   });
 
   test('protectAsync2', () {
-    var protected = protectAsync2((arg1, arg2) {
+    var protected = (arg1, arg2) {
       throw new StateError('error during protectAsync2: $arg1, $arg2');
-    });
+    };
     new Future(() => protected('arg1', 'arg2'));
   });
 
diff --git a/pkg/unittest/test/unittest_test_returning_future_test.dart b/pkg/unittest/test/unittest_test_returning_future_test.dart
index a74a8db..83c4a5d 100644
--- a/pkg/unittest/test/unittest_test_returning_future_test.dart
+++ b/pkg/unittest/test/unittest_test_returning_future_test.dart
@@ -21,8 +21,8 @@
   // I had a situation where either worked fine on their own, and
   // error/fail worked, but fail/error would time out.
   test("error1", () {
-    var callback = expectAsync0((){});
-    var excesscallback = expectAsync0((){});
+    var callback = expectAsync(() {});
+    var excesscallback = expectAsync(() {});
     return _defer(() {
       excesscallback();
       excesscallback();
@@ -36,8 +36,8 @@
     });
   });
   test("error2", () {
-    var callback = expectAsync0((){});
-    var excesscallback = expectAsync0((){});
+    var callback = expectAsync(() {});
+    var excesscallback = expectAsync(() {});
     return _defer(() {
       excesscallback();
       excesscallback();
diff --git a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart b/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
index 98f276b..e5fc304 100644
--- a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
+++ b/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
@@ -15,58 +15,48 @@
   test("successful", () {
     return _defer(() {
       scheduleMicrotask(() {
-        guardAsync(() {
-          expect(true, true);
-        });
+        expect(true, true);
       });
     });
   });
   test("fail1", () {
-    var callback = expectAsync0((){});
+    var callback = expectAsync(() {});
     return _defer(() {
       scheduleMicrotask(() {
-        guardAsync(() {
-          expect(true, false);
-          callback();
-        });
+        expect(true, false);
+        callback();
       });
     });
   });
   test('error1', () {
-    var callback = expectAsync0((){});
-    var excesscallback = expectAsync0((){});
+    var callback = expectAsync(() {});
+    var excesscallback = expectAsync(() {});
     return _defer(() {
       scheduleMicrotask(() {
-        guardAsync(() {
-          excesscallback();
-          excesscallback();
-          callback();
-        });
+        excesscallback();
+        excesscallback();
+        callback();
       });
     });
   });
   test("fail2", () {
-    var callback = expectAsync0((){});
+    var callback = expectAsync(() {});
     return _defer(() {
       scheduleMicrotask(() {
-        guardAsync(() {
-          fail('failure');
-          callback();
-        });
+        fail('failure');
+        callback();
       });
     });
   });
   test('error2', () {
-    var callback = expectAsync0((){});
-    var excesscallback = expectAsync0((){});
+    var callback = expectAsync(() {});
+    var excesscallback = expectAsync(() {});
     return _defer(() {
       scheduleMicrotask(() {
-        guardAsync(() {
-          excesscallback();
-          excesscallback();
-          excesscallback();
-          callback();
-        });
+        excesscallback();
+        excesscallback();
+        excesscallback();
+        callback();
       });
     });
   });
diff --git a/pkg/unittest/test/unittest_test_utils.dart b/pkg/unittest/test/unittest_test_utils.dart
index adb9823..8385a1b 100644
--- a/pkg/unittest/test/unittest_test_utils.dart
+++ b/pkg/unittest/test/unittest_test_utils.dart
@@ -16,7 +16,7 @@
                          String message: ''}) {
   var totalTests = 0;
   var testDetails = new StringBuffer();
-  if(results == null) {
+  if (results == null) {
     // no op
     assert(message == '');
   } else if (results is String) {
@@ -44,7 +44,7 @@
   final SendPort _port;
   String _result;
 
-  TestConfiguration(this._port) : super.blank();
+  TestConfiguration(this._port): super.blank();
 
   void onSummary(int passed, int failed, int errors, List<TestCase> results,
       String uncaughtError) {
@@ -88,6 +88,6 @@
   var replyPort = new ReceivePort();
   Isolate.spawn(runTestInIsolate, replyPort.sendPort);
   replyPort.first.then((String msg) {
-    expect(msg.trim(), equals(expected));
+    expect(msg.trim(), expected);
   });
 }
diff --git a/runtime/bin/directory_patch.dart b/runtime/bin/directory_patch.dart
index f3d0dab..f8643ae 100644
--- a/runtime/bin/directory_patch.dart
+++ b/runtime/bin/directory_patch.dart
@@ -7,7 +7,7 @@
   /* patch */ static _setCurrent(path) native "Directory_SetCurrent";
   /* patch */ static _createTemp(String path) native "Directory_CreateTemp";
   /* patch */ static String _systemTemp() native "Directory_SystemTemp";
-  /* patch */ static int _exists(String path) native "Directory_Exists";
+  /* patch */ static _exists(String path) native "Directory_Exists";
   /* patch */ static _create(String path) native "Directory_Create";
   /* patch */ static _deleteNative(String path, bool recursive)
       native "Directory_Delete";
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h
index 347d0e0..54845d0 100644
--- a/runtime/bin/eventhandler.h
+++ b/runtime/bin/eventhandler.h
@@ -7,7 +7,6 @@
 
 #include "bin/builtin.h"
 #include "bin/isolate_data.h"
-#include "bin/socket.h"
 
 namespace dart {
 namespace bin {
@@ -25,6 +24,7 @@
   kCloseCommand = 8,
   kShutdownReadCommand = 9,
   kShutdownWriteCommand = 10,
+  kReturnTokenCommand = 11,
   kListeningSocket = 16,
   kPipe = 17,
 };
@@ -108,7 +108,7 @@
 class EventHandler {
  public:
   void SendData(intptr_t id, Dart_Port dart_port, int64_t data) {
-    delegate_.Notify(id, dart_port, data);
+    delegate_.SendData(id, dart_port, data);
   }
 
   /**
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 4d7cda3..ce5171a 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -40,26 +40,32 @@
 static const int kShutdownId = -2;
 
 
+intptr_t SocketData::GetPollEvents() {
+  // Do not ask for EPOLLERR and EPOLLHUP explicitly as they are
+  // triggered anyway.
+  intptr_t events = EPOLLET | EPOLLRDHUP;
+  if ((mask_ & (1 << kInEvent)) != 0) {
+    events |= EPOLLIN;
+  }
+  if ((mask_ & (1 << kOutEvent)) != 0) {
+    events |= EPOLLOUT;
+  }
+  return events;
+}
+
+
 // Unregister the file descriptor for a SocketData structure with epoll.
 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  if (!sd->tracked_by_epoll()) return;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_DEL,
-                                            sd->fd(),
-                                            NULL));
-  if (status == -1) {
-    FATAL("Failed unregistering events for file descriptor");
-  }
-  sd->set_tracked_by_epoll(false);
+  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+                                    EPOLL_CTL_DEL,
+                                    sd->fd(),
+                                    NULL));
 }
 
 
 static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  ASSERT(!sd->tracked_by_epoll());
   struct epoll_event event;
-  event.events = EPOLLET | EPOLLRDHUP;
-  if ((sd->mask() & (1 << kInEvent)) != 0) event.events |= EPOLLIN;
-  if ((sd->mask() & (1 << kOutEvent)) != 0) event.events |= EPOLLOUT;
+  event.events = sd->GetPollEvents();
   event.data.ptr = sd;
   int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
                                             EPOLL_CTL_ADD,
@@ -71,8 +77,6 @@
     // as /dev/null. In such case, mark the file descriptor as closed,
     // so dart will handle it accordingly.
     DartUtils::PostInt32(sd->port(), 1 << kCloseEvent);
-  } else {
-    sd->set_tracked_by_epoll(true);
   }
 }
 
@@ -116,8 +120,7 @@
 }
 
 
-SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd,
-                                                      bool* is_new) {
+SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) {
   ASSERT(fd >= 0);
   HashMap::Entry* entry = socket_map_.Lookup(
       GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true);
@@ -128,7 +131,6 @@
     // new SocketData for the file descriptor is inserted.
     sd = new SocketData(fd);
     entry->value = sd;
-    *is_new = true;
   }
   ASSERT(fd == sd->fd());
   return sd;
@@ -168,20 +170,15 @@
     } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      bool is_new = false;
-      SocketData* sd = GetSocketData(msg[i].id, &is_new);
-      if (is_new) {
-        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
-        AddToEpollInstance(epoll_fd_, sd);
-      }
+      SocketData* sd = GetSocketData(msg[i].id);
       if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
-        sd->ShutdownRead();
+        shutdown(sd->fd(), SHUT_RD);
       } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
-        sd->ShutdownWrite();
+        shutdown(sd->fd(), SHUT_WR);
       } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources and move on to
@@ -192,6 +189,14 @@
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
+      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
+        if (sd->ReturnToken()) {
+          AddToEpollInstance(epoll_fd_, sd);
+        }
+      } else {
+        // Setup events to wait for.
+        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
+        AddToEpollInstance(epoll_fd_, sd);
       }
     }
   }
@@ -222,47 +227,14 @@
 #ifdef DEBUG_POLL
   PrintEventMask(sd->fd(), events);
 #endif
-  intptr_t event_mask = 0;
-  if (sd->IsListeningSocket()) {
-    // For listening sockets the EPOLLIN event indicate that there are
-    // connections ready for accept unless accompanied with one of the
-    // other flags.
-    if ((events & EPOLLIN) != 0) {
-      if ((events & EPOLLHUP) != 0) event_mask |= (1 << kCloseEvent);
-      if ((events & EPOLLERR) != 0) event_mask |= (1 << kErrorEvent);
-      if (event_mask == 0) event_mask |= (1 << kInEvent);
-    }
-  } else {
-    // Prioritize data events over close and error events.
-    if ((events & (EPOLLIN | EPOLLHUP | EPOLLRDHUP)) != 0) {
-      // If we have EPOLLIN and we have available bytes, report that.
-      if ((events & EPOLLIN) != 0) {
-        event_mask = (1 << kInEvent);
-      }
-      if ((events & (EPOLLHUP | EPOLLRDHUP)) != 0) {
-        // If both EPOLLHUP and EPOLLERR are reported treat it as an
-        // error.
-        if ((events & EPOLLERR) != 0) {
-          event_mask = (1 << kErrorEvent);
-        } else {
-          event_mask |= (1 << kCloseEvent);
-        }
-      } else if ((events & EPOLLERR) != 0) {
-        event_mask = (1 << kErrorEvent);
-      }
-    }
-
-    if ((events & EPOLLOUT) != 0) {
-      if ((events & EPOLLERR) != 0) {
-        if (!sd->IsPipe()) {
-          event_mask = (1 << kErrorEvent);
-        }
-      } else {
-        event_mask |= (1 << kOutEvent);
-      }
-    }
+  if (events & EPOLLERR) {
+    // Return error only if EPOLLIN is present.
+    return (events & EPOLLIN) ? (1 << kErrorEvent) : 0;
   }
-
+  intptr_t event_mask = 0;
+  if (events & EPOLLIN) event_mask |= (1 << kInEvent);
+  if (events & EPOLLOUT) event_mask |= (1 << kOutEvent);
+  if (events & (EPOLLHUP | EPOLLRDHUP)) event_mask |= (1 << kCloseEvent);
   return event_mask;
 }
 
@@ -277,6 +249,10 @@
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
       intptr_t event_mask = GetPollEvents(events[i].events, sd);
       if (event_mask != 0) {
+        if (sd->TakeToken()) {
+          // Took last token, remove from epoll.
+          RemoveFromEpollInstance(epoll_fd_, sd);
+        }
         Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
@@ -350,13 +326,13 @@
 
 
 void EventHandlerImplementation::Shutdown() {
-  Notify(kShutdownId, 0, 0);
+  SendData(kShutdownId, 0, 0);
 }
 
 
-void EventHandlerImplementation::Notify(intptr_t id,
-                                        Dart_Port dart_port,
-                                        intptr_t data) {
+void EventHandlerImplementation::SendData(intptr_t id,
+                                          Dart_Port dart_port,
+                                          intptr_t data) {
   WakeupHandler(id, dart_port, data);
 }
 
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 5a80eef..2647164 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -31,17 +31,11 @@
 class SocketData {
  public:
   explicit SocketData(intptr_t fd)
-      : tracked_by_epoll_(false), fd_(fd), port_(0), mask_(0) {
+      : fd_(fd), port_(0), mask_(0), tokens_(8) {
     ASSERT(fd_ != -1);
   }
 
-  void ShutdownRead() {
-    shutdown(fd_, SHUT_RD);
-  }
-
-  void ShutdownWrite() {
-    shutdown(fd_, SHUT_WR);
-  }
+  intptr_t GetPollEvents();
 
   void Close() {
     port_ = 0;
@@ -50,9 +44,6 @@
     fd_ = -1;
   }
 
-  bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; }
-  bool IsPipe() { return (mask_ & (1 << kPipe)) != 0; }
-
   void SetPortAndMask(Dart_Port port, intptr_t mask) {
     ASSERT(fd_ != -1);
     port_ = port;
@@ -61,15 +52,26 @@
 
   intptr_t fd() { return fd_; }
   Dart_Port port() { return port_; }
-  intptr_t mask() { return mask_; }
-  bool tracked_by_epoll() { return tracked_by_epoll_; }
-  void set_tracked_by_epoll(bool value) { tracked_by_epoll_ = value; }
+
+  // Returns true if the last token was taken.
+  bool TakeToken() {
+    ASSERT(tokens_ > 0);
+    tokens_--;
+    return tokens_ == 0;
+  }
+
+  // Returns true if the tokens was 0 before adding.
+  bool ReturnToken() {
+    ASSERT(tokens_ >= 0);
+    tokens_++;
+    return tokens_ == 1;
+  }
 
  private:
-  bool tracked_by_epoll_;
   intptr_t fd_;
   Dart_Port port_;
   intptr_t mask_;
+  int tokens_;
 };
 
 
@@ -80,8 +82,8 @@
 
   // Gets the socket data structure for a given file
   // descriptor. Creates a new one if one is not found.
-  SocketData* GetSocketData(intptr_t fd, bool* is_new);
-  void Notify(intptr_t id, Dart_Port dart_port, intptr_t data);
+  SocketData* GetSocketData(intptr_t fd);
+  void SendData(intptr_t id, Dart_Port dart_port, intptr_t data);
   void Start(EventHandler* handler);
   void Shutdown();
 
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 612f3cb..f87c1a4 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -20,7 +20,6 @@
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/socket.h"
 #include "platform/hashmap.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
@@ -29,36 +28,63 @@
 namespace dart {
 namespace bin {
 
+static const int kInterruptMessageSize = sizeof(InterruptMessage);
 static const int kTimerId = -1;
+static const int kShutdownId = -2;
 
 
-static void AddToEpollInstance(intptr_t epoll_fd_,
-                               int fd, Dart_Port port,
-                               int mask) {
-  struct epoll_event event;
-  event.events = EPOLLET | EPOLLRDHUP;
-  if ((mask & (1 << kInEvent)) != 0) event.events |= EPOLLIN;
-  if ((mask & (1 << kOutEvent)) != 0) event.events |= EPOLLOUT;
-  // Be sure we don't collide with the TIMER_BIT.
-  if (port == ILLEGAL_PORT) {
-    FATAL("Illigal port sent to event handler");
+intptr_t SocketData::GetPollEvents() {
+  // Do not ask for EPOLLERR and EPOLLHUP explicitly as they are
+  // triggered anyway.
+  intptr_t events = EPOLLET | EPOLLRDHUP;
+  if ((mask_ & (1 << kInEvent)) != 0) {
+    events |= EPOLLIN;
   }
-  event.data.u64 = port;
+  if ((mask_ & (1 << kOutEvent)) != 0) {
+    events |= EPOLLOUT;
+  }
+  return events;
+}
+
+
+// Unregister the file descriptor for a SocketData structure with epoll.
+static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
+  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+                                    EPOLL_CTL_DEL,
+                                    sd->fd(),
+                                    NULL));
+}
+
+
+static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
+  struct epoll_event event;
+  event.events = sd->GetPollEvents();
+  event.data.ptr = sd;
   int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
                                             EPOLL_CTL_ADD,
-                                            fd,
+                                            sd->fd(),
                                             &event));
   if (status == -1) {
     // Epoll does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
     // as /dev/null. In such case, mark the file descriptor as closed,
     // so dart will handle it accordingly.
-    DartUtils::PostInt32(port, 1 << kCloseEvent);
+    DartUtils::PostInt32(sd->port(), 1 << kCloseEvent);
   }
 }
 
 
-EventHandlerImplementation::EventHandlerImplementation() : shutdown_(false) {
+EventHandlerImplementation::EventHandlerImplementation()
+    : socket_map_(&HashMap::SamePointerValue, 16) {
+  intptr_t result;
+  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  if (result != 0) {
+    FATAL("Pipe creation failed");
+  }
+  FDUtils::SetNonBlocking(interrupt_fds_[0]);
+  FDUtils::SetCloseOnExec(interrupt_fds_[0]);
+  FDUtils::SetCloseOnExec(interrupt_fds_[1]);
+  shutdown_ = false;
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
   static const int kEpollInitialSize = 64;
@@ -67,18 +93,28 @@
     FATAL1("Failed creating epoll file descriptor: %i", errno);
   }
   FDUtils::SetCloseOnExec(epoll_fd_);
+  // Register the interrupt_fd with the epoll instance.
+  struct epoll_event event;
+  event.events = EPOLLIN;
+  event.data.ptr = NULL;
+  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+                                            EPOLL_CTL_ADD,
+                                            interrupt_fds_[0],
+                                            &event));
+  if (status == -1) {
+    FATAL("Failed adding interrupt fd to epoll instance");
+  }
   timer_fd_ = TEMP_FAILURE_RETRY(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
   if (timer_fd_ == -1) {
     FATAL1("Failed creating timerfd file descriptor: %i", errno);
   }
   // Register the timer_fd_ with the epoll instance.
-  struct epoll_event event;
   event.events = EPOLLIN;
-  event.data.u64 = ILLEGAL_PORT;  // Use ILLEGAL_PORT to identify timer-fd.
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            timer_fd_,
-                                            &event));
+  event.data.fd = timer_fd_;
+  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+                                        EPOLL_CTL_ADD,
+                                        timer_fd_,
+                                        &event));
   if (status == -1) {
     FATAL2(
         "Failed adding timerfd fd(%i) to epoll instance: %i", timer_fd_, errno);
@@ -87,14 +123,106 @@
 
 
 EventHandlerImplementation::~EventHandlerImplementation() {
-  TEMP_FAILURE_RETRY(close(epoll_fd_));
-  TEMP_FAILURE_RETRY(close(timer_fd_));
+  VOID_TEMP_FAILURE_RETRY(close(epoll_fd_));
+  VOID_TEMP_FAILURE_RETRY(close(timer_fd_));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+}
+
+
+SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) {
+  ASSERT(fd >= 0);
+  HashMap::Entry* entry = socket_map_.Lookup(
+      GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true);
+  ASSERT(entry != NULL);
+  SocketData* sd = reinterpret_cast<SocketData*>(entry->value);
+  if (sd == NULL) {
+    // If there is no data in the hash map for this file descriptor a
+    // new SocketData for the file descriptor is inserted.
+    sd = new SocketData(fd);
+    entry->value = sd;
+  }
+  ASSERT(fd == sd->fd());
+  return sd;
+}
+
+
+void EventHandlerImplementation::WakeupHandler(intptr_t id,
+                                               Dart_Port dart_port,
+                                               int64_t data) {
+  InterruptMessage msg;
+  msg.id = id;
+  msg.dart_port = dart_port;
+  msg.data = data;
+  // WriteToBlocking will write up to 512 bytes atomically, and since our msg
+  // is smaller than 512, we don't need a thread lock.
+  // See: http://linux.die.net/man/7/pipe, section 'Pipe_buf'.
+  ASSERT(kInterruptMessageSize < PIPE_BUF);
+  intptr_t result =
+      FDUtils::WriteToBlocking(interrupt_fds_[1], &msg, kInterruptMessageSize);
+  if (result != kInterruptMessageSize) {
+    if (result == -1) {
+      perror("Interrupt message failure:");
+    }
+    FATAL1("Interrupt message failure. Wrote %" Pd " bytes.", result);
+  }
+}
+
+
+void EventHandlerImplementation::HandleInterruptFd() {
+  const intptr_t MAX_MESSAGES = kInterruptMessageSize;
+  InterruptMessage msg[MAX_MESSAGES];
+  ssize_t bytes = TEMP_FAILURE_RETRY(
+      read(interrupt_fds_[0], msg, MAX_MESSAGES * kInterruptMessageSize));
+  for (ssize_t i = 0; i < bytes / kInterruptMessageSize; i++) {
+    if (msg[i].id == kTimerId) {
+      timeout_queue_.UpdateTimeout(msg[i].dart_port, msg[i].data);
+      struct itimerspec it;
+      memset(&it, 0, sizeof(it));
+      if (timeout_queue_.HasTimeout()) {
+        int64_t millis = timeout_queue_.CurrentTimeout();
+        it.it_value.tv_sec = millis / 1000;
+        it.it_value.tv_nsec = (millis % 1000) * 1000000;
+      }
+      timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL);
+    } else if (msg[i].id == kShutdownId) {
+      shutdown_ = true;
+    } else {
+      SocketData* sd = GetSocketData(msg[i].id);
+      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+        // Close the socket for reading.
+        shutdown(sd->fd(), SHUT_RD);
+      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+        // Close the socket for writing.
+        shutdown(sd->fd(), SHUT_WR);
+      } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
+        ASSERT(msg[i].data == (1 << kCloseCommand));
+        // Close the socket and free system resources and move on to
+        // next message.
+        RemoveFromEpollInstance(epoll_fd_, sd);
+        intptr_t fd = sd->fd();
+        sd->Close();
+        socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
+        delete sd;
+        DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
+      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
+        if (sd->ReturnToken()) {
+          AddToEpollInstance(epoll_fd_, sd);
+        }
+      } else {
+        // Setup events to wait for.
+        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
+        AddToEpollInstance(epoll_fd_, sd);
+      }
+    }
+  }
 }
 
 #ifdef DEBUG_POLL
-static void PrintEventMask(intptr_t events) {
-  // TODO(ajohnsen): When DEBUG_POLL is enabled, we could add the fd to the
-  // epoll-data as well.
+static void PrintEventMask(intptr_t fd, intptr_t events) {
+  Log::Print("%d ", fd);
   if ((events & EPOLLIN) != 0) Log::Print("EPOLLIN ");
   if ((events & EPOLLPRI) != 0) Log::Print("EPOLLPRI ");
   if ((events & EPOLLOUT) != 0) Log::Print("EPOLLOUT ");
@@ -106,17 +234,19 @@
   if ((events & ~all_events) != 0) {
     Log::Print("(and %08x) ", events & ~all_events);
   }
+  Log::Print("(available %d) ", FDUtils::AvailableBytes(fd));
 
   Log::Print("\n");
 }
 #endif
 
-intptr_t EventHandlerImplementation::GetPollEvents(intptr_t events) {
+intptr_t EventHandlerImplementation::GetPollEvents(intptr_t events,
+                                                   SocketData* sd) {
 #ifdef DEBUG_POLL
-  PrintEventMask(events);
+  PrintEventMask(sd->fd(), events);
 #endif
   if (events & EPOLLERR) {
-    // Return only error if EPOLLIN is present.
+    // Return error only if EPOLLIN is present.
     return (events & EPOLLIN) ? (1 << kErrorEvent) : 0;
   }
   intptr_t event_mask = 0;
@@ -129,32 +259,40 @@
 
 void EventHandlerImplementation::HandleEvents(struct epoll_event* events,
                                               int size) {
+  bool interrupt_seen = false;
   for (int i = 0; i < size; i++) {
-    uint64_t data = events[i].data.u64;
-    // ILLEGAL_PORT is used to identify timer-fd.
-    if (data == ILLEGAL_PORT) {
+    if (events[i].data.ptr == NULL) {
+      interrupt_seen = true;
+    } else if (events[i].data.fd == timer_fd_) {
       int64_t val;
       VOID_TEMP_FAILURE_RETRY(read(timer_fd_, &val, sizeof(val)));
-      timer_mutex_.Lock();
       if (timeout_queue_.HasTimeout()) {
         DartUtils::PostNull(timeout_queue_.CurrentPort());
         timeout_queue_.RemoveCurrent();
       }
-      timer_mutex_.Unlock();
     } else {
-      int32_t event_mask = GetPollEvents(events[i].events);
+      SocketData* sd = reinterpret_cast<SocketData*>(events[i].data.ptr);
+      intptr_t event_mask = GetPollEvents(events[i].events, sd);
       if (event_mask != 0) {
-        Dart_Port port = data;
+        if (sd->TakeToken()) {
+          // Took last token, remove from epoll.
+          RemoveFromEpollInstance(epoll_fd_, sd);
+        }
+        Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
       }
     }
   }
+  if (interrupt_seen) {
+    // Handle after socket events, so we avoid closing a socket before we handle
+    // the current events.
+    HandleInterruptFd();
+  }
 }
 
 
 void EventHandlerImplementation::Poll(uword args) {
-  // Main event-handler thread loop.
   static const intptr_t kMaxEvents = 16;
   struct epoll_event events[kMaxEvents];
   EventHandler* handler = reinterpret_cast<EventHandler*>(args);
@@ -188,51 +326,26 @@
 
 
 void EventHandlerImplementation::Shutdown() {
-  shutdown_ = true;
+  SendData(kShutdownId, 0, 0);
 }
 
 
-void EventHandlerImplementation::Notify(intptr_t id,
-                                        Dart_Port dart_port,
-                                        int64_t data) {
-  // This method is called by isolates, that is, not in the event-handler
-  // thread.
-  if (id == kTimerId) {
-    // Lock this region, as multiple isolates may attempt to update
-    // timeout_queue_.
-    // TODO(ajohnsen): Consider using a timer-fd per isolate to avoid the lock.
-    timer_mutex_.Lock();
-    timeout_queue_.UpdateTimeout(dart_port, data);
-    struct itimerspec it;
-    memset(&it, 0, sizeof(it));
-    if (timeout_queue_.HasTimeout()) {
-      int64_t millis = timeout_queue_.CurrentTimeout();
-      it.it_value.tv_sec = millis / 1000;
-      it.it_value.tv_nsec = (millis % 1000) * 1000000;
-    }
-    timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL);
-    timer_mutex_.Unlock();
-  } else {
-    if ((data & (1 << kShutdownReadCommand)) != 0) {
-      ASSERT(data == (1 << kShutdownReadCommand));
-      // Close the socket for reading.
-      shutdown(id, SHUT_RD);
-    } else if ((data & (1 << kShutdownWriteCommand)) != 0) {
-      ASSERT(data == (1 << kShutdownWriteCommand));
-      // Close the socket for writing.
-      shutdown(id, SHUT_WR);
-    } else if ((data & (1 << kCloseCommand)) != 0) {
-      ASSERT(data == (1 << kCloseCommand));
-      // Close the socket and free system resources and move on to
-      // next message.
-      // This will also remove the file descriptor from epoll.
-      Socket::Close(id);
-      DartUtils::PostInt32(dart_port, 1 << kDestroyedEvent);
-    } else {
-      // Add to epoll - this is the first time we see it.
-      AddToEpollInstance(epoll_fd_, id, dart_port, data);
-    }
-  }
+void EventHandlerImplementation::SendData(intptr_t id,
+                                          Dart_Port dart_port,
+                                          int64_t data) {
+  WakeupHandler(id, dart_port, data);
+}
+
+
+void* EventHandlerImplementation::GetHashmapKeyFromFd(intptr_t fd) {
+  // The hashmap does not support keys with value 0.
+  return reinterpret_cast<void*>(fd + 1);
+}
+
+
+uint32_t EventHandlerImplementation::GetHashmapHashFromFd(intptr_t fd) {
+  // The hashmap does not support keys with value 0.
+  return dart::Utils::WordHash(fd + 1);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index f5386c3..9341cd1 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -14,32 +14,93 @@
 #include <sys/socket.h>
 
 #include "platform/hashmap.h"
-#include "platform/thread.h"
 
 
 namespace dart {
 namespace bin {
 
+class InterruptMessage {
+ public:
+  intptr_t id;
+  Dart_Port dart_port;
+  int64_t data;
+};
+
+
+class SocketData {
+ public:
+  explicit SocketData(intptr_t fd) : fd_(fd), port_(0), mask_(0), tokens_(8) {
+    ASSERT(fd_ != -1);
+  }
+
+  intptr_t GetPollEvents();
+
+  void Close() {
+    port_ = 0;
+    mask_ = 0;
+    close(fd_);
+    fd_ = -1;
+  }
+
+  void SetPortAndMask(Dart_Port port, intptr_t mask) {
+    ASSERT(fd_ != -1);
+    port_ = port;
+    mask_ = mask;
+  }
+
+  intptr_t fd() { return fd_; }
+  Dart_Port port() { return port_; }
+
+  // Returns true if the last token was taken.
+  bool TakeToken() {
+    ASSERT(tokens_ > 0);
+    tokens_--;
+    return tokens_ == 0;
+  }
+
+  // Returns true if the tokens was 0 before adding.
+  bool ReturnToken() {
+    ASSERT(tokens_ >= 0);
+    tokens_++;
+    return tokens_ == 1;
+  }
+
+ private:
+  intptr_t fd_;
+  Dart_Port port_;
+  intptr_t mask_;
+  int tokens_;
+};
+
+
 class EventHandlerImplementation {
  public:
   EventHandlerImplementation();
   ~EventHandlerImplementation();
 
-  void Notify(intptr_t id, Dart_Port dart_port, int64_t data);
+  // Gets the socket data structure for a given file
+  // descriptor. Creates a new one if one is not found.
+  SocketData* GetSocketData(intptr_t fd);
+  void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
   void Start(EventHandler* handler);
   void Shutdown();
 
  private:
   void HandleEvents(struct epoll_event* events, int size);
   static void Poll(uword args);
+  void WakeupHandler(intptr_t id, Dart_Port dart_port, int64_t data);
+  void HandleInterruptFd();
   void SetPort(intptr_t fd, Dart_Port dart_port, intptr_t mask);
-  intptr_t GetPollEvents(intptr_t events);
+  intptr_t GetPollEvents(intptr_t events, SocketData* sd);
+  static void* GetHashmapKeyFromFd(intptr_t fd);
+  static uint32_t GetHashmapHashFromFd(intptr_t fd);
 
+  HashMap socket_map_;
   TimeoutQueue timeout_queue_;
   bool shutdown_;
+  int interrupt_fds_[2];
   int epoll_fd_;
   int timer_fd_;
-  Mutex timer_mutex_;
 };
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index b7d4fde..8024e1c 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -47,26 +47,11 @@
 static void RemoveFromKqueue(intptr_t kqueue_fd_, SocketData* sd) {
   if (!sd->tracked_by_kqueue()) return;
   static const intptr_t kMaxChanges = 2;
-  intptr_t changes = 0;
   struct kevent events[kMaxChanges];
-  if (sd->HasReadEvent()) {
-    EV_SET(events + changes, sd->fd(), EVFILT_READ, EV_DELETE, 0, 0, NULL);
-    ++changes;
-  }
-  if (sd->HasWriteEvent()) {
-    EV_SET(events + changes, sd->fd(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
-    ++changes;
-  }
-  ASSERT(changes > 0);
-  ASSERT(changes <= kMaxChanges);
-  int status =
-    TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
-  if (status == -1) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    FATAL1("Failed deleting events from kqueue: %s\n", error_message);
-  }
+  EV_SET(events, sd->fd(), EVFILT_READ, EV_DELETE, 0, 0, NULL);
+  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+  EV_SET(events, sd->fd(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
+  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
   sd->set_tracked_by_kqueue(false);
 }
 
@@ -74,6 +59,7 @@
 // Update the kqueue registration for SocketData structure to reflect
 // the events currently of interest.
 static void AddToKqueue(intptr_t kqueue_fd_, SocketData* sd) {
+  ASSERT(!sd->tracked_by_kqueue());
   static const intptr_t kMaxChanges = 2;
   intptr_t changes = 0;
   struct kevent events[kMaxChanges];
@@ -102,7 +88,7 @@
   ASSERT(changes > 0);
   ASSERT(changes <= kMaxChanges);
   int status =
-    TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
+      TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
   if (status == -1) {
     // kQueue does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -152,8 +138,7 @@
 }
 
 
-SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd,
-                                                      bool* is_new) {
+SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) {
   ASSERT(fd >= 0);
   HashMap::Entry* entry = socket_map_.Lookup(
       GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true);
@@ -164,7 +149,6 @@
     // new SocketData for the file descriptor is inserted.
     sd = new SocketData(fd);
     entry->value = sd;
-    *is_new = true;
   }
   ASSERT(fd == sd->fd());
   return sd;
@@ -203,19 +187,15 @@
     } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
-      bool is_new = false;
-      SocketData* sd = GetSocketData(msg[i].id, &is_new);
-      if (is_new) {
-        sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
-      }
+      SocketData* sd = GetSocketData(msg[i].id);
       if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
-        sd->ShutdownRead();
+        shutdown(sd->fd(), SHUT_RD);
       } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
-        sd->ShutdownWrite();
+        shutdown(sd->fd(), SHUT_WR);
       } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources.
@@ -225,10 +205,17 @@
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
-      } else {
-        if (is_new) {
+      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
+        if (sd->ReturnToken()) {
           AddToKqueue(kqueue_fd_, sd);
         }
+      } else {
+        // Setup events to wait for.
+        ASSERT((msg[i].data > 0) && (msg[i].data < kIntptrMax));
+        ASSERT(sd->port() == 0);
+        sd->SetPortAndMask(msg[i].dart_port,
+                           static_cast<intptr_t>(msg[i].data));
+        AddToKqueue(kqueue_fd_, sd);
       }
     }
   }
@@ -320,6 +307,10 @@
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].udata);
       intptr_t event_mask = GetEvents(events + i, sd);
       if (event_mask != 0) {
+        if (sd->TakeToken()) {
+          // Took last token, remove from epoll.
+          RemoveFromKqueue(kqueue_fd_, sd);
+        }
         Dart_Port port = sd->port();
         ASSERT(port != 0);
         DartUtils::PostInt32(port, event_mask);
@@ -408,13 +399,13 @@
 
 
 void EventHandlerImplementation::Shutdown() {
-  Notify(kShutdownId, 0, 0);
+  SendData(kShutdownId, 0, 0);
 }
 
 
-void EventHandlerImplementation::Notify(intptr_t id,
-                                        Dart_Port dart_port,
-                                        int64_t data) {
+void EventHandlerImplementation::SendData(intptr_t id,
+                                          Dart_Port dart_port,
+                                          int64_t data) {
   WakeupHandler(id, dart_port, data);
 }
 
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index acbfc91..70a103c 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -10,7 +10,6 @@
 #endif
 
 #include <unistd.h>
-#include <errno.h>
 #include <sys/event.h>  // NOLINT
 #include <sys/socket.h>
 
@@ -34,21 +33,14 @@
       : fd_(fd),
         port_(0),
         mask_(0),
-        tracked_by_kqueue_(false) {
+        tracked_by_kqueue_(false),
+        tokens_(8) {
     ASSERT(fd_ != -1);
   }
 
   bool HasReadEvent();
   bool HasWriteEvent();
 
-  void ShutdownRead() {
-    shutdown(fd_, SHUT_RD);
-  }
-
-  void ShutdownWrite() {
-    shutdown(fd_, SHUT_WR);
-  }
-
   void Close() {
     port_ = 0;
     mask_ = 0;
@@ -57,7 +49,6 @@
   }
 
   bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; }
-  bool IsPipe() { return (mask_ & (1 << kPipe)) != 0; }
 
   void SetPortAndMask(Dart_Port port, intptr_t mask) {
     ASSERT(fd_ != -1);
@@ -73,11 +64,24 @@
     tracked_by_kqueue_ = value;
   }
 
+  // Returns true if the last token was taken.
+  bool TakeToken() {
+    tokens_--;
+    return tokens_ == 0;
+  }
+
+  // Returns true if the tokens was 0 before adding.
+  bool ReturnToken() {
+    tokens_++;
+    return tokens_ == 1;
+  }
+
  private:
   intptr_t fd_;
   Dart_Port port_;
   intptr_t mask_;
   bool tracked_by_kqueue_;
+  int tokens_;
 };
 
 
@@ -88,8 +92,8 @@
 
   // Gets the socket data structure for a given file
   // descriptor. Creates a new one if one is not found.
-  SocketData* GetSocketData(intptr_t fd, bool* is_new);
-  void Notify(intptr_t id, Dart_Port dart_port, int64_t data);
+  SocketData* GetSocketData(intptr_t fd);
+  void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
   void Start(EventHandler* handler);
   void Shutdown();
 
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 534f328..d32fb1e 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -373,9 +373,7 @@
   // we create it.
   if (pending_read_ != NULL) return true;
   OverlappedBuffer* buffer = OverlappedBuffer::AllocateReadBuffer(kBufferSize);
-
   ASSERT(completion_port_ != INVALID_HANDLE_VALUE);
-
   BOOL ok = ReadDirectoryChangesW(handle_,
                                   buffer->GetBufferStart(),
                                   buffer->GetBufferSize(),
@@ -947,6 +945,8 @@
   } else if (msg->id == kShutdownId) {
     shutdown_ = true;
   } else {
+    // No tokens to return on Windows.
+    if ((msg->data & (1 << kReturnTokenCommand)) != 0) return;
     Handle* handle = reinterpret_cast<Handle*>(msg->id);
     ASSERT(handle != NULL);
     if (handle->is_listen_socket()) {
@@ -1203,9 +1203,9 @@
 }
 
 
-void EventHandlerImplementation::Notify(intptr_t id,
-                                        Dart_Port dart_port,
-                                        int64_t data) {
+void EventHandlerImplementation::SendData(intptr_t id,
+                                          Dart_Port dart_port,
+                                          int64_t data) {
   InterruptMessage* msg = new InterruptMessage;
   msg->id = id;
   msg->dart_port = dart_port;
@@ -1289,7 +1289,7 @@
 
 
 void EventHandlerImplementation::Shutdown() {
-  Notify(kShutdownId, 0, 0);
+  SendData(kShutdownId, 0, 0);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index b756e07..90e505a 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -485,7 +485,7 @@
   EventHandlerImplementation();
   virtual ~EventHandlerImplementation();
 
-  void Notify(intptr_t id, Dart_Port dart_port, int64_t data);
+  void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
   void Start(EventHandler* handler);
   void Shutdown();
 
diff --git a/runtime/bin/io_buffer.cc b/runtime/bin/io_buffer.cc
index ef08b4f..c69d9c7 100644
--- a/runtime/bin/io_buffer.cc
+++ b/runtime/bin/io_buffer.cc
@@ -12,7 +12,7 @@
   uint8_t* data = Allocate(size);
   Dart_Handle result = Dart_NewExternalTypedData(
       Dart_TypedData_kUint8, data, size);
-  Dart_NewWeakPersistentHandle(result, data, IOBuffer::Finalizer);
+  Dart_NewWeakPersistentHandle(result, data, size, IOBuffer::Finalizer);
 
   if (Dart_IsError(result)) {
     Free(data);
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 1a54a1e..2c05324 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -323,7 +323,7 @@
           bind(fd,
                &addr->addr,
                SocketAddress::GetAddrLength(addr))) < 0) {
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
     return -1;
   }
   return fd;
@@ -392,12 +392,12 @@
   if (fd < 0) return -1;
 
   int optval = 1;
-  TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 7806964..0edd468 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -355,8 +355,9 @@
   static const int CLOSE_COMMAND = 8;
   static const int SHUTDOWN_READ_COMMAND = 9;
   static const int SHUTDOWN_WRITE_COMMAND = 10;
+  static const int RETURN_TOKEN_COMMAND = 11;
   static const int FIRST_COMMAND = CLOSE_COMMAND;
-  static const int LAST_COMMAND = SHUTDOWN_WRITE_COMMAND;
+  static const int LAST_COMMAND = RETURN_TOKEN_COMMAND;
 
   // Type flag send to the eventhandler providing additional
   // information on the type of the file descriptor.
@@ -817,6 +818,9 @@
         }
       }
     }
+    if (eventPort != null && !isClosing && !isClosed) {
+      sendToEventHandler(1 << RETURN_TOKEN_COMMAND);
+    }
   }
 
   void setHandlers({read, write, error, closed, destroyed}) {
@@ -832,7 +836,7 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null) {
+    if (eventPort == null && !isClosing && !isClosed) {
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
@@ -889,7 +893,7 @@
   }
 
   void sendToEventHandler(int data) {
-    assert(!isClosed);
+    assert(!isClosing);
     connectToEventHandler();
     _EventHandler._sendData(this, eventPort, data);
   }
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index d400306..9a0e5af 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -30,7 +30,7 @@
       case _STDIO_HANDLE_TYPE_PIPE:
       case _STDIO_HANDLE_TYPE_SOCKET:
       case _STDIO_HANDLE_TYPE_FILE:
-        return wrap(new IOSink(new _FileStreamConsumer.fromStdio(fd)));
+        return wrap(new IOSink(new _StdConsumer(fd)));
       default:
         throw new FileSystemException("Unsupported stdin type");
     }
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 62a33f6..366b9f6 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -14,9 +14,6 @@
 <body><polymer-element name="observatory-element">
   
 </polymer-element>
-<polymer-element name="isolate-element" extends="observatory-element">
-  
-</polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -155,10 +152,10 @@
     </style>
     <li>
       <template if="{{ active }}">
-        <button class="active" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="active" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
       <template if="{{ !active }}">
-        <button class="idle" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="idle" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
     </li>
   </template>
@@ -172,40 +169,40 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="isolate-element">
+<polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="isolate-element">
+<polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
+    <nav-menu link="{{ library.hashLink }}" anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="isolate-element">
+<polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
+    <nav-menu link="{{ cls.hashLink }}" anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
 
-<polymer-element name="breakpoint-list" extends="isolate-element">
+<polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -227,7 +224,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="isolate-element">
+<polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
 <template>
@@ -240,9 +237,9 @@
     <div class="row">
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-danger">
-        <div class="panel-heading">{{ error['errorType'] }}</div>
+        <div class="panel-heading">{{ error.kind }}</div>
         <div class="panel-body">
-          <p>{{ error['text'] }}</p>
+          <p>{{ error.message }}</p>
         </div>
       </div>
     </div>
@@ -258,7 +255,7 @@
   var
   </template>
   <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
   </template>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </div>
@@ -312,52 +309,56 @@
     <style>
       .member {
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 1px 0 1px 1em;
       }
     </style>
     <div>
-      <template if="{{ isUnexpectedRef(ref['type']) }}">
-        unexpected reference type &lt;{{ ref['type'] }}&gt;
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNullRef(ref['type']) }}">
-        <div title="{{ hoverText }}">{{ name }}</div>
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre>{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ (isStringRef(ref['type']) ||
-                        isBoolRef(ref['type']) ||
-                        isIntRef(ref['type'])) }}">
-        <a href="{{ url }}">{{ name }}</a>
+      <template if="{{ isNull(ref.serviceType) }}">
+        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
       </template>
 
-      <template if="{{ isClosureRef(ref['type']) }}">
+      <template if="{{ (isString(ref.serviceType) ||
+                        isBool(ref.serviceType) ||
+                        isInt(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['preview'] }}</a>
+      </template>
+
+      <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstanceRef(ref['type']) }}">
+      <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
         </curly-block>
       </template>
 
-      <template if="{{ isListRef(ref['type']) }}">
+      <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -373,13 +374,13 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="class-view" extends="isolate-element">
+</polymer-element><polymer-element name="class-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -387,12 +388,13 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-warning">
         <div class="panel-heading">
-          class <strong>{{ cls['user_name'] }}</strong>
+          class <strong>{{ cls.name }}</strong>
           <template if="{{ cls['super']['type'] != 'Null' }}">
             extends
-            <class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
+            <class-ref ref="{{ cls['super'] }}"></class-ref>
           </template>
-          <library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
+          <p></p>
+          <library-ref ref="{{ cls['library'] }}"></library-ref>
         </div>
         <div class="panel-body">
           <table class="table table-hover">
@@ -422,8 +424,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref ref="{{ field }}"></field-ref></td>
+                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -437,8 +439,8 @@
               </thead>
               <tbody>
                 <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
-                  <td><function-ref app="{{ app }}" ref="{{ function }}" internal=""></function-ref></td>
+                  <td><function-ref ref="{{ function }}"></function-ref></td>
+                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -458,46 +460,77 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="disassembly-entry" extends="observatory-element">
-  <template>
-  <div class="row">
-      <div class="col-md-2">{{ instruction.formattedTicks() }}</div>
-      <div class="col-md-2">{{ instruction.formattedAddress() }}</div>
-      <div class="col-md-4">
-        <code>{{ instruction.machine }} {{ instruction.human }}</code>
-      </div>
-  </div>
-  </template>
-  
-</polymer-element><polymer-element name="code-view" extends="isolate-element">
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Implement code refresh -->
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="{{ cssPanelClass }}">
-        <div class="panel-heading">
-          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
-        </div>
-        <div class="panel-body">
-          <div class="row">
-              <div class="col-md-2"><strong>Samples</strong></div>
-              <div class="col-md-2"><strong>Address</strong></div>
-              <div><strong>Instruction</strong></div>
-          </div>
-          <template repeat="{{ instruction in code.instructions }}">
-            <disassembly-entry instruction="{{ instruction }}">
-            </disassembly-entry>
-          </template>
-        </div>
-      </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">kind</td>
+          <td class="member">{{code.kind}}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">function</td>
+          <td class="member">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Inclusive</td>
+          <td class="member">{{ code.formattedInclusiveTicks }}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Exclusive</td>
+          <td class="member">{{ code.formattedExclusiveTicks }}</td>
+        </tr>
+      </tbody></table>
     </div>
-  </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
   </template>
   
 </polymer-element>
@@ -513,17 +546,98 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="field-view" extends="isolate-element">
+</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+  <template>
+    <style>
+      .textbox {
+        width: 80ex;
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .bigtextbox {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .button {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .radios {
+        display: inline;
+      }
+      .radios label{
+        padding-left: 15px;
+      }
+      .historyExpr, .historyValue {
+        vertical-align: text-top;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .historyExpr a {
+        display: block;
+        color: black;
+        text-decoration: none;
+        padding: 6px 6px;
+        cursor: pointer;
+        white-space: pre-line;
+      }
+      .historyExpr a:hover {
+        background-color: #e1f5fe
+      }
+      .historyValue {
+        display: block;
+        padding: 6px 6px;
+      }
+    </style>
+    <form>
+      <template if="{{ lineMode == '1-line' }}">
+        <input class="textbox" type="text" value="{{ text }}">
+      </template>
+      <template if="{{ lineMode == 'N-line' }}">
+        <textarea class="bigtextbox" rows="5" cols="80" value="{{ text }}"></textarea>
+      </template>
+
+      <input class="button" type="submit" value="Evaluate" on-click="{{ eval }}">
+      <div class="radios" on-change="{{ updateLineMode }}">
+        <label for="1-line">1-line
+          <input type="radio" name="lineMode" value="1-line" checked="">
+        </label>
+        <label for="N-line">N-line
+          <input type="radio" name="lineMode" value="N-line">
+        </label>
+      </div>
+    </form>
+
+    <br>
+    <template if="{{ results.isNotEmpty }}">
+      <table>
+        <tbody><tr template="" repeat="{{ result in results }}">
+          <td class="historyExpr">
+            <a class="expr" on-click="{{ selectExpr }}" expr="{{ result['expr'] }}">{{ result['expr'] }}</a>
+          </td>
+          <td class="historyValue">
+            <template if="{{ result['value'] == null }}">
+              <div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
+            </template>
+            <template if="{{ result['value'] != null }}">
+              <instance-ref isolate="{{ isolate }}" ref="{{ result['value'] }}">
+              </instance-ref>
+            </template>
+          </td>
+        </tr>
+      </tbody></table>
+    </template>
+  </template>
+</polymer-element>
+
+
+<polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner']['type'] == '@Class' }}">
+      <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Library' }}">
+        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -537,7 +651,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref ref="{{ field['owner'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -556,7 +670,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
@@ -566,19 +680,19 @@
   </template>
   
 </polymer-element>
-<polymer-element name="function-view" extends="isolate-element">
+<polymer-element name="function-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -587,12 +701,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref ref="{{ function['code'] }}"></code-ref>
+          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
@@ -635,7 +749,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-summary" extends="isolate-element">
+<polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -660,9 +774,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
-            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
+            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
+            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -695,7 +809,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ isolate.hashLink('allocationprofile') }}">
+        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -706,7 +820,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -714,8 +828,8 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+          (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
           <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
         </template>
@@ -726,10 +840,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="vm-element" extends="observatory-element">
-  
-</polymer-element>
-<polymer-element name="isolate-list" extends="vm-element">
+<polymer-element name="isolate-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -737,7 +848,7 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in vm.isolates.values }}">
+      <template repeat="{{ isolate in isolates.isolates.values }}">
       	<li class="list-group-item">
         <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
@@ -746,50 +857,119 @@
   </template>
   
 </polymer-element>
-<polymer-element name="instance-view" extends="isolate-element">
+<polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Add nav refresh here. -->
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-         Instance of
-         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <template if="{{ instance['error'] == null }}">
-            <table class="table table-hover">
-              <tbody>
-                <tr>
-                  <td>Preview</td><td>{{ instance['preview'] }}</td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ instance['error'] != null }}">
-            <error-view error_obj="{{ instance['error'] }}"></error-view>
-          </template>
-        </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .memberBold {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <template if="{{ instance['error'] != null }}">
+      <error-view error_obj="{{ instance['error'] }}"></error-view>
+    </template>
+
+    <template if="{{ instance['error'] == null }}">
+      <div class="content">
+        <!-- TODO(turnidge): Handle null instances. -->
+        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <table>
+          <tbody><tr>
+            <td class="memberBold">class</td>
+            <td class="member">
+              <class-ref ref="{{ instance['class'] }}">
+              </class-ref>
+            </td>
+          </tr>
+          <tr template="" if="{{ instance['preview'] != null }}">
+            <td class="memberBold">preview</td>
+            <td class="member">{{ instance['preview'] }}</td>
+          </tr>
+          <tr>
+            <td class="memberBold">size</td>
+            <td class="member">{{ instance['size'] | formatSize }}</td>
+          </tr>
+        </tbody></table>
       </div>
-    </div>
-    </div>
+
+      <hr>
+
+      <div class="content">
+        <template if="{{ instance['fields'].isNotEmpty }}">
+          fields ({{ instance['fields'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
+                <td class="member">
+                  <field-ref ref="{{ field['decl'] }}"></field-ref>
+                </td>
+                <td class="member">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['nativeFields'].isNotEmpty }}">
+          native fields ({{ instance['nativeFields'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
+                <td class="member">[{{ field['index']}}]</td>
+                <td class="member">[{{ field['value']}}]</td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['elements'].isNotEmpty }}">
+          elements ({{ instance['elements'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
+                <td class="member">[{{ element['index']}}]</td>
+                <td class="member">
+                  <instance-ref ref="{{ element['value'] }}">
+                  </instance-ref>
+                </td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+      </div>
+
+      <hr>
+
+      <div class="content">
+        <eval-box callback="{{ eval }}"></eval-box>
+      </div>
+      <br><br><br><br>
+      <br><br><br><br>
+    </template>
   </template>
   
 </polymer-element>
@@ -823,12 +1003,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-view" extends="isolate-element">
+<polymer-element name="library-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -837,10 +1017,10 @@
     <tbody>
       <tr template="" repeat="{{ script in library['scripts']}}">
         <td>
-          {{ script['kind'] }}
+          {{ script.kind }}
         </td>
         <td>
-          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
+          <script-ref ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -850,7 +1030,7 @@
     <tbody>
       <tr template="" repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
+          <library-ref ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -859,8 +1039,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -869,7 +1049,7 @@
     <tbody>
       <tr template="" repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
+          <function-ref ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -885,10 +1065,10 @@
     <tbody>
       <tr template="" repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
+          <class-ref ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal=""></class-ref>
+          <class-ref ref="{{ cls }}" internal=""></class-ref>
         </td>
       </tr>
     </tbody>
@@ -897,11 +1077,54 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="isolate-element">
+<polymer-element name="isolate-profile" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <div class="row">
+      <div class="col-md-12">
+        <span>Top</span>
+        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
+          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
+        </select>
+        <span>exclusive methods</span>
+      </div>
+    </div>
+    <div class="row">
+      <div class="col-md-12">
+        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
+      </div>
+    </div>
+    <table id="tableTree" class="table table-hover">
+      <thead>
+        <tr>
+          <th>Method</th>
+          <th>Exclusive</th>
+          <th>Caller</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+            <code-ref ref="{{ row.code }}"></code-ref>
+          </td>
+          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+        </tr>
+      </tbody>
+    </table>
+  </template>
+  
+</polymer-element>
+<polymer-element name="heap-profile" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
@@ -964,72 +1187,31 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-profile" extends="isolate-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
-        <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
-          <th>Inclusive</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
-          </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
-        </tr>
-      </tbody>
-    </table>
-  </template>
-  
-</polymer-element>
-<polymer-element name="script-view" extends="isolate-element">
+<polymer-element name="script-view" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}">
+    <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
-    <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
+    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
+    <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
+      <li>
+        <input type="checkbox" checked="{{ showCoverage }}">
+        <label>Show Coverage Data</label>
+      </li>
+    </nav-menu>
+    <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <div class="row">
     <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">
-      <button on-click="{{refreshCoverage}}">Refresh Coverage</button>
-      {{ script.scriptRef['user_name'] }}
-      {{ script.coveredPercentageFormatted() }}
-      </div>
+      <div class="panel-heading">Script source for: {{ script.name }}</div>
       <div class="panel-body">
         <table style="width:100%">
           <tbody>
-          <tr template="" repeat="{{ line in script.linesForDisplay }}">
+          <tr template="" repeat="{{ line in script.lines }}">
             <td style="{{ hitsStyle(line) }}">  </td>
             <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
             <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
@@ -1042,7 +1224,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="stack-frame" extends="isolate-element">
+<polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
       .member {
@@ -1056,15 +1238,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref isolate="{{ isolate }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
         <curly-block>
           <table>
             <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
               <td class="member">{{ v['name']}}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -1078,11 +1260,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="stack-trace" extends="isolate-element">
+<polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -1097,7 +1279,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
@@ -1105,78 +1287,14 @@
   </template>
   
 </polymer-element>
-<polymer-element name="message-viewer" extends="observatory-element">
-  <!--
-    This is a big switch statement which instantiates the custom element
-    designated to display the message type.
-  -->
-  <template>
-  	<!-- If the message type is an IsolateList -->
-    <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list vm="{{ app.vm }}"></isolate-list>
-    </template>
-    <!-- If the message type is a StackTrace -->
-    <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
-    </template>
-    <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
-    </template>
-    <template if="{{ messageType == 'Error' }}">
-      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
-    </template>
-    <template if="{{ messageType == 'Library' }}">
-      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
-    </template>
-    <template if="{{ messageType == 'Class' }}">
-      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
-    </template>
-    <template if="{{ messageType == 'Field' }}">
-      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
-    </template>
-    <template if="{{ messageType == 'Closure' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Instance' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Array' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'String' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Bool' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Smi' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Function' }}">
-      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
-    </template>
-    <template if="{{ messageType == 'Code' }}">
-      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
-    </template>
-    <template if="{{ messageType == 'Script' }}">
-      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
-    </template>
-    <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
-    </template>
-    <template if="{{ messageType == 'Profile' }}">
-      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
-    </template>
-    <!-- Add new views and message types in the future here. -->
-  </template>
+<polymer-element name="service-view" extends="observatory-element">
+  <!-- This element explicitly manages the child elements to avoid setting
+       an observable property on the old element to an invalid type. -->
   
 </polymer-element>
 <polymer-element name="response-viewer" extends="observatory-element">
   <template>
-    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
+    <service-view object="{{ app.response }}"></service-view>
   </template>
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index c1683ab..74565cd 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -8542,8 +8542,8 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.2.0-dev.5.15.
-(function($){function dart() {}var A=new dart
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+(function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
 delete B.x
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBW:"__$msg",gCO:"_oldPieChart",gF0:"__$cls",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJh:"__$vm",gJo:"__$last",gKM:"$",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPy:"__$error",gRd:"line",gSB:"__$active",gSS:"__$methodCountSelected",gSw:"lines",gUp:"__$trace",gUy:"_collapsed",gUz:"__$script",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gah:"__$app",gb:"b",gbV:"_combinedDataTable",geH:"__$sampleCount",geJ:"__$code",geb:"__$json",gfb:"methodCounts",gi2:"isolates",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm0:"__$instruction",gm7:"machine",gnx:"__$callback",goH:"columns",gpC:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",guy:"__$link",gvH:"index",gva:"instructions",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={DI:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",b7:"ALLOCATED_BEFORE_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8825,7 +8825,7 @@
 if(typeof z!=="number")return z.g()
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"call$1","eh",2,0,null,11,[]],
+return y[x]},"call$1","Tj",2,0,null,11,[]],
 Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
@@ -8836,10 +8836,10 @@
 return y[x][b]},"call$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
-n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 $isGv:true,
 "%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
@@ -8851,7 +8851,7 @@
 $isbool:true},
 Jh:{
 "^":"Null/Gv;",
-n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,109,[]],
 bu:[function(a){return"null"},"call$0","gXo",0,0,null],
 giO:function(a){return 0},
 gbx:function(a){return C.Qf}},
@@ -8866,41 +8866,41 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,23,[]],
+a.push(b)},"call$1","ght",2,0,null,28,[]],
 KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,47,[]],
+return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,47,[],23,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
-return!0}return!1},"call$1","gRI",2,0,null,129,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,115,[]],
+return!0}return!1},"call$1","guH",2,0,null,132,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,332,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,115,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
+aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 zV:[function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gnr",0,2,null,333,334,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,292,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){H.K0(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
+return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
@@ -8916,15 +8916,15 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,120,[],121,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,115,[]],
+this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,123,[],124,[]],
+Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,133,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
-Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
+H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
-return!1},"call$1","gdj",2,0,null,104,[]],
+return!1},"call$1","gdj",2,0,null,109,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 bu:[function(a){return H.mx(a,"[","]")},"call$0","gXo",0,0,null],
@@ -8932,27 +8932,27 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
 sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b<0)throw H.b(P.N(b))
+if(b<0)throw H.b(new P.bJ("value "+H.d(b)))
 if(!!a.fixed$length)H.vh(P.f("set length"))
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b>=a.length||b<0)throw H.b(new P.bJ("value "+H.d(b)))
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
+if(b>=a.length||b<0)throw H.b(P.N(b))
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
 $isList:true,
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{Qi:function(a,b){var z
 if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
 z=H.VM(new Array(a),[b])
@@ -8976,73 +8976,71 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,188,[]],
+return 1}else return-1},"call$1","gYc",2,0,null,187,[]],
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,188,[]],
+JV:[function(a,b){return a%b},"call$1","gDH",2,0,null,187,[]],
 yu:[function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
 return z+0}throw H.b(P.f(''+a))},"call$0","gDi",0,0,null],
-HG:[function(a){return this.yu(this.UD(a))},"call$0","gD5",0,0,null],
+HG:[function(a){return this.yu(this.UD(a))},"call$0","gA0",0,0,null],
 UD:[function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},"call$0","gE8",0,0,null],
 yM:[function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,338,[]],
+return z},"call$1","gfE",2,0,null,335,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,28,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
 J:[function(a){return-a},"call$0","gVd",0,0,null],
 g:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a+b},"call$1","gF1n",2,0,null,104,[]],
+return a+b},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},"call$1","gTG",2,0,null,104,[]],
+return a-b},"call$1","gTG",2,0,null,109,[]],
 V:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a/b},"call$1","gJj",2,0,null,104,[]],
+return a/b},"call$1","gJj",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a*b},"call$1","gEH",2,0,null,104,[]],
+return a*b},"call$1","gEH",2,0,null,109,[]],
 Y:[function(a,b){var z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
-else return z+b},"call$1","gQR",2,0,null,104,[]],
+else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,104,[]],
-cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,104,[]],
+else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
-return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,104,[]],
-W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,104,[]],
+return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
+W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,109,[]],
 m:[function(a,b){var z
 if(b<0)throw H.b(new P.AT(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gyp",2,0,null,104,[]],
+z=a>>z>>>0}return z},"call$1","gyp",2,0,null,109,[]],
 GG:[function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gMe",2,0,null,104,[]],
+z=a>>z>>>0}return z},"call$1","gMe",2,0,null,109,[]],
 i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a&b)>>>0},"call$1","gAU",2,0,null,104,[]],
-k:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a|b)>>>0},"call$1","gX9",2,0,null,104,[]],
+return(a&b)>>>0},"call$1","gAU",2,0,null,109,[]],
 w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},"call$1","gttE",2,0,null,104,[]],
+return(a^b)>>>0},"call$1","gttE",2,0,null,109,[]],
 C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},"call$1","gix",2,0,null,104,[]],
+return a<b},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},"call$1","gh1",2,0,null,104,[]],
+return a>b},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a<=b},"call$1","gf5",2,0,null,104,[]],
+return a<=b},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a>=b},"call$1","gNH",2,0,null,104,[]],
+return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"zc,LN"}},
+static:{"^":"SAz,LN"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9056,17 +9054,17 @@
 $isnum:true},
 vT:{
 "^":"im;"},
-qa:{
+VP:{
 "^":"vT;"},
 BQ:{
-"^":"qa;"},
+"^":"VP;"},
 O:{
 "^":"String/Gv;",
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,47,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,339,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9077,21 +9075,21 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,335,26,[],120,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
-return a+b},"call$1","gF1n",2,0,null,104,[]],
+return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
 z=b.length
 y=a.length
 if(z>y)return!1
-return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,104,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,105,[],106,[]],
-Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,98,[]],
+return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,109,[]],
+h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,110,[],111,[]],
+Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,103,[]],
 Qi:[function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-if(typeof b==="string"){z=c+b.length
+z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,335,98,[],47,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,19 +9098,35 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 if(J.z8(c,a.length))throw H.b(P.N(c))
-return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,77,80,[],130,[]],
+return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v
-for(z=a.length,y=0;y<z;){if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x===32||x===13||J.Ga(x))++y
-else break}if(y===z)return""
-for(w=z;!0;w=v){v=w-1
-if(v<0)H.vh(P.N(v))
-if(v>=z)H.vh(P.N(v))
-x=a.charCodeAt(v)
-if(x===32||x===13||J.Ga(x));else break}if(y===0&&w===z)return a
-return a.substring(y,w)},"call$0","gZH",0,0,null],
+bS:[function(a){var z,y,x,w,v,u,t,s
+z=a.trim()
+y=z.length
+if(y===0)return z
+x=this.j(z,0)
+if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
+v=z.charCodeAt(w)
+if(v===32||v===13||J.Ga(v))++w
+else break}if(w===y)return""}else w=0
+u=y-1
+t=this.j(z,u)
+if(t===133||t===65279)for(;!0;u=s){s=u-1
+if(s<0)H.vh(P.N(s))
+if(s>=y)H.vh(P.N(s))
+v=z.charCodeAt(s)
+if(v===32||v===13||J.Ga(v));else break}else u=y
+if(w===0&&u===y)return z
+return z.substring(w,u)},"call$0","gZH",0,0,null],
+U:[function(a,b){var z,y
+if(typeof b!=="number")return H.s(b)
+if(0>=b)return""
+if(b===1||a.length===0)return a
+if(b!==b>>>0)throw H.b(C.IU)
+for(z=a,y="";!0;){if((b&1)===1)y=z+y
+b=b>>>1
+if(b===0)break
+z+=z}return y},"call$1","gEH",2,0,null,337,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
@@ -9120,7 +9134,7 @@
 z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,98,[],120,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9131,17 +9145,17 @@
 x=c
 while(!0){if(typeof x!=="number")return x.F()
 if(!(x>=0))break
-if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,98,[],120,[]],
+if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,335,104,[],80,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
 if(typeof b!=="string")throw H.b(new P.AT(b))
 if(a===b)z=0
 else z=a<b?-1:1
-return z},"call$1","gYc",2,0,null,104,[]],
+return z},"call$1","gYc",2,0,null,109,[]],
 bu:[function(a){return a},"call$0","gXo",0,0,null],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
@@ -9153,51 +9167,63 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(b)
+zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
 return z},"call$2","Ag",4,0,null,14,[],15,[]],
-oT:[function(a){var z,y,x,w,v
-z=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
-z.i6(a)
-init.globalState=z
+ox:[function(){var z=init.globalState.Xz
+z.GL=z.GL-1},"call$0","q4",0,0,null],
+oT:[function(a,b){var z,y,x,w,v,u
+z={}
+z.a=b
+b=b
+z.a=b
+if(b==null){b=[]
+z.a=b
+y=b}else y=b
+x=J.x(y)
+if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y.i6(a)
+init.globalState=y
 if(init.globalState.EF===!0)return
-z=init.globalState
-y=z.Hg
-z.Hg=y+1
-z=P.L5(null,null,null,J.im,H.yo)
-x=P.Ls(null,null,null,J.im)
-w=new H.yo(0,null,!1)
-v=new H.aX(y,z,x,new I(),w,P.Jz(),!1,[],P.Ls(null,null,null,null))
-x.h(0,0)
-v.aU(0,w)
-init.globalState.Nr=v
-init.globalState.N0=v
-z=H.N7()
-y=H.KT(z,[z]).BD(a)
-if(y)v.vV(new H.PK(a))
-else{z=H.KT(z,[z,z]).BD(a)
-if(z)v.vV(new H.JO(a))
-else v.vV(a)}init.globalState.Xz.bL()},"call$1","wr",2,0,null,16,[]],
+y=init.globalState
+x=y.Hg
+y.Hg=x+1
+y=P.L5(null,null,null,J.im,H.yo)
+w=P.Ls(null,null,null,J.im)
+v=new H.yo(0,null,!1)
+u=new H.aX(x,y,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+w.h(0,0)
+u.aU(0,v)
+init.globalState.Nr=u
+init.globalState.N0=u
+y=H.N7()
+x=H.KT(y,[y]).BD(a)
+if(x)u.vV(0,new H.PK(z,a))
+else{y=H.KT(y,[y,y]).BD(a)
+if(y)u.vV(0,new H.JO(z,a))
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
-if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.ZV()
+if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
+if(init.globalState.EF===!0)return H.fU()
 return},"call$0","dY",0,0,null],
-ZV:[function(){var z,y
+fU:[function(){var z,y
 z=new Error().stack
 if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+z+"\""))},"call$0","Sx",0,0,null],
-Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"call$0","mZ",0,0,null],
+Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h
 z=H.Hh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
@@ -9206,37 +9232,39 @@
 v=y.t(z,"args")
 u=H.Hh(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
-s=H.Hh(y.t(z,"replyTo"))
+s=y.t(z,"startPaused")
+r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState
-r=y.Hg
-y.Hg=r+1
+q=y.Hg
+y.Hg=q+1
 y=P.L5(null,null,null,J.im,H.yo)
-q=P.Ls(null,null,null,J.im)
-p=new H.yo(0,null,!1)
-o=new H.aX(r,y,q,new I(),p,P.Jz(),!1,[],P.Ls(null,null,null,null))
-q.h(0,0)
-o.aU(0,p)
-init.globalState.Xz.Rk.NZ(0,new H.IY(o,new H.jl(w,v,u,t,s),"worker-start"))
-init.globalState.N0=o
+p=P.Ls(null,null,null,J.im)
+o=new H.yo(0,null,!1)
+n=new H.aX(q,y,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+p.h(0,0)
+n.aU(0,o)
+init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
+init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":r=y.t(z,"functionName")
-n=y.t(z,"uri")
-q=y.t(z,"args")
-p=y.t(z,"msg")
-m=y.t(z,"isSpawnUri")
+case"spawn-worker":q=y.t(z,"functionName")
+m=y.t(z,"uri")
+p=y.t(z,"args")
+o=y.t(z,"msg")
+l=y.t(z,"isSpawnUri")
+k=y.t(z,"startPaused")
 y=y.t(z,"replyPort")
-if(n==null)n=$.Cl()
-l=new Worker(n)
-l.onmessage=function(e) { H.Mg(l, e); }
-k=init.globalState
-j=k.hJ
-k.hJ=j+1
-$.p6().u(0,l,j)
-init.globalState.XC.u(0,j,l)
-l.postMessage(H.Gy(H.B7(["command","start","id",j,"replyTo",H.Gy(y),"args",q,"msg",H.Gy(p),"isSpawnUri",m,"functionName",r],P.L5(null,null,null,null,null))))
+if(m==null)m=$.Cl()
+j=new Worker(m)
+j.onmessage=function(e) { H.Mg(j, e); }
+i=init.globalState
+h=i.hJ
+i.hJ=h+1
+$.p6().u(0,j,h)
+init.globalState.XC.u(0,h,j)
+j.postMessage(H.Gy(H.B7(["command","start","id",h,"replyTo",H.Gy(y),"args",p,"msg",H.Gy(o),"isSpawnUri",l,"startPaused",k,"functionName",q],P.L5(null,null,null,null,null))))
 break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
+case"message":if(y.t(z,"port")!=null)J.Sq(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
 case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
@@ -9246,39 +9274,51 @@
 case"log":H.ZF(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.vd
-r=H.Gy(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
+q=H.Gy(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
 y.toString
-self.postMessage(r)}else P.JS(y.t(z,"msg"))
+self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,17,[],18,[]],
+default:}},"call$2","NB",4,0,null,18,[],19,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,19,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+Ws:[function(a,b,c,d,e,f){var z,y,x,w
+z=init.globalState.N0
+y=z.jO
+$.te=$.te+("_"+y)
+$.eb=$.eb+("_"+y)
+y=z.EE
+x=init.globalState.N0.jO
+w=z.Qy
+J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
+x=new H.Vg(a,b,c,d)
+if(e===!0){z.v8(w,w)
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,20,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","m6",2,0,null,20,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,21,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,21,[]],
+else return a},"call$1","jr",2,0,null,22,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
 PK:{
-"^":"Tp:113;a",
-call$0:[function(){this.a.call$1([])},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,b",
+call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:113;b",
-call$0:[function(){this.b.call$2([],null)},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,c",
+call$0:[function(){this.c.call$2(this.a.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2@,vd,XC,w2<",
+"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2*,vd,XC,w2<",
 i6:function(a){var z,y,x,w
 z=$.Qm()==null
 y=$.Nl()
@@ -9297,9 +9337,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,RW<,C9<,lJ",
+"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
 v8:[function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,340,[],341,[]],
+if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
+this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9315,30 +9356,55 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}},"call$1","gtS",2,0,null,341,[]],
-vV:[function(a){var z,y
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+iK:[function(a){var z=this.Jp
+if(z==null){z=[]
+this.Jp=z}if(J.kE(z,a))return
+this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+Hh:[function(a){var z=this.Jp
+if(z==null)return
+J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+MZ:[function(a,b){if(!this.PX.n(0,a))return
+this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
+else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-try{y=a.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,141,[]],
+try{y=b.call$0()}finally{init.globalState.N0=z
+if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,143,[]],
 Ds:[function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
-default:P.JS("UNKOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,20,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,342,[]],
+case"add-ondone":this.iK(z.t(a,1))
+break
+case"remove-ondone":this.Hh(z.t(a,1))
+break
+case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
+break
+case"ping":this.Wq(z.t(a,1),z.t(a,2))
+break
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,342,[],343,[]],
-PC:[function(){var z=this.jO
-if(this.Gx.X5-this.fW.X5>0)init.globalState.i2.u(0,z,this)
-else init.globalState.i2.Rz(0,z)},"call$0","gi8",0,0,null],
+z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
+else this.UM()},"call$0","gi8",0,0,null],
+UM:[function(){J.V1(init.globalState.i2,this.jO)
+var z=this.Jp
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},"call$0","gAh",0,0,null],
 $isaX:true},
+oU:{
+"^":"Tp:115;a",
+call$0:[function(){J.Sq(this.a,null)},"call$0",null,0,0,null,"call"],
+$isEH:true},
 cC:{
-"^":"a;Rk,bZ",
+"^":"a;Rk,GL",
 Jc:[function(){var z,y,x,w,v
 z=this.Rk
 y=z.av
@@ -9350,12 +9416,12 @@
 v=x[y]
 x[y]=null
 z.av=(y+1&w-1)>>>0
-return v},"call$0","glk",0,0,null],
+return v},"call$0","gRe",0,0,null],
 xB:[function(){var z,y,x
 z=this.Jc()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)===!0&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.i2.X5===0&&y.Xz.bZ===0){y=y.vd
+if(y.EF===!0&&J.FN(y.i2)===!0&&y.Xz.GL===0){y=y.vd
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
@@ -9372,34 +9438,31 @@
 w.toString
 self.postMessage(v)}},"call$0","gcP",0,0,null]},
 RA:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
-"^":"a;Aq*,i3,G1*",
-VU:[function(){if(this.Aq.gRW()){this.Aq.gC9().push(this)
-return}this.Aq.vV(this.i3)},"call$0","gbF",0,0,null],
+"^":"a;F1*,i3,G1*",
+VU:[function(){if(this.F1.gRW()){this.F1.gC9().push(this)
+return}J.yn(this.F1,this.i3)},"call$0","gjF",0,0,null],
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:113;a,b,c,d,e",
-call$0:[function(){var z,y,x,w,v,u
-z=this.a
-y=this.b
-x=this.c
-w=init.globalState.N0
-v=w.jO
-$.te=$.te+("_"+v)
-$.eb=$.eb+("_"+v)
-J.H4(this.e,["spawned",new H.Z6(w.EE,init.globalState.N0.jO),w.Qy])
-if(this.d!==!0)z.call$1(x)
-else{v=H.N7()
-u=H.KT(v,[v,v]).BD(z)
-if(u)z.call$2(y,x)
-else{x=H.KT(v,[v]).BD(z)
-if(x)z.call$1(y)
+"^":"Tp:115;a,b,c,d,e,f",
+call$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"call$0",null,0,0,null,"call"],
+$isEH:true},
+Vg:{
+"^":"Tp:114;a,b,c,d",
+call$0:[function(){var z,y,x
+if(this.d!==!0)this.a.call$1(this.c)
+else{z=this.a
+y=H.N7()
+x=H.KT(y,[y,y]).BD(z)
+if(x)z.call$2(this.b,this.c)
+else{y=H.KT(y,[y]).BD(z)
+if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Iy:{
@@ -9407,10 +9470,10 @@
 $isbC:true},
 Z6:{
 "^":"Iy;JE,Jz",
-wR:[function(a,b){var z,y,x,w,v
+zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
-x=init.globalState.i2.t(0,y)
+x=J.UQ(init.globalState.i2,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
@@ -9420,16 +9483,16 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,20,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
 Ua:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -9437,15 +9500,15 @@
 $isEH:true},
 ns:{
 "^":"Iy;hQ,bv,Jz",
-wR:[function(a,b){var z,y
+zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,20,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
 z=J.c1(this.hQ,16)
 y=J.c1(this.Jz,8)
@@ -9467,23 +9530,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,344,[]],
+this.wy(b)},"call$1","gT5",2,0,null,345,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
-"^":"Dd;CN,il",
+"^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,21,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,21,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
 NO:{
-"^":"oo;il",
+"^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,21,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,21,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9491,17 +9554,17 @@
 y=z.t(a,1)
 x=z.t(a,2)
 w=z.t(a,3)
-if(J.de(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
+if(J.de(y,init.globalState.oL)){v=J.UQ(init.globalState.i2,x)
 if(v==null)return
 u=v.Zt(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,68,[]],
-Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gID",2,0,null,68,[]]},
+return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,73,[]],
+Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gID",2,0,null,73,[]]},
 fP:{
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],345,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9510,28 +9573,28 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],345,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
-Xq:[function(){return},"call$0","gt6",0,0,null]},
+Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
 "^":"a;",
 h7:[function(a){var z
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,21,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
 if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isIU)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,21,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
-oo:{
+if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9543,7 +9606,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gqb",2,0,null,68,[]],
+z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9553,31 +9616,31 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,149,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
+return z.a},"call$1","gnM",2,0,null,151,[]],
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
 OW:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,42,[],211,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
 $isEH:true},
-Dd:{
+Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,68,[]],
+return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,149,[]],
+return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,151,[]],
 mE:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -9587,14 +9650,14 @@
 w=0
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},"call$1","gBv",2,0,null,68,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
+x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,21,[]],
+return this.XE(a)},"call$1","gia",2,0,null,26,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9604,7 +9667,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gN3",2,0,null,21,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9615,7 +9678,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,21,[]],
+return x},"call$1","gMS",2,0,null,26,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9629,19 +9692,15 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,21,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,21,[]]},
+return z},"call$1","gwq",2,0,null,26,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
-ed:[function(){var z,y,x
-z=$.jk()
-if(z.setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-y=this.p9
-if(y==null)return
-x=init.globalState.Xz
-x.bZ=x.bZ-1
-if(this.Kf)z.clearTimeout(y)
-else z.clearInterval(y)
+ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.p9==null)return
+H.ox()
+if(this.Kf)$.jk().clearTimeout(this.p9)
+else $.jk().clearInterval(this.p9)
 this.p9=null}else throw H.b(P.f("Canceling a timer."))},"call$0","gZS",0,0,null],
 Qa:function(a,b){var z,y
 if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
@@ -9652,21 +9711,20 @@
 z.Rk.NZ(0,new H.IY(y,new H.FA(this,b),"timer"))
 this.zu=!0}else{z=$.jk()
 if(z.setTimeout!=null){y=init.globalState.Xz
-y.bZ=y.bZ+1
+y.GL=y.GL+1
 this.p9=z.setTimeout(H.tR(new H.Av(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
 static:{cy:function(a,b){var z=new H.yH(!0,!1,null)
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:112;c,d",
+"^":"Tp:114;c,d",
 call$0:[function(){this.c.p9=null
-var z=init.globalState.Xz
-z.bZ=z.bZ-1
+H.ox()
 this.d.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ku:{
@@ -9688,14 +9746,14 @@
 z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
 y=b.ng
-return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,104,[]],
+return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
-$isIU:true}}],["_js_helper","dart:_js_helper",,H,{
+$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 wV:[function(a,b){var z,y
 if(b!=null){z=b.x
 if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],22,[]],
+return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9703,12 +9761,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","Sa",2,0,null,23,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,24,[]],
+return z},"call$1","mQ",2,0,null,28,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,25,26,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9735,7 +9793,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,27,[],28,[],29,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9743,7 +9801,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,27,[],29,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9757,7 +9815,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","ma",2,0,null,30,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9767,12 +9825,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,31,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,32,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9787,13 +9845,13 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,33,[],34,[],35,[],36,[],37,[],38,[],39,[],40,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,41,[]],
+return a.date},"call$1","j1",2,0,null,46,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],42,[]],
+return a[b]},"call$2","De",4,0,null,6,[],47,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],42,[],23,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
@@ -9802,8 +9860,8 @@
 if(b!=null){z.a=0+b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],43,[],44,[]],
-Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -9813,17 +9871,17 @@
 w=x.Rv
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=x.Rn,s=0;s<u;++s){r=s+w
-v.u(0,init.metadata[t[2*r+u+3]],init.metadata[x.BX(0,r)])}z.a=!1
+for(u=x.hG,t=0;t<u;++t){s=t+w
+v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
-J.bj(b,v.gUQ(v))
-return y.apply(a,b)}q=[]
-p=0+b.length
-C.Nm.FV(q,b)
-y=a["call$"+p]
+C.Nm.FV(b,v.gUQ(v))
+return y.apply(a,b)}r=[]
+q=0+b.length
+C.Nm.FV(r,b)
+y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,q)},"call$3","ra",6,0,null,15,[],43,[],44,[]],
+return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
 pL:[function(a){if(a=="String")return C.Kn
 if(a=="int")return C.wq
 if(a=="double")return C.yX
@@ -9831,21 +9889,21 @@
 if(a=="bool")return C.Fm
 if(a=="List")return C.l0
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,45,[]],
+return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,46,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,41,[],47,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
 z.name=""}else z.toString=H.Ju
-return z},"call$1","Vb",2,0,null,48,[]],
+return z},"call$1","Cr",2,0,null,53,[]],
 Ju:[function(){return J.AG(this.dartException)},"call$0","Eu",0,0,null],
 vh:[function(a){var z
 if(a==null)a=new P.LK()
@@ -9853,7 +9911,7 @@
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
 z.name=""}else z.toString=H.Ju
-throw z},"call$1","wZ",2,0,null,48,[]],
+throw z},"call$1","wZ",2,0,null,53,[]],
 Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
@@ -9893,28 +9951,28 @@
 return z.call$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.call$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.call$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"call$1","v2",2,0,null,48,[]],
+return a},"call$1","v2",2,0,null,53,[]],
 CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
 else return H.eQ(a)},"call$1","Zs",2,0,null,6,[]],
 B7:[function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"call$2","nD",4,0,null,50,[],51,[]],
+b.u(0,a[y],a[x])}return b},"call$2","nD",4,0,null,55,[],56,[]],
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,52,[],14,[],53,[],54,[],55,[],56,[],57,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=(function(closure, arity, context, invoke) {  return function(a1, a2, a3, a4) {     return invoke(closure, context, arity, a1, a2, a3, a4);  };})(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},"call$2","qN",4,0,null,52,[],58,[]],
+return z},"call$2","qN",4,0,null,57,[],63,[]],
 iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
@@ -9943,7 +10001,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,41,[],59,[],60,[],61,[],62,[],63,[]],
+return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -9951,7 +10009,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,58,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -9968,7 +10026,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","Fw",4,0,null,15,[],64,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -9979,51 +10037,51 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,58,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
 if(typeof dart_precompiled=="function")return H.Z4(y,z,a)
-else if(y===1){x="return this."+H.d(H.oN())+"."+z+"(this."+H.d(H.Wz())+");"
+else if(y===1){x="return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(x+H.d(w))}else if(1<y&&y<28){v="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y-1).join(",")
-x="return function("+v+"){return this."+H.d(H.oN())+"."+z+"(this."+H.d(H.Wz())+","+v+");"
+x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,41,[],59,[],60,[],61,[],62,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,23,[],66,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,23,[],66,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,67,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,69,[],70,[],71,[]],
-uK:[function(a,b){var z=a.name
+H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
+Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"call$2","iw",4,0,null,72,[],73,[]],
-N7:[function(){return C.KZ},"call$0","cI",0,0,null],
+return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
+N7:[function(){return C.KZ},"call$0","Se",0,0,null],
 mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"call$2","aa",4,0,null,74,[],75,[]],
+return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"call$1","Qn",2,0,null,74,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,74,[],76,[]],
+return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Cn",6,0,null,74,[],76,[],47,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,74,[],47,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.call$1(a)
-else return},"call$2$onTypeVariable","bR",2,3,null,77,11,[],78,[]],
+else return},"call$2$onTypeVariable","bR",2,3,null,82,11,[],83,[]],
 ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
@@ -10033,33 +10091,33 @@
 if(v!=null)w=!1
 u=H.Ko(v,c)
 u=typeof u==="string"?u:H.d(u)
-z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,77,79,[],80,[],78,[]],
+z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,82,84,[],85,[],83,[]],
 dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","om",2,0,null,6,[]],
+return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","Yx",2,0,null,6,[]],
 Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,81,[],82,[]],
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,86,[],87,[]],
 RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"call$4","Ym",8,0,null,6,[],83,[],84,[],85,[]],
+return H.hv(H.Y9(y[d],z),c)},"call$4","Ym",8,0,null,6,[],88,[],89,[],90,[]],
 hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"call$2","QY",4,0,null,86,[],87,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,88,[],89,[],90,[]],
-Gq:[function(a,b){var z,y
+return!0},"call$2","QY",4,0,null,91,[],92,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,93,[],94,[],95,[]],
+XY:[function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"call$2","TU",4,0,null,91,[],87,[]],
+return H.t1(y,b)},"call$2","tk",4,0,null,96,[],92,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -10077,7 +10135,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,86,[],87,[]],
+return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,91,[],92,[]],
 Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -10087,7 +10145,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,86,[],87,[],92,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,91,[],92,[],97,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -10098,7 +10156,7 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","oq",4,0,null,86,[],87,[]],
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,91,[],92,[]],
 Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
@@ -10120,12 +10178,12 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,86,[],87,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","lv",6,0,null,15,[],41,[],82,[]],
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
 uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,93,[]],
-Su:[function(a){return H.eQ(a)},"call$1","cx",2,0,null,6,[]],
-bm:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","C5",6,0,null,93,[],66,[],23,[]],
+return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
+wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10151,16 +10209,16 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
-return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,93,[]],
+return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,98,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
-return b},"call$2","qF",4,0,null,93,[],7,[]],
+return b},"call$2","qF",4,0,null,98,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"call$1","oe",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,94,[],95,[],8,[]],
+else return J.Qu(z,c,null,null)},"call$3","di",6,0,null,99,[],100,[],8,[]],
 XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},"call$0","Ki",0,0,null],
@@ -10192,8 +10250,8 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"call$0","Bk",0,0,null],
-ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,96,[],97,[]],
+$.x7=new H.VX(t)},"call$0","Hb",0,0,null],
+ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,101,[],102,[]],
 ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
@@ -10203,13 +10261,13 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,102,[],103,[]],
+else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,41,[],104,[],80,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10223,7 +10281,7 @@
 if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,41,[],105,[],106,[]],
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -10236,36 +10294,35 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,42,[],211,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return this.Ix()},"call$0","gyP",0,0,null],
-FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,104,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
+FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
 LPe:{
 "^":"oH;B>,HV,tc",
-di:[function(a){return this.gUQ(this).Vr(0,new H.bw(this,a))},"call$1","gmc",2,0,null,102,[]],
+di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
-if(a==="__proto__")return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,42,[]],
-t:[function(a,b){if(typeof b!=="string")return
-if(!this.x4(b))return
-return this.HV[b]},"call$1","gIA",2,0,null,42,[]],
-aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,115,[]],
+if("__proto__"===a)return!1
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+t:[function(a,b){if(!this.x4(b))return
+return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+aN:[function(a,b){var z,y,x
+z=this.tc
+for(y=0;y<z.length;++y){x=z[y]
+b.call$2(x,this.TZ(x))}},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
-bw:{
+LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,23,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
-WT:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.b.call$2(a,this.a.t(0,a))},"call$1",null,2,0,null,42,[],"call"],
-$isEH:true},
 jJ:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,42,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10323,8 +10380,8 @@
 else z=null}s=!0}else s=!1
 if(typeof u=="function"){if(!("$reflectable" in u))H.Hz(J.GL(this.gWa()))
 if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gLk",2,0,null,6,[]],
-static:{"^":"hAw,oY,Y8"}},
+else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gpW",2,0,null,6,[]],
+static:{"^":"hAw,HT,zl"}},
 A2:{
 "^":"a;Pi<,mr,eK<,Ot",
 gpf:function(){return!1},
@@ -10334,7 +10391,7 @@
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
+b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
@@ -10353,25 +10410,48 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
+return this.mr.apply(v,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
 F3:{
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,145,[],331,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM",
+"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
 BX:[function(a,b){var z=this.Rv
+if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,347,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+Fk:[function(a){var z=this.Rv
+if(a<z)return
+if(!this.Mo||this.hG===1)return this.BX(0,a)
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+KE:[function(a){var z=this.Rv
+if(a<z)return
+if(!this.Mo||this.hG===1)return this.XL(a)
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+e4:[function(a){var z,y,x,w,v,u,t
+z={}
+if(this.NE==null){y=this.hG
+this.NE=Array(y)
+x=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.im])
+for(w=this.Rv,v=this.Rn,u=0;u<y;++u){t=w+u
+x.u(0,init.metadata[v[2*t+y+3]],t)}z.a=0
+y=x.gvc(x)
+y=P.F(y,!0,H.ip(y,"mW",0))
+H.rd(y,null)
+H.bQ(y,new H.Nv(z,this,x))}z=this.NE
+if(a<0||a>=z.length)return H.e(z,a)
+return z[a]},"call$1","gIK",2,0,null,350,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,348,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"t4,FV,C1,kj",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -10379,20 +10459,31 @@
 y=z[0]
 x=y>>1
 w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2])}}},
+return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+Nv:{
+"^":"Tp:30;a,b,c",
+call$1:[function(a){var z,y,x
+z=this.b.NE
+y=this.a
+x=y.a
+y.a=x+1
+y=this.c.t(0,a)
+if(x>=z.length)return H.e(z,x)
+z[x]=y},"call$1",null,2,0,null,12,[],"call"],
+$isEH:true},
 Cj:{
-"^":"Tp:349;a,b,c",
+"^":"Tp:352;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b)
-z.a=z.a+1},"call$2",null,4,0,null,12,[],46,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:349;a,b",
+"^":"Tp:352;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,347,[],23,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10410,7 +10501,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,20,[]],
+return y},"call$1","gul",2,0,null,22,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10420,20 +10511,20 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,20,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
   } catch (e) {
     return e.message;
   }
-}(a)},"call$1","LS",2,0,null,49,[]],Mj:[function(a){return function($expr$) {
+}(a)},"call$1","LS",2,0,null,54,[]],Mj:[function(a){return function($expr$) {
   try {
     $expr$.$method$;
   } catch (e) {
     return e.message;
   }
-}(a)},"call$1","cl",2,0,null,49,[]]}},
+}(a)},"call$1","cl",2,0,null,54,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:[function(a){var z=this.Ga
@@ -10447,8 +10538,8 @@
 z=this.Ga
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.EP
-if(y==null)return"NoSuchMethodError: Cannot call \""+z+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+z+"\" on \""+y+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
 $ismp:true,
 $isGe:true,
 static:{T3:function(a,b){var z,y
@@ -10461,10 +10552,10 @@
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"call$1",null,2,0,null,160,[],"call"],
+return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -10477,23 +10568,23 @@
 this.ui=z
 return z},"call$0","gXo",0,0,null]},
 dr:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:113;b,c",
+"^":"Tp:115;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:113;d,e,f",
+"^":"Tp:115;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:113;UI,bK,Gq,Rm",
+"^":"Tp:115;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:113;w3,HZ,mG,xC,cj",
+"^":"Tp:115;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
@@ -10510,35 +10601,35 @@
 if(this===b)return!0
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,104,[]],
+return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
 if(z==null)y=H.eQ(this.nw)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"call$1","PR",2,0,null,52,[]],yS:[function(a){return a.EP},"call$1","h0",2,0,null,52,[]],oN:[function(){var z=$.bf
+static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"call$1","PR",2,0,null,57,[]],yS:[function(a){return a.EP},"call$1","MZ",2,0,null,57,[]],oN:[function(){var z=$.bf
 if(z==null){z=H.B3("self")
 $.bf=z}return z},"call$0","uT",0,0,null],Wz:[function(){var z=$.P4
 if(z==null){z=H.B3("receiver")
-$.P4=z}return z},"call$0","TT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.P4=z}return z},"call$0","qY",0,0,null],B3:[function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"call$1","ec",2,0,null,65,[]]}},
+if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
 Ll:{
-"^":"a;Jy"},
-dN:{
-"^":"a;Jy"},
-GT:{
+"^":"a;QW"},
+D2:{
+"^":"a;QW"},
+my:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
 bu:[function(a){return this.G1},"call$0","gXo",0,0,null],
 $isGe:true,
-static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+a+" to incompatible type "+H.d(b))}}},
+static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 Eq:{
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -10548,9 +10639,9 @@
 tD:{
 "^":"lb;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,49,[]],
+return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,91,[]],
+return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,96,[]],
 za:[function(){var z,y,x,w,v,u,t
 z={ "func": "dynafunc" }
 y=this.dw
@@ -10585,7 +10676,7 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","eL",2,0,null,68,[]]}},
+return z},"call$1","At",2,0,null,73,[]]}},
 hJ:{
 "^":"lb;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
@@ -10596,7 +10687,7 @@
 za:[function(){var z,y
 z=this.oc
 y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+z+"'")
+if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},"call$0","gpA",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
@@ -10607,11 +10698,11 @@
 z=this.oc
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+z+"<...>'")
+if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},"call$0","gpA",0,0,null],
-bu:[function(a){return this.oc+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
+bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
 bu:[function(a){return"Unsupported operation: "+this.K9},"call$0","gXo",0,0,null],
@@ -10632,22 +10723,22 @@
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:350;b",
-call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,91,[],94,[],"call"],
+"^":"Tp:353;b",
+call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:25;c",
-call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,94,[],"call"],
+"^":"Tp:30;c",
+call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
 "^":"a;Ej,Ii,Ua",
@@ -10667,16 +10758,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,339,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,339,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,339,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,26,[],120,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10687,15 +10778,15 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,26,[],120,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,335,26,[],120,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
 $isVR:true,
-$iscT:true,
+$isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -10703,12 +10794,12 @@
 w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","ka",8,0,null,98,[],99,[],100,[],101,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","ka",8,0,null,103,[],104,[],105,[],106,[]]}},
 EK:{
-"^":"a;zO,QK<",
+"^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10718,7 +10809,7 @@
 "^":"mW;Gf,rv",
 gA:function(a){return new H.Pb(this.Gf,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$ascX:function(){return[P.Od]}},
+$asQV:function(){return[P.Od]}},
 Pb:{
 "^":"a;VV,rv,Wh",
 gl:function(){return this.Wh},
@@ -10739,42 +10830,35 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,351,[]],
+return this.zO},"call$1","gIA",2,0,null,354,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"call$1","vN",2,0,107,108,[]],
-js:[function(a,b){return J.pb(b,new G.BO(a))},"call$2","o4",4,0,null,110,[],111,[]],
+return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-352,zf>-353,AJ,Eb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gn9:[function(a){return this.AJ},null,null,1,0,354,"response",355,356],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,357,23,[],"response",355],
-gAq:[function(a){return this.Eb},null,null,1,0,358,"isolate",355,356],
-sAq:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,359,23,[],"isolate",355],
-Ww:[function(a,b){var z=H.B7(["type","Error","errorType",b,"text",a],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-this.AJ=F.Wi(this,C.mE,this.AJ,z)
-N.Jx("").hh(a)},function(a){return this.Ww(a,"ResponseError")},"AI","call$2",null,"gug",2,2,null,360,20,[],361,[]],
-TR:[function(){this.zf.sec(this)
-var z=this.Z6
+"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
+gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+Da:[function(){var z=this.Z6
 z.sec(this)
-z.kI()},"call$0","gIo",0,0,null],
-US:function(){this.TR()},
-hq:function(){this.TR()},
-static:{"^":"Tj,pQ"}},
+z.kI()},"call$0","gLW",0,0,null],
+US:function(){this.Da()},
+hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],362,[]],
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
 lb:[function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",0,0,null],
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,363,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10782,219 +10866,18 @@
 if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
 x=J.U6(z)
 y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
+y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gmf",0,0,null],
 W2:[function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])},"call$1","gW8",2,0,null,186,[]]},
-bv:{
-"^":["Pi;zf>,rI,we,jF,XR<-364,Z0<-365,hI,am,y6,c8,LE<-366,qU,yg,YG,jy,AP,fn",null,null,null,null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gAq:function(a){return this},
-gPj:function(a){return this.rI},
-gjO:function(a){return this.rI},
-zr:[function(a){return this.zf.Sl(this.rI).ml(new G.eS(this)).ml(new G.IQ(this))},"call$0","gvC",0,0,null],
-Mq:[function(a){return H.d(this.rI)+"/"+H.d(a)},"call$1","gLc",2,0,367,109,[],"relativeLink",355],
-rn:[function(a){return"#/"+(H.d(this.rI)+"/"+H.d(a))},"call$1","gHP",2,0,367,109,[],"hashLink",355],
-gB1:[function(a){return this.jF},null,null,1,0,368,"profile",355,356],
-sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,369,23,[],"profile",355],
-goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
-soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
-gzz:[function(){return this.am},null,null,1,0,370,"vmName",355,356],
-szz:[function(a){this.am=F.Wi(this,C.KS,this.am,a)},null,null,3,0,25,23,[],"vmName",355],
-gw2:[function(){return this.y6},null,null,1,0,354,"entry",355,356],
-sw2:[function(a){this.y6=F.Wi(this,C.tP,this.y6,a)},null,null,3,0,357,23,[],"entry",355],
-gVc:[function(){return this.c8},null,null,1,0,370,"rootLib",355,356],
-sVc:[function(a){this.c8=F.Wi(this,C.iF,this.c8,a)},null,null,3,0,25,23,[],"rootLib",355],
-gCi:[function(){return this.qU},null,null,1,0,371,"newHeapUsed",355,356],
-sCi:[function(a){this.qU=F.Wi(this,C.IO,this.qU,a)},null,null,3,0,372,23,[],"newHeapUsed",355],
-guq:[function(){return this.yg},null,null,1,0,371,"oldHeapUsed",355,356],
-suq:[function(a){this.yg=F.Wi(this,C.ap,this.yg,a)},null,null,3,0,372,23,[],"oldHeapUsed",355],
-gUu:[function(){return this.YG},null,null,1,0,354,"topFrame",355,356],
-sUu:[function(a){this.YG=F.Wi(this,C.ch,this.YG,a)},null,null,3,0,357,23,[],"topFrame",355],
-gNh:[function(a){return this.jy},null,null,1,0,370,"fileAndLine",355,356],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.jy=F.Wi(this,C.SK,this.jy,b)},null,null,3,0,25,23,[],"fileAndLine",355],
-eC:[function(a){var z,y,x,w
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
-return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
-return}y=J.UQ(z.t(a,"rootLib"),"id")
-this.c8=F.Wi(this,C.iF,this.c8,y)
-y=z.t(a,"name")
-this.am=F.Wi(this,C.KS,this.am,y)
-if(z.t(a,"entry")!=null){y=z.t(a,"entry")
-y=F.Wi(this,C.tP,this.y6,y)
-this.y6=y
-y=J.UQ(y,"name")
-this.hI=F.Wi(this,C.YS,this.hI,y)}else this.hI=F.Wi(this,C.YS,this.hI,"root isolate")
-if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
-this.YG=F.Wi(this,C.ch,this.YG,y)}x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(a,"timers"),new G.TI(x))
-y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
-y=J.UQ(z.t(a,"heap"),"usedNew")
-this.qU=F.Wi(this,C.IO,this.qU,y)
-z=J.UQ(z.t(a,"heap"),"usedOld")
-this.yg=F.Wi(this,C.ap,this.yg,z)},"call$1","gpn",2,0,null,149,[]],
-bu:[function(a){return H.d(this.rI)},"call$0","gXo",0,0,null],
-hv:[function(a){var z,y,x,w
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gER",2,0,null,373,[]],
-R7:[function(){var z,y,x,w
-N.Jx("").To("Reset all code ticks.")
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
-oe:[function(a){var z,y,x,w,v,u,t
-for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
-v=J.U6(w)
-u=J.UQ(v.t(w,"script"),"id")
-t=x.t(y,u)
-if(t==null){t=G.Ak(v.t(w,"script"))
-x.u(y,u,t)}t.hC(v.t(w,"hits"))}},"call$1","gHY",2,0,null,374,[]],
-tx:[function(a,b,c){var z,y,x
-z=H.B7(["type",a,b,c],P.L5(null,null,null,null,null))
-y=this.zf.ec
-y.toString
-x=R.Jk(z)
-y.AJ=F.Wi(y,C.mE,y.AJ,x)},"call$3","gmk",6,0,null,11,[],375,[],285,[]],
-XT:[function(a,b){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
-y=J.RE(z)
-x=H.d(y.gys(z))+" "+y.gpo(z)
-if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
-this.zf.ec.Ww(x,"RequestError")}else this.zf.ec.AI(H.d(a)+" "+H.d(b))},"call$2","gdT",4,0,376,18,[],377,[]],
-n1:[function(a){var z,y,x
-z=G.Ep(a)
-y=J.x(z)
-if(y.n(z,0)){this.zf.ec.AI(a+" is not a valid code request.")
-return}x=this.hv(z)
-if(x!=null){N.Jx("").To("Found code with 0x"+y.WZ(z,16)+" in isolate.")
-this.tx("Code","code",x)
-return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.at(this,z)).OA(this.gdT())},"call$1","gN8",2,0,null,109,[]],
-PL:[function(a){var z,y
-z=J.UQ(this.XR,a)
-y=z!=null
-if(y&&!z.giI()){N.Jx("").To("Found script "+H.d(J.UQ(z.gKC(),"name"))+" in isolate")
-this.tx("Script","script",z)
-return}if(y){this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.wu(this,z))
-return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.Vc(this,a))},"call$1","gdk",2,0,null,109,[]],
-ox:[function(a){var z,y
-z=$.Ks().Ej
-y=typeof a!=="string"
-if(y)H.vh(new P.AT(a))
-if(z.test(a)){this.n1(a)
-return}z=$.hK().Ej
-if(y)H.vh(new P.AT(a))
-if(z.test(a)){this.PL(a)
-return}return this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.KQ(this,a))},"call$1","gVw",2,0,null,109,[]],
-oX:[function(a){return this.zf.Sl(H.d(this.rI)+"/"+H.d(a))},"call$1","guZ",2,0,null,109,[]],
-$isd3:true,
-static:{"^":"rC,lF",Ep:[function(a){var z,y,x,w,v,u
-z=$.Ks().R4(0,a)
-if(z==null)return 0
-try{x=z.gQK().input
-w=z
-v=w.gQK().index
-w=w.gQK()
-if(0>=w.length)return H.e(w,0)
-w=J.q8(w[0])
-if(typeof w!=="number")return H.s(w)
-y=H.BU(C.xB.yn(x,v+w),16,null)
-return y}catch(u){H.Ru(u)
-return 0}},"call$1","VP",2,0,null,109,[]]}},
-eS:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.eC(a)},"call$1",null,2,0,null,191,[],"call"],
-$isEH:true},
-IQ:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
-$isEH:true},
-TI:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,378,[],"call"],
-$isEH:true},
-at:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z,y,x,w,v
-z=R.Jk([])
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.B7([],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-w=J.U6(a)
-v=new G.kx(C.l8,H.BU(w.t(a,"start"),16,null),H.BU(w.t(a,"end"),16,null),[],[],[],0,0,z,y,x,null,null,null,null)
-v.NV(a)
-N.Jx("").To("Added code with 0x"+J.u1(this.b,16)+" to isolate.")
-x=this.a
-J.bi(x.Z0,v)
-x.tx("Code","code",v)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-wu:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z=this.b
-z.qi(J.UQ(a,"source"))
-N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
-this.a.tx("Script","script",z)},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-Vc:{
-"^":"Tp:107;c,d",
-call$1:[function(a){var z,y
-z=G.Ak(a)
-N.Jx("").To("Added script "+H.d(J.UQ(z.VG,"name"))+" to isolate.")
-y=this.c
-y.tx("Script","script",z)
-J.kW(y.XR,this.d,z)},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z,y
-z=this.a
-y=J.U6(a)
-y=new G.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,y.t(a,"id"),y.t(a,"type"),null,null,null,null)
-y.wp(z,a)
-return y},"call$1",null,2,0,null,191,[],"call"],
-$isEH:true},
+this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
-"^":"Pi;ec?,jF,JL,MU,AP,fn",
-guw:function(a){return this.ec},
-gB1:[function(a){return this.jF},null,null,1,0,380,"profile",355,356],
-sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,381,23,[],"profile",355],
-gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",355,356],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,25,23,[],"currentHash",355],
-gXX:[function(){return this.MU},null,null,1,0,382,"currentHashUri",355,356],
-sXX:[function(a){this.MU=F.Wi(this,C.tv,this.MU,a)},null,null,3,0,383,23,[],"currentHashUri",355],
+"^":"Pi;ec?,JL,AP,Lk",
+gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
-vI:[function(){var z,y,x,w,v
-z=$.oy().R4(0,this.JL)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
-V4:[function(){var z,y,x,w
-z=$.oy().R4(0,this.JL)
+e8:[function(){var z,y,x,w
+z=$.wM().R4(0,this.JL)
 if(z==null)return
 y=z.QK
 x=y.input
@@ -11002,332 +10885,46 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$0","gdQ",0,0,null],
-gwB:[function(){return this.vI()!=null},null,null,1,0,380,"hasCurrentIsolate",356],
-R6:[function(){var z=this.vI()
+return C.xB.yn(x,w+y)},"call$0","gIZ",0,0,null],
+R6:[function(){var z,y,x,w
+z=$.QJ().R4(0,this.JL)
 if(z==null)return""
-return J.D8(z,2)},"call$0","gKo",0,0,null],
+y=z.QK
+x=y.input
+w=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return this.ec.zf.AQ(z)},"call$0","gjf",0,0,358,"currentIsolate",356],
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
 S7:[function(){var z=J.Co(C.ol.gmW(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
 if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
-df:[function(){var z,y,x,w
+rR:[function(a){var z=this.ec
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+df:[function(){var z,y,x
 z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.JL,z)
-this.JL=z
-y=J.D8(z,1)
+this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
-x=this.Pr()
-z.Eb=F.Wi(z,C.Z8,z.Eb,x)
-x=P.r6($.qG().ej(y))
-this.MU=F.Wi(this,C.tv,this.MU,x)
-if(this.ec.Eb==null){N.Jx("").j2("Refreshing isolates.")
-this.ec.zf.r3()
-return}w=this.V4()
-N.Jx("").To("Asking "+H.d(J.F8(this.ec.Eb))+" for "+w)
-this.ec.Eb.ox(w).ml(new G.GH(this))},"call$0","glq",0,0,null],
-static:{"^":"x4,Qq,qY"}},
+y=this.Pr()
+z.Eb=F.Wi(z,C.Z8,z.Eb,y)
+z=this.ec
+if(z.Eb==null){J.am(J.dm(z.zf)).ml(this.gf8())
+return}x=this.e8()
+this.ec.Eb.ox(x).ml(this.gf8())},"call$0","glq",0,0,null],
+static:{"^":"K3D,m6,vi"}},
 Qe:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
-z.df()},"call$1",null,2,0,null,384,[],"call"],
+z.df()},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
-GH:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=this.a.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1",null,2,0,null,385,[],"call"],
-$isEH:true},
-Q4:{
-"^":["Pi;Yu<-386,m7<-387,L4<-387,NC,xb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-ga0:[function(){return this.NC},null,null,1,0,371,"ticks",355,356],
-sa0:[function(a){this.NC=F.Wi(this,C.p1,this.NC,a)},null,null,3,0,372,23,[],"ticks",355],
-gGK:[function(){return this.xb},null,null,1,0,388,"percent",355,356],
-sGK:[function(a){this.xb=F.Wi(this,C.tI,this.xb,a)},null,null,3,0,389,23,[],"percent",355],
-oS:[function(){var z=this.xb
-if(z==null||J.Hb(z,0))return""
-return J.Ez(this.xb,2)+"% ("+H.d(this.NC)+")"},"call$0","gu3",0,0,370,"formattedTicks",356],
-xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gDa",0,0,370,"formattedAddress",356]},
-WAE:{
-"^":"a;Zd",
-bu:[function(a){return"CodeKind."+this.Zd},"call$0","gXo",0,0,null],
-static:{"^":"r1,pg,WAg",CQ:[function(a){var z=J.x(a)
-if(z.n(a,"Native"))return C.nj
-else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
-throw H.b(P.hS())},"call$1","Tx",2,0,null,86,[]]}},
-N8:{
-"^":"a;Yu<,pO,Iw"},
-Vi:{
-"^":"a;tT>,Av<"},
-kx:{
-"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-390,tQ,Ge,hI,HJ,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gkx:[function(){return this.tQ},null,null,1,0,354,"functionRef",355,356],
-skx:[function(a){this.tQ=F.Wi(this,C.yg,this.tQ,a)},null,null,3,0,357,23,[],"functionRef",355],
-gZN:[function(){return this.Ge},null,null,1,0,354,"codeRef",355,356],
-sZN:[function(a){this.Ge=F.Wi(this,C.EX,this.Ge,a)},null,null,3,0,357,23,[],"codeRef",355],
-goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
-soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
-giK:[function(){return this.HJ},null,null,1,0,370,"userName",355,356],
-siK:[function(a){this.HJ=F.Wi(this,C.ct,this.HJ,a)},null,null,3,0,25,23,[],"userName",355],
-R3:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
-y=z.t(b,"ticks")
-if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
-x=this.a0
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(y,w),16,null)
-t=H.BU(z.t(y,w+1),null,null)
-x.push(new G.N8(u,H.BU(z.t(y,w+2),null,null),t))
-w+=3}}},"call$1","gOT",2,0,null,149,[]],
-QQ:[function(){return this.uL(this.VS)},"call$0","gyj",0,0,null],
-dJ:[function(a){return this.KU(this.VS,a)},"call$1","gf7",2,0,null,141,[]],
-uL:[function(a){var z,y,x
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gAv()
-if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","grr",2,0,null,391,[]],
-KU:[function(a,b){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gKZ",4,0,null,391,[],141,[]],
-xF:[function(a,b){var z=J.U6(a)
-this.lC(this.VS,z.t(a,"callers"),b)
-this.lC(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,141,[],392,[]],
-lC:[function(a,b,c){var z,y,x,w,v
-C.Nm.sB(a,0)
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new G.Vi(c[w],v))
-y+=2}H.ZE(a,0,a.length-1,new G.fx())},"call$3","gPG",6,0,null,391,[],239,[],392,[]],
-FB:[function(){this.fF=0
-this.Du=0
-C.Nm.sB(this.a0,0)
-for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
-iv:[function(a){var z,y,x,w,v
-z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(J.de(x.t(a,w),""))break c$0
-y.h(z,new G.Q4(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","goU",2,0,null,393,[]],
-tg:[function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,373,[]],
-NV:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"function")
-y=R.Jk(y)
-this.tQ=F.Wi(this,C.yg,this.tQ,y)
-y=R.Jk(a)
-this.Ge=F.Wi(this,C.EX,this.Ge,y)
-y=z.t(a,"name")
-this.hI=F.Wi(this,C.YS,this.hI,y)
-y=z.t(a,"user_name")
-this.HJ=F.Wi(this,C.ct,this.HJ,y)
-if(z.t(a,"disassembly")!=null)this.iv(z.t(a,"disassembly"))},
-$iskx:true},
-fx:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
-CM:{
-"^":"a;Aq>,tm,hV<",
-j8:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"ProfileCode"))return
-y=this.Aq
-x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
-if(x==null){w=G.CQ(z.t(a,"kind"))
-v=z.t(a,"code")
-z=J.U6(v)
-u=H.BU(z.t(v,"start"),16,null)
-t=H.BU(z.t(v,"end"),16,null)
-s=z.t(v,"name")
-r=z.t(v,"user_name")
-q=R.Jk([])
-p=H.B7([],P.L5(null,null,null,null,null))
-p=R.Jk(p)
-o=H.B7([],P.L5(null,null,null,null,null))
-o=R.Jk(o)
-x=new G.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
-x.Ge=F.Wi(x,C.EX,o,v)
-o=z.t(v,"function")
-q=R.Jk(o)
-x.tQ=F.Wi(x,C.yg,x.tQ,q)
-x.HJ=F.Wi(x,C.ct,x.HJ,r)
-if(z.t(v,"disassembly")!=null){x.iv(z.t(v,"disassembly"))
-z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.JD(x,a)
-this.tm.push(x)},"call$1","gWF",2,0,null,394,[]],
-T0:[function(a){var z,y
-z=this.Aq.gZ0()
-y=J.w1(z)
-y.GT(z,new G.vu())
-if(J.u6(y.gB(z),a)||J.de(a,0))return z
-return y.D6(z,0,a)},"call$1","gmZ",2,0,null,127,[]],
-uH:function(a,b){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"codes")
-this.hV=z.t(b,"samples")
-z=J.U6(y)
-N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
-this.Aq.R7()
-x=this.tm
-C.Nm.sB(x,0)
-z.aN(y,new G.xn(this))
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-if(w>=x.length)return H.e(x,w)
-x[w].xF(z.t(y,w),x);++w}C.Nm.sB(x,0)},
-static:{hh:function(a,b){var z=new G.CM(a,H.VM([],[G.kx]),0)
-z.uH(a,b)
-return z}}},
-xn:{
-"^":"Tp:107;a",
-call$1:[function(a){var z,y,x,w
-try{this.a.j8(a)}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-N.Jx("").wF("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,141,[],"call"],
-$isEH:true},
-vu:{
-"^":"Tp:395;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
-c2:{
-"^":["Pi;Rd>-386,ye,i0,AP,fn",function(){return[C.mI]},null,null,null,null],
-gu9:[function(){return this.ye},null,null,1,0,371,"hits",355,356],
-su9:[function(a){this.ye=F.Wi(this,C.K7,this.ye,a)},null,null,3,0,372,23,[],"hits",355],
-ga4:[function(a){return this.i0},null,null,1,0,370,"text",355,356],
-sa4:[function(a,b){this.i0=F.Wi(this,C.MB,this.i0,b)},null,null,3,0,25,23,[],"text",355],
-goG:function(){return J.J5(this.ye,0)},
-gVt:function(){return J.z8(this.ye,0)},
-$isc2:true},
-rj:{
-"^":["Pi;I2,VG,pw,tq,Sw<-396,iA,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
-gfY:[function(a){return this.I2},null,null,1,0,370,"kind",355,356],
-sfY:[function(a,b){this.I2=F.Wi(this,C.fy,this.I2,b)},null,null,3,0,25,23,[],"kind",355],
-gKC:[function(){return this.VG},null,null,1,0,354,"scriptRef",355,356],
-sKC:[function(a){this.VG=F.Wi(this,C.Be,this.VG,a)},null,null,3,0,357,23,[],"scriptRef",355],
-gQT:[function(){return this.pw},null,null,1,0,370,"shortName",355,397],
-sQT:[function(a){this.pw=F.Wi(this,C.Kt,this.pw,a)},null,null,3,0,25,23,[],"shortName",355],
-gBi:[function(){return this.tq},null,null,1,0,354,"libraryRef",355,356],
-sBi:[function(a){this.tq=F.Wi(this,C.cg,this.tq,a)},null,null,3,0,357,23,[],"libraryRef",355],
-giI:function(){return this.iA},
-gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,398,"linesForDisplay",356],
-H2:[function(a){var z,y,x,w
-z=this.Sw
-y=J.U6(z)
-x=J.Wx(a)
-if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
-w=y.t(z,a)
-if(w==null){w=new G.c2(a,-1,"",null,null)
-y.u(z,a,w)}return w},"call$1","git",2,0,null,399,[]],
-qi:[function(a){var z,y,x,w
-if(a==null)return
-N.Jx("").To("Loading source for "+H.d(J.UQ(this.VG,"name")))
-z=J.uH(a,"\n")
-this.iA=z.length===0
-for(y=0;y<z.length;y=x){x=y+1
-w=this.H2(x)
-if(y>=z.length)return H.e(z,y)
-J.c9(w,z[y])}},"call$1","gUe",2,0,null,27,[]],
-hC:[function(a){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-this.H2(z.t(a,y)).su9(z.t(a,y+1))
-y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","geL",2,0,null,400,[]],
-Nk:[function(){var z,y,x,w
-for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
-if(w==null)continue
-if(!w.goG())continue;++x
-if(!w.gVt())continue;++y}if(x===0)return 0
-return y/x*100},"call$0","gUO",0,0,388,"coveredPercentage",356],
-Jt:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,370,"coveredPercentageFormatted",356],
-Ea:function(a){var z,y
-z=J.U6(a)
-y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-this.VG=F.Wi(this,C.Be,this.VG,y)
-y=J.D8(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
-this.pw=F.Wi(this,C.Kt,this.pw,y)
-y=z.t(a,"library")
-y=R.Jk(y)
-this.tq=F.Wi(this,C.cg,this.tq,y)
-y=z.t(a,"kind")
-this.I2=F.Wi(this,C.fy,this.I2,y)
-this.qi(z.t(a,"source"))},
-$isrj:true,
-static:{Ak:function(a){var z,y,x
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.VM([],[G.c2])
-x=R.Jk(x)
-x=new G.rj(null,z,null,y,x,!0,null,null)
-x.Ea(a)
-return x}}},
-af:{
-"^":"d3;Aq>",
-gPj:function(a){return H.d(this.Aq.rI)+"/"+H.d(this.rI)},
-gjO:function(a){return this.rI}},
-SI:{
-"^":"af;YY,Aq,rI,we,R9,wv,V2,me",
-zr:[function(a){var z=this.Aq
-z.zf.Sl(H.d(z.rI)+"/"+H.d(this.rI)).ml(this.gE7())
-return P.Ab(this,null)},"call$0","gvC",0,0,null],
-Tn:[function(a){var z=this.YY
-z.V1(0)
-z.FV(0,a)},"call$1","gE7",2,0,401,191,[]],
-FV:[function(a,b){return this.YY.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
-V1:[function(a){return this.YY.V1(0)},"call$0","gyP",0,0,null],
-di:[function(a){return this.YY.Zp.di(a)},"call$1","gmc",2,0,null,277,[]],
-x4:[function(a){return this.YY.Zp.x4(a)},"call$1","gV9",2,0,null,402,[]],
-aN:[function(a,b){return this.YY.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
-Rz:[function(a,b){return this.YY.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
-t:[function(a,b){return this.YY.Zp.t(0,b)},"call$1","gIA",2,0,null,402,[]],
-u:[function(a,b,c){this.YY.u(0,b,c)
-return c},"call$2","gj3",4,0,null,402,[],277,[]],
-gl0:function(a){var z=this.YY.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.YY.Zp
-return z.gB(z)!==0},
-gvc:function(a){var z=this.YY.Zp
-return z.gvc(z)},
-gUQ:function(a){var z=this.YY.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.YY.Zp
-return z.gB(z)},
-wp:function(a,b){var z=this.YY
-z.V1(0)
-z.FV(0,b)},
-$isZ0:true,
-$asZ0:function(){return[null,null]}},
 Y2:{
-"^":["Pi;eT>,yt<-386,wd>-403,oH<-404",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -11337,15 +10934,15 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rO,WT>-403,AP,fn",null,function(){return[C.mI]},null,null],
+"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,405,[]],
-Mf:[function(a){var z=J.UQ(this.WT,a)
+y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
+qU:[function(a){var z=J.UQ(this.WT,a)
 if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,406,[]],
+else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
 VE:[function(a){var z,y,x,w,v,u,t
 z=this.WT
 y=J.U6(z)
@@ -11358,7 +10955,7 @@
 u=x+v+1
 t=J.UQ(w.gwd(a),v)
 if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,363,[]],
+else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -11369,159 +10966,37 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,363,[]]},
-No:{
-"^":["Pi;ec?,i2<-407",null,function(){return[C.mI]}],
-guw:[function(a){return this.ec},null,null,1,0,408,"app",356],
-Sl:[function(a){return this.GS(a).ml(new G.PG()).OA(new G.YW())},"call$1","gdI",2,0,null,265,[]],
-AQ:[function(a){var z,y,x,w,v,u
-z=this.i2
-y=J.U6(z)
-x=y.t(z,a)
-if(x!=null)return x
-w=P.L5(null,null,null,J.O,G.rj)
-w=R.Jk(w)
-v=H.VM([],[G.kx])
-u=P.L5(null,null,null,J.O,J.GW)
-u=R.Jk(u)
-x=new G.bv(this,a,"Isolate",null,w,v,"isolate",null,null,null,u,0,0,null,null,null,null)
-y.u(z,a,x)
-return x},"call$1","grE",2,0,null,110,[]],
-GR:[function(a){var z=[]
-J.kH(this.i2,new G.Yu(a,z))
-H.bQ(z,new G.y2(this))
-J.kH(a,new G.Hq(this))},"call$1","gZM",2,0,null,111,[]],
-r3:[function(){this.Sl("isolates").ml(new G.Pl(this))},"call$0","gNI",0,0,null]},
-PG:{
-"^":"Tp:107;",
-call$1:[function(a){var z,y,x,w,v
-try{z=C.xr.kV(a)
-w=R.Jk(z)
-return w}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-w=H.B7(["type","Error","errorType","DecodeError","text",H.d(y)+" "+H.d(x)],P.L5(null,null,null,null,null))
-w=R.Jk(w)
-return w}},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-YW:{
-"^":"Tp:107;",
-call$1:[function(a){var z=H.B7(["type","Error","errorType","FetchError","text",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,160,[],"call"],
-$isEH:true},
-BO:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,409,[],"call"],
-$isEH:true},
-Yu:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){if(G.js(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,402,[],277,[],"call"],
-$isEH:true},
-y2:{
-"^":"Tp:107;c",
-call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,110,[],"call"],
-$isEH:true},
-Hq:{
-"^":"Tp:107;d",
-call$1:[function(a){var z,y,x,w,v,u,t,s,r
-z=J.U6(a)
-y=z.t(a,"id")
-x=this.d
-w=x.i2
-v=J.U6(w)
-u=v.t(w,y)
-if(u==null){t=P.L5(null,null,null,J.O,G.rj)
-t=R.Jk(t)
-s=H.VM([],[G.kx])
-r=P.L5(null,null,null,J.O,J.GW)
-r=R.Jk(r)
-u=new G.bv(x,z.t(a,"id"),"Isolate",null,t,s,z.t(a,"name"),null,null,null,r,0,0,null,null,null,null)
-v.u(w,y,u)}J.KM(u)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-Pl:{
-"^":"Tp:107;a",
-call$1:[function(a){var z,y
-z=this.a
-z.GR(J.UQ(a,"members"))
-z=z.ec
-z.toString
-y=R.Jk(a)
-z.AJ=F.Wi(z,C.mE,z.AJ,y)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-XK:{
-"^":["No;Yu<,ec,i2-407,AP,fn",null,null,function(){return[C.mI]},null,null],
-GS:[function(a){var z=this.Yu
-N.Jx("").To("Fetching "+H.d(a)+" from "+z)
-return W.It(C.xB.g(z,a),null,null)},"call$1","gFw",2,0,null,265,[]]},
-ho:{
-"^":["No;Ct,pL,ec,i2-407,AP,fn",null,null,null,function(){return[C.mI]},null,null],
-rz:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.Ct
-v=z.t(0,y)
-z.Rz(0,y)
-J.Xf(v,w)},"call$1","gcW",2,0,158,19,[]],
-GS:[function(a){var z,y,x
-z=""+this.pL
-y=H.B7([],P.L5(null,null,null,null,null))
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query","/"+H.d(a))
-this.pL=this.pL+1
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.Ct.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gFw",2,0,null,265,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/isolate_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/disassembly_entry.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/vm_element.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/message_viewer.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
-F.E2()},"call$0","nE",0,0,112]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Ur;BW%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grs:[function(a){return a.BW},null,null,1,0,354,"msg",355,397],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,357,23,[],"msg",355],
-RF:[function(a,b){a.pC.oX("breakpoints").ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
+yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.jy]},
-static:{Dw:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.BW=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{Dw:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.J0.ZL(a)
 C.J0.G6(a)
-return a},null,null,0,0,113,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[414],
-Ur:{
-"^":"PO+Pi;",
-$isd3:true},
-j3:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+BreakpointListElement_refresh_closure":[415],
-i0:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+BreakpointListElement_refresh_closure":[415]}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[380],
+Vf:{
+"^":"uL+Pi;",
+$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11535,15 +11010,15 @@
 a.X0=w
 C.YZ.ZL(a)
 C.YZ.G6(a)
-return a},null,null,0,0,113,"new ClassRefElement$created"]}},
-"+ClassRefElement":[418]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,115,"new ClassRefElement$created"]}},
+"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
-Ps:{
-"^":["KU;F0%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.F0},null,null,1,0,354,"cls",355,397],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,357,23,[],"cls",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.F0,"id")).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.aQx]},
+Jc:{
+"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
+sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
+yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11555,27 +11030,14 @@
 a.X0=w
 C.kk.ZL(a)
 C.kk.G6(a)
-return a},null,null,0,0,113,"new ClassViewElement$created"]}},
-"+ClassViewElement":[419],
-KU:{
-"^":"PO+Pi;",
-$isd3:true},
-RI:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+ClassViewElement_refresh_closure":[415],
-Ye:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+ClassViewElement_refresh_closure":[415]}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+return a},null,null,0,0,115,"new ClassViewElement$created"]}},
+"+ClassViewElement":[384],
+pv:{
+"^":"uL+Pi;",
+$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11589,15 +11051,21 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.G6(a)
-return a},null,null,0,0,113,"new CodeRefElement$created"]}},
-"+CodeRefElement":[418]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,115,"new CodeRefElement$created"]}},
+"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
-HT:{
-"^":["qbd;eJ%-420,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtT:[function(a){return a.eJ},null,null,1,0,421,"code",355,397],
-stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,422,23,[],"code",355],
-grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
-"@":function(){return[C.xW]},
+Be:{
+"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+i4:[function(a){var z
+Z.uL.prototype.i4.call(this,a)
+z=a.Xx
+if(z==null)return
+J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
+yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
+"@":function(){return[C.xz]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11609,34 +11077,34 @@
 a.X0=w
 C.YD.ZL(a)
 C.YD.G6(a)
-return a},null,null,0,0,113,"new CodeViewElement$created"]}},
-"+CodeViewElement":[423],
-qbd:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new CodeViewElement$created"]}},
+"+CodeViewElement":[388],
+Vfx:{
+"^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Ds;zh%-387,HX%-387,Uy%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gl7:[function(a){return a.zh},null,null,1,0,370,"iconClass",355,356],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",355],
-gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",355,356],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",355],
-gxj:[function(a){return a.Uy},null,null,1,0,380,"collapsed"],
+"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
+gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
+gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.np(a)},null,null,3,0,381,424,[],"collapsed"],
+this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.np(a)},"call$0","gQd",0,0,112,"enteredView"],
+this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.np(a)
-this.np(a)},"call$3","gl8",6,0,425,18,[],306,[],74,[],"toggleDisplay"],
-np:[function(a){var z,y
+this.SS(a)
+this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,112,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-387,DI<-387",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11650,32 +11118,30 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.G6(a)
-return a},null,null,0,0,113,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[426],
-Ds:{
+return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[394],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-417,Hu%-417,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goE:[function(a){return a.GV},null,null,1,0,380,"expanded",355,356],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,381,23,[],"expanded",355],
-gO9:[function(a){return a.Hu},null,null,1,0,380,"busy",355,356],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,381,23,[],"busy",355],
-gFR:[function(a){return a.nx},null,null,1,0,113,"callback",355,397],
+"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
+gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,107,23,[],"callback",355],
-PA:[function(a){var z
-P.JS("done callback")
-z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
+PA:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,112,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,427,128,[],188,[],283,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11691,8 +11157,8 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.G6(a)
-return a},null,null,0,0,113,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[428],
+return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[396],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11704,20 +11170,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,114,[],115,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,116,[],117,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,114,[],115,[]],
+return!1},"call$2","cs",4,0,null,116,[],117,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,114,[],116,[],117,[]],
+return b},"call$3","hp",6,0,null,116,[],118,[],119,[]],
 mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
@@ -11726,19 +11192,22 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,114,[],118,[],119,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,116,[],120,[],121,[]],
+rd:[function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,73,[],122,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,68,[],120,[],121,[]],
-Og:[function(a,b,c,d,e){var z,y
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
+qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-z=J.xH(c,b)
-if(J.de(z,0))return
+if(typeof b!=="number")return H.s(b)
+z=c-b
+if(z===0)return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
-H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],120,[],121,[],105,[],122,[]],
+H.tb(d,e,a,b,z)},"call$5","it",10,0,null,73,[],123,[],124,[],110,[],125,[]],
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
@@ -11750,41 +11219,42 @@
 z=z.g(b,x)
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
-H.Og(a,z,w,a,b)
+H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.lo
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],114,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,123,[],124,[],125,[],126,[],127,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,126,[],127,[],128,[],129,[],130,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
-for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,128,[],129,[],80,[],130,[]],
-eX:[function(a,b,c){var z,y
+if(c<0)c=0
+for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
+if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,131,[],132,[],85,[],133,[]],
+lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,128,[],129,[],80,[]],
-ZE:[function(a,b,c,d){if(J.Hb(J.xH(c,b),32))H.d1(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,128,[],131,[],132,[],133,[]],
-d1:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,131,[],132,[],85,[]],
+ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,131,[],134,[],135,[],122,[]],
+w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","aH",8,0,null,128,[],131,[],132,[],133,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
-y=J.IJ(J.WB(z.W(a0,b),1),6)
+y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
 w=x.g(b,y)
 v=z.W(a0,y)
-u=J.IJ(x.g(b,a0),2)
+u=J.Ts(x.g(b,a0),2)
 t=J.Wx(u)
 s=t.W(u,y)
 r=t.g(u,y)
@@ -11878,7 +11348,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,128,[],131,[],132,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,131,[],134,[],135,[],122,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -11887,7 +11357,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11896,13 +11366,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,129,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,132,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,430,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11922,17 +11392,16 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gnr",0,2,null,333,334,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,430,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,116,[],117,[]],
-eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,127,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,118,[],119,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -11945,7 +11414,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11968,24 +11437,23 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,47,[]],
-eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,127,[]],
+return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
 qZ:[function(a,b){var z,y,x
-if(J.u6(b,0))throw H.b(P.N(b))
+if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
 y=this.SH
-if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
+if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.j5(this.l6,y,x,null)}},"call$1","grK4",2,0,null,127,[]],
+return H.q9(this.l6,y,x,null)}},"call$1","gVw",2,0,null,130,[]],
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
+if(y.C(z,0))throw H.b(new P.bJ("value "+H.d(z)))
 x=this.AN
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
+if(x!=null){if(J.u6(x,0))throw H.b(new P.bJ("value "+H.d(x)))
 if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
+static:{q9:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -12011,9 +11479,9 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
@@ -12033,10 +11501,10 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
@@ -12055,48 +11523,19 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]}},
+$asQV:function(a,b){return[b]}},
 rR:{
-"^":"a;OI,T6,TQ,lo",
+"^":"a;OI,T6,C2,lo",
 mb:function(a){return this.T6.call$1(a)},
 gl:function(){return this.lo},
 G:[function(){var z,y
-z=this.TQ
+z=this.C2
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.TQ=null
+if(y.G()){this.C2=null
 z=J.GP(this.mb(y.gl()))
-this.TQ=z}else return!1}this.lo=this.TQ.gl()
+this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-H6:{
-"^":"mW;l6,FT",
-eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,292,[]],
-gA:function(a){var z=this.l6
-z=new H.U1(z.gA(z),this.FT)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-ap:function(a,b,c){},
-static:{ke:function(a,b,c){var z
-if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
-z.ap(a,b,c)
-return z}return H.mi(a,b,c)},mi:function(a,b,c){var z=H.VM(new H.H6(a,b),[c])
-z.ap(a,b,c)
-return z}}},
-wB:{
-"^":"H6;l6,FT",
-gB:function(a){var z,y
-z=this.l6
-y=J.xH(z.gB(z),this.FT)
-if(J.J5(y,0))return y
-return 0},
-$isyN:true},
-U1:{
-"^":"AC;OI,FT",
-G:[function(){var z,y
-for(z=this.OI,y=0;y<this.FT;++y)z.G()
-this.FT=0
-return z.G()},"call$0","gqy",0,0,null],
-gl:function(){return this.OI.gl()}},
 SJ:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
@@ -12104,75 +11543,76 @@
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,23,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,114,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gyP",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,47,[]]},
-Qr:{
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
+Tv:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,47,[],23,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,23,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,114,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,129,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,133,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gyP",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
+V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 w2Y:{
-"^":"ar+Qr;",
+"^":"ar+Tv;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,47,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
 GD:{
 "^":"a;fN>",
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
 bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"call$0","gXo",0,0,null],
 $isGD:true,
 $iswv:true,
-static:{"^":"zP",le:[function(a){var z=J.U6(a)
-if(z.gl0(a)===!0)return a
-if(z.nC(a,"_"))throw H.b(new P.AT("\""+H.d(a)+"\" is a private identifier"))
-z=$.R0().Ej
+static:{"^":"RWj,ES,quP,KG,Np,p1",u1:[function(a){var z,y
+z=J.U6(a)
+if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-if(!z.test(a))throw H.b(new P.AT("\""+H.d(a)+"\" is not an identifier or an empty String"))
-return a},"call$1","kh",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+y=y.test(a)}else y=!0
+if(y)return a
+if(z.nC(a,"_"))throw H.b(new P.AT("\""+H.d(a)+"\" is a private identifier"))
+throw H.b(new P.AT("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"call$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
-X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,134,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
 vn:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,135,136,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,137,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,139,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -12208,15 +11648,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,134,[],137,[]],
+return x},"call$2","ER",4,0,null,136,[],139,[]],
 Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,138,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,140,[]],
 Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,138,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
 vE:[function(a,b){var z,y,x,w,v,u
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -12226,7 +11666,7 @@
 v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
 u=J.x(v)
 if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,138,[],139,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -12234,14 +11674,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","V8",4,0,null,140,[],137,[]],
+return w},"call$2","V8",4,0,null,142,[],139,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,142,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,144,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -12258,9 +11698,9 @@
 if(typeof b==="number"){t=z.call$1(b)
 x=J.x(t)
 if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"call$2","xN",4,0,null,143,[],11,[]],
+return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,143,[],144,[]],
+return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -12270,7 +11710,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,145,[]],
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.U6(b)
 if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
@@ -12281,10 +11721,10 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,143,[],146,[],61,[],51,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,26,[],98,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -12292,9 +11732,9 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","uG",2,0,null,42,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
 Sn:{
-"^":"a;L5,Aq>",
+"^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
 z=this.L5
 if(z!=null)return z
@@ -12303,70 +11743,70 @@
 y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=P.L5(null,null,null,J.O,[J.Q,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
 v=J.U6(w)
 u=v.t(w,0)
-t=v.t(w,1)
-s=P.r6($.qG().ej(t))
-r=v.t(w,2)
-q=v.t(w,3)
-p=v.t(w,4)
-o=v.t(w,5)
-n=v.t(w,6)
-m=v.t(w,7)
-l=p==null?C.xD:p()
-J.bi(z.to(u,new H.nI()),new H.Uz(s,r,q,l,o,n,m,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
+t=P.hK(v.t(w,1))
+s=v.t(w,2)
+r=v.t(w,3)
+q=v.t(w,4)
+p=v.t(w,5)
+o=v.t(w,6)
+n=v.t(w,7)
+m=q==null?C.xD:q()
+J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
-TY:{
+jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,41,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gfH",4,0,null,41,[],173,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
 $isej:true},
 Lj:{
-"^":"TY;MA",
+"^":"jU;MA",
 gOO:function(){return"Isolate"},
 gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:432;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,431,[],"call"],
+"^":"Tp:400;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
 $isEH:true},
-am:{
-"^":"TY;If<",
+cb:{
+"^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,43,[],44,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
 $isNL:true,
 $isej:true},
 cw:{
-"^":"EE;XP<,xW,Nz,LQ,If",
+"^":"EE;XP<,yG,Nz,LQ,If",
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
 y=this.XP
 return(1073741823&z^17*J.v1(this.If)^19*y.giO(y))>>>0},
 gOO:function(){return"TypeVariableMirror"},
+gFo:function(){return!1},
 $iscw:true,
-$isac:true,
+$isFw:true,
 $isX9:true,
 $isNL:true,
 $isej:true},
 EE:{
-"^":"am;If",
+"^":"cb;If",
 gOO:function(){return"TypeMirror"},
 gXP:function(){return},
 gc9:function(){return H.vh(P.SY(null))},
@@ -12391,7 +11831,7 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.nz=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 PU:[function(a,b){var z,y,x,w
@@ -12403,16 +11843,16 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
-return H.vn(z.IB(this))},"call$1","gPo",2,0,null,65,[]],
+return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
 F2:[function(a,b,c){var z,y
 z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -12432,7 +11872,7 @@
 if(q){u=C.xB.yn(r,4)
 r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
 y.push(p)
-p.nz=this}++v}this.SD=y
+p.jE=this}++v}this.SD=y
 return y},
 gTH:function(){var z,y
 z=this.zE
@@ -12500,22 +11940,22 @@
 $isej:true,
 $isNL:true},
 uh:{
-"^":"am+M2;",
+"^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
-"^":"Un;AY<,XW,BB,Ra,If",
+"^":"Un;AY<,XW,BB,i1,If",
 gOO:function(){return"ClassMirror"},
 gIf:function(){var z,y
 z=this.BB
@@ -12527,9 +11967,9 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
-rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
+PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -12550,7 +11990,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12562,15 +12002,15 @@
 z=this.gK8()
 y=z[c]
 if(y==null){x=$.I6().t(0,c)
-w=b===0?H.j5(J.uH(c,":"),3,null,null).br(0):C.xD
+w=b===0?H.q9(J.uH(c,":"),3,null,null).br(0):C.xD
 v=new H.LI(a,x,b,d,w,null)
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],434,[],82,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
@@ -12581,7 +12021,7 @@
 else{w=H.vn(x)
 y.v=x
 y.m=w
-return w}}return this.Dm(a)},"call$1","gPo",2,0,null,65,[]],
+return w}}return this.Dm(a)},"call$1","gPo",2,0,null,70,[]],
 Dm:[function(a){var z,y,x,w,v,u,t
 z=J.GL(a)
 y=this.tu(a,1,z,C.xD)
@@ -12598,14 +12038,14 @@
 t=x.geK()?this.QN(u,v):this.x0(u,v)
 w[z]=t
 t.v=t.m=w
-return y},"call$1","gFf",2,0,null,65,[]],
+return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,110,[],435,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],435,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gpa",4,0,null,12,[],435,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -12613,7 +12053,7 @@
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
-return z},"call$1","gUJ",2,0,null,104,[]],
+return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
 t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
@@ -12621,16 +12061,21 @@
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,134,[],23,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
 $isEH:true},
 bl:{
-"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If",
+"^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
 gOO:function(){return"ClassMirror"},
+bu:[function(a){var z,y,x
+z="ClassMirror on "+H.d(this.NK.gIf().fN)
+if(this.gw8()!=null){y=z+"<"
+x=this.gw8()
+z=y+x.zV(x,", ")+">"}return z},"call$0","gXo",0,0,null],
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
 gNy:function(){return this.NK.gNy()},
@@ -12681,8 +12126,8 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],173,[]],
-rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,65,[]],
+PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,70,[],172,[]],
+rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
 gAY:function(){var z=this.qN
@@ -12690,7 +12135,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12709,29 +12154,29 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:25;a",
+"^":"Tp:30;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,437,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:107;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,87,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,92,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,438,[],"call"],
+return a},"call$1",null,2,0,null,406,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
 gaB:function(){var z,y
 z=this.Tx
@@ -12755,7 +12200,7 @@
 if(t.$reflectable==2)continue
 s=H.Sd(u,t,!1,!1)
 x.push(s)
-s.nz=a}y=H.kU(init.statics[this.Cr])
+s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
 q=this.gXP().gae()[r]
@@ -12766,7 +12211,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.nz=a}return x},"call$1","gN4",2,0,null,439,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12782,7 +12227,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gMp",2,0,null,440,[]],
+return z},"call$1","gap",2,0,null,408,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12813,32 +12258,32 @@
 z=new H.Ei(y)
 this.gQH().nb.aN(0,z)
 this.gEz().nb.aN(0,z)
-J.kH(this.gNy(),new H.U7(y))
+J.kH(this.gNy(),new H.Ci(y))
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 PU:[function(a,b){var z,y
 z=this.gcc().nb.t(0,a)
-if(z!=null&&z.gFo()&&!z.gV5()){y=z.gao()
+if(z!=null&&z.gFo()&&J.WO(z)!==!0){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
+else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
-z=this.nz
+z=this.jE
 if(z==null){z=this.Tx
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.nz=H.jO(C.nY.LU).gXP()
+if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.nz
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
 if(z==null)throw H.b(new P.lj("Class \""+H.d(this.If.fN)+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
@@ -12865,13 +12310,13 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
 y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,143,[]],
+return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -12901,30 +12346,30 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
-U7:{
-"^":"Tp:107;b",
+Ci:{
+"^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,438,[],"call"],
+return a},"call$1",null,2,0,null,406,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:442;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:410;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 Ld:{
-"^":"am;ao<,V5<,Fo<,n6,nz,Ay>,le,If",
+"^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
-gt5:function(a){return H.Jf(this.nz,init.metadata[this.Ay])},
-gXP:function(){return this.nz},
+gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
+gXP:function(){return this.jE},
 gc9:function(){var z=this.le
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,41,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gfH",4,0,null,41,[],173,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12946,7 +12391,7 @@
 s=y.yn(x,r+1)}else q=s
 p=d?$.Sl().t(0,q):$.bx().t(0,"g"+q)
 if(p==null)p=q
-if(t){o=H.YC(p+"=")
+if(t){o=H.YC(H.d(p)+"=")
 y=c.gEO()
 v=new H.a7(y,y.length,0,null)
 v.$builtinTypeInfo=[H.Kp(y,0)]
@@ -12955,7 +12400,7 @@
 return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,141,[]]}},
+return 0},"call$1","fS",2,0,null,143,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -12985,14 +12430,14 @@
 $isvr:true,
 $isej:true},
 Zk:{
-"^":"am;dl,Yq,lT<,hB<,Fo<,xV<,qx,nz,le,wM,H3,If",
+"^":"cb;dl,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
 gOO:function(){return"MethodMirror"},
 gMP:function(){var z=this.H3
 if(z!=null)return z
 this.gc9()
 return this.H3},
 tB:[function(){return"$reflectable" in this.dl},"call$0","gX1",0,0,null],
-gXP:function(){return this.nz},
+gXP:function(){return this.jE},
 gdw:function(){this.gc9()
 return this.wM},
 gc9:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
@@ -13009,7 +12454,7 @@
 if(z!=null){x=J.x(z)
 x=typeof z==="object"&&z!==null&&!!x.$isD4
 z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.nz):new H.Ar(v.hl(this.nz.gJi().gTx()),null,null,null,this.nz)}if(this.xV)this.wM=this.nz
+t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -13025,11 +12470,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,43,[],44,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,41,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gfH",4,0,null,41,[],173,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -13051,25 +12496,26 @@
 u=!1}w=H.YC(a)
 return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},
 fu:{
-"^":"am;XP<,Ay>,Q2<,Sh,BE,QY,If",
+"^":"cb;XP<,Ay>,Q2<,Sh,BE,QY,If",
 gOO:function(){return"ParameterMirror"},
 gt5:function(a){return H.Jf(this.XP,this.Ay)},
 gFo:function(){return!1},
-gV5:function(){return!1},
+gV5:function(a){return!1},
 gc9:function(){return J.C0(this.QY,new H.wt()).br(0)},
 $isYs:true,
 $isRY:true,
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:372;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 ng:{
-"^":"am;Cr<,CM,If",
+"^":"cb;Cr<,CM,If",
 gP:function(a){return this.CM},
 r6:function(a,b){return this.gP(this).call$1(b)},
 gOO:function(){return"TypedefMirror"},
+gYj:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
 gXP:function(){return H.vh(P.SY(null))},
 gc9:function(){return H.vh(P.SY(null))},
@@ -13084,9 +12530,9 @@
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
 t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
-rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,65,[],23,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -13135,23 +12581,23 @@
 z=x+"'"
 this.o3=z
 return z},"call$0","gXo",0,0,null],
-gwK:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gwK().call$2(a,b)},
-nQ:function(a){return this.gwK().call$1(a)},
+gah:function(){return H.vh(P.SY(null))},
+V7:function(a,b){return this.gah().call$2(a,b)},
+nQ:function(a){return this.gah().call$1(a)},
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:443;a",
+"^":"Tp:412;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,47,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:444;b",
+"^":"Tp:413;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -13159,33 +12605,33 @@
 if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,47,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:372;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:372;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,104,[]],
-Rz:[function(a,b){H.kT()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return H.kT()},"call$0","gyP",0,0,null],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
 "^":"Sk<"}],["dart._js_names","dart:_js_names",,H,{
@@ -13197,10 +12643,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,147,[],148,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","Hn",4,0,null,149,[],150,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,149,[]],
+return z},"call$1","OX",2,0,null,151,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -13209,36 +12655,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","wp",2,0,null,145,[]],
+return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:445;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,137,[],434,[],"call"],
+"^":"Tp:414;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"call$2","p3",4,0,null,150,[],151,[]],
-pH:[function(a,b){var z,y,x,w,v,u,t
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.j7(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();){w=x.lo
-v=z.c
-z.c=v+1
-w.Rx(new P.ff(z,b,v),y)}y=z.c
-if(y===0)return P.Ab(C.xD,null)
-u=Array(y)
-u.fixed$length=init
-z.b=u
-y=J.Q
-t=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=t
-return t.MM},"call$2$eagerError","pk",2,3,null,152,153,[],154,[]],
+else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
@@ -13247,7 +12673,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,112],
+throw z}},"call$0","qZ",0,0,114],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -13255,11 +12681,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","xc",2,0,null,156,[]],
+$.k8=y}},"call$1","vy",2,0,null,155,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,156,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,155,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -13275,56 +12701,56 @@
 return}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,157,[]],
-YE:[function(a){},"call$1","bZ",2,0,158,23,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,159,77,160,[],161,[]],
-dL:[function(){return},"call$0","v3",0,0,112],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
+dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,162,[],163,[],164,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,161,[],162,[],163,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,165,[],166,[],160,[],161,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,165,[],166,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,165,[],166,[],23,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=C.jn.cU(a.Fq,1000)
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,167,[],156,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,166,[],155,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,151,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,168,169,[],170,[],151,[],160,[],161,[]],
+return z},"call$1","kb",2,0,null,153,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,167,168,[],169,[],153,[],159,[],160,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,171,169,[],170,[],151,[],115,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,170,168,[],169,[],153,[],117,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,172,169,[],170,[],151,[],115,[],173,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,171,168,[],169,[],153,[],117,[],172,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,174,169,[],170,[],151,[],115,[],54,[],55,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,175,169,[],170,[],151,[],115,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,176,169,[],170,[],151,[],115,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,177,169,[],170,[],151,[],115,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,178,169,[],170,[],151,[],115,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,179,169,[],170,[],151,[],167,[],156,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,180,169,[],170,[],151,[],181,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,182,181,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,173,168,[],169,[],153,[],117,[],59,[],60,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,174,168,[],169,[],153,[],117,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,175,168,[],169,[],153,[],117,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,176,168,[],169,[],153,[],117,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,177,168,[],169,[],153,[],117,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,178,168,[],169,[],153,[],166,[],155,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,179,168,[],169,[],153,[],180,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,181,180,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,183,169,[],170,[],151,[],184,[],185,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,182,168,[],169,[],153,[],183,[],184,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -13335,10 +12761,10 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,446,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gXI1",0,0,null],
+this.Ae=z^1},"call$0","gUe",0,0,null],
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
@@ -13348,10 +12774,10 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){return},"call$0","gp4",0,0,112],
-LP:[function(){return},"call$0","gZ9",0,0,112],
-static:{"^":"FJ,RG,cP"}},
-LO:{
+uO:[function(){},"call$0","gp4",0,0,114],
+LP:[function(){},"call$0","gZ9",0,0,114],
+static:{"^":"FJ,CM,cP"}},
+WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
@@ -13366,17 +12792,17 @@
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gOo",2,0,null,165,[]],
+a.siE(a)},"call$1","gOo",2,0,null,164,[]],
 j0:[function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,165,[]],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,164,[]],
 q7:[function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},"call$0","gVo",0,0,null],
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"LO")},239,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gXB",2,2,447,77,160,[],161,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -13385,8 +12811,8 @@
 y=this.SL()
 this.SY()
 return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,239,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,160,[],161,[]],
+Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,235,[]],
+V8:[function(a,b){this.pb(a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
 Qj:[function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
@@ -13410,92 +12836,67 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,429,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
-"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,239,[]],
+return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,160,[],161,[]],
+this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Zj",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
-"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,239,[]],
+z.w6(y)}},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,160,[],161,[]],
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 b8:{
 "^":"a;",
 $isb8:true},
-j7:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=z.c-1
-z.c=x
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,448,[],449,[],"call"],
-$isEH:true},
-ff:{
-"^":"Tp:450;a,c,d",
-call$1:[function(a){var z,y,x,w
-z=this.a
-y=z.c-1
-z.c=y
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"call$1",null,2,0,null,23,[],"call"],
-$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,451,77,23,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,447,77,160,[],161,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
+gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
 swG:function(a){if(a)this.Gv=2
 else this.Gv=0},
@@ -13507,70 +12908,72 @@
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gVy",2,3,null,77,115,[],164,[]],
+return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"grf",2,3,null,82,117,[],163,[]],
 yd:[function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,77,164,[],430,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gE1",2,0,null,429,[]],
+return y},"call$1","gBv",2,0,null,397,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","gHa",2,0,null,23,[]],
+this.jk=a},"call$1","goU",2,0,null,28,[]],
 E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,160,[],161,[]],
+this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,297,[]],
+this.jk=a}},"call$1","gXA",2,0,null,295,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
 for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},"call$0","gDH",0,0,null],
+z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){P.GZ(a,this)
-return}y=this.L3()
+if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+else P.k3(a,this)
+else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)},"call$1","gJJ",2,0,null,23,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+R8:[function(a){var z=this.L3()
+this.Am(a)
+P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,159,77,160,[],161,[]],
-OH:[function(a){var z,y
-z=J.x(a)
-y=typeof a==="object"&&a!==null&&!!z.$isb8
-if(y);if(y)z=typeof a!=="object"||a===null||!z.$isvs||a.Gv<4
-else z=!1
-if(z){this.rX(a)
-return}if(this.Gv!==0)H.vh(P.w("Future already completed"))
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
+OH:[function(a){var z
+if(a==null);else{z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.rH(this,a))},"call$1","gZV",2,0,null,23,[]],
+this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
+this.Gv=1
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},"call$2","gFE",4,0,null,160,[],161,[]],
+this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
 L7:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
-return z},GZ:[function(a,b){var z
-b.swG(!0)
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isvs)if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)
-else a.Rx(new P.xw(b),new P.dm(b))},"call$2","mX",4,0,null,27,[],74,[]],yE:[function(a,b){var z
+return z},k3:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+if(a.Gv>=4)P.HZ(a,b)
+else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,27,[],155,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -13580,62 +12983,66 @@
 z.e.gLj().hk(J.w8(v),v.gI4())
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
-return}u=b.gLj()
-if(w&&!z.e.gLj().fC(u)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}t=$.X3
-if(t==null?u!=null:t!==u)$.X3=u
-else t=null
-x.b=null
-x.c=null
+return}x.b=!0
+u=z.e.gWj()?z.e.gDL():null
+x.c=u
 x.d=!1
-if(!w)if(b.gO1()!=null)x.b=new P.rq(x,z,b,u).call$0()
-else{x.c=z.e.gDL()
-x.b=!0}else new P.RW(z,x,b,u).call$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,u).call$0()
-if(t!=null)$.X3=t
+y=!w
+if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
+if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
+z.e.gLj().hk(J.w8(v),v.gI4())
+return}s=$.X3
+if(s==null?t!=null:s!==t)$.X3=t
+else s=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).call$0()}else new P.RW(z,x,b,t).call$0()
+if(b.gIa()!=null)new P.RT(z,x,w,b,t).call$0()
+if(s!=null)$.X3=s
 if(x.d)return
-y=x.b===!0
-if(y){s=x.c
-r=J.x(s)
-r=typeof s==="object"&&s!==null&&!!r.$isb8
-s=r}else s=!1
-if(s){q=x.c
+if(x.b===!0){y=x.c
+if(u==null?y!=null:u!==y){r=J.x(y)
+r=typeof y==="object"&&y!==null&&!!r.$isb8
+y=r}else y=!1}else y=!1
+if(y){q=x.c
 y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs&&q.Gv>=4){b.swG(!0)
+if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
 z.e=q
 y=q
-continue}P.GZ(q,b)
-return}if(y){p=b.L3()
+continue}else P.A9(q,b)
+else P.k3(q,b)
+return}}if(x.b===!0){p=b.L3()
 b.Am(x.c)}else{p=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","DU",4,0,null,27,[],155,[]]}},
+b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
 da:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-xw:{
-"^":"Tp:107;a",
-call$1:[function(a){this.a.rX(a)},"call$1",null,2,0,null,23,[],"call"],
+pV:{
+"^":"Tp:112;a",
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
-dm:{
-"^":"Tp:452;b",
-call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"call"],
+U7:{
+"^":"Tp:418;b",
+call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:113;a,b",
-call$0:[function(){this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,b",
+call$0:[function(){P.A9(this.b,this.a)},"call$0",null,0,0,null,"call"],
+$isEH:true},
+cX:{
+"^":"Tp:115;c,d",
+call$0:[function(){this.c.R8(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:380;b,c,d,e",
+"^":"Tp:390;b,d,e,f",
 call$0:[function(){var z,y,x,w
-try{this.b.c=this.e.FI(this.d.gO1(),this.c.e.gDL())
+try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
@@ -13643,13 +13050,13 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:112;c,b,f,UI",
+"^":"Tp:114;c,b,UI,bK",
 call$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
-r=this.f
+r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{x=this.UI.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
 v=new H.XO(q,null)
 r=J.w8(z)
@@ -13662,7 +13069,7 @@
 if(x===!0&&u!=null){try{r=u
 p=H.N7()
 p=H.KT(p,[p,p]).BD(r)
-n=this.UI
+n=this.bK
 m=this.b
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
@@ -13679,14 +13086,14 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:112;c,b,bK,Gq,Rm",
+"^":"Tp:114;c,b,Gq,Rm,w3",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
-try{z.a=this.Rm.Gr(this.Gq.gIa())}catch(w){v=H.Ru(w)
+try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-if(this.bK){v=J.w8(this.c.e.gcG())
+if(this.Gq){v=J.w8(this.c.e.gcG())
 u=y
 u=v==null?u==null:v===u
 v=u}else v=!1
@@ -13695,54 +13102,54 @@
 else u.c=new P.Ca(y,x)
 u.b=!1}v=z.a
 u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Gq
+if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:107;c,w3",
-call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:112;c,HZ",
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:452;a,HZ",
+"^":"Tp:418;a,mG",
 call$2:[function(a,b){var z,y,x,w
 z=this.a
 y=z.a
 x=J.x(y)
 if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
 z.a=w
-w.E6(a,b)}P.HZ(z.a,this.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"call"],
+w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,454,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.tG(z,this,b,y),!0,new P.zn(y),y.gbY())
-return y},"call$1","gdj",2,0,null,102,[]],
+z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gbY())
+return y},"call$1","gdj",2,0,null,107,[]],
 aN:[function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,429,[]],
+return y},"call$1","gjw",2,0,null,397,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,430,[]],
+return y},"call$1","gG2",2,0,null,398,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
 z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gbY())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gbY())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -13755,9 +13162,6 @@
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
 return y},"call$0","gRV",0,0,null],
-eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
-z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,127,[]],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13777,44 +13181,44 @@
 if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(new P.AT(z.a))
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
-z.b=this.KR(new P.ii(z,this,y),!0,new P.ib(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,47,[]],
+z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
+return y},"call$1","goY",2,0,null,52,[]],
 $isqh:true},
-tG:{
+YJ:{
 "^":"Tp;a,b,c,d",
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:381;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
+"^":"Tp:391;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-zn:{
-"^":"Tp:113;bK",
+DO:{
+"^":"Tp:115;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,129,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:107;",
-call$1:[function(a){},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:113;UI",
+"^":"Tp:115;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -13822,78 +13226,78 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:381;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
+"^":"Tp:391;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:113;bK",
+"^":"Tp:115;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-PI:{
-"^":"Tp:107;a",
+B5:{
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,108,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
-uO:{
-"^":"Tp:113;a,b",
+PI:{
+"^":"Tp:115;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:107;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:113;c",
+"^":"Tp:115;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,239,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,235,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,23,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:113;d",
+"^":"Tp:115;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,23,[],"call"],
+z.a=a},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:113;a,c",
+"^":"Tp:115;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
-ii:{
+j5:{
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,23,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-ib:{
-"^":"Tp:113;a,d",
+ii:{
+"^":"Tp:115;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -13916,36 +13320,36 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gGE",2,0,null,456,[]],
+return w},"call$1","gmn",2,0,null,422,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
 n:[function(a,b){var z
 if(b==null)return!1
 if(this===b)return!0
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isO9)return!1
-return b.Y8===this.Y8},"call$1","gUJ",2,0,null,104,[]],
+return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
 "^":"KA;Y8<",
 tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,112],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,112]},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,114],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,114]},
 nP:{
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,457,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,29,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,458,[]],
-nB:[function(a,b){var z,y,x
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13969,19 +13373,19 @@
 Rg:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,239,[]],
+else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,235,[]],
 V8:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,160,[],161,[]],
+else this.w6(new P.DS(a,b,null))},"call$2","gEm",4,0,null,159,[],160,[]],
 Qj:[function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,112],
-LP:[function(){},"call$0","gZ9",0,0,112],
+uO:[function(){},"call$0","gp4",0,0,114],
+LP:[function(){},"call$0","gZ9",0,0,114],
 tA:[function(){},"call$0","gQC",0,0,null],
 w6:[function(a){var z,y
 z=this.Ri
@@ -13990,19 +13394,19 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,384,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,239,[]],
+this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,160,[],161,[]],
+this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
 new P.qB(this).call$0()},"call$0","gXm",0,0,null],
@@ -14010,7 +13414,7 @@
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,156,[]],
+this.Kl((z&4)!==0)},"call$1","gEq",2,0,null,155,[]],
 Kl:[function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
@@ -14026,11 +13430,11 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,460,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Il,X8,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
 Vo:{
-"^":"Tp:112;a,b,c",
+"^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -14046,7 +13450,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -14061,25 +13465,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
 w4:[function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gGE",2,0,null,456,[]]},
-ti:{
+return y},"call$1","gmn",2,0,null,422,[]]},
+fIm:{
 "^":"a;aw@"},
 LV:{
-"^":"ti;P>,aw",
+"^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,463,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
 DS:{
-"^":"ti;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,463,[]]},
+"^":"fIm;kc>,I4<,aw",
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,463,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -14088,9 +13492,9 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,463,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
 CR:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -14104,26 +13508,26 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,384,[]],
+this.N6=b}},"call$1","ght",2,0,null,368,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gKt",2,0,null,463,[]],
+z.dP(a)},"call$1","gTn",2,0,null,429,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
-this.zR=null},"call$0","gyP",0,0,null]},
+this.zR=null},"call$0","gRa",0,0,null]},
 v1y:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:464;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,160,[],161,[],"call"],
+"^":"Tp:430;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
-Q0:{
-"^":"Tp:113;a,b",
+GU:{
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
@@ -14139,27 +13543,27 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,239,[],465,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,239,[]],
+P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,235,[]],
 V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,160,[],161,[]],
+P.KA.prototype.V8.call(this,a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,112],
+z.yy(0)},"call$0","gp4",0,0,114],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE()},"call$0","gZ9",0,0,112],
+z.QE()},"call$0","gZ9",0,0,114],
 tA:[function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
-vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},239,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,466,160,[],161,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,112],
+vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -14175,7 +13579,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,467,[],465,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -14187,16 +13591,8 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,467,[],465,[]]},
-dq:{
-"^":"YR;Em,Sb",
-Ml:[function(a,b){var z=this.Em
-if(z>0){this.Em=z-1
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,467,[],465,[]],
-U6:function(a,b,c){},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-lO:{
+return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
@@ -14216,7 +13612,7 @@
 iT:function(a){return this.iq.call$1$specification(a)}},
 e4:{
 "^":"a;"},
-JB:{
+dl:{
 "^":"a;"},
 Id:{
 "^":"a;oh",
@@ -14224,102 +13620,102 @@
 c1:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,151,[],160,[],161,[]],
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,153,[],159,[],160,[]],
 Vn:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,151,[],115,[]],
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,153,[],117,[]],
 qG:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,151,[],115,[],173,[]],
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,153,[],117,[],172,[]],
 nA:[function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,151,[],115,[],54,[],55,[]],
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,153,[],117,[],59,[],60,[]],
 TE:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,153,[],117,[]],
 V6:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,151,[],115,[]],
+y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,153,[],117,[]],
 pX:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,151,[],167,[],115,[]],
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,153,[],166,[],117,[]],
 RB:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,151,[],181,[]],
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,153,[],180,[]],
 ld:[function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,151,[],184,[],185,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,468,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gSI",2,0,null,115,[]],
+return this.hk(z,y)}},"call$1","gSI",2,0,null,117,[]],
 m1:[function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,115,[],173,[]],
+return this.hk(z,y)}},"call$2","gNY",4,0,null,117,[],172,[]],
 z8:[function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,115,[],54,[],55,[]],
+return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,336,115,[],469,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,336,115,[],469,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,336,115,[],469,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
 TF:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,173,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:107;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,173,[],"call"],
+"^":"Tp:112;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
+"^":"Tp:348;a,b",
+call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
-pV:{
-"^":"Tp:346;c,d",
-call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
+ph:{
+"^":"Tp:348;c,d",
+call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,zU<,R1",
@@ -14328,24 +13724,24 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
-c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,77,77,184,[],185,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,115,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,115,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,115,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,115,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,115,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,181,[]]},
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
+c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
+Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
+FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
+mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
+Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
+cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
+uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
+Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
 pK:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){var z,y,x
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -14357,11 +13753,11 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
-nU:{
+W5:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -14391,23 +13787,23 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,468,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
-c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,77,77,184,[],185,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,115,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,115,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,115,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,115,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,115,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
+c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
+Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
+FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
+mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
+Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
+cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
+uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,181,[]]}}],["dart.collection","dart:collection",,P,{
+return},"call$1","gJS",2,0,null,180,[]]}}],["dart.collection","dart:collection",,P,{
 "^":"",
-Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,187,128,[],188,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,189,128,[]],
+R2:[function(a,b){return J.de(a,b)},"call$2","to",4,0,186,131,[],187,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,188,131,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -14422,7 +13818,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,114,[]],
+return y.vM},"call$1","Zw",2,0,null,116,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
@@ -14455,10 +13851,8 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,114,[],190,[]],
-L5:function(a,b,c,d,e){if(b==null){if(a==null)return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])
-b=P.py()}else{if(P.J2()===b&&P.N3()===a)return H.VM(new P.ey(0,null,null,null,null,null,0),[d,e])
-if(a==null)a=P.iv()}return P.Ex(a,b,c,d,e)},
+b.push(v)},"call$2","wB",4,0,null,116,[],189,[]],
+L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w
 z={}
@@ -14470,7 +13864,7 @@
 J.kH(a,new P.ZQ(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,191,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,190,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -14483,11 +13877,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,42,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,23,[]],
-FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,104,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
+FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -14499,7 +13893,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,42,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -14515,7 +13909,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,42,[],23,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14526,17 +13920,17 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","gRI",2,0,null,42,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gyP",0,0,null],
+this.X5=0}},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y,x,w
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -14557,71 +13951,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,186,[],42,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+return z}else return},"call$2","got",4,0,null,185,[],47,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,186,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,186,[],42,[],23,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.call$2(a,b)},
+WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,42,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,42,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","gRI",2,0,null,42,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){var z=H.XY(a,this.a)
+return z},"call$1",null,2,0,null,272,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14631,12 +14025,12 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,115,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,117,[]],
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
@@ -14664,9 +14058,9 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,23,[]],
-FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,104,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
@@ -14679,7 +14073,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,42,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14692,12 +14086,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,42,[],23,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,42,[],472,[]],
+return z},"call$2","gMs",4,0,null,47,[],438,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14708,30 +14102,30 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","gRI",2,0,null,42,[]],
+return w.gS4()}},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
+this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,186,[],42,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14740,7 +14134,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,42,[],23,[]],
+return z},"call$2","gTM",4,0,null,47,[],28,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14749,13 +14143,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14764,50 +14158,18 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-ey:{
-"^":"YB;X5,vv,OX,OB,H9,lX,zN",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
-aH:[function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y){x=a[y].gkh()
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
-xd:{
-"^":"YB;m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN",
-C2:function(a,b){return this.m6.call$2(a,b)},
-H5:function(a){return this.Q6.call$1(a)},
-Ef:function(a){return this.ac.call$1(a)},
-t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.YB.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,42,[]],
-x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.YB.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,42,[]],
-Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.YB.prototype.Rz.call(this,this,b)},"call$1","gRI",2,0,null,42,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
-aH:[function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(this.C2(a[y].gkh(),b)===!0)return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
-static:{Ex:function(a,b,c,d,e){var z=new P.v6(d)
-return H.VM(new P.xd(a,b,z,0,null,null,null,null,null,0),[d,e])}}},
-v6:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
-$isEH:true},
 db:{
 "^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
@@ -14820,14 +14182,14 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,115,[]],
+y=y.gDG()}},"call$1","gjw",2,0,null,117,[]],
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
@@ -14839,7 +14201,7 @@
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
 return!0}}},"call$0","gqy",0,0,null]},
-Rr:{
+UB:{
 "^":"lN;",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14885,9 +14247,9 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,129,[]],
+return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14899,12 +14261,12 @@
 this.X5=this.X5-1
 this.DM=null
 y.splice(x,1)
-return!0}},"call$1","gRI",2,0,null,6,[]],
+return!0}},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){if(this.X5>0){this.DM=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gyP",0,0,null],
+this.X5=0}},"call$0","gRa",0,0,null],
 Zl:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.DM
 if(z!=null)return z
@@ -14928,28 +14290,28 @@
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,186,[],129,[]],
+return!0},"call$2","gLa",4,0,null,185,[],132,[]],
 Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,186,[],129,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
+return!0}else return!1},"call$2","got",4,0,null,185,[],132,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,470,[],129,[]],
+return-1},"call$2","gSP",4,0,null,436,[],132,[]],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 YO:{
-"^":"Rr;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+"^":"UB;X5,vv,OX,OB,DM",
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],129,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14993,7 +14355,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -15017,9 +14379,9 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,129,[]],
+u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -15029,24 +14391,24 @@
 x=this.aH(y,b)
 if(x<0)return!1
 this.Vb(y.splice(x,1)[0])
-return!0}},"call$1","gRI",2,0,null,6,[]],
+return!0}},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
+this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
 cA:[function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,186,[],129,[]],
+return!0},"call$2","gLa",4,0,null,185,[],132,[]],
 Nv:[function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,186,[],129,[]],
+return!0},"call$2","got",4,0,null,185,[],132,[]],
 xf:[function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
@@ -15055,7 +14417,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,129,[]],
+return z},"call$1","gTM",2,0,null,132,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -15064,16 +14426,16 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,470,[],129,[]],
+return-1},"call$2","gSP",4,0,null,436,[],132,[]],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -15089,7 +14451,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,47,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -15099,20 +14461,20 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
+ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
 tg:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,129,[]],
+return!1},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,115,[]],
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,117,[]],
 zV:[function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
@@ -15122,18 +14484,17 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gnr",0,2,null,333,334,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
-return!1},"call$1","gG2",2,0,null,115,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+return!1},"call$1","gG2",2,0,null,117,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
@@ -15142,33 +14503,33 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,77,430,[],475,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,47,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ar:{
 "^":"a+lD;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -15181,21 +14542,21 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,129,[]],
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,132,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,430,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gnr",0,2,null,333,334,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,430,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,127,[]],
+return z.vM},"call$1","gNU",0,2,null,330,331,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
+eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
@@ -15208,15 +14569,15 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
-this.u(a,z,b)},"call$1","ght",2,0,null,129,[]],
+this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=J.GP(b);z.G();){y=z.gl()
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
-this.u(a,x,y)}},"call$1","gDY",2,0,null,114,[]],
+this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
@@ -15224,15 +14585,15 @@
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,133,[]],
+return!0}++z}return!1},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
+GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,82,122,[]],
 pZ:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,120,[],121,[]],
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gm0",4,0,null,123,[],124,[]],
 D6:[function(a,b,c){var z,y,x,w
-if(c==null)c=this.gB(a)
+c=this.gB(a)
 this.pZ(a,b,c)
 z=J.xH(c,b)
 y=H.VM([],[H.ip(a,"lD",0)])
@@ -15241,9 +14602,9 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
+return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -15260,20 +14621,21 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(c>=z)return-1
+if(c<0)c=0
 y=c
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],80,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],80,[]],
+return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -15282,11 +14644,11 @@
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){var z=this.t(a,b)
 this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
 this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,47,[]],
+return z},"call$1","gNM",2,0,null,52,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -15295,19 +14657,19 @@
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},"call$0","gXo",0,0,null],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ZQ:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,402,[],277,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -15319,16 +14681,17 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
-grZ:function(a){var z,y
+gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
+grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-y=J.mQ(J.xH(y,1),this.v5.length-1)
-if(y>=z.length)return H.e(z,y)
+x=z.length
+y=(y-1&x-1)>>>0
+if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -15339,81 +14702,83 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,47,[]],
+return z[y]},"call$1","goY",2,0,null,52,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.e4(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,129,[]],
+z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=z.gB(b)
-x=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-z=x+y
+z=b.length
+y=this.gB(this)
+x=y+z
 w=this.v5
 v=w.length
-if(z>=v){u=P.ua(z)
+if(x>=v){u=P.ua(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.e4(t)
+this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.Og(t,x,z,b,0)
-this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
-if(typeof z!=="number")return H.s(z)
-s=v-z
-if(y<s){H.Og(w,z,z+y,b,0)
-this.eZ=J.WB(this.eZ,y)}else{r=y-s
-H.Og(w,z,z+s,b,0)
-z=this.v5
-H.Og(z,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,476,[]],
+H.qG(t,y,x,b,0)
+this.eZ=this.eZ+z}else{x=this.eZ
+s=v-x
+if(z<s){H.qG(w,x,x+z,b,0)
+this.eZ=this.eZ+z}else{r=z-s
+H.qG(w,x,x+s,b,0)
+x=this.v5
+H.qG(x,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
 if(J.de(y[z],b)){this.bB(z)
 this.qT=this.qT+1
-return!0}}return!1},"call$1","gRI",2,0,null,6,[]],
+return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0
-this.qT=this.qT+1}},"call$0","gyP",0,0,null],
+this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y
+NZ:[function(a,b){var z,y,x
 z=this.v5
 y=this.eZ
-if(y>>>0!==y||y>=z.length)return H.e(z,y)
+x=z.length
+if(y<0||y>=x)return H.e(z,y)
 z[y]=b
-y=(y+1&this.v5.length-1)>>>0
-this.eZ=y
-if(this.av===y)this.VW()
-this.qT=this.qT+1},"call$1","gXk",2,0,null,129,[]],
+x=(y+1&x-1)>>>0
+this.eZ=x
+if(this.av===x)this.VW()
+this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5.length-1
-if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
-if(u<0||u>=w)return H.e(x,u)
-t=x[u]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-this.av=(y+1&z)>>>0
-return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
-this.eZ=y
-for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
-if(s<0||s>=w)return H.e(x,s)
-t=x[s]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-return a}},"call$1","gzv",2,0,null,477,[]],
+z=this.v5
+y=z.length
+x=y-1
+w=this.av
+v=this.eZ
+if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
+if(t<0||t>=y)return H.e(z,t)
+v=z[t]
+if(u<0||u>=y)return H.e(z,u)
+z[u]=v}if(w>=y)return H.e(z,w)
+z[w]=null
+this.av=(w+1&x)>>>0
+return(a+1&x)>>>0}else{w=(v-1&x)>>>0
+this.eZ=w
+for(u=a;u!==w;u=s){s=(u+1&x)>>>0
+if(s<0||s>=y)return H.e(z,s)
+v=z[s]
+if(u<0||u>=y)return H.e(z,u)
+z[u]=v}if(w<0||w>=y)return H.e(z,w)
+z[w]=null
+return a}},"call$1","gzv",2,0,null,444,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -15421,44 +14786,38 @@
 z=this.v5
 x=this.av
 w=z.length-x
-H.Og(y,0,w,z,x)
+H.qG(y,0,w,z,x)
 z=this.av
 x=this.v5
-H.Og(y,w,w+z,x,0)
+H.qG(y,w,w+z,x,0)
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-e4:[function(a){var z,y,x,w
+wR:[function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
-if(typeof y!=="number")return H.s(y)
-if(z<=y){x=y-z
-z=this.v5
-y=this.av
-H.Og(a,0,x,z,y)
-return x}else{y=this.v5
-w=y.length-z
-H.Og(a,0,w,y,z)
+x=this.v5
+if(z<=y){w=y-z
+H.qG(a,0,w,x,z)
+return w}else{v=x.length-z
+H.qG(a,0,v,x,z)
 z=this.eZ
-if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.Og(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,74,[]],
-Eo:function(a,b){var z
-if(typeof 8!=="number")return H.s(8)
-z=Array(8)
+H.qG(a,v,v+z,y,0)
+return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","bD",2,0,null,192,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,191,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -15480,7 +14839,7 @@
 "^":"qv;P*,G3,Bb,T8",
 r6:function(a,b){return this.P.call$1(b)},
 $asqv:function(a,b){return[a]}},
-vX:{
+GZ:{
 "^":"a;",
 vh:[function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -15516,10 +14875,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,42,[]],
+return v},"call$1","gST",2,0,null,47,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gOv",2,0,null,264,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -15531,7 +14890,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,42,[]],
+return z},"call$1","gzv",2,0,null,47,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -15542,27 +14901,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,264,[],478,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
 Ba:{
-"^":"vX;Cw,ac,aY,iW,P6,qT,bb",
+"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gcd",4,0,null,479,[],480,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,42,[]],
+return},"call$1","gIA",2,0,null,47,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","gRI",2,0,null,42,[]],
+return},"call$1","guH",2,0,null,47,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,104,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -15571,20 +14930,20 @@
 y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,115,[]],
+b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,117,[]],
 gB:function(a){return this.P6},
 V1:[function(a){this.aY=null
 this.P6=0
-this.qT=this.qT+1},"call$0","gyP",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return new P.LD(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,23,[]],
+this.qT=this.qT+1},"call$0","gRa",0,0,null],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isBa:true,
-$asvX:function(a,b){return[a]},
+$asGZ:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -15592,47 +14951,47 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){var z=H.XY(a,this.a)
+return z},"call$1",null,2,0,null,272,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
-LD:{
-"^":"Tp:481;a,b,c",
+BW:{
+"^":"Tp:448;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,264,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-WV:[function(a){var z
-for(z=this.Ln;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,264,[]],
+p0:[function(a){var z
+for(z=this.Jt;a!=null;){z.push(a)
+a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Ln
+y=this.Jt
 if(y.length===0){this.ya=null
 return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
 C.Nm.sB(y,0)
-if(x==null)this.WV(z.aY)
+if(x==null)this.p0(z.aY)
 else{z.vh(x.G3)
-this.WV(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+this.p0(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
 this.ya=z
-this.WV(z.T8)
+this.p0(z.T8)
 return!0},"call$0","gqy",0,0,null],
-Qf:function(a,b){this.WV(a.aY)}},
+Qf:function(a,b){this.p0(a.aY)}},
 OG:{
 "^":"mW;Dn",
 gB:function(a){return this.Dn.P6},
@@ -15655,39 +15014,36 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,264,[]]},
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
 ZM:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,264,[]],
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,264,[]],
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,193,[],194,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,192,[],193,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],194,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,195,6,[]],
-Md:[function(a){a.i(0,64512)
-return!1},"call$1","bO",2,0,null,13,[]],
-ZZ:[function(a,b){return(65536+(a.i(0,1023)<<10>>>0)|b&1023)>>>0},"call$2","hz",4,0,null,198,[],199,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,32,[],193,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:346;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -15697,96 +15053,48 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,18,[],"call"],
+return v},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
-wI:{
+zF:{
 "^":"a;"},
 Zi:{
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
-"^":"Ge;Pc,FN",
+"^":"Ge;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
-static:{ox:function(a,b){return new P.Ud(a,b)}}},
+static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
-"^":"Ud;Pc,FN",
+"^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],194,[]],
-PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],196,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 pD:{
-"^":"wI;Xi",
-$aswI:function(){return[P.a,J.O]}},
+"^":"zF;Xi",
+$aszF:function(){return[P.a,J.O]}},
 Cf:{
-"^":"wI;N5",
-$aswI:function(){return[J.O,P.a]}},
+"^":"zF;N5",
+$aszF:function(){return[J.O,P.a]}},
 Sh:{
-"^":"a;WE,Mw,JN",
-Tt:function(a){return this.WE.call$1(a)},
-WD:[function(a){var z=this.JN
-if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
-rl:[function(a){var z,y,x,w,v
-if(!this.IS(a)){x=a
-w=this.JN
-if(w.tg(0,x))H.vh(P.TP(x))
-w.h(0,x)
-try{z=this.Tt(a)
-if(!this.IS(z)){x=P.ox(a,null)
-throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
-y=x
-throw H.b(P.ox(a,y))}}},"call$1","gO5",2,0,null,6,[]],
-IS:[function(a){var z,y,x,w
-z={}
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.Mw.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.Mw.KF("true")
-return!0}else if(a===!1){this.Mw.KF("false")
-return!0}else if(a==null){this.Mw.KF("null")
-return!0}else if(typeof a==="string"){z=this.Mw
-z.KF("\"")
-P.NY(z,a)
-z.KF("\"")
-return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
-z=this.Mw
-z.KF("[")
-if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
-x=1
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-z.vM=z.vM+","
-this.rl(y.t(a,x));++x}}z.KF("]")
-this.JN.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
-w=this.Mw
-w.KF("{")
-z.a=!0
-y.aN(a,new P.tF(z,this))
-w.KF("}")
-this.JN.Rz(0,a)
-return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,IE,Yz,ij,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[function(a,b){var z
-b=P.BC()
-z=P.p9("")
-new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","ab",4,0,null,6,[],196,[]],NY:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-y=z.gB(b)
+"^":"a;iY,Vy,qi",
+Wt:function(a){return this.iY.call$1(a)},
+aK:[function(a){var z,y,x,w,v,u,t
+z=J.U6(a)
+y=z.gB(a)
 x=H.VM([],[J.im])
 if(typeof y!=="number")return H.s(y)
 w=!1
 v=0
-for(;v<y;++v){u=z.j(b,v)
+for(;v<y;++v){u=z.j(a,v)
 if(u<32){x.push(92)
 switch(u){case 8:x.push(98)
 break
@@ -15809,81 +15117,156 @@
 x.push(t<10?48+t:87+t)
 break}w=!0}else if(u===34||u===92){x.push(92)
 x.push(u)
-w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,197,[],86,[]]}},
+w=!0}else x.push(u)}z=w?P.HM(x):a
+this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
+WD:[function(a){var z=this.qi
+if(z.tg(0,a))throw H.b(P.TP(a))
+z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+rl:[function(a){var z,y,x,w,v
+if(!this.IS(a)){x=a
+w=this.qi
+if(w.tg(0,x))H.vh(P.TP(x))
+w.h(0,x)
+try{z=this.Wt(a)
+if(!this.IS(z)){x=P.NM(a,null)
+throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
+y=x
+throw H.b(P.NM(a,y))}}},"call$1","gO5",2,0,null,6,[]],
+IS:[function(a){var z,y,x,w
+z={}
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+this.Vy.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.Vy.KF("true")
+return!0}else if(a===!1){this.Vy.KF("false")
+return!0}else if(a==null){this.Vy.KF("null")
+return!0}else if(typeof a==="string"){z=this.Vy
+z.KF("\"")
+this.aK(a)
+z.KF("\"")
+return!0}else{y=J.x(a)
+if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+z=this.Vy
+z.KF("[")
+if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
+x=1
+while(!0){w=y.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+z.vM=z.vM+","
+this.rl(y.t(a,x));++x}}z.KF("]")
+this.qi.Rz(0,a)
+return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+w=this.Vy
+w.KF("{")
+z.a=!0
+y.aN(a,new P.tF(z,this))
+w.KF("}")
+this.qi.Rz(0,a)
+return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
+static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+b=P.BC()
+z=P.p9("")
+new P.Sh(b,z,P.yv(null)).rl(a)
+return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:482;a,b",
+"^":"Tp:449;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
-if(!z.a){x=y.Mw
-x.KF(",\"")}else{x=y.Mw
-x.KF("\"")}P.NY(x,a)
+if(!z.a){x=y.Vy
+x.KF(",\"")}else{x=y.Vy
+x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.E3()}},
 E3:{
-"^":"wI;",
+"^":"zF;",
 WJ:[function(a){var z,y,x
-z=a.gB(a)
-y=H.VM(Array(z.U(0,3)),[J.im])
+z=J.U6(a)
+y=J.vX(z.gB(a),3)
+if(typeof y!=="number")return H.s(y)
+y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
-x.fJ(a,0,z)
-x.Lb(a.j(0,z.W(0,1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gmC",2,0,null,26,[]],
-$aswI:function(){return[J.O,[J.Q,J.im]]}},
+if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+$aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
-"^":"a;vn,ZP,EN",
-Lb:[function(a,b){var z,y,x,w
-if((b&64512)===56320)P.ZZ(a,b)
-else{z=this.EN
+"^":"a;WF,ZP,EN",
+Lb:[function(a,b){var z,y,x,w,v
+z=this.EN
 y=this.ZP
+if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
+w=y+1
+this.ZP=w
+v=z.length
+if(y>=v)return H.e(z,y)
+z[y]=(240|x>>>18)>>>0
+y=w+1
+this.ZP=y
+if(w>=v)return H.e(z,w)
+z[w]=128|x>>>12&63
+w=y+1
+this.ZP=w
+if(y>=v)return H.e(z,y)
+z[y]=128|x>>>6&63
+this.ZP=w+1
+if(w>=v)return H.e(z,w)
+z[w]=128|x&63
+return!0}else{w=y+1
+this.ZP=w
+v=z.length
+if(y>=v)return H.e(z,y)
+z[y]=224|a>>>12
+y=w+1
+this.ZP=y
+if(w>=v)return H.e(z,w)
+z[w]=128|a>>>6&63
 this.ZP=y+1
-x=C.jn.k(224,a.m(0,12))
-w=z.length
-if(y>=w)return H.e(z,y)
-z[y]=x
-x=this.ZP
-this.ZP=x+1
-y=a.m(0,6).i(0,63)
-if(x>=w)return H.e(z,x)
-z[x]=128|y
-y=this.ZP
-this.ZP=y+1
-x=a.i(0,63)
-if(y>=w)return H.e(z,y)
-z[y]=128|x
-return!1}},"call$2","gkL",4,0,null,483,[],484,[]],
-fJ:[function(a,b,c){var z,y,x,w,v,u
-P.Md(a.j(0,c.W(0,1)))
-for(z=this.EN,y=z.length,x=b;C.jn.C(x,c);++x){w=a.j(0,x)
-w.E(0,127)
-P.Md(w)
-w.E(0,2047)
-v=this.ZP
-if(v+2>=y)break
-this.ZP=v+1
-u=C.jn.k(224,w.m(0,12))
-if(v>=y)return H.e(z,v)
-z[v]=u
-u=this.ZP
+if(y>=v)return H.e(z,y)
+z[y]=128|a&63
+return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
+if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
+if(typeof c!=="number")return H.s(c)
+z=this.EN
+y=z.length
+x=J.rY(a)
+w=b
+for(;w<c;++w){v=x.j(a,w)
+if(v<=127){u=this.ZP
+if(u>=y)break
 this.ZP=u+1
-v=w.m(0,6).i(0,63)
+z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
+t=w+1
+if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
+s=u+1
+if(s>=y)break
+this.ZP=s
 if(u>=y)return H.e(z,u)
-z[u]=128|v
-v=this.ZP
-this.ZP=v+1
-u=w.i(0,63)
-if(v>=y)return H.e(z,v)
-z[v]=128|u}return x},"call$3","gkH",6,0,null,339,[],120,[],121,[]],
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
+z[u]=192|v>>>6
+this.ZP=s+1
+z[s]=128|v&63}else{u=this.ZP
+if(u+2>=y)break
+s=u+1
+this.ZP=s
+if(u>=y)return H.e(z,u)
+z[u]=224|v>>>12
+u=s+1
+this.ZP=u
+if(s>=y)return H.e(z,s)
+z[s]=128|v>>>6&63
+this.ZP=u+1
+if(u>=y)return H.e(z,u)
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","PM",2,0,null,44,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,200,128,[],188,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -15909,44 +15292,38 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,202,128,[],188,[]],
-xv:[function(a){return H.CU(a)},"call$1","J2",2,0,203,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,204,77,77,27,[],164,[],28,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
+NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
 return z},
-F:function(a,b,c){var z,y,x,w,v,u,t
+F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.GP(a);y.G();)z.push(y.gl())
 if(b)return z
-x=z.length
-y=Array(x)
-y.fixed$length=init
-w=H.VM(y,[c])
-for(y=z.length,v=w.length,u=0;u<x;++u){if(u>=y)return H.e(z,u)
-t=z[u]
-if(u>=v)return H.e(w,u)
-w[u]=t}return w},
+z.fixed$length=init
+return z},
 JS:[function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.call$1(z)},"call$1","Qki",2,0,null,6,[]],
+else y.call$1(z)},"call$1","Pl",2,0,null,6,[]],
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,134,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15955,7 +15332,7 @@
 "^":"a;",
 bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
 $isbool:true},
-Rz:{
+Tx:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -15963,29 +15340,26 @@
 if(b==null)return!1
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,104,[]],
-iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,104,[]],
+return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
+iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
-bu:[function(a){var z,y,x,w,v,u,t,s,r,q
-z=new P.B5()
-y=this.aL
-x=y?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0
-w=new P.Hn().call$1(x)
-v=z.call$1(y?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
-u=z.call$1(y?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
-t=z.call$1(y?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
-s=z.call$1(y?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
-r=z.call$1(y?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-z=y?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0
-q=new P.Zl().call$1(z)
-if(y)return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)+"Z"
-else return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,167,[]],
+bu:[function(a){var z,y,x,w,v,u,t,s
+z=this.aL
+y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
+x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
+w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
+v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
+u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
+t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
+s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
+if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"call$0","gXo",0,0,null],
+h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,166,[]],
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,dfk,Kw,h2,mo,EQe,NXt,tp1,Xs,k3,cR,Oq,fH,Ne,Nr,bmS,lX,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?\\+00(?::?00)?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -16001,68 +15375,65 @@
 if(6>=x.length)return H.e(x,6)
 r=y.call$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.LL(J.p0(new P.Rq().call$1(x[7]),1000))
+q=J.LL(J.vX(new P.Rq().call$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
-if(8>=x.length)return H.e(x,8)
-o=x[8]!=null
-n=H.zW(w,v,u,t,s,r,q,o)
-return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","zZ",2,0,null,201,[]],Wu:function(a,b){var z=new P.iP(a,b)
+o=x.length
+if(8>=o)return H.e(x,8)
+if(x[8]!=null){if(9>=o)return H.e(x,9)
+o=x[9]
+if(o!=null){n=J.de(o,"-")?-1:1
+if(10>=x.length)return H.e(x,10)
+m=H.BU(x[10],null,null)
+if(11>=x.length)return H.e(x,11)
+l=y.call$1(x[11])
+if(typeof m!=="number")return H.s(m)
+l=J.WB(l,60*m)
+if(typeof l!=="number")return H.s(l)
+s=J.xH(s,n*l)}k=!0}else k=!1
+j=H.zW(w,v,u,t,s,r,q,k)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,197,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gi:function(){var z=new P.iP(Date.now(),!1)
-z.EK()
-return z}}},
-MF:{
-"^":"Tp:486;",
-call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,485,[],"call"],
-$isEH:true},
-Rq:{
-"^":"Tp:487;",
-call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,485,[],"call"],
-$isEH:true},
-Hn:{
-"^":"Tp:444;",
-call$1:[function(a){var z,y
+return z},Gq:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1",null,2,0,null,292,[],"call"],
-$isEH:true},
-Zl:{
-"^":"Tp:444;",
-call$1:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"call$1","Cp",2,0,null,198,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1",null,2,0,null,292,[],"call"],
+return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"call$1","wI",2,0,null,198,[]]}},
+MF:{
+"^":"Tp:453;",
+call$1:[function(a){if(a==null)return 0
+return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
 $isEH:true},
-B5:{
-"^":"Tp:444;",
-call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,292,[],"call"],
+Rq:{
+"^":"Tp:454;",
+call$1:[function(a){if(a==null)return 0
+return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
-g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,104,[]],
-W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,104,[]],
+g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,488,[]],
-Z:[function(a,b){if(b===0)throw H.b(P.zl())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,489,[]],
-C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,104,[]],
-D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,104,[]],
-E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gf5",2,0,null,104,[]],
-F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,104,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+Z:[function(a,b){if(b===0)throw H.b(P.ts())
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
+D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
+E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
+F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isa6)return!1
-return this.Fq===b.Fq},"call$1","gUJ",2,0,null,104,[]],
+return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,104,[]],
+iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
 bu:[function(a){var z,y,x,w,v
 z=new P.DW()
 y=this.Fq
@@ -16072,20 +15443,20 @@
 v=new P.P7().call$1(C.jn.JV(y,1000000))
 return""+C.jn.cU(y,3600000000)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"call$0","gXo",0,0,null],
 $isa6:true,
-static:{"^":"Kl,S4d,dk,uU,RD,b2,q9,ll,Do,f4,kTB,IJZ,iI,Vk,Nw,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:444;",
+"^":"Tp:413;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
 if(a>=100)return"000"+a
 if(a>=10)return"0000"+a
-return"00000"+a},"call$1",null,2,0,null,292,[],"call"],
+return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:444;",
+"^":"Tp:413;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,292,[],"call"],
+return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -16104,11 +15475,11 @@
 "^":"AT;G1",
 bu:[function(a){return"RangeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
-Np:{
+yd:{
 "^":"Ge;",
-static:{hS:function(){return new P.Np()}}},
+static:{hS:function(){return new P.yd()}}},
 mp:{
-"^":"Ge;uF,UP,mP,SA,FZ",
+"^":"Ge;uF,UP,mP,SA,mZ",
 bu:[function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
@@ -16144,6 +15515,11 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"call$0","gXo",0,0,null],
 static:{a4:function(a){return new P.UV(a)}}},
+kF:{
+"^":"a;",
+bu:[function(a){return"Out of Memory"},"call$0","gXo",0,0,null],
+gI4:function(){return},
+$isGe:true},
 VS:{
 "^":"a;",
 bu:[function(a){return"Stack Overflow"},"call$0","gXo",0,0,null],
@@ -16165,15 +15541,15 @@
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"call$0","gXo",0,0,null],
-static:{zl:function(){return new P.eV()}}},
+static:{ts:function(){return new P.eV()}}},
 kM:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+this.oc},"call$0","gXo",0,0,null],
+bu:[function(a){return"Expando:"+H.d(this.oc)},"call$0","gXo",0,0,null],
 t:[function(a,b){var z=H.of(b,"expando$values")
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],23,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -16184,10 +15560,10 @@
 EH:{
 "^":"a;",
 $isEH:true},
-cX:{
+QV:{
 "^":"a;",
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 AC:{
 "^":"a;"},
 Z0:{
@@ -16198,10 +15574,10 @@
 bu:[function(a){return"null"},"call$0","gXo",0,0,null]},
 a:{
 "^":";",
-n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -16235,7 +15611,7 @@
 gl0:function(a){return this.vM.length===0},
 gor:function(a){return this.vM.length!==0},
 KF:[function(a){var z=typeof a==="string"?a:H.d(a)
-this.vM=this.vM+z},"call$1","gMG",2,0,null,93,[]],
+this.vM=this.vM+z},"call$1","gMG",2,0,null,98,[]],
 We:[function(a,b){var z,y
 z=J.GP(a)
 if(!z.G())return
@@ -16246,8 +15622,8 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gS9",2,2,null,333,474,[],334,[]],
-V1:[function(a){this.vM=""},"call$0","gyP",0,0,null],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
@@ -16261,40 +15637,34 @@
 "^":"a;",
 $isuq:true},
 iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,hO,yW",
-gWu:function(){if(J.de(this.gJf(this),""))return""
+"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
+gWu:function(){if(this.gJf(this)==="")return""
 var z=P.p9("")
 this.tb(z)
 return z.vM},
-gJf:function(a){var z,y
-z=this.NN
-if(z!=null&&J.co(z,"[")){y=J.U6(z)
-return y.Nj(z,1,J.xH(y.gB(z),1))}return z},
-gtp:function(a){var z,y
+gJf:function(a){var z
+if(C.xB.nC(this.NN,"[")){z=this.NN
+return C.xB.Nj(z,1,z.length-1)}return this.NN},
+gtp:function(a){var z
 if(J.de(this.HC,0)){z=this.Fi
-y=J.x(z)
-if(y.n(z,"http"))return 80
-if(y.n(z,"https"))return 443}return this.HC},
+if(z==="http")return 80
+if(z==="https")return 443}return this.HC},
 Ja:function(a,b){return this.tP.call$1(b)},
 x6:[function(a,b){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if(!J.de(this.gJf(this),"")||J.de(this.Fi,"file")){z=J.U6(y)
-z=z.gor(y)&&!z.nC(y,"/")}else z=!1
-if(z)return"/"+H.d(y)
-return y},"call$2","gbQ",4,0,null,265,[],490,[]],
-Ky:[function(a,b){var z=J.x(a)
-if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,491,[],492,[]],
-uo:[function(a){var z=J.U6(a)
-if(J.z8(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,265,[]],
+if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+Ky:[function(a,b){if(a==="")return"/"+H.d(b)
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
-for(y=J.uH(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
 if(J.de(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.de(z[0],"")}else v=!0
@@ -16303,94 +15673,123 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,265,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
-a.KF("@")}z=this.NN
-a.KF(z==null?"null":z)
+a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,493,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(!J.de(this.gJf(this),"")||J.de(y,"file")){z.KF("//")
+z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
 this.tb(z)}z.KF(this.r0)
 y=this.tP
 if(""!==y){z.KF("?")
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.RE(b)
 if(typeof b!=="object"||b===null||!z.$isiD)return!1
-return J.de(this.Fi,b.Fi)&&J.de(this.ku,b.ku)&&J.de(this.gJf(this),z.gJf(b))&&J.de(this.gtp(this),z.gtp(b))&&J.de(this.r0,b.r0)&&J.de(this.tP,b.tP)&&J.de(this.Ka,b.Ka)},"call$1","gUJ",2,0,null,104,[]],
+if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=b.r0
+z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+else z=!1
+else z=!1
+else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=new P.XZ()
 return z.call$2(this.Fi,z.call$2(this.ku,z.call$2(this.gJf(this),z.call$2(this.gtp(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.Ka,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){var z=J.x(h)
-if(z.n(h,"http")&&J.de(e,80))this.HC=0
-else if(z.n(h,"https")&&J.de(e,443))this.HC=0
+n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
+else if(h==="https"&&J.de(e,443))this.HC=0
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,n2,q7,ux,vI,SF,fd,IL,Q5,zk,yt,fC,Ft,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,aJ,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
-z=a.QK
-if(1>=z.length)return H.e(z,1)
-y=z[1]
-y=P.iy(y!=null?y:"")
-x=z.length
-if(2>=x)return H.e(z,2)
-w=z[2]
-w=w!=null?w:""
-if(3>=x)return H.e(z,3)
-v=z[3]
-if(4>=x)return H.e(z,4)
-v=P.K6(v,z[4])
-if(5>=x)return H.e(z,5)
-x=P.n7(z[5])
-u=z.length
-if(6>=u)return H.e(z,6)
-t=z[6]
-t=t!=null?t:""
-if(7>=u)return H.e(z,7)
-s=z[7]
-s=s!=null?s:""
-if(8>=u)return H.e(z,8)
-z=z[8]
-z=z!=null?z:""
-u=P.iy(y)
-u=new P.iD(P.L7(v),null,null,u,w,P.LE(s,null),P.UJ(z),null,null)
-u.n3(z,v,t,null,x,s,null,y,w)
-return u},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+x=new P.hP()
+w=new P.Uo(a1)
+v=J.U6(a1)
+u=v.gB(a1)
+if(J.de(u,0))return P.R6("","",null,null,0,null,null,null,"")
+if(v.j(a1,0)!==47){if(typeof u!=="number")return H.s(u)
+t=0
+for(;s=0,t<u;t=r){r=t+1
+q=v.j(a1,t)
+if(q<128){p=q>>>4
+if(p>=8)return H.e(C.mK,p)
+p=(C.mK[p]&C.jn.W4(1,q&15))!==0}else p=!1
+if(!p){if(q===58){s=r
+t=s}else{t=r-1
+s=0}break}}}else{t=0
+s=0}if(s===t){p=s+1
+if(typeof u!=="number")return H.s(u)
+p=p<u&&v.j(a1,s)===47&&v.j(a1,p)===47}else p=!1
+if(p){o=s+2
+for(n=-1;p=J.Wx(o),m=-1,p.C(o,u);){l=p.g(o,1)
+q=v.j(a1,o)
+if(x.call$1(q)!==!0)if(q===91)o=w.call$1(l)
+else{if(J.de(n,-1)&&q===58);else{p=q===64||q===58
+o=l-1
+if(p){m=v.XU(a1,"@",o)
+if(m===-1){o=t
+break}o=m+1
+for(n=-1;p=J.Wx(o),p.C(o,u);){l=p.g(o,1)
+q=v.j(a1,o)
+if(x.call$1(q)!==!0)if(q===91)o=w.call$1(l)
+else{if(q===58){if(!J.de(n,-1))throw H.b(P.cD("Double port in host"))}else{o=l-1
+break}o=l
+n=o}else o=l}break}else{m=-1
+break}}o=l
+n=o}else o=l}}else{o=s
+m=-1
+n=-1}for(k=o;x=J.Wx(k),x.C(k,u);k=j){j=x.g(k,1)
+q=v.j(a1,k)
+if(q===63||q===35){k=j-1
+break}}x=J.Wx(k)
+if(x.C(k,u)&&v.j(a1,k)===63)for(i=k;w=J.Wx(i),w.C(i,u);i=h){h=w.g(i,1)
+if(v.j(a1,i)===35){i=h-1
+break}}else i=k
+g=s>0?v.Nj(a1,0,s-1):null
+z=0
+if(s!==o){f=s+2
+if(m>0){e=v.Nj(a1,f,m)
+f=m+1}else e=""
+w=J.Wx(n)
+if(w.D(n,0)){y=v.Nj(a1,n,o)
+try{z=H.BU(y,null,null)}catch(d){H.Ru(d)
+throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}c=v.Nj(a1,f,w.W(n,1))}else c=v.Nj(a1,f,o)}else{c=""
+e=""}b=v.Nj(a1,o,k)
+a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
+x=J.Wx(i)
+a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
+return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,202,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y,x
-if(a==null||J.FN(a)===!0)return a
-z=J.rY(a)
-if(z.j(a,0)===91){if(z.j(a,J.xH(z.gB(a),1))!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.eg(z.Nj(a,1,J.xH(z.gB(a),1)))
-return a}y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-if(z.j(a,y)===58){P.eg(a)
-return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u,t,s
+return z},L7:[function(a){var z,y
+if(a.length===0)return a
+if(C.xB.j(a,0)===91){z=a.length-1
+if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
+P.eg(C.xB.Nj(a,1,z))
+return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(new P.bJ("value "+y))
+if(a.charCodeAt(y)===58){P.eg(a)
+return"["+a+"]"}}return a},"call$1","jC",2,0,null,203,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
-y=new P.XX()
 if(a==null)return""
-x=J.U6(a)
-w=x.gB(a)
-if(typeof w!=="number")return H.s(w)
-v=!0
-u=0
-for(;u<w;++u){t=x.j(a,u)
-if(u===0){if(!(t>=97&&t<=122))s=t>=65&&t<=90
-else s=!0
-s=!s}else s=!1
-if(s)throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-if(z.call$1(t)!==!0){if(y.call$1(t)===!0);else throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,206,[]],LE:[function(a,b){var z,y,x
+y=a.length
+for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(new P.bJ("value "+w))
+v=a.charCodeAt(w)
+if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
+else u=!0
+u=!u}else u=!1
+if(u)throw H.b(new P.AT("Illegal scheme: "+a))
+if(z.call$1(v)!==!0){if(v<128){u=v>>>4
+if(u>=8)return H.e(C.mK,u)
+u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
+if(u);else throw H.b(new P.AT("Illegal scheme: "+a))
+x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,204,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -16399,65 +15798,59 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){if(a==null)return""
-return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,205,[],206,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,207,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
-y=new P.Gs()
-x=new P.Tw()
-w=new P.wm(a,y,new P.pm())
-v=new P.FB(a)
-z.a=null
-u=J.U6(a)
-t=u.gB(a)
-z.b=0
+y=J.U6(a).u8(a,"%")
+z.a=y
+if(y<0)return a
+x=new P.Gs()
+w=new P.Tw()
+v=new P.wm(a,x,new P.pm())
+u=new P.FB(a)
+z.b=null
+t=a.length
 z.c=0
 s=new P.Lk(z,a)
-if(typeof t!=="number")return H.s(t)
-r=0
-for(;r<t;)if(u.j(a,r)===37){r=z.b
-if(t<r+2)throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(a)))
-q=u.j(a,r+1)
-p=u.j(a,z.b+2)
-o=v.call$1(z.b+1)
-if(y.call$1(q)===!0&&y.call$1(p)===!0&&x.call$1(o)!==!0){n=z.b+3
-z.b=n
-r=n}else{s.call$0()
-r=x.call$1(o)
-m=z.a
-if(r===!0){m.toString
-l=P.O8(1,o,J.im)
-r=H.eT(l)
-m.vM=m.vM+r}else{m.toString
-m.vM=m.vM+"%"
-r=w.call$1(z.b+1)
-m.toString
-l=P.O8(1,r,J.im)
-r=H.eT(l)
-m.vM=m.vM+r
-r=z.a
-m=w.call$1(z.b+2)
+for(r=y;r<t;){if(t<r+2)throw H.b(new P.AT("Invalid percent-encoding in URI component: "+a))
+q=C.xB.j(a,r+1)
+p=C.xB.j(a,z.a+2)
+o=u.call$1(z.a+1)
+if(x.call$1(q)===!0&&x.call$1(p)===!0&&w.call$1(o)!==!0){y=z.a+3
+z.a=y
+r=y}else{s.call$0()
+r=w.call$1(o)
+n=z.b
+if(r===!0){n.toString
+m=P.O8(1,o,J.im)
+r=H.eT(m)
+n.vM=n.vM+r}else{n.toString
+n.vM=n.vM+"%"
+r=v.call$1(z.a+1)
+n.toString
+m=P.O8(1,r,J.im)
+r=H.eT(m)
+n.vM=n.vM+r
+r=z.b
+n=v.call$1(z.a+2)
 r.toString
-l=P.O8(1,m,J.im)
-m=H.eT(l)
-r.vM=r.vM+m}n=z.b+3
-z.b=n
-z.c=n
-r=n}}else{n=z.b+1
-z.b=n
-r=n}if(z.a!=null&&z.c!==r)s.call$0()
-z=z.a
-if(z==null)return a
-return J.AG(z)},"call$1","Sy",2,0,null,210,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
-else return 0},"call$1","dl",2,0,null,211,[]],K6:[function(a,b){if(a!=null)return a
-if(b!=null)return b
-return""},"call$2","xX",4,0,null,212,[],213,[]],q5:[function(a){var z,y
+m=P.O8(1,n,J.im)
+n=H.eT(m)
+r.vM=r.vM+n}y=z.a+3
+z.a=y
+z.c=y
+r=y}l=C.xB.XU(a,"%",r)
+if(l>=z.a){z.a=l
+r=l}else{z.a=t
+r=t}}if(z.b==null)return a
+if(z.c!==r)s.call$0()
+return J.AG(z.b)},"call$1","Sy",2,0,null,208,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,203,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
-if(J.u6(J.q8(a),2))z.call$1("address is too short")
+if(J.q8(a)<2)z.call$1("address is too short")
 x=[]
 w=0
 u=!1
@@ -16465,29 +15858,35 @@
 while(!0){s=J.q8(a)
 if(typeof s!=="number")return H.s(s)
 if(!(t<s))break
-if(J.lE(a,t)===58){if(t===0){++t
-if(J.lE(a,t)!==58)z.call$1("invalid start colon.")
+s=a
+r=J.q8(s)
+if(typeof r!=="number")return H.s(r)
+if(t>=r)H.vh(new P.bJ("value "+t))
+if(s.charCodeAt(t)===58){if(t===0){++t
+s=a
+if(t>=J.q8(s))H.vh(new P.bJ("value "+t))
+if(s.charCodeAt(t)!==58)z.call$1("invalid start colon.")
 w=t}if(t===w){if(u)z.call$1("only one wildcard `::` is allowed")
 J.bi(x,-1)
 u=!0}else J.bi(x,y.call$2(w,t))
 w=t+1}++t}if(J.q8(x)===0)z.call$1("too few parts")
-r=J.de(w,J.q8(a))
-q=J.de(J.MQ(x),-1)
-if(r&&!q)z.call$1("expected a part after last `:`")
-if(!r)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(p){H.Ru(p)
-try{v=P.q5(J.D8(a,w))
+q=J.de(w,J.q8(a))
+p=J.de(J.MQ(x),-1)
+if(q&&!p)z.call$1("expected a part after last `:`")
+if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
+try{v=P.q5(J.ZZ(a,w))
 s=J.c1(J.UQ(v,0),8)
-o=J.UQ(v,1)
-if(typeof o!=="number")return H.s(o)
-J.bi(x,(s|o)>>>0)
-o=J.c1(J.UQ(v,2),8)
+r=J.UQ(v,1)
+if(typeof r!=="number")return H.s(r)
+J.bi(x,(s|r)>>>0)
+r=J.c1(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.bi(x,(o|s)>>>0)}catch(p){H.Ru(p)
+J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,205,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -16503,29 +15902,35 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,214,152,215,[],216,[],217,[],218,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
+hP:{
+"^":"Tp:462;",
+call$1:[function(a){var z
+if(a<128){z=a>>>4
+if(z>=8)return H.e(C.aa,z)
+z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
+return z},"call$1",null,2,0,null,461,[],"call"],
+$isEH:true},
+Uo:{
+"^":"Tp:463;a",
+call$1:[function(a){a=J.aK(this.a,"]",a)
+if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
+return a+1},"call$1",null,2,0,null,52,[],"call"],
+$isEH:true},
 hb:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
-$isEH:true},
-XX:{
-"^":"Tp:495;",
-call$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.mK,z)
-z=(C.mK[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
+return z},"call$1",null,2,0,null,461,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:107;",
-call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -16533,105 +15938,105 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,496,[],"call"],
+return z},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:495;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,496,[],"call"],
+"^":"Tp:462;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
+return z},"call$1",null,2,0,null,461,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:497;b,c,d",
+"^":"Tp:463;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
-y=J.lE(z,a)
+y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
-else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+H.d(z)))
-else return y},"call$1",null,2,0,null,47,[],"call"],
+else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
+else return y},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:497;e",
-call$1:[function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(z)))}}return x},"call$1",null,2,0,null,47,[],"call"],
+"^":"Tp:463;e",
+call$1:[function(a){var z,y,x,w
+for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
+if(48<=w&&w<=57)y=y*16+w-48
+else{w|=32
+if(97<=w&&w<=102)y=y*16+w-97+10
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:112;a,f",
+"^":"Tp:114;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
-y=z.a
+y=z.b
 x=z.c
 w=this.f
-v=z.b
-if(y==null)z.a=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
+v=z.a
+if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
+else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:499;",
+"^":"Tp:466;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,498,[],245,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:182;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
+"^":"Tp:181;",
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,500,[],"call"],
+return z},"call$1",null,2,0,null,467,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:182;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
+"^":"Tp:181;",
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:501;a,b",
+"^":"Tp:468;a,b",
 call$2:[function(a,b){var z,y
-if(J.z8(J.xH(b,a),4))this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(J.Nj(this.a,a,b),16,null)
+if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
+z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,120,[],121,[],"call"],
+return z},"call$2",null,4,0,null,123,[],124,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:107;c",
+"^":"Tp:112;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,23,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,502,[],503,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,219,18,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],220,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,77,77,221,[],222,[],223,[]],
+return"transitionend"},"call$1","pq",2,0,215,19,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -16642,7 +16047,7 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,221,[],224,[],225,[],222,[],226,[],227,[],228,[],223,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,82,82,82,82,82,82,82,217,[],220,[],218,[],221,[],222,[],223,[],224,[],219,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
@@ -16650,23 +16055,23 @@
 try{z=a
 y=J.x(z)
 return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","EF",2,0,null,229,[]],
+return!1}},"call$1","tn",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,230,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
 qc:[function(a){var z,y
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,18,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,18,[]],
+return}else return a},"call$1","Wq",2,0,null,19,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
 Z9:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
-return P.o7(a,!0)},"call$1","cj",2,0,null,91,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,231,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,107,41,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,107,41,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,232,41,[],12,[],233,[],234,[]],
+return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -16705,29 +16110,29 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],235,[],94,[],11,[],236,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,94,[],231,[],99,[],11,[],232,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,156,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,155,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,156,[]],
+return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Vf|PO|Ur|G6|Sq|xI|Tg|KU|Ps|CN|qbd|HT|Ds|E0|LP|lw|pv|Fv|Vfx|E9|m8|Urj|Gk|AX|oub|yb|c4r|NM|pR|Squ|hx|Dsd|Zt|u7|KUl|E7|Kz|tuj|vj|LU|mHk|T2|Vct|PF|F1|D13|aQ|WZq|Ya5|pva|Ww|cda|tz|qFb|fl|rna|oM|Vba|wM|waa|lI|XP|V0|JG|T5|knI|oaa|fI|q2|nm|q3|uwf"},
-pa:{
+"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+zw:{
 "^":"Gv;",
 $isList:true,
-$asWO:function(){return[W.M5]},
+$aszM:function(){return[W.M5]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.M5]},
+$isQV:true,
+$asQV:function(){return[W.M5]},
 "%":"EntryArray"},
-Gh:{
+Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $isGv:true,
 "%":"HTMLAnchorElement"},
-na:{
+Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $isGv:true,
@@ -16742,7 +16147,7 @@
 "^":"Gv;t5:type=",
 $isAz:true,
 "%":";Blob"},
-QP:{
+Fy:{
 "^":"qE;",
 $isD0:true,
 $isGv:true,
@@ -16758,8 +16163,8 @@
 Yr:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
-di:{
-"^":"Qa;Rn:data=",
+wT:{
+"^":"Mf;Rn:data=",
 "%":"CompositionEvent"},
 He:{
 "^":"ea;",
@@ -16773,15 +16178,15 @@
 "%":"HTMLDataListElement"},
 QF:{
 "^":"KV;",
-JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,264,[],294,[]],
+JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16794,9 +16199,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 $isGv:true,
 "%":";DocumentFragment"},
 cm:{
@@ -16820,13 +16225,13 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 gDD:function(a){return new W.I4(a)},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
-aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
+aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 gqn:function(a){return a.localName},
 bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
 WO:[function(a,b){if(!!a.matches)return a.matches(b)
@@ -16834,14 +16239,15 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,295,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,295,[]],
+return!1},"call$1","gMn",2,0,null,293,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
-gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
+gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
+GE:[function(a,b){return a.getAttribute(b)},"call$1","gBy",2,0,null,12,[]],
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
@@ -16859,13 +16265,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
+e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|SpeechRecognitionEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16875,40 +16282,40 @@
 "^":"Az;oc:name=",
 $ishH:true,
 "%":"File"},
-Aa:{
+QU:{
 "^":"cm;tT:code=",
 "%":"FileError"},
-Tq:{
+h4:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-wa:{
+xn:{
 "^":"Gb;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"rk;iC:responseText=,ys:status=,po:statusText=",
+"^":"wa;iC:responseText=",
 gn9:function(a){return W.Z9(a.response)},
-Yh:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,77,77,77,224,[],221,[],299,[],300,[],301,[]],
-wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,239,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
-rk:{
+wa:{
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
@@ -16923,7 +16330,7 @@
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,aK:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
@@ -16951,6 +16358,7 @@
 "%":"HTMLLinkElement"},
 cS:{
 "^":"Gv;cC:hash%,mH:href=",
+VD:[function(a){return a.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $iscS:true,
 "%":"Location"},
@@ -16959,6 +16367,7 @@
 "%":"HTMLMapElement"},
 El:{
 "^":"qE;kc:error=,LA:src=",
+xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
 "%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
 zm:{
 "^":"Gv;tT:code=",
@@ -16969,16 +16378,16 @@
 aB:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
-fJ:{
+W7:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 Rv:{
-"^":"D0;jO:id=",
+"^":"D0;jO:id=,ph:label=",
 "%":"MediaStream"},
-Hy:{
+cx:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isHy:true,
+$iscx:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"qE;jb:content=,oc:name%",
@@ -16991,17 +16400,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"Imr;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,239,[],302,[]],
+"^":"ab;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
 "%":"MIDIOutput"},
-Imr:{
+ab:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
-CX:{
-"^":"Qa;",
+Wp:{
+"^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[]],
-$isCX:true,
+return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+$isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -17014,12 +16423,12 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,77,77,77,77,77,77,77,74,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
-FI:{
+o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-oU:{
+Q0:{
 "^":"Gv;",
 $isGv:true,
 "%":"Navigator"},
@@ -17030,36 +16439,36 @@
 "^":"D0;q6:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
 gyT:function(a){return new W.e7(a)},
 wg:[function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},"call$0","gRI",0,0,null],
+if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,324,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,325,[]],
-tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,104,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,325,[],326,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,325,[],327,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
 $isKV:true,
 "%":"Entity|Notation;Node"},
 yk:{
-"^":"ecX;",
+"^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 KY:{
@@ -17068,8 +16477,11 @@
 G7:{
 "^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
 "%":"HTMLObjectElement"},
+l9:{
+"^":"qE;ph:label%",
+"%":"HTMLOptGroupElement"},
 Ql:{
-"^":"qE;MB:form=,vH:index=,P:value%",
+"^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 $isQl:true,
 "%":"HTMLOptionElement"},
@@ -17106,21 +16518,33 @@
 "^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
-z=z.ev(z,new W.kI())
+z=z.ev(z,new W.Ou())
 return H.VM(new P.Yp(P.F(z,!0,H.ip(z,"mW",0))),[null])},
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
 $isI0:true,
 "%":"ShadowRoot"},
-CY:{
+QR:{
 "^":"qE;LA:src=,t5:type%",
 "%":"HTMLSourceElement"},
-Hd:{
+uaa:{
+"^":"ea;PK:results=",
+"%":"SpeechInputEvent"},
+yg:{
+"^":"Gv;",
+"%":"SpeechInputResult"},
+mG:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
+Ul:{
+"^":"ea;PK:results=",
+"%":"SpeechRecognitionEvent"},
+uj:{
+"^":"Gv;V5:isFinal=,B:length=",
+"%":"SpeechRecognitionResult"},
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
@@ -17138,7 +16562,7 @@
 "^":"qE;",
 $istV:true,
 "%":"HTMLTableRowElement"},
-KP:{
+BT:{
 "^":"qE;",
 gWT:function(a){return H.VM(new W.Of(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
@@ -17156,25 +16580,25 @@
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 xV:{
-"^":"Qa;Rn:data=",
+"^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
-"^":"qE;fY:kind%,LA:src=",
+"^":"qE;fY:kind%,ph:label%,LA:src=",
 "%":"HTMLTrackElement"},
 OJ:{
 "^":"ea;",
 $isOJ:true,
 "%":"TransitionEvent|WebKitTransitionEvent"},
-Qa:{
+Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 u9:{
-"^":"D0;oc:name%,ys:status=",
+"^":"D0;oc:name%",
 gmW:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,156,[]],
+oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,155,[]],
 hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
@@ -17195,7 +16619,7 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
@@ -17208,7 +16632,7 @@
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-hq:{
+Eb:{
 "^":"KV;",
 $isGv:true,
 "%":"DocumentType"},
@@ -17217,60 +16641,99 @@
 $isD0:true,
 $isGv:true,
 "%":"HTMLFrameSetElement"},
-QV:{
-"^":"w1p;",
+Cy:{
+"^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
+c5:{
+"^":"w1p;",
+gB:function(a){return a.length},
+t:[function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},"call$1","goY",2,0,null,52,[]],
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]},
+$isXj:true,
+"%":"SpeechInputResultList"},
+LO:{
+"^":"kEI;",
+gB:function(a){return a.length},
+t:[function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},"call$1","goY",2,0,null,52,[]],
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]},
+$isXj:true,
+"%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,504,173,[]],
-Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,504,173,[]],
-To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,173,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,182,505,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,182,505,[]],
-WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,504,173,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,132,[]],
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,47,[],23,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,23,[]],
+return b},"call$1","ght",2,0,null,28,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-z=J.x(b)
-for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
-return!0}}return!1},"call$1","gRI",2,0,null,6,[]],
+return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
@@ -17278,29 +16741,29 @@
 x=this.MW
 if(b===y)x.appendChild(c)
 else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,47,[],129,[]],
-V1:[function(a){this.MW.textContent=""},"call$0","gyP",0,0,null],
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
 KI:[function(a,b){var z,y
 z=this.vG
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
-$ascX:function(){return[W.cv]}},
+$aszM:function(){return[W.cv]},
+$asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,47,[],23,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,77,133,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gi9:function(a){return C.mt.vo(this)},
@@ -17309,17 +16772,17 @@
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,18,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -17337,27 +16800,27 @@
 RAp:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:107;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,506,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,507,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:107;b,c",
+"^":"Tp:112;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -17366,24 +16829,20 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,18,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:346;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){var z,y,x,w
-z=J.w1(b)
-if(typeof b==="object"&&b!==null&&!!z.$ise7){z=b.NL
-y=this.NL
-if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){var z,y
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
@@ -17391,81 +16850,108 @@
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,47,[],264,[]],
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
 KI:[function(a,b){var z,y,x
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 x=y[b]
 z.removeChild(x)
-return x},"call$1","gNM",2,0,null,47,[]],
+return x},"call$1","gNM",2,0,null,52,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
-return!0},"call$1","gRI",2,0,null,6,[]],
-V1:[function(a){this.NL.textContent=""},"call$0","gyP",0,0,null],
+return!0},"call$1","guH",2,0,null,6,[]],
+V1:[function(a){J.c9(this.NL,"")},"call$0","gRa",0,0,null],
 u:[function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,47,[],23,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
-$ise7:true,
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 $asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$ascX:function(){return[W.KV]}},
+$aszM:function(){return[W.KV]},
+$asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-ecX:{
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+ma:{
 "^":"nNL+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-kI:{
-"^":"Tp:107;",
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+Ou:{
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,18,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-w1p:{
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+ecX:{
 "^":"yoo+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+zLC:{
+"^":"Gv+lD;",
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]}},
+w1p:{
+"^":"zLC+Gm;",
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]}},
+dxW:{
+"^":"Gv+lD;",
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]}},
+kEI:{
+"^":"dxW+Gm;",
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,104,[]],
+FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,23,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
 V1:[function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gyP",0,0,null],
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,115,[]],
+b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
@@ -17483,21 +16969,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,402,[],277,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,42,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,42,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,42,[],23,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","gRI",2,0,null,42,[]],
+return y},"call$1","guH",2,0,null,47,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,264,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -17505,38 +16991,38 @@
 return z},"call$0","gt8",0,0,null],
 p5:[function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gpJ",2,0,null,86,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,115,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","gRI",2,0,null,23,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,115,[]],
+for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
+OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:107;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:346;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,509,[],129,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17545,36 +17031,36 @@
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]},
+J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
 e0:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,152,18,[],298,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,152,18,[],298,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,152,18,[],298,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
 $isqh:true},
 ie:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,18,[],"call"],
+return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
 KR:[function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17582,16 +17068,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
 $isqh:true},
 i2:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,18,[],"call"],
+return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17600,9 +17086,9 @@
 this.uv=null
 this.u7=null
 return},"call$0","gZS",0,0,null],
-nB:[function(a,b){if(this.uv==null)return
+Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17617,57 +17103,57 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gXB()))},"call$1","ght",2,0,null,511,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","gRI",2,0,null,511,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"call$0","gJK",0,0,112],
+this.aV.cO(0)},"call$0","gJK",0,0,114],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-hP:{
-"^":"a;vm",
-cN:function(a){return this.vm.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,152,18,[],298,[]]},
+bO:{
+"^":"a;Ob",
+cN:function(a){return this.Ob.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,114,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,133,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],129,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,512,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gRI",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 Of:{
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,129,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){J.U2(this.xa)},"call$0","gyP",0,0,null],
+h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,132,[]],
+Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
+z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){J.wg(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,133,[]],
-XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
-Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
-xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]]},
+GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
+KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17684,29 +17170,30 @@
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"call$1",null,2,0,null,41,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,46,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
 gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
+On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
+Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
 $isD0:true,
 $isGv:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"call$1","lG",2,0,null,237,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
 scC:function(a,b){this.WK.hash=b},
 gmH:function(a){return this.WK.href},
+VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
 $iscS:true,
 $isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
@@ -17728,7 +17215,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-mk:{
+vO:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGCircleElement"},
@@ -17748,7 +17235,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEBlendElement"},
-bd:{
+lv:{
 "^":"d5;t5:type=,UQ:values=",
 $isGv:true,
 "%":"SVGFEColorMatrixElement"},
@@ -17768,7 +17255,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDiffuseLightingElement"},
-wf:{
+kK:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDisplacementMapElement"},
@@ -17776,7 +17263,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEFloodElement"},
-tk:{
+Ob:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEGaussianBlurElement"},
@@ -17796,11 +17283,11 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEOffsetElement"},
-kK:{
+um:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFESpecularLightingElement"},
-um:{
+kL:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFETileElement"},
@@ -17835,7 +17322,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGLineElement"},
-uzr:{
+Jq:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGMarkerElement"},
@@ -17843,7 +17330,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGMaskElement"},
-lZ:{
+AW:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPathElement"},
@@ -17855,7 +17342,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolygonElement"},
-mO:{
+GH:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolylineElement"},
@@ -17876,7 +17363,7 @@
 return a._cssClassSet},
 gwd:function(a){return H.VM(new P.D7(a,new W.e7(a)),[W.cv])},
 swd:function(a,b){var z=H.VM(new P.D7(a,new W.e7(a)),[W.cv])
-z.h2.NL.textContent=""
+J.c9(z.h2.NL,"")
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
@@ -17886,7 +17373,7 @@
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
 hy:{
 "^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
 $ishy:true,
 $isGv:true,
 "%":"SVGSVGElement"},
@@ -17925,7 +17412,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGCursorElement"},
-cB:{
+hW:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDropShadowElement"},
@@ -17945,27 +17432,27 @@
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
 TM:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-IU:{
+hq:{
 "^":"a;",
-$isIU:true,
+$ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,152,115,[],238,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,210,117,[],234,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,156,[],238,[],169,[],82,[]],
+d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,91,[],12,[],23,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,96,[],12,[],28,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"call$2","Cb",4,0,null,91,[],12,[]],
+return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
@@ -17977,44 +17464,45 @@
 if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
 else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
 else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,107,91,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],240,[]],
+P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,96,[],68,[],236,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
 z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
 if(z)return a
-else if(a instanceof Date)return P.Wu(a.getMilliseconds(),!1)
-else if(a.constructor===DartObject)return a.o
-else return P.ND(a)}},"call$1","Xl",2,0,195,91,[]],
+else if(a instanceof Date)return P.Wu(a.getTime(),!1)
+else if(a.constructor===$.hs())return a.o
+else return P.ND(a)}},"call$1","Xl",2,0,194,96,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,91,[]],
+else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,96,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],240,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,96,[],68,[],236,[]],
 E4:{
 "^":"a;eh",
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-return P.dU(this.eh[b])},"call$1","gIA",2,0,null,66,[]],
+return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,66,[],23,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
 giO:function(a){return 0},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,104,[]],
-Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,66,[]],
+return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
-return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gwK",2,2,null,77,224,[],268,[]],
+if(b==null)y=null
+else{b.toString
+y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
 $isE4:true,
 static:{uw:function(a,b){var z,y,x
 z=P.wY(a)
@@ -18024,9 +17512,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,239,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,235,[]]}},
 Gn:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -18034,10 +17522,10 @@
 if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$iscX)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"call$1",null,2,0,null,91,[],"call"],
+return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -18048,31 +17536,31 @@
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,47,[]],
+if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,47,[],23,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,114,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,47,[],129,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,47,[]],
+return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
 YW:[function(a,b,c,d,e){var z,y,x
 if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
@@ -18086,38 +17574,37 @@
 x=[b,y]
 z=new H.nH(d,e,null)
 z.$builtinTypeInfo=[null]
-if(e<0)H.vh(P.N(e))
 C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,133,[]]},
+this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 DV:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"call$1",null,2,0,null,91,[],"call"],
+return z},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:107;",
-call$1:[function(a){return new DartObject(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:107;",
-call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:107;",
-call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:107;",
-call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
 J:[function(a,b){var z
@@ -18129,7 +17616,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","yT",4,0,null,128,[],188,[]],
+return a}return a},"call$2","If",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -18137,7 +17624,7 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,128,[],188,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
@@ -18145,9 +17632,9 @@
 y=P.o1(a)
 z=J.x(y)
 if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,42,[]],
+return y.gJi()},"call$1","vG",2,0,null,47,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,42,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -18175,9 +17662,9 @@
 $isej:true,
 $isX9:true,
 $isNL:true},
-ac:{
+Fw:{
 "^":"X9;",
-$isac:true},
+$isFw:true},
 RS:{
 "^":"a;",
 $isRS:true,
@@ -18195,9 +17682,9 @@
 $isNL:true,
 $isej:true},
 Lw:{
-"^":"a;ew,yz,nV,Li"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+"^":"a;ew,yz,nV,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","A9",0,0,null],
+ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","rX",0,0,null],
 Gj:{
 "^":"U4;EV"},
 U4:{
@@ -18205,26 +17692,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,104,[]],
-Rz:[function(a,b){Q.ah()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return Q.ah()},"call$0","gyP",0,0,null],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
-V1:[function(a){this.EV.V1(0)},"call$0","gyP",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
+V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -18244,18 +17731,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,47,[],330,[]],
-XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],330,[]],
-PZ:[function(a,b,c,d){var z=d+1
-this.XL(a,b,z)
-if(c==null)return d
-this.XL(a,c,z)
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.TE(b,0,c))
-return c},"call$3","gyD",6,0,null,120,[],121,[],330,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
+return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ob|Ip|Dg|Nb|nA|Pg"},
+"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -18265,119 +17747,119 @@
 "^":"Dg;",
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]},
+$isQV:true,
+$asQV:function(){return[J.GW]},
 $isHY:true,
 "%":"Float32Array"},
 L3:{
 "^":"Dg;",
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]},
+$isQV:true,
+$asQV:function(){return[J.GW]},
 $isHY:true,
 "%":"Float64Array"},
 zz:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int32Array"},
-Eb:{
+IJ:{
 "^":"Pg;",
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-dT:{
+aH:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Uint16Array"},
 N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
@@ -18385,17 +17867,17 @@
 gbx:function(a){return C.nG},
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
@@ -18403,17 +17885,17 @@
 gbx:function(a){return C.eY},
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
 LZ:{
@@ -18421,8 +17903,8 @@
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.XL(a,b,z)
-this.XL(a,c,z)
+this.ZF(a,b,z)
+this.ZF(a,c,z)
 if(typeof c!=="number")return H.s(c)
 if(b>c)throw H.b(P.TE(b,0,c))
 y=c-b
@@ -18430,81 +17912,59 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,120,[],121,[],27,[],122,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
 YW:[function(a,b,c,d,e){var z=J.x(d)
 if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]}},
-Ob:{
+$isQV:true,
+$asQV:function(){return[J.GW]}},
+Ui:{
 "^":"LZ+lD;",
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]}},
+$isQV:true,
+$asQV:function(){return[J.GW]}},
 Ip:{
-"^":"Ob+SU7;"},
+"^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
 YW:[function(a,b,c,d,e){var z=J.x(d)
 if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]}},
-Nb:{
+$isQV:true,
+$asQV:function(){return[J.im]}},
+ObS:{
 "^":"LZ+lD;",
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]}},
+$isQV:true,
+$asQV:function(){return[J.im]}},
 nA:{
-"^":"Nb+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
 qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/elements/disassembly_entry.dart",,E,{
-"^":"",
-Fv:{
-"^":["pv;m0%-513,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkX:[function(a){return a.m0},null,null,1,0,514,"instruction",355,397],
-skX:[function(a,b){a.m0=this.ct(a,C.i6,a.m0,b)},null,null,3,0,515,23,[],"instruction",355],
-"@":function(){return[C.Vy]},
-static:{AH:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.er.ZL(a)
-C.er.G6(a)
-return a},null,null,0,0,113,"new DisassemblyEntryElement$created"]}},
-"+DisassemblyEntryElement":[516],
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["Vfx;Py%-410,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkc:[function(a){return a.Py},null,null,1,0,354,"error",355,397],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,357,23,[],"error",355],
+"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18517,16 +17977,70 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.G6(a)
-return a},null,null,0,0,113,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[517],
-Vfx:{
+return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[480],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+"^":"",
+rm:{
+"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
+gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
+gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+Ki:function(a){return this.gFR(a).call$0()},
+VN:function(a,b){return this.gFR(a).call$1(b)},
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
+gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+z=this.ct(a,C.eh,a.Ab,z)
+a.Ab=z
+if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
+lp:[function(a,b,c,d){var z,y,x
+J.xW(b)
+z=a.fn
+a.fn=this.ct(a,C.mi,z,"")
+if(a.Ln!=null){y=H.B7([],P.L5(null,null,null,null,null))
+x=R.Jk(y)
+J.kW(x,"expr",z)
+J.BM(a.y4,0,x)
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+"@":function(){return[C.Qz]},
+static:{Rp:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.Ab="1-line"
+a.y4=z
+a.SO=y
+a.B7=x
+a.X0=v
+C.Gh.ZL(a)
+C.Gh.G6(a)
+return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[488],
+Vct:{
+"^":"uL+Pi;",
+$isd3:true},
+YW:{
+"^":"Tp:112;a-82",
+call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
+$isEH:true},
+"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
-static:{Tt:[function(a){var z,y,x,w
+static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18538,16 +18052,16 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.G6(a)
-return a},null,null,0,0,113,"new FieldRefElement$created"]}},
-"+FieldRefElement":[418]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,115,"new FieldRefElement$created"]}},
+"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["Urj;vt%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gt0:[function(a){return a.vt},null,null,1,0,354,"field",355,397],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,357,23,[],"field",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.vt,"id")).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.vc]},
-static:{cY:[function(a){var z,y,x,w
+"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
+st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
+yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.My]},
+static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18558,29 +18072,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.G6(a)
-return a},null,null,0,0,113,"new FieldViewElement$created"]}},
-"+FieldViewElement":[518],
-Urj:{
-"^":"PO+Pi;",
-$isd3:true},
-e5:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+FieldViewElement_refresh_closure":[415],
-Ni:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+FieldViewElement_refresh_closure":[415]}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+return a},null,null,0,0,115,"new FieldViewElement$created"]}},
+"+FieldViewElement":[490],
+D13:{
+"^":"uL+Pi;",
+$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-AX:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.YQ]},
-static:{wH:[function(a){var z,y,x,w
+qW:{
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.R0]},
+static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18592,14 +18093,14 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.G6(a)
-return a},null,null,0,0,113,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[418]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
-yb:{
-"^":["oub;Z8%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gMj:[function(a){return a.Z8},null,null,1,0,354,"function",355,397],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,357,23,[],"function",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.Z8,"id")).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+mk:{
+"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
+yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18610,31 +18111,18 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.h4.ZL(a)
-C.h4.G6(a)
-return a},null,null,0,0,113,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[519],
-oub:{
-"^":"PO+Pi;",
-$isd3:true},
-QR:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+FunctionViewElement_refresh_closure":[415],
-Yx:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+FunctionViewElement_refresh_closure":[415]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+C.Yu.ZL(a)
+C.Yu.G6(a)
+return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[491],
+WZq:{
+"^":"uL+Pi;",
+$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
-NM:{
-"^":["c4r;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,kg%-77,LY%-77,q3%-77,Ol%-410,X3%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gB1:[function(a){return a.Ol},null,null,1,0,354,"profile",355,397],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,357,23,[],"profile",355],
+jY:{
+"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
@@ -18661,7 +18149,7 @@
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
 J.kW(J.wc(a.kg),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,112,"enteredView"],
+this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z!=null){z=J.UQ(z,"members")
@@ -18674,33 +18162,35 @@
 if(this.K1(a,x))continue
 y=J.U6(x)
 w=J.UQ(y.t(x,"class"),"name")
-v=a.pC.Mq(J.UQ(y.t(x,"class"),"id"))
+v=y.t(x,"class").gHP()
 J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.Wj(a,x,0))+"</a>",this.Wj(a,x,1),this.Wj(a,x,2),this.Wj(a,x,3),this.Wj(a,x,4),this.Wj(a,x,5),this.Wj(a,x,6)])}a.GQ.lb()
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
+J.N5(a.GQ,["External",z.t(u,"external")])
 a.Oc.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
 J.N5(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
-this.uB(a)},"call$0","gYs",0,0,112,"_updateChartData"],
+J.N5(a.Oc,["External",z.t(u,"external")])
+this.uB(a)},"call$0","gYs",0,0,114,"_updateChartData"],
 uB:[function(a){if(a.q3==null||a.kg==null)return
 a.kg.u5()
 a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,112,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,114,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,520,277,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18713,8 +18203,8 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,521,277,[],47,[],"_fullTableColumnValue"],
-Wj:[function(a,b,c){var z
+default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
@@ -18728,30 +18218,34 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gPI",4,0,521,277,[],47,[],"_combinedTableColumnValue"],
-RF:[function(a,b){a.pC.oX("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-ii:[function(a,b,c,d){a.pC.oX("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,425,18,[],306,[],74,[],"resetAccumulator"],
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
+yv:[function(a,b){var z=a.Ol
+if(z==null)return
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+ii:[function(a,b,c,d){var z=a.Ol
+if(z==null)return
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,157,229,[],"profileChanged"],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,522,523,[],"formattedAverage",356],
-uW:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gBo",2,0,522,523,[],"formattedCollections",356],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,522,523,[],"formattedTotalCollectionTime",356],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
 Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
@@ -18779,9 +18273,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,113,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"b7<-77,bQj<-77,WY<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DP<-77",op:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18791,48 +18285,48 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.RJ.ZL(a)
-C.RJ.G6(a)
-C.RJ.Dd(a)
-return a},null,null,0,0,113,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[524],
-c4r:{
-"^":"PO+Pi;",
+C.Vc.ZL(a)
+C.Vc.G6(a)
+C.Vc.Dd(a)
+return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[496],
+pva:{
+"^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:357;a-77",
+"^":"Tp:378;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[415],
+"+ nx":[489],
 jm:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[415],
-xj:{
-"^":"Tp:357;a-77",
+"+ jm":[489],
+ke:{
+"^":"Tp:378;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[415],
-VB:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
+"+ ke":[489],
+xj:{
+"^":"Tp:348;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[415]}],["html_common","dart:html_common",,P,{
+"+ xj":[489]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,23,[]],
+return y},"call$1","Lq",2,0,null,28,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,152,6,[],241,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18840,33 +18334,33 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:189;b,c",
+"^":"Tp:188;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,23,[],"call"],
+return y},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:372;d",
+"^":"Tp:411;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,441,[],"call"],
+return z[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:525;e",
+"^":"Tp:499;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:107;f,UI,bK",
+"^":"Tp:112;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -18875,7 +18369,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$iscT)throw H.b(P.SY("structured clone of RegExp"))
+if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
 if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
 if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
 if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
@@ -18888,7 +18382,7 @@
 w={}
 z.a=w
 this.bK.call$2(x,w)
-y.aN(a,new P.q1(z,this))
+y.aN(a,new P.ib(z,this))
 return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
@@ -18899,36 +18393,36 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,18,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
-q1:{
-"^":"Tp:346;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+ib:{
+"^":"Tp:348;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:189;a,b",
+"^":"Tp:188;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,23,[],"call"],
+return y},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:372;c",
+"^":"Tp:411;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,441,[],"call"],
+return z[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:525;d",
+"^":"Tp:499;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:107;e,f,UI,bK",
+"^":"Tp:112;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -18953,7 +18447,7 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,18,[],"call"],
+return y}return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 As:{
 "^":"a;",
@@ -18963,90 +18457,86 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
-aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,115,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,333,334,[]],
+aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,115,[]],
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
+Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,117,[]],
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,23,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,23,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,23,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","gRI",2,0,null,23,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,114,[]],
+return y},"call$1","guH",2,0,null,28,[]],
+FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
-eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,292,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,47,[]],
-V1:[function(a){this.OS(new P.uQ())},"call$0","gyP",0,0,null],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
-return y},"call$1","gFd",2,0,null,115,[]],
+return y},"call$1","gFd",2,0,null,117,[]],
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.O]}},
+$isQV:true,
+$asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:107;",
-call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 D7:{
-"^":"ar;F1,h2",
+"^":"ar;qt,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,115,[]],
+aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,47,[],23,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
 FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
-tg:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-return b.parentNode===this.F1},"call$1","gdj",2,0,null,102,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,120,[],121,[]],
-V1:[function(a){this.h2.NL.textContent=""},"call$0","gyP",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,47,[],23,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
+V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
 KI:[function(a,b){var z,y
 z=this.gzT()
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 J.QC(y)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 Rz:[function(a,b){var z,y,x
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$iscv)return!1
@@ -19054,43 +18544,40 @@
 if(y>=z.length)return H.e(z,y)
 x=z[y]
 if(x==null?b==null:x===b){J.QC(x)
-return!0}}return!1},"call$1","gRI",2,0,null,129,[]],
+return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,292,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:107;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goc:[function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.goc.call(this,a)
-return J.UQ(z,"preview")},null,null,1,0,370,"name"],
-gJp:[function(a){var z=a.tY
-if(z!=null)if(J.de(J.UQ(z,"type"),"@Null"))if(J.de(J.UQ(a.tY,"id"),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.de(J.UQ(a.tY,"id"),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.de(J.UQ(a.tY,"id"),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.de(J.UQ(a.tY,"id"),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.de(J.UQ(a.tY,"id"),"objects/being-initialized"))return"This object is currently being initialized."
-return""},null,null,1,0,370,"hoverText"],
-Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,113,"expander"],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gD5:[function(a){var z=a.tY
+if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
 SF:[function(a,b,c){var z,y
-P.JS("Calling expandEvent")
-if(b===!0){z=a.pC
-y=a.tY
-z.oX(y==null?"":J.UQ(y,"id")).ml(new B.Js(a)).OA(new B.fM()).YM(c)}else{J.kW(a.tY,"fields",null)
-J.kW(a.tY,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,526,527,[],413,[],"expandEvent"],
+z=a.tY
+if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
+else{y=J.w1(z)
+y.u(z,"fields",null)
+y.u(z,"elements",null)
+c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19104,34 +18591,26 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.G6(a)
-return a},null,null,0,0,113,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[418],
+return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[383],
 Js:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y,x
+"^":"Tp:112;a-82",
+call$1:[function(a){var z,y
 z=J.U6(a)
-y=this.a
-if(J.de(z.t(a,"type"),"Null")){z.u(a,"type","@Null")
-x=J.RE(y)
-x.stY(y,x.ct(y,C.kY,x.gtY(y),a))}else{x=J.RE(y)
-J.kW(x.gtY(y),"fields",z.t(a,"fields"))
-J.kW(x.gtY(y),"elements",z.t(a,"elements"))
-J.kW(x.gtY(y),"length",z.t(a,"length"))}x=J.RE(y)
-J.kW(x.gtY(y),"fields",z.t(a,"fields"))
-J.kW(x.gtY(y),"elements",z.t(a,"elements"))
-J.kW(x.gtY(y),"length",z.t(a,"length"))},"call$1",null,2,0,107,149,[],"call"],
+if(z.t(a,"preview")!=null){z.soc(a,z.t(a,"preview"))
+a.szz(z.t(a,"preview"))}z=this.a
+y=J.RE(z)
+y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
+y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[415],
-fM:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+InstanceRefElement_expandEvent_closure":[415]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["Squ;Xh%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gQr:[function(a){return a.Xh},null,null,1,0,354,"instance",355,397],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,357,23,[],"instance",355],
+"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
+yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19144,39 +18623,17 @@
 a.X0=w
 C.yK.ZL(a)
 C.yK.G6(a)
-return a},null,null,0,0,113,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[528],
-Squ:{
-"^":"PO+Pi;",
-$isd3:true}}],["isolate_element","package:observatory/src/elements/isolate_element.dart",,S,{
-"^":"",
-PO:{
-"^":["Vf;pC%-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.pC},null,null,1,0,358,"isolate",355,397],
-sAq:[function(a,b){a.pC=this.ct(a,C.Z8,a.pC,b)},null,null,3,0,359,23,[],"isolate",355],
-"@":function(){return[C.EA]},
-static:{O5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.wx.ZL(a)
-C.wx.G6(a)
-return a},null,null,0,0,113,"new IsolateElement$created"]}},
-"+IsolateElement":[529],
-Vf:{
+return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[503],
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["Zt;Jh-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-RF:[function(a,b){var z=[]
-J.kH(a.Jh.gi2(),new L.fW(z))
-P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,158,413,[],"refresh"],
+"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
+yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.jF]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19189,150 +18646,134 @@
 a.X0=w
 C.b9.ZL(a)
 C.b9.G6(a)
-return a},null,null,0,0,113,"new IsolateListElement$created"]}},
-"+IsolateListElement":[530],
-fW:{
-"^":"Tp:346;a-77",
-call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,346,110,[],14,[],"call"],
-$isEH:true},
-"+IsolateListElement_refresh_closure":[415],
-Ey:{
-"^":"Tp:107;b-77",
-call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,107,108,[],"call"],
-$isEH:true},
-"+IsolateListElement_refresh_closure":[415]}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+return a},null,null,0,0,115,"new IsolateListElement$created"]}},
+"+IsolateListElement":[507],
+waa:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 qm:{
-"^":["Y2;Aq>,tT>-420,eT,yt-386,wd-403,oH-404,z3,AP,fn",null,function(){return[C.mI]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
 C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-H.bQ(this.tT.gVS(),new X.vO(this))},"call$0","gz7",0,0,null],
-o8:[function(){return},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v,u
-z=this.oH
-y=this.tT
-x=this.Aq
-w=J.RE(x)
-v=J.w1(z)
-v.h(z,X.eI(y.gDu(),w.gB1(x).ghV()))
-if(c==null)v.h(z,"")
-else{u=c.tT
-v.h(z,X.eI(u.dJ(y),u.QQ()))}v.h(z,X.eI(y.gfF(),w.gB1(x).ghV()))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","uV",4,0,null,128,[],242,[]],Tl:function(a,b,c){var z,y
+J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v
+z=J.UQ(this.B1,"samples")
+y=this.oH
+x=this.tT
+w=J.w1(y)
+w.h(y,X.eI(x.gDu(),z))
+if(c==null)w.h(y,"")
+else{v=c.tT
+w.h(y,X.eI(v.dJ(x),v.QQ()))}},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-vO:{
-"^":"Tp:532;a",
+TI:{
+"^":"Tp:509;a",
 call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,531,[],"call"],
+J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
 $isEH:true},
 E7:{
-"^":["KUl;SS%-386,fb=-533,qY%-533,qO=-77,Hm%-534,pD%-410,eH%-387,vk%-387,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gXc:[function(a){return a.SS},null,null,1,0,371,"methodCountSelected",355,356],
-sXc:[function(a,b){a.SS=this.ct(a,C.fQ,a.SS,b)},null,null,3,0,372,23,[],"methodCountSelected",355],
-gDt:[function(a){return a.qY},null,null,1,0,535,"topExclusiveCodes",355,356],
-sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,536,23,[],"topExclusiveCodes",355],
-gB1:[function(a){return a.pD},null,null,1,0,354,"profile",355,397],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,357,23,[],"profile",355],
-gLW:[function(a){return a.eH},null,null,1,0,370,"sampleCount",355,356],
-sLW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,25,23,[],"sampleCount",355],
-gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",355,356],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,25,23,[],"refreshTime",355],
-pM:[function(a,b){var z,y
-if(a.pD==null)return
-P.JS("profile changed")
-z=J.UQ(a.pD,"samples")
-this.IW(a,a.pC,z,a.pD)
-y=a.pC
-this.oC(a,y)
-this.f9(a,y)},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
+gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
+sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
+gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
+gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
+pM:[function(a,b){var z,y,x
+z=a.pD
+if(z==null)return
+y=J.UQ(z,"samples")
+x=new P.iP(Date.now(),!1)
+x.EK()
+z=J.AG(y)
+a.FT=this.ct(a,C.XU,a.FT,z)
+z=x.bu(0)
+a.vk=this.ct(a,C.Dj,a.vk,z)
+J.QP(a.pD).N3(a.pD)
+this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
 i4:[function(a){var z,y
 z=[]
 y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller","Inclusive"])
+C.Nm.FV(z,["Method","Exclusive","Caller"])
 a.Hm=new G.XN(z,y,null,null)
-y=a.pC
-this.oC(a,y)
-this.f9(a,y)},"call$0","gQd",0,0,112,"enteredView"],
-wW:[function(a,b){var z=a.pC
-this.oC(a,z)
-this.f9(a,z)},"call$1","ghj",2,0,107,233,[],"methodCountSelectedChanged"],
-RF:[function(a,b){a.pC.oX("profile").ml(new X.SV(a)).OA(new X.Mf()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-IW:[function(a,b,c,d){var z=J.AG(c)
-a.eH=this.ct(a,C.XU,a.eH,z)
-z=P.Gi().bu(0)
-a.vk=this.ct(a,C.Dj,a.vk,z)
-J.CJ(b,G.hh(b,d))
-this.oC(a,b)
-this.f9(a,b)},"call$3","gja",6,0,537,14,[],538,[],379,[],"_loadProfileData"],
-yF:[function(a,b){this.oC(a,b)
-this.f9(a,b)},"call$1","gAL",2,0,539,14,[],"_refresh"],
-f9:[function(a,b){var z,y
+this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
+wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
+yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+Cx:[function(a){var z,y,x
+if(a.pD==null)return
+z=J.UQ(a.fb,a.BA)
+y=a.Dt
+x=J.w1(y)
+x.V1(y)
+x.FV(y,J.QP(a.pD).gZ0().T0(z))
+this.zr(a)},"call$0","gBn",0,0,114,"_update"],
+Ti:[function(a){var z,y,x
+z=J.UQ(a.fb,a.BA)
+y=a.Dt
+x=J.w1(y)
+x.V1(y)
+x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
+zr:[function(a){var z,y,x
 z=[]
-for(y=J.GP(a.qY);y.G();)z.push(X.Tl(b,y.gl(),null))
-a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,539,14,[],"_refreshTree"],
-oC:[function(a,b){var z,y
-J.U2(a.qY)
-if(b==null||J.Tv(b)==null)return
-z=J.UQ(a.fb,a.SS)
-y=J.Tv(b).T0(z)
-J.bj(a.qY,y)},"call$1","guE",2,0,539,14,[],"_refreshTopMethods"],
-ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,540,363,[],"padding",356],
+for(y=J.GP(a.Dt);y.G();){x=y.gl()
+z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
+this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,540,363,[],"coloring",356],
+return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.Mf(x-1)}},"call$3","gpR",6,0,541,18,[],306,[],74,[],"toggleExpanded",356],
+y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
 "@":function(){return[C.jR]},
 static:{jD:[function(a){var z,y,x,w,v
-z=R.Jk([])
+z=Q.uX(null,D.kx)
 y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.SS=0
-a.fb=[10,20,50]
-a.qY=z
-a.qO="#tableTree"
-a.eH=""
+a.Dt=z
+a.BA=0
+a.FT=""
 a.vk=""
+a.fb=[10,20,50]
+a.qO="#tableTree"
 a.SO=y
 a.B7=x
 a.X0=v
 C.XH.ZL(a)
 C.XH.G6(a)
-return a},null,null,0,0,113,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[542],
-KUl:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[515],
+V4:{
+"^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:357;a-77",
-call$1:[function(a){var z,y,x
-z=J.UQ(a,"samples")
-N.Jx("").To("Profile contains "+H.d(z)+" samples.")
-y=this.a
-x=J.RE(y)
-x.IW(y,x.gpC(y),z,a)},"call$1",null,2,0,357,543,[],"call"],
+"^":"Tp:378;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[415],
-Mf:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").wF("Error refreshing profile",a,b)},"call$2",null,4,0,346,18,[],377,[],"call"],
-$isEH:true},
-"+IsolateProfileElement_refresh_closure":[415]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Kz:{
-"^":["PO;pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19345,37 +18786,40 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.G6(a)
-return a},null,null,0,0,113,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[544]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[517],
+V9:{
+"^":"uL+Pi;",
+$isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["tuj;eb%-77,kf%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gvL:[function(a){return a.eb},null,null,1,0,113,"json",355,397],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,107,23,[],"json",355],
+"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,112,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,158,233,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,370,"primitiveString"],
+a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
+yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
 gmm:[function(a){var z,y
 z=a.eb
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
 else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,370,"valueType"],
+return"Primitive"},null,null,1,0,365,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,371,"counter"],
-gaK:[function(a){var z,y
+return z},null,null,1,0,512,"counter"],
+go6:[function(a){var z,y
 z=a.eb
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,535,"list"],
+return[]},null,null,1,0,518,"list"],
 gvc:[function(a){var z,y
 z=a.eb
 y=J.RE(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,535,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,25,42,[],"value"],
+return[]},null,null,1,0,518,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19388,17 +18832,17 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.GB.ZL(a)
-C.GB.G6(a)
-return a},null,null,0,0,113,"new JsonViewElement$created"]}},
-"+JsonViewElement":[545],
-tuj:{
+C.Yt.ZL(a)
+C.Yt.G6(a)
+return a},null,null,0,0,115,"new JsonViewElement$created"]}},
+"+JsonViewElement":[519],
+V10:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.QU]},
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19411,47 +18855,31 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.G6(a)
-return a},null,null,0,0,113,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[418]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
-T2:{
-"^":["mHk;N7%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.N7},null,null,1,0,354,"library",355,397],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,357,23,[],"library",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.N7,"id")).ml(new M.Jq(a)).OA(new M.Yn()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+KL:{
+"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
+yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.Gg]},
-static:{SP:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.N7=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{Ro:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.MG.ZL(a)
 C.MG.G6(a)
-return a},null,null,0,0,113,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[546],
-mHk:{
-"^":"PO+Pi;",
-$isd3:true},
-Jq:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+LibraryViewElement_refresh_closure":[415],
-Yn:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+LibraryViewElement_refresh_closure":[415]}],["logging","package:logging/logging.dart",,N,{
+return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[520],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
@@ -19468,34 +18896,35 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,23,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
-y=P.Gi()
+y=new P.iP(Date.now(),!1)
+y.EK()
 x=$.xO
 $.xO=x+1
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,77,77,547,[],20,[],160,[],161,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"gEX",2,4,null,77,77,20,[],160,[],161,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,77,77,20,[],160,[],161,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,77,77,20,[],160,[],161,[]],
-wF:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.wF(a,null,null)},"j2","call$3",null,"goa",2,4,null,77,77,20,[],160,[],161,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gxx",2,4,null,77,77,20,[],160,[],161,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
+OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
 IE:[function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,22,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -19513,29 +18942,29 @@
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<z},"call$1","gix",2,0,null,104,[]],
+return this.P<z},"call$1","gix",2,0,null,109,[]],
 E:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<=z},"call$1","gf5",2,0,null,104,[]],
+return this.P<=z},"call$1","gER",2,0,null,109,[]],
 D:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>z},"call$1","gh1",2,0,null,104,[]],
+return this.P>z},"call$1","gh1",2,0,null,109,[]],
 F:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>=z},"call$1","gNH",2,0,null,104,[]],
+return this.P>=z},"call$1","gNH",2,0,null,109,[]],
 iM:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P-z},"call$1","gYc",2,0,null,104,[]],
+return this.P-z},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,reI,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"call$0","gXo",0,0,null],
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
 $isHV:true,
 static:{"^":"xO"}}}],["","main.dart",,F,{
 "^":"",
@@ -19547,60 +18976,30 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:549;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,548,[],"call"],
+"^":"Tp:523;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,108,[],"call"],
-$isEH:true}}],["message_viewer_element","package:observatory/src/elements/message_viewer.dart",,L,{
+A.Ok()},"call$1",null,2,0,null,113,[],"call"],
+$isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-PF:{
-"^":["Vct;Gj%-410,ah%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gG1:[function(a){return a.Gj},null,null,1,0,354,"message",397],
-guw:[function(a){return a.ah},null,null,1,0,408,"app",355,397],
-suw:[function(a,b){a.ah=this.ct(a,C.wh,a.ah,b)},null,null,3,0,551,23,[],"app",355],
-sG1:[function(a,b){if(b==null){N.Jx("").To("Viewing null message.")
-return}N.Jx("").To("Viewing message of type '"+H.d(J.UQ(b,"type"))+"'")
-a.Gj=b
-this.ct(a,C.US,"",this.gQW(a))},null,null,3,0,357,191,[],"message",397],
-gQW:[function(a){var z=a.Gj
-if(z==null||J.UQ(z,"type")==null)return"Error"
-return J.UQ(a.Gj,"type")},null,null,1,0,370,"messageType"],
-"@":function(){return[C.rc]},
-static:{A5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Wp.ZL(a)
-C.Wp.G6(a)
-return a},null,null,0,0,113,"new MessageViewerElement$created"]}},
-"+MessageViewerElement":[552],
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
-"^":"",
-fA:{
+T4:{
 "^":"a;T9,Bu",
 static:{"^":"Xd,en,pjg,PZ,xa"}},
-Qz:{
+tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-Jo:{
+PO:{
 "^":"a;"},
-c5:{
+oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.nW]},
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.Ug]},
 static:{z5:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19612,16 +19011,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.G6(a)
-return a},null,null,0,0,113,"new NavBarElement$created"]}},
-"+NavBarElement":[553],
+return a},null,null,0,0,115,"new NavBarElement$created"]}},
+"+NavBarElement":[524],
 aQ:{
-"^":["D13;uy%-387,ZC%-387,Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
-sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
-gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
+gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.pc]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19629,57 +19028,59 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.uy="#"
-a.ZC="---"
+a.KU="#"
+a.V4="---"
 a.Jo=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.SU.ZL(a)
 C.SU.G6(a)
-return a},null,null,0,0,113,"new NavMenuElement$created"]}},
-"+NavMenuElement":[554],
-D13:{
+return a},null,null,0,0,115,"new NavMenuElement$created"]}},
+"+NavMenuElement":[525],
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
-Ya5:{
-"^":["WZq;uy%-387,ZC%-387,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
-sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
-gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
-"@":function(){return[C.qT]},
+Qa:{
+"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
+gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.uy="#"
-a.ZC="---"
+a.KU="#"
+a.V4="---"
 a.SO=z
 a.B7=y
 a.X0=w
 C.nn.ZL(a)
 C.nn.G6(a)
-return a},null,null,0,0,113,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[555],
-WZq:{
+return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[526],
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["pva;rU%-77,SB%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gFR:[function(a){return a.rU},null,null,1,0,113,"callback",355,397],
+"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,107,23,[],"callback",355],
-gxw:[function(a){return a.SB},null,null,1,0,380,"active",355,397],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,381,23,[],"active",355],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
+gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
+gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gzY",6,0,425,18,[],306,[],74,[],"buttonClick"],
-wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,112,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{ZC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19688,20 +19089,21 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
+a.Hq="Refresh"
 a.SO=z
 a.B7=y
 a.X0=w
 C.J7.ZL(a)
 C.J7.G6(a)
-return a},null,null,0,0,113,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[556],
-pva:{
+return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[527],
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["cda;Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19715,17 +19117,19 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.G6(a)
-return a},null,null,0,0,113,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[557],
-cda:{
+return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[528],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["qFb;Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
 "@":function(){return[C.zaS]},
-static:{Yt:[function(a){var z,y,x,w
+static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19737,17 +19141,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.G6(a)
-return a},null,null,0,0,113,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[558],
-qFb:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[529],
+V16:{
+"^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["rna;Ap%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.Ap},null,null,1,0,354,"library",355,397],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,357,23,[],"library",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+Zt:{
+"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19759,19 +19163,19 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.S3.ZL(a)
-C.S3.G6(a)
-return a},null,null,0,0,113,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[559],
-rna:{
-"^":"PO+Pi;",
+C.ct.ZL(a)
+C.ct.G6(a)
+return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[530],
+V17:{
+"^":"uL+Pi;",
 $isd3:true},
-wM:{
-"^":["Vba;Au%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.Au},null,null,1,0,354,"cls",355,397],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,357,23,[],"cls",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+iL:{
+"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19785,29 +19189,30 @@
 a.X0=w
 C.xE.ZL(a)
 C.xE.G6(a)
-return a},null,null,0,0,113,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[560],
-Vba:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[531],
+V18:{
+"^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["waa;k5%-417,xH%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzj:[function(a){return a.k5},null,null,1,0,380,"devtools",355,397],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,381,23,[],"devtools",355],
-guw:[function(a){return a.xH},null,null,1,0,408,"app",355,356],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,551,23,[],"app",355],
-ZB:[function(a){var z,y
-if(a.k5===!0){z=new G.ho(P.L5(null,null,null,null,null),0,null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null)
-y=C.ph.aM(window)
-H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(z.gcW()),y.Sg),[H.Kp(y,0)]).Zz()
-P.JS("Connected to DartiumVM")
-z=new G.mL(new G.dZ(null,!1,"",null,null,null),z,null,null,null,null)
+"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
+guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
+suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+ZB:[function(a){var z
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+z.pC()
+z.PI()
+z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new G.mL(new G.dZ(null,!1,"",null,null,null),new G.XK("http://127.0.0.1:8181/",null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null),null,null,null,null)
+a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+z.pC()
+z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,113,"created"],
-"@":function(){return[C.kR]},
+a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+"@":function(){return[C.bd]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19821,49 +19226,51 @@
 C.k0.ZL(a)
 C.k0.G6(a)
 C.k0.ZB(a)
-return a},null,null,0,0,113,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[561],
-waa:{
+return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[535],
+V19:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,112,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,112,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,562,12,[],233,[],234,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,380,"applyAuthorStyles"],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
-z=J.LL(J.p0(b,1000))
+z=J.LL(J.vX(b,1000))
 y=C.jn.cU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.cU(z,60000)
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,563,564,[],"formatTime"],
-Ze:[function(a,b){var z=J.Wx(b)
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,444,565,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
 bj:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,566,567,[],"fileAndLine"],
-nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,568,11,[],"isNullRef"],
-Qq:[function(a,b){var z=J.x(b)
-return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,568,11,[],"isIntRef"],
-TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,568,11,[],"isBoolRef"],
-qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,568,11,[],"isStringRef"],
-JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,568,11,[],"isInstanceRef"],
-CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,568,11,[],"isClosureRef"],
-Bk:[function(a,b){var z=J.x(b)
-return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,568,11,[],"isListRef"],
-VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,568,11,[],"isUnexpectedRef"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
+z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+OP:[function(a,b){var z=J.x(b)
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+Cp:[function(a,b){var z=J.x(b)
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19876,12 +19283,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.G6(a)
-return a},null,null,0,0,113,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,115,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","px",4,0,243,23,[],244,[],"_zeroPad"]}},
-"+ObservatoryElement":[569]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
+"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19890,46 +19297,40 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,112],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,112],
+k0:[function(a){},"call$0","gqw",0,0,114],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,114],
 BN:[function(a){var z,y,x
-z=a.fn
-a.fn=null
-y=a.AP
-if(y!=null){x=y.iE
-x=x==null?y!=null:x!==y}else x=!1
-if(x&&z!=null){x=H.VM(new P.Yp(z),[T.z2])
+z=a.Lk
+a.Lk=null
+if(this.gnz(a)&&z!=null){y=a.AP
+x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,380],
-gUV:function(a){var z,y
+return!0}return!1},"call$0","gDx",0,0,390],
+gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
-nq:[function(a,b){var z,y
-z=a.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},"call$1","gbW",2,0,null,22,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+nq:[function(a,b){if(!this.gnz(a))return
+if(a.Lk==null){a.Lk=[]
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
 "^":"a;",
 $isz2:true},
 qI:{
-"^":"z2;WA<,oc>,jL>,zZ>",
+"^":"z2;WA>,oc>,jL>,zZ>",
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
 $isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
 "^":"",
 J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
+"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,113,"value",355],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19943,14 +19344,14 @@
 x.push(w)}this.Ow()},"call$0","gM",0,0,null],
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,158,108,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,157,113,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,112],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,114],
 cO:[function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -19958,12 +19359,12 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,113],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,113],
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,115],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,115],
 $isJ3:true},
 E5:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 Y3:[function(){var z,y,x,w,v,u,t,s,r,q
@@ -19995,36 +19396,36 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:570;a",
+"^":"Tp:544;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,170,[],151,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,169,[],153,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:171;b",
+"^":"Tp:170;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:113;c,d,e,f",
+"^":"Tp:115;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:571;UI",
+"^":"Tp:545;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:107;bK,Gq,Rm,w3",
+"^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,21,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -20062,7 +19463,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -20097,10 +19498,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,251,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,252,[],253,[],254,[]],
+return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -20111,7 +19512,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,252,[],253,[],254,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -20161,16 +19562,17 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","Lr",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
+return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=b.gWA()
-y=J.zj(b)
+z=J.RE(b)
+y=z.gWA(b)
+z=z.gvH(b)
 x=J.qA(b.gIl())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
 v.$builtinTypeInfo=[null]
-u=new G.DA(z,v,x,y,w)
+u=new G.DA(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
 q.jr=J.WB(q.jr,s)
@@ -20200,11 +19602,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,255,[],22,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,68,[],256,[]],
+return z},"call$2","bN",4,0,null,73,[],252,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -20214,9 +19616,9 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,68,[],256,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
 DA:{
-"^":"a;WA<,ok,Il<,jr,dM",
+"^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
 gRt:function(){return this.ok},
 gNg:function(){return this.dM},
@@ -20227,7 +19629,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gw9",2,0,null,42,[]],
+return a<z},"call$1","gcW",2,0,null,47,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -20244,8 +19646,8 @@
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
-if(z.gUV(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,93,[],257,[],233,[],234,[]],
+if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
+return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
 d3:{
 "^":"a;",
 gUj:function(a){var z=this.R9
@@ -20253,7 +19655,7 @@
 z=P.bK(this.gkk(),z,!0,null)
 this.R9=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gUV:function(a){var z,y
+gnz:function(a){var z,y
 z=this.R9
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
@@ -20270,16 +19672,16 @@
 v=new H.MH(null,J.GP(z.l6),z.T6)
 v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
 for(;v.G();){u=v.lo
-z=J.x(u)
-if(typeof u!=="object"||u===null||!z.$isRY||u.gV5()||u.gFo()||u.gq4())continue
+z=J.RE(u)
+if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
 for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
 s=J.x(t)
 if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
 x.u(0,r,y.rN(r).gAx())
 break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,112],
+this.V2=x},"call$0","gFW",0,0,114],
 B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,112],
+this.V2=null}},"call$0","gkk",0,0,114],
 BN:[function(a){var z,y,x,w
 z={}
 y=this.V2
@@ -20298,7 +19700,7 @@
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(z)
 return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
+ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
 nq:[function(a,b){var z,y
 z=this.R9
 if(z!=null){y=z.iE
@@ -20306,10 +19708,10 @@
 if(!z)return
 z=this.me
 if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","gbW",2,0,null,22,[]],
+this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -20319,23 +19721,23 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],233,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],229,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
-"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",355],
+"^":"Pi;L1,AP,Lk",
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},234,[],"value",355],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"Ay;b3,xg,h3,AP,fn",
+"^":"er;b3,xg,h3,AP,Lk",
 gvp:function(){var z=this.xg
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,371,"length",355],
+gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -20363,10 +19765,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,372,23,[],"length",355],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},47,[],"[]",355],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -20378,9 +19780,9 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},47,[],23,[],"[]=",355],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,380,"isEmpty",355],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,380,"isNotEmpty",355],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20389,7 +19791,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,23,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20399,10 +19801,10 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,114,[]],
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","gRI",2,0,null,129,[]],
+return!0}return!1},"call$1","guH",2,0,null,132,[]],
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
@@ -20430,7 +19832,7 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,120,[],121,[]],
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
@@ -20438,7 +19840,7 @@
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
-H.Og(z,b+1,y,this,b)
+H.qG(z,b+1,y,this,b)
 y=z.length
 this.nU(y-1,y)
 y=this.xg
@@ -20446,27 +19848,27 @@
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
 if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,47,[],129,[]],
+z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){var z,y
 z=this.h3
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,22,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,233,[],234,[]],
-cv:[function(){var z,y,x
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
 y=G.u2(this,z)
@@ -20477,15 +19879,15 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,380],
+return!0}return!1},"call$0","gL6",0,0,390],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
-Ay:{
+er:{
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -20497,20 +19899,20 @@
 return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
 $isHA:true},
 qC:{
-"^":"Pi;Zp,AP,fn",
+"^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",355],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.cX,b]}},this.$receiver,"qC")},"values",355],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,371,"length",355],
+return z.gB(z)},null,null,1,0,512,"length",358],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,380,"isEmpty",355],
+return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,380,"isNotEmpty",355],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,572,23,[],"containsValue",355],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,572,42,[],"containsKey",355],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},42,[],"[]",355],
+return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20521,8 +19923,8 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",355],
-FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,104,[]],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20531,7 +19933,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","gRI",2,0,null,42,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -20539,9 +19941,10 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gRa",0,0,null],
+aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+$isqC:true,
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
 z.FV(0,a)
@@ -20552,20 +19955,20 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
 if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
 if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,22,[],42,[]],
+return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
 yf:[function(a,b){var z,y,x,w,v
 if(a==null)return
 x=b
@@ -20581,7 +19984,7 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"call$2","MT",4,0,null,6,[],66,[]],
+return},"call$2","MT",4,0,null,6,[],71,[]],
 h6:[function(a,b,c){var z,y,x,w,v
 if(a==null)return!1
 x=b
@@ -20598,14 +20001,14 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],66,[],23,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
 dR:[function(a,b){var z,y,x,w
-z=new H.GD(H.le(H.d(b.gfN(b))+"="))
+z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
 x=y.t(0,b)
 w=J.x(x)
@@ -20617,20 +20020,20 @@
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"call$2","Cp",4,0,null,11,[],12,[]],
+a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
 return $.aA()}},"call$1","WV",2,0,null,11,[]],
-rd:[function(a){a=J.JA(a,$.c3(),"")
+cB:[function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"call$1","KL",2,0,null,86,[]],
+return $.tN().zD(a)},"call$1","wf",2,0,null,91,[]],
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
+"^":"Pi;ay,YB,BK,kN,cs,cT,AP,Lk",
 E4:function(a){return this.cT.call$1(a)},
-gWA:function(){var z=this.kN
+gWA:function(a){var z=this.kN
 if(0>=z.length)return H.e(z,0)
 return z[0]},
 gP:[function(a){var z,y
@@ -20639,7 +20042,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,113,"value",355],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20656,16 +20059,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,504,234,[],"value",355],
+z[y]=b}},null,null,3,0,471,230,[],"value",358],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,112],
+this.XI()},"call$0","gqw",0,0,114],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,112],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,114],
 Zy:[function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -20681,7 +20084,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,77,121,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20697,9 +20100,9 @@
 return}t=this.kN
 if(s>=t.length)return H.e(t,s)
 t[s]=u}this.ij(a)
-if(this.gUV(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
+if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,335,120,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20708,7 +20111,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,335,77,120,[],121,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20732,12 +20135,12 @@
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gCf",2,0,null,441,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
 w=H.BU(x,10,new L.qL())
-y.push(w!=null?w:new H.GD(H.le(x)))}z=this.BK
+y.push(w!=null?w:new H.GD(H.u1(x)))}z=this.BK
 this.kN=H.VM(Array(z.length+1),[P.a])
 if(z.length===0&&c!=null)a=c.call$1(a)
 y=this.kN
@@ -20745,27 +20148,27 @@
 y[0]=a
 this.cs=H.VM(Array(z.length),[P.MO])},
 $isWR:true,
-static:{ao:function(a,b,c){var z=new L.WR(b,L.rd(b),H.VM([],[P.a]),null,null,c,null,null)
+static:{ao:function(a,b,c){var z=new L.WR(b,L.cB(b),H.VM([],[P.a]),null,null,c,null,null)
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:107;",
-call$1:[function(a){return},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:573;a,b,c",
+"^":"Tp:547;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,256,[],"call"],
+return}},"call$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:574;d,e,f",
+"^":"Tp:548;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,256,[],"call"],
+return}},"call$1",null,2,0,null,252,[],"call"],
 $isEH:true},
-YJ:{
-"^":"Tp:113;",
+Md:{
+"^":"Tp:115;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -20774,18 +20177,18 @@
 if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
 if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,R.np())
+return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,107,23,[]],
+return x}return a},"call$1","np",2,0,112,28,[]],
 km:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,402,[],277,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
 z=document.createElement("style",null)
-z.textContent=".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n"
+J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
@@ -20797,28 +20200,28 @@
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
 oF:[function(a,b){var z,y,x,w,v,u
-if(J.de(a,$.Tf()))return b
+if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.x(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!y.gV5()))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.RE(y)
+if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
 u=J.x(v)
 if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,258,[],259,[]],
+b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
-a=a.gAY()}while(!J.de(a,$.Tf()))
-return},"call$2","il",4,0,null,258,[],66,[]],
+a=a.gAY()}while(!J.de(a,$.H8()))
+return},"call$2","il",4,0,null,254,[],71,[]],
 bc:[function(a,b){var z,y
-z=H.le(H.d(b.gIf().fN)+"=")
+z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
 z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,258,[],260,[]],
+return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20827,7 +20230,7 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,261,[],12,[],262,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
 Hl:[function(a){var z,y,x,w,v,u,t
 if(a==null)return""
 w=J.RE(a)
@@ -20847,28 +20250,28 @@
 if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,263,[]],
+return""}else throw u}},"call$1","NI",2,0,null,259,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,77,12,[],11,[]],
-zM:[function(a){A.Vx(a,new A.Mq())},"call$1","jU",2,0,null,264,[]],
-Vx:[function(a,b){var z
+if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
+xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
+om:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,264,[],156,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,265,[],12,[],264,[],266,[]],
-Hr:[function(a){var z
+return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","Fd",2,0,null,264,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,41,[],267,[],268,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
 Rk:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
@@ -20877,10 +20280,10 @@
 ZI:[function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
-z.textContent=a.textContent
+J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
@@ -20889,7 +20292,7 @@
 y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,23,[],66,[]],
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
 h5:[function(a){var z
 if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
@@ -20898,7 +20301,7 @@
 if(typeof a==="string")return C.Db
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,23,[]],
+return},"call$1","v9",2,0,null,28,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20907,7 +20310,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.Bl())},"call$0","PB",0,0,112],
+$.ax().ml(new A.rD())},"call$0","PB",0,0,114],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -20919,7 +20322,7 @@
 t=y
 if(t==null)H.vh(new P.AT("Error must not be null"))
 if(u.Gv!==0)H.vh(new P.lj("Future already completed"))
-u.CG(t,x)}}},"call$0","xm",0,0,null],
+u.CG(t,x)}}},"call$0","vH",0,0,null],
 GA:[function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.QF)
 if(d==null){d=[]
@@ -20937,67 +20340,66 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,77,77,271,[],272,[],273,[],274,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
-y=$.qG()
-x=P.r6(y.ej(a))
-w=x.Fi
-if(!J.de(w,"")){v=x.ku
-u=x.gJf(x)
-t=x.gtp(x)
-s=z.SK(x.r0)
-r=x.tP}else{if(!J.de(x.gJf(x),"")){v=x.ku
-u=x.gJf(x)
-t=x.gtp(x)
-s=z.SK(x.r0)
-r=x.tP}else{if(J.de(x.r0,"")){s=z.r0
-r=x.tP
-r=!J.de(r,"")?r:z.tP}else{q=J.co(x.r0,"/")
-p=x.r0
-s=q?z.SK(p):z.SK(z.Ky(z.r0,p))
-r=x.tP}v=z.ku
-u=z.gJf(z)
-t=z.gtp(z)}w=z.Fi}o=P.R6(x.Ka,u,s,null,t,r,null,w,v)
-x=$.UG().nb
-n=x.t(0,o)
-m=o.r0
-if(J.de(o.Fi,z.Fi))if(o.gWu()===z.gWu()){z=J.rY(m)
-if(z.Tc(m,".dart"))z=z.tg(m,"/packages/")===!0||z.nC(m,"packages/")
-else z=!1}else z=!1
+y=P.hK(a)
+x=y.Fi
+if(x!==""){w=y.ku
+v=y.gJf(y)
+u=y.gtp(y)
+t=z.SK(y.r0)
+s=y.tP}else{if(y.gJf(y)!==""){w=y.ku
+v=y.gJf(y)
+u=y.gtp(y)
+t=z.SK(y.r0)
+s=y.tP}else{r=y.r0
+if(r===""){t=z.r0
+s=y.tP
+s=s!==""?s:z.tP}else{r=J.co(r,"/")
+q=y.r0
+t=r?z.SK(q):z.SK(z.Ky(z.r0,q))
+s=y.tP}w=z.ku
+v=z.gJf(z)
+u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
+y=$.UG().nb
+o=y.t(0,p)
+n=p.r0
+if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
-if(z){z=o.r0
-q=J.U6(z)
-l=x.t(0,P.r6(y.ej("package:"+q.yn(z,J.WB(q.cn(z,"packages/"),9)))))
-if(l!=null)n=l}if(n==null){$.M7().To(H.d(o)+" library not found")
-return}z=n.gYK().nb
+else z=!1
+else z=!1
+if(z){z=p.r0
+m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
+if(m!=null)o=m}if(o==null){$.M7().To(H.d(p)+" library not found")
+return}z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.Fn()
-x=new H.U5(z,y)
-x.$builtinTypeInfo=[H.ip(z,"mW",0)]
+r=new H.U5(z,y)
+r.$builtinTypeInfo=[H.ip(z,"mW",0)]
 z=z.gA(z)
 y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(x,0)]
-for(;y.G();)A.ZB(n,z.gl())
-z=n.gYK().nb
+y.$builtinTypeInfo=[H.Kp(r,0)]
+for(;y.G();)A.ZB(o,z.gl())
+z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.e3()
-x=new H.U5(z,y)
-x.$builtinTypeInfo=[H.ip(z,"mW",0)]
+r=new H.U5(z,y)
+r.$builtinTypeInfo=[H.ip(z,"mW",0)]
 z=z.gA(z)
 y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(x,0)]
-for(;y.G();){k=z.gl()
-for(x=J.GP(k.gc9());x.G();){j=x.lo.gAx()
-q=J.x(j)
-if(typeof j==="object"&&j!==null&&!!q.$isV3){q=j.ns
-p=k.gYj()
-$.Ej().u(0,q,p)
+y.$builtinTypeInfo=[H.Kp(r,0)]
+for(;y.G();){l=z.gl()
+for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
+q=J.x(k)
+if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+j=l.gYj()
+$.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
 ZB:[function(a,b){var z,y,x
-for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.za){y=!0
+for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+H.d(b.gIf())+" is not."
 z=$.oK
@@ -21009,20 +20411,20 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],224,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,98,[],220,[]],
 Zj:{
-"^":"Tp:107;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 XP:{
-"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ei",
+"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ve",
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
 gZf:function(a){var z,y,x
 z=a.querySelector("template")
 if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z))
+x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
 y=x}else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
@@ -21058,9 +20460,9 @@
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gLD",2,0,null,12,[]],
+return!0},"call$1","gXX",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,262,[]],
+return!0}return!1},"call$1","gmL",2,0,null,258,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -21079,23 +20481,23 @@
 if(w!==""){y=a.Q7
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
-v=new H.GD(H.le(w))
+v=new H.GD(H.u1(w))
 u=A.Oy(b,v)
 if(u==null){window
 y=$.pl()
-t="property for attribute "+w+" of polymer-element name="+a.RT+" not found."
+t="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 y.toString
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,258,[],575,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,576,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -21113,15 +20515,15 @@
 t=w.vM+u
 w.vM=t
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
-z.textContent=H.d(w)
+J.c9(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gq6(x))}}},"call$0","gysu",0,0,null],
+v.mK(x,z,v.gq6(x))}}},"call$0","gnt",0,0,null],
 oP:[function(a,b,c){var z,y,x
 z=W.vD(a.querySelectorAll(b),null)
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,77,510,[],577,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -21132,16 +20534,15 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,578,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
-z.textContent=b
-z.toString
-z.setAttribute("element",a.RT+"-"+c)
-return z},"call$2","gNG",4,0,null,579,[],578,[]],
+J.c9(z,b)
+z.setAttribute("element",H.d(a.RT)+"-"+c)
+return z},"call$2","gNG",4,0,null,553,[],552,[]],
 q1:[function(a,b){var z,y,x,w
-if(J.de(b,$.Tf()))return
+if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 x=J.x(y)
@@ -21150,10 +20551,10 @@
 x=J.rY(w)
 if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,258,[]],
+a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,580,[]],
+return z},"call$1","gir",2,0,null,554,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -21162,48 +20563,48 @@
 C.xk.du(a)
 return a}}},
 q6:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:346;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],23,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
-w10:{
-"^":"Tp:113;",
+w12:{
+"^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,581,[],582,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
 $isEH:true},
 yL:{
 "^":"nd;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-412",function(){return[C.nJ]}],
+"^":["a;KM:X0=-375",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -21216,12 +20617,12 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
+$.Bh=$.Bh-1},"call$0","gLi",0,0,null],
 i4:[function(a){if(a.dZ==null)this.Ec(a)
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,583,[]],
+this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
 d0:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=z.Ja(b,"template")
@@ -21232,32 +20633,32 @@
 if(typeof x!=="object"||x===null||!w.$isI0)return
 v=z.gQg(b).MW.getAttribute("name")
 if(v==null)return
-a.B7.u(0,v,x)},"call$1","gcY",2,0,null,584,[]],
+a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
 z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$ishs?b:M.Ky(b)
+z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,261,[]],
+return y},"call$1","gAt",2,0,null,257,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
-this.gKE(a)
+this.gIW(a)
 z=this.er(a)
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
 y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$ishs?b:M.Ky(b)
+y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,261,[]],
+return z},"call$1","gQb",2,0,null,257,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,585,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
-if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
 fk:[function(a){if(J.ak(a.dZ)==null)return
 this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
@@ -21268,14 +20669,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,586,12,[],23,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,23,[]],
+return},"call$1","gt4",2,0,null,28,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -21288,7 +20689,7 @@
 else{J.MV(M.Ky(a),b)
 y=z.gIf()
 x=$.ZH()
-if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+this.gqn(a)+"].["+H.d(y)+"]")
+if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+H.d(this.gqn(a))+"].["+H.d(y)+"]")
 w=L.ao(c,d,null)
 if(w.gP(w)==null)w.sP(0,H.vn(a).rN(y).gAx())
 x=H.vn(a)
@@ -21299,12 +20700,12 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
 if(a.Uk===!0)return
-$.P5().J4("["+this.gqn(a)+"] asyncUnbindAll")
+$.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.oq
 y=this.gJg(a)
 if(z!=null)z.TP(0)
@@ -21318,16 +20719,16 @@
 if(z!=null){z.ed()
 a.Wz=null}this.C0(a)
 J.AA(M.Ky(a))
-y=this.gKE(a)
-for(;y!=null;){A.zM(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,112],
+y=this.gIW(a)
+for(;y!=null;){A.xv(y)
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,114],
 BT:[function(a,b){var z
-if(a.Uk===!0){$.P5().j2("["+this.gqn(a)+"] already unbound, cannot cancel unbindAll")
-return}$.P5().J4("["+this.gqn(a)+"] cancelUnbindAll")
+if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,587,[]],
+A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
@@ -21341,7 +20742,7 @@
 for(w=J.GP(b);w.G();){v=w.gl()
 u=J.x(v)
 if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,588,589,[]],
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -21349,10 +20750,10 @@
 if(y==null)return
 x=J.x(d)
 if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+this.gqn(a)+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
 if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+this.gqn(a)+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
 w.dB=x.cR(new A.xf(a,d,y))
@@ -21361,7 +20762,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],23,[],248,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -21372,11 +20773,11 @@
 a.Sa.V1(0)
 a.Sa=null},"call$0","gNX",0,0,null],
 Uc:[function(a){var z,y
-z=J.wX(a.dZ)
+z=J.yxg(a.dZ)
 if(z.gl0(z))return
 y=$.SS()
-if(y.Im(C.R5))y.J4("["+this.gqn(a)+"] addHostListeners: "+H.d(z))
-this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","ghu",0,0,null],
+if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+H.d(z))
+this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","gxD",0,0,null],
 UH:[function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
@@ -21385,61 +20786,61 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,264,[],590,[],297,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.SS()
 x=y.Im(C.R5)
-if(x)y.J4(">>> ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")
-w=J.wX(a.dZ)
+if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+w=J.yxg(a.dZ)
 v=z.gt5(b)
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.J4("["+this.gqn(a)+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,591,384,[]],
+if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
+this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
 ea:[function(a,b,c,d){var z,y,x
 z=$.SS()
 y=z.Im(C.R5)
-if(y)z.J4(">>> ["+this.gqn(a)+"]: dispatch "+H.d(c))
+if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 x=J.x(c)
 if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
-else if(typeof c==="string")A.HR(b,new H.GD(H.le(c)),d)
+else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],592,[],268,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
 $iszs:true,
-$ishs:true,
+$isTU:true,
 $isd3:true,
 $iscv:true,
 $isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],23,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:113;b",
+"^":"Tp:115;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,292,[],"call"],
+if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,264,[],"call"],
+return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:346;b,c,d,e",
+"^":"Tp:348;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -21449,29 +20850,29 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],593,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
-y=J.D8(this.b,3)
+y=J.ZZ(this.b,3)
 x=C.FS.t(0,y)
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],264,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:107;c,d,e",
+"^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
-y=A.Hr(z)
+y=A.z9(z)
 x=J.RE(y)
 if(typeof y!=="object"||y===null||!x.$iszs)return
 w=this.c
@@ -21480,25 +20881,25 @@
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,384,[],"call"],
+x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:107;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,108,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,108,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -21506,17 +20907,17 @@
 this.Jq.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
-this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,234,[]],
-ho:[function(a){var z,y,x,w,v
+this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
+aL4:[function(a){var z,y,x,w,v
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,595,256,[]],
+return}}},"call$1","giz",2,0,569,252,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -21530,17 +20931,17 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-jpR:{
-"^":["qE+zs;KM:X0=-412",function(){return[C.nJ]}],
+Sa:{
+"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
 $iszs:true,
-$ishs:true,
+$isTU:true,
 $isd3:true,
 $iscv:true,
 $isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"jpR+Pi;",
+"^":"Sa+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -21554,30 +20955,30 @@
 if(z!=null){z.ed()
 this.ih=null}},"call$0","gol",0,0,null],
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,112]},
+this.Ws()}},"call$0","gv6",0,0,114]},
 V3:{
 "^":"a;ns",
 $isV3:true},
-Bl:{
-"^":"Tp:107;",
+rD:{
+"^":"Tp:112;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,108,[],"call"],
+return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,596,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,596,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:107;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
 $isEH:true},
 jh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -21587,72 +20988,72 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,23,[],276,[],11,[]],
+return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
 W6:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
-z.u(0,C.Ts,new Z.nl())
+z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,21,[],597,[],"call"],
+return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:346;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:346;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:346;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a," "):a
-return z},"call$1","qP",2,0,195,277,[]],
+else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,272,[]],
 PX:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,195,277,[]],
+else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,272,[]],
 o8:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,402,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:107;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,402,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 e9:{
-"^":"T4;",
+"^":"ve;",
 cl:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
@@ -21667,41 +21068,41 @@
 if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
 z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,598,265,[],12,[],264,[]],
-CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,261,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
 Xy:{
-"^":"Tp:346;a,b,c",
+"^":"Tp:348;a,b,c",
 call$2:[function(a,b){var z=J.x(a)
 if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
 z=typeof b==="object"&&b!==null&&!!z.$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],264,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
 $isEH:true},
-G0:{
-"^":"Tp:107;a",
+uK:{
+"^":"Tp:112;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,285,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
 $isEH:true},
 mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,fn",
+"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
 y=J.x(a)
 if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,107,277,[]],
-gP:[function(a){return this.Y7},null,null,1,0,113,"value",355],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,107,277,[],"value",355],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
 yB:function(a,b,c){var z,y,x,w,v
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -21715,18 +21116,18 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:107;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,441,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
-"^":"xh;vq,L1,AP,fn",
+"^":"xh;vq,L1,AP,Lk",
 vb:function(a,b){this.vq.yI(new B.bX(b,this))},
 $asxh:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
@@ -21735,13 +21136,13 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,441,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
+return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -21771,83 +21172,83 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.le(u)),b)},"call$3","wA",6,0,null,278,[],23,[],270,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
 ci:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,277,[]],
-Uf:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
+return a},"call$1","Af",2,0,null,272,[]],
 Ra:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:346;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:346;",
-call$2:[function(a,b){var z=H.uK(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,128,[],115,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:107;",
-call$1:[function(a){return a},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){var z=H.Og(P.a)
+z=H.KT(z,[z]).BD(b)
+if(z)return b.call$1(a)
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,131,[],117,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
-w9:{
-"^":"Tp:107;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,128,[],"call"],
+w10:{
+"^":"Tp:112;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,131,[],"call"],
+$isEH:true},
+w11:{
+"^":"Tp:112;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
-"^":"a;eT>,k8,bq,G9",
+"^":"a;eT>,k8<,bq,G9",
 gCH:function(){var z=this.G9
 if(z!=null)return z
 z=H.vn(this.k8)
@@ -21857,7 +21258,7 @@
 if(J.de(b,"this"))return this.k8
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
-else if(this.k8!=null){y=new H.GD(H.le(b))
+else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
 if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
@@ -21870,26 +21271,27 @@
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
-else{z=H.le(a)
+else{z=H.u1(a)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},"call$1","gXe",2,0,null,12,[]],
 tg:[function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
-else{z=H.le(b)
+else{z=H.u1(b)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},"call$1","gdj",2,0,null,12,[]],
 $isz6:true},
-Ay0:{
+Ay:{
 "^":"a;bO?,Lv<",
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-Qh:[function(a){},"call$1","gVj",2,0,null,270,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,270,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21898,30 +21300,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,270,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
-"^":"cfS;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,18,[]],
+"^":"d2;Jd",
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,283,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
 G1:{
 "^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,18,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,18,[]],
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,351,[]],
+return y},"call$1","gEW",2,0,null,354,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,441,[]],
+return x},"call$1","gA2",2,0,null,409,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21931,115 +21333,115 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,441,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,279,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gX7",2,0,null,279,[]],
+return y},"call$1","gmd",2,0,null,274,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,18,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,441,[]],
+return x},"call$1","ghH",2,0,null,19,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
-x=new K.mG(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","glf",2,0,null,91,[]],
+return x},"call$1","glf",2,0,null,96,[]],
 Hx:[function(a){var z,y
 z=J.UK(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","ghe",2,0,null,91,[]],
+return y},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gXf",2,0,null,441,[]]},
+return x},"call$1","gU6",2,0,null,409,[]]},
 Os:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,128,[],"call"],
+return z},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,18,[],"call"],
+return z},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Wh:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.EZ]},
+"^":"Ay;KL,bO,tj,Lv,k6",
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
 x5:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
+"^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.no]},
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
-"^":"Ay0;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.kB]},
+"^":"Ay;Pu>,KL,bO,tj,Lv,k6",
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,191,[],18,[],"call"],
+return a},"call$2",null,4,0,null,190,[],19,[],"call"],
 $isEH:true},
 qR:{
-"^":"Ay0;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.ae]},
+"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
 ek:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
+"^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z,y,x
 z=this.KL
-this.Lv=a.t(0,z.gP(z))
+this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
 x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.le(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.w6]},
+if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,bO,tj,Lv,k6",
+"^":"Ay;wz<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:[function(a){var z,y
@@ -22047,13 +21449,13 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.jK]},
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
-mG:{
-"^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
+iv:{
+"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:[function(a){var z,y,x,w
@@ -22070,64 +21472,64 @@
 w=typeof z==="object"&&z!==null&&!!w.$iswn
 z=w}else z=!1
 if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.uk]},
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 vl:{
-"^":"Ay0;hP<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:[function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.KL
-x=new H.GD(H.le(y.goc(y)))
+x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.x9]},
+if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 iT:{
-"^":"Ay0;hP<,Jn<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
 Qh:[function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.zX]},
+if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 ja:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
-zw:{
-"^":"Tp:107;d",
+ey:{
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 fa:{
-"^":"Ay0;hP<,re<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
 gbP:function(a){var z=this.KL
 return z.gbP(z)},
 Qh:[function(a){var z,y,x,w
@@ -22138,52 +21540,52 @@
 if(x==null){this.Lv=null
 return}z=this.KL
 if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.le(z.gbP(z)))
+this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
 z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.Jy]},
+if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:107;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:574;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:548;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 VA:{
-"^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
+"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 Qh:[function(a){var z,y,x,w
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$iscX)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
 if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.K9]},
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;kF,bm",
 $isfk:true},
 wL:{
-"^":"a:107;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gQl",2,0,null,599,[]],
+"^":"a:112;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -22192,70 +21594,65 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y,x
-z=J.x(a)
-if(z.n(a,b))return!0
+Pu:[function(a,b){var z,y
+if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
-if(!J.de(z.gB(a),b.length))return!1
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,128,[],188,[]],
+if(a.length!==b.length)return!1
+for(z=0;z<a.length;++z){y=a[z]
+if(z>=b.length)return H.e(b,z)
+if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,280,[],23,[]],
+return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,280,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,600,18,[],128,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],191,[],128,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,91,[]],
+return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -22263,33 +21660,33 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -22297,12 +21694,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -22311,12 +21708,12 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -22325,12 +21722,12 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -22338,12 +21735,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -22351,12 +21748,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -22364,8 +21761,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:346;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,601,[],602,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -22373,8 +21770,8 @@
 XJ:[function(a,b){var z
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
-if(z)throw H.b(Y.RV("Expected "+b+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,603,[],23,[]],
+if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
 return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
@@ -22392,7 +21789,7 @@
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gHr",4,0,null,131,[],604,[]],
+return a},"call$2","gTv",4,0,null,134,[],578,[]],
 qL:[function(a,b){var z,y
 if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
 this.Sk.toString
@@ -22403,7 +21800,7 @@
 if(z){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,131,[],132,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -22414,7 +21811,7 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,131,[]],
+return new U.uk(x,a,y)},"call$1","gvB",2,0,null,134,[]],
 Dl:[function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -22504,34 +21901,34 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gJ1",0,0,null],
-pT0:[function(a){var z,y
+return y},"call$0","gJA",0,0,null],
+pT:[function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT0("")},"Ud","call$1",null,"gwo",0,2,null,333,605,[]],
-Fj:[function(a){var z,y
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.Fj("")},"tw","call$1",null,"gSE",0,2,null,333,605,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,281,114,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
 Ae:{
-"^":"a;vH>-386,P>-606",
+"^":"a;vH>-369,P>-580",
 r6:function(a,b){return this.P.call$1(b)},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,107,91,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,371,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
+return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
 $isAe:true,
-"@":function(){return[C.nJ]},
+"@":function(){return[C.Nw]},
 "<>":[3],
-static:{iz:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},47,[],23,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -22548,9 +21945,9 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,47,[]],
+return z},"call$1","goY",2,0,null,52,[]],
 $asmW:function(a){return[[K.Ae,a]]},
-$ascX:function(a){return[[K.Ae,a]]}},
+$asQV:function(a){return[[K.Ae,a]]}},
 vR:{
 "^":"AC;WS,wX,CD",
 gl:function(){return this.CD},
@@ -22568,14 +21965,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","tm",4,0,null,282,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-aK:[function(a){switch(a){case 102:return 12
+wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","aN",2,0,null,283,[]],
+default:return a}},"call$1","uO",2,0,null,278,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22620,14 +22017,14 @@
 if(x===92){x=y.G()?y.Wn:null
 this.VQ=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-v=P.O8(1,Y.aK(x),J.im)
+v=P.O8(1,Y.wX(x),J.im)
 x=H.eT(v)
 w.vM=w.vM+x}else{v=P.O8(1,x,J.im)
 x=H.eT(v)
 w.vM=w.vM+x}x=y.G()?y.Wn:null
 this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},"call$0","gxs",0,0,null],
+this.VQ=y.G()?y.Wn:null},"call$0","gPJ",0,0,null],
 zI:[function(){var z,y,x,w,v,u
 z=this.jI
 y=this.zy
@@ -22681,43 +22078,43 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,607,86,[]]},
-cfS:{
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,18,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,18,[]],
+this.xn(a)},"call$1","gff",2,0,null,19,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,441,[]],
+this.xn(a)},"call$1","gEW",2,0,null,409,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,441,[]],
+this.xn(a)},"call$1","gA2",2,0,null,409,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,441,[]],
-ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,279,[]],
+this.xn(a)},"call$1","gES",2,0,null,409,[]],
+ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gX7",2,0,null,279,[]],
+this.xn(a)},"call$1","gmd",2,0,null,274,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,18,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,441,[]],
+this.xn(a)},"call$1","ghH",2,0,null,19,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","glf",2,0,null,91,[]],
+this.xn(a)},"call$1","glf",2,0,null,96,[]],
 Hx:[function(a){J.UK(a.gwz(),this)
-this.xn(a)},"call$1","ghe",2,0,null,91,[]],
+this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gXf",2,0,null,283,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V0;kW%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-guw:[function(a){return a.kW},null,null,1,0,408,"app",355,397],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,551,23,[],"app",355],
+"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22730,33 +22127,29 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.G6(a)
-return a},null,null,0,0,113,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[608],
-V0:{
+return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[582],
+V20:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-386,AP,fn,tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRd:[function(a){return a.zw},null,null,1,0,371,"line",355,397],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,372,23,[],"line",355],
-grp:[function(a){if(J.u6(a.zw,0))return Q.xI.prototype.grp.call(this,a)
-return H.d(Q.xI.prototype.grp.call(this,a))+"?line="+H.d(a.zw)},null,null,1,0,370,"objectId"],
-gJp:[function(a){var z,y
-if(a.tY==null)return""
+"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+gD5:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
-if(z)return J.UQ(y,"user_name")
-else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
-goc:[function(a){var z,y,x
-z=a.tY
-if(z==null)return""
-y=J.UQ(z,"user_name")
-z=J.U6(y)
-x=z.yn(y,J.WB(z.cn(y,"/"),1))
-if(J.u6(a.zw,0))return x
-else return x+":"+H.d(a.zw)},null,null,1,0,370,"name"],
-"@":function(){return[C.h9]},
+if(z)return y.gzz()
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+goc:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
+z=J.u6(a.zw,0)
+y=a.tY
+if(z)return J.O6(y)
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+"@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22770,22 +22163,820 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.G6(a)
-return a},null,null,0,0,113,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[609],
+return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[583],
 T5:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["oaa;Uz%-610,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNl:[function(a){return a.Uz},null,null,1,0,611,"script",355,397],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,612,23,[],"script",355],
-PQ:[function(a,b){if(J.de(b.gu9(),-1))return"min-width:32px;"
-else if(J.de(b.gu9(),0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,613,181,[],"hitsStyle"],
-wH:[function(a,b,c,d){a.pC.oX("coverage").ml(new U.qq(a)).OA(new U.FC())},"call$3","gWp",6,0,425,18,[],306,[],74,[],"refreshCoverage"],
+"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
+gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+i4:[function(a){var z
+Z.uL.prototype.i4.call(this,a)
+z=a.Uz
+if(z==null)return
+J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
+da:[function(a){this.ct(a,C.YH,0,1)},"call$0","gze",0,0,114,"_triggerHitRefresh"],
+ib:[function(a,b){this.ct(a,C.YH,0,1)},"call$1","gKg",2,0,112,229,[],"showCoverageChanged"],
+PQ:[function(a,b){var z,y
+z=a.Uz
+if(z==null||a.HJ!==!0)return"min-width:32px;"
+y=J.UQ(z.gu9(),J.f2(b))
+if(y==null)return"min-width:32px;"
+if(J.de(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
+yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
-static:{Ry:[function(a){var z,y,x,w
+static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.HJ=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.cJ.ZL(a)
+C.cJ.G6(a)
+return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[588],
+V21:{
+"^":"uL+Pi;",
+$isd3:true},
+qq:{
+"^":"Tp:112;a-82,b-82",
+call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
+$isEH:true},
+"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"^":"",
+Er:[function(a){var z
+if(a!=null){z=J.U6(a)
+z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
+return z},"call$1","XI",2,0,null,190,[]],
+Io:[function(a){var z=J.rY(a)
+if(!z.nC(a,"@"))return a
+return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+Ch:[function(a,b,c){var z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
+else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+f3:[function(a,b,c){var z,y,x,w,v
+for(z=a.h3,y=0;y<z.length;++y){x=z[y]
+w=J.U6(x)
+v=typeof x==="object"&&x!==null&&!!w.$isqC
+if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
+else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+Lr:[function(a,b,c){var z
+if(c!=null){z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
+switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
+z.H4(b,c)
+return z
+case"IsolateList":a.tl.eC(c)
+return a.tl
+case"Script":return b.fq.Jb(c)
+case"Code":return b.ne.Jb(c)
+case"Isolate":return a.tl.Ze(c)
+case"Class":return b.PH.Jb(c)
+case"Function":return b.pw.Jb(c)
+default:}z=new V.qC(P.Py(null,null,null,null,null),null,null)
+z.$builtinTypeInfo=[null,null]
+z=new D.SI(z,b,null,null,null,null,null,null,null)
+z.H4(b,c)
+return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+G8:{
+"^":"a;F1>",
+tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
+t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
+u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
+ox:[function(a){var z=this.A4.Zp.t(0,a)
+if(z!=null)return P.Ab(z,null)
+return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+Jb:[function(a){var z,y
+z=J.U6(a)
+y=z.t(a,"id")
+z.t(a,"type")
+if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
+if(this.tg(0,y))return this.A4.Zp.t(0,y)
+z=this.tR(a)
+this.A4.u(0,z.gjO(z),z)
+return z},"call$1","gMs",2,0,null,98,[]],
+LJ:[function(a){this.A4.u(0,J.F8(a),a)
+return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+fJ:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.cI().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y,x
+z=this.F1
+y=J.im
+x=J.im
+x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
+x.H4(z,a)
+return x},"call$1","gUU",2,0,null,98,[]],
+Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+$asG8:function(){return[D.rj]},
+static:{"^":"RI"}},
+q1:{
+"^":"Tp:112;a",
+call$1:[function(a){var z=J.U6(a)
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+$isEH:true},
+jx:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.xN().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y,x
+z=this.F1
+y=J.im
+x=D.N8
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x.H4(z,a)
+return x},"call$1","gUU",2,0,null,98,[]],
+T0:[function(a){var z,y
+z=this.A4.Zp
+z=z.gUQ(z)
+y=P.F(z,!0,H.ip(z,"mW",0))
+H.rd(y,new D.yT())
+z=y.length
+if(typeof a!=="number")return H.s(a)
+if(z<a)return y
+C.Nm.sB(y,a)
+return y},"call$1","gy8",2,0,null,130,[]],
+c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+pl:[function(a,b){var z,y,x,w
+z=J.U6(a)
+y=z.t(a,"codes")
+x=z.t(a,"samples")
+for(z=J.GP(y);z.G();){w=z.gl()
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+$asG8:function(){return[D.kx]},
+static:{"^":"PA"}},
+yT:{
+"^":"Tp:595;",
+call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
+$isEH:true},
+Cn:{
+"^":"Tp:596;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+$isEH:true},
+du:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.Yk().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y
+z=this.F1
+y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
+y.H4(z,a)
+return y},"call$1","gUU",2,0,null,98,[]],
+$asG8:function(){return[D.SI]},
+static:{"^":"Oi"}},
+xc:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.uG().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y
+z=this.F1
+y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
+y.H4(z,a)
+return y},"call$1","gUU",2,0,null,98,[]],
+$asG8:function(){return[D.SI]},
+static:{"^":"TO"}},
+bv:{
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gPj:function(a){return this.KG},
+gHP:function(){return"#/"+H.d(this.KG)},
+gZ0:function(){return this.ne},
+gDD:function(a){return this.PH},
+pC:[function(){var z,y
+this.Fm=this
+z=D.rj
+y=J.O
+this.fq=new D.fJ(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.kx
+y=J.O
+this.ne=new D.jx(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.SI
+y=J.O
+this.PH=new D.du(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.SI
+y=J.O
+this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
+lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y
+z=H.VM([],[D.kx])
+for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+this.ne.c2()
+this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+ox:[function(a){var z,y
+this.fq.toString
+z=$.cI().Ej
+y=typeof a!=="string"
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.fq.ox(a)
+this.ne.toString
+z=$.xN().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.ne.ox(a)
+this.PH.toString
+z=$.Yk().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.PH.ox(a)
+this.pw.toString
+z=$.uG().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.pw.ox(a)
+return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
+gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
+sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
+gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
+sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
+goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
+gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
+gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
+gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
+guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
+suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
+gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
+bj:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+tM:[function(a,b){var z,y,x,w
+D.Ch(b,this.zf,this)
+this.nr=!1
+z=J.U6(b)
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
+return}y=z.t(b,"rootLib")
+this.v9=F.Wi(this,C.iF,this.v9,y)
+y=z.t(b,"name")
+this.f5=F.Wi(this,C.KS,this.f5,y)
+if(z.t(b,"entry")!=null){y=z.t(b,"entry")
+y=F.Wi(this,C.tP,this.cL,y)
+this.cL=y
+y=J.UQ(y,"name")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+x=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(b,"timers"),new D.Qq(x))
+y=this.LE
+w=J.w1(y)
+w.u(y,"total",x.t(0,"time_total_runtime"))
+w.u(y,"compile",x.t(0,"time_compilation"))
+w.u(y,"gc",0)
+w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
+w.u(y,"dart",x.t(0,"time_dart_execution"))
+y=J.UQ(z.t(b,"heap"),"usedNew")
+this.Cf=F.Wi(this,C.IO,this.Cf,y)
+z=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+$isbv:true},
+D3:{
+"^":"af+Pi;",
+$isd3:true},
+KQ:{
+"^":"Tp:601;a",
+call$1:[function(a){var z=this.a
+return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
+$isEH:true},
+Qq:{
+"^":"Tp:112;a",
+call$1:[function(a){var z=J.U6(a)
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+$isEH:true},
+Qd:{
+"^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
+gzf:function(){return this.Gt},
+VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+l9:[function(a){var z=[]
+J.kH(this.i2,new D.i6(a,z))
+H.bQ(z,new D.r2(this))
+J.kH(a,new D.JB(this))
+this.Mm()},"call$1","geV",2,0,null,280,[]],
+Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+AQ:[function(a){var z,y,x,w
+z=this.i2
+y=J.U6(z)
+x=y.t(z,a)
+if(x!=null)return x
+w=P.L5(null,null,null,J.O,J.GW)
+w=R.Jk(w)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x.nr=C.xB.nC("@Isolate","@")
+x.mQ=D.Io("@Isolate")
+x.DC(0)
+x.pC()
+y.u(z,a,x)
+x.xW(0)
+return x},"call$1","grE",2,0,null,279,[]],
+Ze:[function(a){var z,y,x,w,v
+z=J.UQ(a,"id")
+y=this.i2
+x=J.U6(y)
+w=x.t(y,z)
+if(w!=null){w.eC(a)
+return w}v=P.L5(null,null,null,J.O,J.GW)
+v=R.Jk(v)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w.H4(null,a)
+w.pC()
+x.u(y,z,w)
+w.xW(0)
+return w},"call$1","gwB",2,0,null,190,[]],
+static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+i6:{
+"^":"Tp:348;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+$isEH:true},
+r2:{
+"^":"Tp:112;c",
+call$1:[function(a){J.V1(this.c.i2,a)
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+$isEH:true},
+JB:{
+"^":"Tp:112;d",
+call$1:[function(a){var z,y,x,w,v,u
+z=J.UQ(a,"id")
+y=this.d
+x=y.i2
+w=J.U6(x)
+if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
+v=R.Jk(v)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u.H4(null,a)
+u.pC()
+N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
+w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
+$isEH:true},
+qj:{
+"^":"Tp:605;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+$isEH:true},
+BH:{
+"^":"Tp:112;a",
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+$isEH:true},
+SI:{
+"^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
+bu:[function(a){return P.vW(this.RF)},"call$0","gXo",0,0,null],
+tM:[function(a,b){var z,y,x
+z=this.RF
+z.V1(0)
+z.FV(0,b)
+y=z.Zp
+x=y.t(0,"user_name")
+this.bN=this.ct(0,C.YS,this.bN,x)
+y=y.t(0,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+y=this.Fm
+D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
+V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+u:[function(a,b,c){this.RF.u(0,b,c)
+return c},"call$2","gj3",4,0,null,442,[],272,[]],
+gl0:function(a){var z=this.RF.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.RF.Zp
+return z.gB(z)!==0},
+gvc:function(a){var z=this.RF.Zp
+return z.gvc(z)},
+gUQ:function(a){var z=this.RF.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.RF.Zp
+return z.gB(z)},
+BN:[function(a){var z=this.RF
+return z.BN(z)},"call$0","gDx",0,0,390],
+nq:[function(a,b){var z=this.RF
+return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+k0:[function(a){return},"call$0","gqw",0,0,114],
+ni:[function(a){this.RF.AP=null
+return},"call$0","gl1",0,0,114],
+gUj:function(a){var z=this.RF
+return z.gUj(z)},
+gnz:function(a){var z,y
+z=this.RF.AP
+if(z!=null){y=z.iE
+z=y==null?z!=null:y!==z}else z=!1
+return z},
+$isSI:true,
+$isqC:true,
+$asqC:function(){return[null,null]},
+$isZ0:true,
+$asZ0:function(){return[null,null]},
+$isd3:true},
+pt:{
+"^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
+gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
+sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+tM:[function(a,b){var z,y
+z=J.U6(b)
+y=z.t(b,"kind")
+this.J6=F.Wi(this,C.fy,this.J6,y)
+z=z.t(b,"message")
+this.LD=F.Wi(this,C.h2,this.LD,z)
+z="ServiceError "+H.d(this.J6)
+z=this.ct(this,C.YS,this.bN,z)
+this.bN=z
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+wVq:{
+"^":"af+Pi;",
+$isd3:true},
+c2:{
+"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+$isc2:true},
+rj:{
+"^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
+gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+tM:[function(a,b){var z,y,x
+z=J.U6(b)
+if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
+return}y=z.t(b,"name")
+this.wA=y
+x=J.U6(y)
+y=x.yn(y,J.WB(x.cn(y,"/"),1))
+this.Ge=y
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=this.wA
+this.GR=this.ct(this,C.KS,this.GR,y)
+y=z.t(b,"kind")
+this.J6=F.Wi(this,C.fy,this.J6,y)
+this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+aq:[function(a){var z,y,x,w,v
+if(this.nr)this.xW(0)
+z=J.U6(a)
+y=this.u9
+x=J.w1(y)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+x.u(y,z.t(a,w),z.t(a,w+1))
+w+=2}},"call$1","gHS",2,0,null,607,[]],
+W8:[function(a){var z,y,x,w,v
+this.nr=!0
+if(a==null)return
+z=J.uH(a,"\n")
+if(z.length===0)return
+this.nr=!1
+y=this.Sw
+x=J.w1(y)
+x.V1(y)
+N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
+for(w=0;w<z.length;w=v){v=w+1
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+$isrj:true},
+dZL:{
+"^":"af+Pi;",
+$isd3:true},
+N8:{
+"^":"a;Yu<,Du<,fF<",
+$isN8:true},
+Q4:{
+"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+xt:[function(){var z,y
+z=this.Yu
+y=J.x(z)
+if(y.n(z,0))return""
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+Io:[function(a){var z
+if(a==null)return""
+z=J.UQ(a.gyP(),this.Yu)
+if(z==null)return""
+if(J.de(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+HU:[function(a){var z
+if(a==null)return""
+z=J.UQ(a.gyP(),this.Yu)
+if(z==null)return""
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+$isQ4:true,
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+WAE:{
+"^":"a;uX",
+bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
+static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+if(z.n(a,"Native"))return C.nj
+else if(z.n(a,"Dart"))return C.l8
+else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Reused"))return C.yP
+N.Jx("").j2("Unknown code kind "+H.d(a))
+throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+Vi:{
+"^":"a;tT>,Av<",
+$isVi:true},
+kx:{
+"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
+glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
+gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
+ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
+gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
+this.Du=0
+this.fF=0
+this.mM=F.Wi(this,C.EF,this.mM,"")
+this.qH=F.Wi(this,C.uU,this.qH,"")
+J.U2(this.VS)
+J.U2(this.hw)
+J.U2(this.yP)},"call$0","gEQ",0,0,null],
+VD:[function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.Ab(this,null)},"call$0","gQU",0,0,null],
+fp:[function(a,b,c){var z,y,x,w,v,u
+z=J.U6(b)
+y=J.w1(a)
+x=0
+while(!0){w=z.gB(b)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=H.BU(z.t(b,x),null,null)
+u=H.BU(z.t(b,x+1),null,null)
+if(v>>>0!==v||v>=c.length)return H.e(c,v)
+y.h(a,new D.Vi(c[v],u))
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+eL:[function(a,b,c){var z,y
+this.jv=F.Wi(this,C.QK,this.jv,c)
+z=J.U6(a)
+this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
+this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
+this.fp(this.VS,z.t(a,"callers"),b)
+this.fp(this.hw,z.t(a,"callees"),b)
+y=z.t(a,"ticks")
+if(y!=null)this.pd(y)
+z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
+this.mM=F.Wi(this,C.EF,this.mM,z)
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+tM:[function(a,b){var z,y,x
+z=J.U6(b)
+this.oc=z.t(b,"user_name")
+this.zz=z.t(b,"name")
+y=D.CQ(z.t(b,"kind"))
+this.J6=F.Wi(this,C.fy,this.J6,y)
+this.vg=H.BU(z.t(b,"start"),16,null)
+this.Mb=H.BU(z.t(b,"end"),16,null)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"function"))
+this.MO=F.Wi(this,C.nf,this.MO,y)
+x=z.t(b,"disassembly")
+if(x!=null)this.xs(x)
+z=this.va
+y=J.U6(z)
+this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+xs:[function(a){var z,y,x,w,v,u,t,s
+z=this.va
+y=J.w1(z)
+y.V1(z)
+x=J.U6(a)
+w=0
+while(!0){v=x.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=x.t(a,w+1)
+t=x.t(a,w+2)
+s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
+y.h(z,new D.Q4(s,u,t,null,null))
+w+=3}},"call$1","gxk",2,0,null,615,[]],
+pd:[function(a){var z,y,x,w,v,u
+z=J.U6(a)
+y=this.yP
+x=J.w1(y)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=H.BU(z.t(a,w),16,null)
+x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
+w+=3}},"call$1","gfi",2,0,null,616,[]],
+tg:[function(a,b){J.J5(b,this.vg)
+return!1},"call$1","gdj",2,0,null,617,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
+F3:[function(a){var z,y,x
+for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
+if(typeof x!=="number")return H.s(x)
+y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+Ov:[function(a,b){var z,y
+for(z=J.GP(a);z.G();){y=z.gl()
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+$iskx:true,
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+w8F:{
+"^":"af+Pi;",
+$isd3:true},
+fx:{
+"^":"Tp:348;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
+$isEH:true},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
+gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
+gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
+gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
+goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
+gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,619,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+UZ:{
+"^":"Tp:348;a,b,c",
+call$2:[function(a,b){var z,y
+z=J.x(b)
+y=typeof b==="object"&&b!==null&&!!z.$isqC
+if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
+else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
+$isEH:true},
+No:{
+"^":["d3;tl@-504",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,497,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
+"^":"",
+XK:{
+"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+z6:[function(a,b){var z=this.Yu
+N.Jx("").To("Fetching "+H.d(b)+" from "+z)
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+dT:{
+"^":"Tp:112;",
+call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
+return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
+ho:{
+"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+bI:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.UQ(z.gRn(a),"id")
+x=J.UQ(z.gRn(a),"name")
+w=J.UQ(z.gRn(a),"data")
+if(!J.de(x,"observatoryData"))return
+z=this.ja
+v=z.t(0,y)
+z.Rz(0,y)
+J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+z6:[function(a,b){var z,y,x
+z=""+this.yb
+y=H.B7([],P.L5(null,null,null,null,null))
+y.u(0,"id",z)
+y.u(0,"method","observatoryQuery")
+y.u(0,"query","/"+H.d(b))
+this.yb=this.yb+1
+x=H.VM(new P.Zf(P.Dt(null)),[null])
+this.ja.u(0,z,x)
+J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+return x.MM},"call$1","gpV",2,0,null,261,[]],
+PI:function(){var z=C.Ns.aM(window)
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
+N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+"^":"",
+ob:{
+"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+hu:[function(a){var z
+switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.mC)
+return z
+case"BreakpointList":z=W.r3("breakpoint-list",null)
+J.X8(z,a.mC)
+return z
+case"Class":z=W.r3("class-view",null)
+J.QQ(z,a.mC)
+return z
+case"Code":z=W.r3("code-view",null)
+J.fH(z,a.mC)
+return z
+case"Error":z=W.r3("error-view",null)
+J.Qr(z,a.mC)
+return z
+case"Field":z=W.r3("field-view",null)
+J.JZ(z,a.mC)
+return z
+case"Function":z=W.r3("function-view",null)
+J.dk(z,a.mC)
+return z
+case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
+J.ti(z,a.mC)
+return z
+case"IsolateList":z=W.r3("isolate-list",null)
+J.oq(z,a.mC)
+return z
+case"Library":z=W.r3("library-view",null)
+J.F6(z,a.mC)
+return z
+case"Profile":z=W.r3("isolate-profile",null)
+J.CJ(z,a.mC)
+return z
+case"Script":z=W.r3("script-view",null)
+J.Tt(z,a.mC)
+return z
+case"StackTrace":z=W.r3("stack-trace",null)
+J.yO(z,a.mC)
+return z
+default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+fa:[function(a,b){var z,y,x
+a.textContent=""
+z=a.mC
+if(z==null){N.Jx("").To("Viewing null object.")
+return}y=z.gzS()
+x=this.hu(a)
+if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
+return}a.appendChild(x)
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,112,229,[],"objectChanged"],
+"@":function(){return[C.hpj]},
+static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -22794,56 +22985,36 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.cJ.ZL(a)
-C.cJ.G6(a)
-return a},null,null,0,0,113,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[614],
-oaa:{
-"^":"PO+Pi;",
-$isd3:true},
-qq:{
-"^":"Tp:357;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.gpC(z).oe(J.UQ(a,"coverage"))
-y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,357,615,[],"call"],
-$isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[415],
-FC:{
-"^":"Tp:346;",
-call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
-$isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[415]}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+C.ZO.ZL(a)
+C.ZO.G6(a)
+return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[621],
+V22:{
+"^":"uL+Pi;",
+$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Sq;tY%-410,Pe%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gnv:[function(a){return a.tY},null,null,1,0,354,"ref",355,397],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,357,23,[],"ref",355],
-gjT:[function(a){return a.Pe},null,null,1,0,380,"internal",355,397],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,381,23,[],"internal",355],
+"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
+gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gJp(a))},"call$1","gma",2,0,158,233,[],"refChanged"],
-gO3:[function(a){var z=a.pC
-if(z==null||a.tY==null)return""
-return z.rn(this.grp(a))},null,null,1,0,370,"url"],
-grp:[function(a){var z=a.tY
-return z==null?"":J.UQ(z,"id")},null,null,1,0,370,"objectId"],
-gJp:[function(a){var z,y
-z=a.tY
-if(z==null)return""
-y=J.UQ(z,"name")
-return y!=null?y:""},null,null,1,0,370,"hoverText"],
-goc:[function(a){var z,y
-z=a.tY
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-y=a.Pe===!0?"name":"user_name"
-if(J.UQ(z,y)!=null)return J.UQ(a.tY,y)
-else if(J.UQ(a.tY,"name")!=null)return J.UQ(a.tY,"name")
-else if(J.UQ(a.tY,"user_name")!=null)return J.UQ(a.tY,"user_name")
-return""},null,null,1,0,370,"name"],
-"@":function(){return[C.Ldf]},
+return z.gHP()},null,null,1,0,365,"url"],
+gOL:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return J.F8(z)},null,null,1,0,365,"serviceId"],
+gD5:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return z.gzz()},null,null,1,0,365,"hoverText"],
+goc:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return J.O6(z)},null,null,1,0,365,"name"],
+"@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22856,85 +23027,66 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.G6(a)
-return a},null,null,0,0,113,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[616],
-Sq:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[622],
+Ds:{
+"^":"uL+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["q2;Va%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gz1:[function(a){return a.Va},null,null,1,0,354,"frame",355,397],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,357,23,[],"frame",355],
+"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
 "@":function(){return[C.pE]},
-static:{an:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Va=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{an:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.dX.ZL(a)
 C.dX.G6(a)
-return a},null,null,0,0,113,"new StackFrameElement$created"]}},
-"+StackFrameElement":[617],
-q2:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new StackFrameElement$created"]}},
+"+StackFrameElement":[624],
+V23:{
+"^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-uwf:{
-"^":["q3;Up%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtN:[function(a){return a.Up},null,null,1,0,354,"trace",355,397],
-stN:[function(a,b){a.Up=this.ct(a,C.kw,a.Up,b)},null,null,3,0,357,23,[],"trace",355],
-RF:[function(a,b){a.pC.oX("stacktrace").ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.Yi]},
-static:{bV:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Up=z
-a.SO=y
-a.B7=x
-a.X0=v
+Vu:{
+"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
+yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.js]},
+static:{bV:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.bg.ZL(a)
 C.bg.G6(a)
-return a},null,null,0,0,113,"new StackTraceElement$created"]}},
-"+StackTraceElement":[618],
-q3:{
-"^":"PO+Pi;",
-$isd3:true},
-At:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sUp(z,y.ct(z,C.kw,y.gUp(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+StackTraceElement_refresh_closure":[415],
-Sb:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+StackTraceElement_refresh_closure":[415]}],["template_binding","package:template_binding/template_binding.dart",,M,{
+return a},null,null,0,0,115,"new StackTraceElement$created"]}},
+"+StackTraceElement":[625],
+V24:{
+"^":"uL+Pi;",
+$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
 IP:[function(a){var z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"call$1","nc",2,0,null,129,[]],
+default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(y.gqn(a)!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -22942,7 +23094,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.XI(z,u,w,t)},"call$2","Nc",4,0,null,264,[],284,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -22952,16 +23104,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,264,[],149,[],285,[],284,[],286,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,264,[]],
+return},"call$1","ay",2,0,null,260,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
 if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,264,[],284,[]],
+if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -22972,9 +23124,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,129,[],284,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$ishs,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23002,7 +23154,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,77,291,[],264,[],285,[],286,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23020,13 +23172,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,86,[],12,[],264,[],284,[]],
+return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -23037,18 +23189,18 @@
 if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(w.gqn(a)!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.hs(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,264,[]],
+return x},"call$1","La",2,0,null,260,[]],
 wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(z.gqn(a)!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"call$1","xS",2,0,null,292,[]],
+return z},"call$1","xS",2,0,null,198,[]],
 V2:{
-"^":"hs;N1,mD,Ck",
+"^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
 z=this.gN1()
@@ -23060,17 +23212,17 @@
 new W.i7(y).Rz(0,b)
 z=this.gN1()
 y=d!=null?d:""
-x=new M.jY(null,z,c,null,null,"value",y)
+x=new M.zP(null,z,c,null,null,"value",y)
 x.Og(z,"value",c,d)
 x.Ca=M.IP(z).yI(x.gqf())}else{z=J.rY(b)
 w=z.Tc(b,"?")
 if(w){J.Vs(y).Rz(0,b)
 v=z.Nj(b,0,J.xH(z.gB(b),1))}else v=b
 z=d!=null?d:""
-x=new M.BT(w,y,c,null,null,v,z)
+x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
-BT:{
+return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
@@ -23078,8 +23230,8 @@
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,23,[]]},
-jY:{
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
 EC:[function(a){var z,y,x,w,v,u
@@ -23091,14 +23243,14 @@
 u=x}else{v=null
 u=null}}else{v=null
 u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,234,[]]},
+if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
-DO:{
-"^":"Tp:113;",
+lP:{
+"^":"Tp:115;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -23115,25 +23267,25 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:107;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:107;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]],
+J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,158,18,[]]},
+O.Y3()},"call$1","gqf",2,0,157,19,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,234,[]],
+J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z,y,x,w
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
@@ -23141,8 +23293,8 @@
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
 y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$ishs?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,158,18,[]],
+w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
+if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23151,9 +23303,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,129,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,132,[]]}},
 r0:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -23162,12 +23314,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,288,[],"call"],
+return z},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -23176,7 +23328,7 @@
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,234,[]],
+this.Dh=z},"call$1","gH0",2,0,null,230,[]],
 Gh:[function(a){var z,y,x
 z=this.eS
 y=J.x(z)
@@ -23185,28 +23337,28 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,234,[]],
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,230,[]],
 C7:[function(){var z=this.Dh
 if(z!=null){z.disconnect()
-this.Dh=null}},"call$0","gln",0,0,null],
+this.Dh=null}},"call$0","glnT",0,0,null],
 FC:[function(a){var z,y
 this.C7()
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,158,18,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,23,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
 hB:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,21,[],619,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:107;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -23216,7 +23368,7 @@
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
 x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$ishs?y:this,b)
+J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23230,17 +23382,17 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
-XI:{
+return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
-hs:{
+TU:{
 "^":"a;N1<,mD,Ck?",
 Z1:[function(a,b,c,d){var z,y
 window
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23255,10 +23407,10 @@
 glN:function(){var z,y
 z=this.gN1()
 y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$ishs?z:this},
-$ishs:true},
+return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+$isTU:true},
 yp:{
-"^":"a;KO,qW,k8"},
+"^":"a;KO,qW,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23268,7 +23420,7 @@
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?z:this,b)
+J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 x=this.N1
@@ -23277,9 +23429,9 @@
 y.Og(x,b,c,d)
 y.Ca=M.IP(x).yI(y.gqf())
 z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
 DT:{
-"^":"V2;lr,xT?,kr<,Dsl,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
+"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){var z,y
 z=this.N1
@@ -23310,7 +23462,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23336,7 +23488,7 @@
 this.jq()
 this.gCd(this).Rz(0,b)
 return
-default:M.hs.prototype.Ih.call(this,this,b)
+default:M.TU.prototype.Ih.call(this,this,b)
 return}},"call$1","gC8",2,0,null,12,[]],
 jq:[function(){var z=this.kr
 if(!z.t9){z.t9=!0
@@ -23344,7 +23496,7 @@
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
 y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z)
+z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
 x=J.nX(z)
 w=z.gdv()
 if(w==null){w=M.iX(x,b)
@@ -23357,7 +23509,8 @@
 y=u}t=M.Fz(x,y)
 M.HP(t,w,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,77,77,77,285,[],284,[],286,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+gk8:function(){return this.lr},
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w,v
 this.Sy()
@@ -23366,7 +23519,7 @@
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
 if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$ishs?x:M.Ky(x))
+v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
 return v!=null?v:x},
 gjb:function(a){var z
 this.Sy()
@@ -23384,9 +23537,9 @@
 y=J.RE(z)
 z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
 if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.N1)
+v=M.eX(this.N1)
 z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$ishs?v:M.Ky(v)
+v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
 v.smj(!0)
 z=v.gN1()
 y=J.x(z)
@@ -23396,23 +23549,23 @@
 if(a!=null)v.sQO(a)
 else if(w)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,77,620,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(y.gqn(z)!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","Tkw",4,0,null,264,[],287,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,261,[]],pZ:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23427,30 +23580,31 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","fo",2,0,null,288,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,261,[],288,[],289,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
-z.textContent=$.cz()+" { display: none; }"
+J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:158;",
+"^":"Tp:157;",
 call$1:[function(a){var z
 if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,261,[],"call"],
+M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
-lP:{
-"^":"Tp:107;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,402,[],"call"],
+Uf:{
+"^":"Tp:112;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
@@ -23466,7 +23620,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:346;a,b,c,d",
+"^":"Tp:348;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23478,7 +23632,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],23,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23497,7 +23651,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,621,23,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -23508,7 +23662,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,622,623,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23521,28 +23675,28 @@
 if(!z&&!this.js){this.Az(null)
 return}y=z?this.JM:this.d6
 x=z?this.yO:this.XV
-if(!this.Q3)w=L.ao(y,x,z?null:new M.ts())
+if(!this.Q3)w=L.ao(y,x,z?null:new M.VU())
 else{v=[]
 w=new Y.J3(v,[],null,new M.Kj(z),!1,!1,null,null)
 v.push(L.ao(y,x,null))
 z=this.rV
 u=this.eD
 v.push(L.ao(z,u,null))
-w.wE(0)}this.FS=w.gUj(w).yI(new M.VU(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,113],
+w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
+this.Az(w.gP(w))},"call$0","gjM",0,0,115],
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.w1(a)
 if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$iscX)){x=y.br(a)
+x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","gbe",2,0,null,234,[]],
+if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,230,[]],
 wx:[function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
@@ -23555,7 +23709,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzm",2,0,null,47,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23568,7 +23722,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,47,[],209,[],624,[],286,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23585,7 +23739,7 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gLu",2,0,null,47,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
@@ -23611,9 +23765,9 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,625,255,[]],
+l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,286,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23627,30 +23781,30 @@
 if(z!=null){z.ed()
 this.FS=null}this.e9.kr=null
 this.pq=!0},"call$0","gJK",0,0,null]},
-ts:{
-"^":"Tp:107;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,21,[],"call"],
+VU:{
+"^":"Tp:112;",
+call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:536;a",
+"^":"Tp:633;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,623,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
 $isEH:true},
-VU:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,424,[],"call"],
+R7:{
+"^":"Tp:112;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
 $isYa:true},
 XT:{
-"^":"hs;N1,mD,Ck",
+"^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x
-if(!J.de(b,"text"))return M.hs.prototype.Z1.call(this,this,b,c,d)
+if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
 this.Ih(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -23658,11 +23812,11 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]]},
+J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]]},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23670,7 +23824,7 @@
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?z:this,b)
+J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 x=this.N1
@@ -23679,14 +23833,15 @@
 y.Og(x,"value",c,d)
 y.Ca=M.IP(x).yI(y.gqf())
 z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-T4:{
+ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
 "^":"a;qP<",
 gH:function(){return this.qP},
+gk8:function(){return this.ZY},
 gP:function(a){return J.Vm(this.xS)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.xS,b)},
@@ -23709,70 +23864,50 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,424,[],"call"],
-$isEH:true}}],["vm_element","package:observatory/src/elements/vm_element.dart",,R,{
-"^":"",
-Zt:{
-"^":["Dsd;Jh%-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzf:[function(a){return a.Jh},null,null,1,0,626,"vm",355,397],
-szf:[function(a,b){a.Jh=this.ct(a,C.DD,a.Jh,b)},null,null,3,0,627,23,[],"vm",355],
-"@":function(){return[C.rm]},
-static:{xip:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Qh.ZL(a)
-C.Qh.G6(a)
-return a},null,null,0,0,113,"new VMElement$created"]}},
-"+VMElement":[628],
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true}}],])
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+$isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 J.O.$isString=true
-J.O.$isRz=true
-J.O.$asRz=[J.O]
+J.O.$isTx=true
+J.O.$asTx=[J.O]
 J.O.$isa=true
-J.P.$isRz=true
-J.P.$asRz=[J.P]
+J.P.$isTx=true
+J.P.$asTx=[J.P]
 J.P.$isa=true
 J.im.$isint=true
-J.im.$isRz=true
-J.im.$asRz=[J.P]
-J.im.$isRz=true
-J.im.$asRz=[J.P]
-J.im.$isRz=true
-J.im.$asRz=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
 J.im.$isa=true
 J.GW.$isdouble=true
-J.GW.$isRz=true
-J.GW.$asRz=[J.P]
-J.GW.$isRz=true
-J.GW.$asRz=[J.P]
+J.GW.$isTx=true
+J.GW.$asTx=[J.P]
+J.GW.$isTx=true
+J.GW.$asTx=[J.P]
 J.GW.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
 W.M5.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
+W.yg.$isa=true
+W.uj.$isa=true
+N.qV.$isTx=true
+N.qV.$asTx=[N.qV]
 N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
+P.a6.$isTx=true
+P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-P.Od.$isa=true
 J.Q.$isList=true
-J.Q.$iscX=true
+J.Q.$isQV=true
 J.Q.$isa=true
+P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
 W.cv.$isKV=true
@@ -23806,11 +23941,25 @@
 U.kB.$isa=true
 K.Ae.$isAe=true
 K.Ae.$isa=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.kx.$iskx=true
+D.kx.$isaf=true
+D.kx.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
 N.TJ.$isa=true
 P.wv.$iswv=true
 P.wv.$isa=true
 J.kn.$isbool=true
 J.kn.$isa=true
+T.z2.$isz2=true
+T.z2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -23838,9 +23987,9 @@
 P.ej.$isa=true
 P.RY.$isej=true
 P.RY.$isa=true
-P.ac.$isX9=true
-P.ac.$isej=true
-P.ac.$isa=true
+P.Fw.$isX9=true
+P.Fw.$isej=true
+P.Fw.$isa=true
 P.X9.$isX9=true
 P.X9.$isej=true
 P.X9.$isa=true
@@ -23853,16 +24002,14 @@
 P.Ys.$isa=true
 X.TR.$isa=true
 F.d3.$isa=true
-T.z2.$isz2=true
-T.z2.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.CX.$isea=true
-W.CX.$isa=true
+W.Wp.$isea=true
+W.Wp.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -23890,17 +24037,20 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
-W.Hy.$isea=true
-W.Hy.$isa=true
+W.cx.$isea=true
+W.cx.$isa=true
+D.bv.$isbv=true
+D.bv.$isaf=true
+D.bv.$isa=true
+D.c2.$isa=true
+D.Vi.$isVi=true
+D.Vi.$isa=true
+D.Q4.$isa=true
+D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
-G.kx.$iskx=true
-G.kx.$isa=true
-G.rj.$isa=true
-G.c2.$isc2=true
-G.c2.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -23927,39 +24077,41 @@
 H.Uz.$isa=true
 P.e4.$ise4=true
 P.e4.$isa=true
-P.JB.$isJB=true
-P.JB.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-G.Vi.$isVi=true
-G.Vi.$isa=true
+P.dl.$isdl=true
+P.dl.$isa=true
+V.qC.$isqC=true
+V.qC.$isZ0=true
+V.qC.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
+P.Tx.$isTx=true
+P.Tx.$isa=true
 W.D0.$isD0=true
 W.D0.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
 P.aY.$isaY=true
 P.aY.$isa=true
-P.lO.$islO=true
-P.lO.$isa=true
-P.cX.$iscX=true
-P.cX.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$isa=true
+P.tU.$istU=true
+P.tU.$isa=true
+P.QV.$isQV=true
+P.QV.$isa=true
 P.nP.$isnP=true
 P.nP.$isa=true
 P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
+P.iP.$isTx=true
+P.iP.$asTx=[null]
 P.iP.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
+P.fIm.$isfIm=true
+P.fIm.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
+D.af.$isaf=true
+D.af.$isa=true
+K.z6.$isz6=true
+K.z6.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-$.$signature_bh={func:"bh",args:[null,null]}
-$.$signature_HB={func:"HB",ret:P.a,args:[P.a]}
-$.$signature_Dv={func:"Dv",args:[null]}
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -23999,15 +24151,18 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
+return J.Wx(a).E(a,b)}
 J.C0=function(a,b){return J.w1(a).ez(a,b)}
 J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Co=function(a){return J.RE(a).gcC(a)}
-J.D8=function(a,b){return J.rY(a).yn(a,b)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
+J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FW=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
@@ -24015,24 +24170,19 @@
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.Hb=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
-J.I8=function(a,b,c){return J.rY(a).wL(a,b,c)}
-J.IJ=function(a,b){return J.Wx(a).Z(a,b)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JD=function(a,b){return J.RE(a).R3(a,b)}
+J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
-J.KM=function(a){return J.RE(a).zr(a)}
 J.Kv=function(a,b){return J.RE(a).jx(a,b)}
+J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
@@ -24045,22 +24195,26 @@
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
-J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.Nv=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
-J.QQ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.QP=function(a){return J.RE(a).gF1(a)}
+J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.SK=function(a){return J.RE(a).xW(a)}
+J.Sq=function(a,b){return J.RE(a).zY(a,b)}
 J.TD=function(a){return J.RE(a).i4(a)}
 J.TZ=function(a){return J.RE(a).gKV(a)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
-J.Tv=function(a){return J.RE(a).gB1(a)}
+J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
+J.Tt=function(a,b){return J.RE(a).sNl(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
 J.UK=function(a,b){return J.RE(a).RR(a,b)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
@@ -24078,7 +24232,9 @@
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a){return J.RE(a).gG3(a)}
+J.WO=function(a){return J.RE(a).gV5(a)}
 J.We=function(a,b){return J.RE(a).scC(a,b)}
+J.X8=function(a,b){return J.RE(a).srs(a,b)}
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
@@ -24087,7 +24243,10 @@
 J.Z7=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
 J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
+J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
+J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
+J.am=function(a){return J.RE(a).VD(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
@@ -24102,13 +24261,17 @@
 J.de=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
 return J.x(a).n(a,b)}
+J.dk=function(a,b){return J.RE(a).sMj(a,b)}
+J.dm=function(a){return J.RE(a).gi2(a)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.eJ=function(a,b){return J.U6(a).cn(a,b)}
+J.f2=function(a){return J.RE(a).gRd(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
-J.hf=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.fH=function(a,b){return J.RE(a).stT(a,b)}
+J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
+J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -24119,15 +24282,12 @@
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
-J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
-return J.Wx(a).i(a,b)}
+J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
-J.p0=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Wx(a).U(a,b)}
-J.pB=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
 J.pb=function(a,b){return J.w1(a).Vr(a,b)}
@@ -24141,8 +24301,8 @@
 J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
+J.ti=function(a,b){return J.RE(a).sQr(a,b)}
 J.tx=function(a){return J.RE(a).guD(a)}
-J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u3=function(a){return J.RE(a).geT(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
@@ -24150,17 +24310,23 @@
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
+return J.Qc(a).U(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
-J.wX=function(a){return J.RE(a).gGd(a)}
 J.wc=function(a){return J.RE(a).gbG(a)}
 J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
+J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
+J.y9=function(a){return J.RE(a).lh(a)}
+J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
+J.yn=function(a,b){return J.RE(a).vV(a,b)}
+J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.zH=function(a){return J.RE(a).gt5(a)}
@@ -24177,23 +24343,24 @@
 C.oD=new J.P()
 C.Kn=new J.O()
 C.mI=new K.nd()
+C.IU=new P.kF()
 C.Us=new A.yL()
-C.nJ=new K.vly()
+C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.za=new A.jh()
+C.xd=new A.jh()
 C.NU=new P.R8()
-C.v8=new P.nU()
-C.xE=A.wM.prototype
+C.v8=new P.W5()
+C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
-C.kk=Z.Ps.prototype
-C.WA=new G.WAE("Collected")
-C.l8=new G.WAE("Dart")
-C.nj=new G.WAE("Native")
+C.kk=Z.Jc.prototype
+C.WA=new D.WAE("Collected")
+C.l8=new D.WAE("Dart")
+C.nj=new D.WAE("Native")
+C.yP=new D.WAE("Reused")
 C.IK=O.CN.prototype
-C.YD=F.HT.prototype
+C.YD=F.Be.prototype
 C.j8=R.E0.prototype
 C.O0=R.lw.prototype
-C.Vy=new A.V3("disassembly-entry")
 C.Br=new A.V3("observatory-element")
 C.dA=new A.V3("heap-profile")
 C.I3=new A.V3("script-view")
@@ -24201,58 +24368,56 @@
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
-C.qT=new A.V3("nav-menu-item")
+C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
+C.hpj=new A.V3("service-view")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xW=new A.V3("code-view")
-C.aQx=new A.V3("class-view")
+C.xz=new A.V3("code-view")
+C.oY=new A.V3("class-view")
 C.Gg=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
-C.rc=new A.V3("message-viewer")
-C.rm=new A.V3("vm-element")
 C.NT=new A.V3("top-nav-menu")
-C.Yi=new A.V3("stack-trace")
-C.h9=new A.V3("script-ref")
+C.js=new A.V3("stack-trace")
+C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
 C.jF=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
 C.pE=new A.V3("stack-frame")
-C.kR=new A.V3("observatory-application")
+C.bd=new A.V3("observatory-application")
+C.Qz=new A.V3("eval-box")
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.pc=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.YQ=new A.V3("function-ref")
-C.QU=new A.V3("library-ref")
-C.EA=new A.V3("isolate-element")
-C.vc=new A.V3("field-view")
-C.Ldf=new A.V3("service-ref")
-C.nW=new A.V3("nav-bar")
+C.R0=new A.V3("function-ref")
+C.uy=new A.V3("library-ref")
+C.My=new A.V3("field-view")
+C.JD=new A.V3("service-ref")
+C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
 C.be=new A.V3("instance-view")
-C.er=E.Fv.prototype
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
+C.Gh=L.rm.prototype
 C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.CX])
+C.pi=H.VM(new W.e0("click"),[W.Wp])
 C.MD=H.VM(new W.e0("error"),[W.ew])
 C.PP=H.VM(new W.e0("hashchange"),[W.ea])
 C.i3=H.VM(new W.e0("input"),[W.ea])
 C.fK=H.VM(new W.e0("load"),[W.ew])
-C.ph=H.VM(new W.e0("message"),[W.Hy])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.AX.prototype
-C.h4=N.yb.prototype
-C.RJ=K.NM.prototype
+C.Xo=U.qW.prototype
+C.Yu=N.mk.prototype
+C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.yK=Z.hx.prototype
-C.wx=S.PO.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
 C.XH=X.E7.prototype
@@ -24396,15 +24561,15 @@
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
 C.Ap=new P.pD(null)
-C.GB=Z.vj.prototype
+C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
 C.UP=new N.qV("WARNING",900)
-C.S3=A.oM.prototype
+C.ct=A.Zt.prototype
 C.Z3=R.LU.prototype
-C.MG=M.T2.prototype
+C.MG=M.KL.prototype
 I.makeConstantList = function(list) {
   list.immutable$list = init;
   list.fixed$length = init;
@@ -24412,33 +24577,34 @@
 };
 C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
 C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
 C.PQ=I.makeConstantList(["active","success","warning","danger","info"])
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.ac])
+C.dn=H.VM(I.makeConstantList([]),[P.Fw])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
 C.iH=H.VM(I.makeConstantList([]),[J.im])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.kg=I.makeConstantList([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.makeConstantList([0,0,32754,11263,65534,34815,65534,18431])
 C.Wd=I.makeConstantList([0,0,32722,12287,65535,34815,65534,18431])
 C.iq=I.makeConstantList([40,41,91,93,123,125])
-C.zJ=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zJ)
+C.jH=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
-C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
+C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
-C.Wp=L.PF.prototype
 C.S2=W.H9.prototype
 C.kD=A.F1.prototype
 C.SU=A.aQ.prototype
-C.nn=A.Ya5.prototype
+C.nn=A.Qa.prototype
 C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
@@ -24448,25 +24614,23 @@
 C.Cc=Q.JG.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
+C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
 C.dX=K.nm.prototype
-C.bg=X.uwf.prototype
+C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
 C.N4=new H.GD("dart.core.DateTime")
-C.Ts=new H.GD("dart.core.bool")
+C.Kc=new H.GD("dart.core.bool")
 C.fz=new H.GD("[]")
 C.aP=new H.GD("active")
-C.Es=new H.GD("anchor")
+C.cg=new H.GD("anchor")
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
 C.AV=new H.GD("callback")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
-C.EX=new H.GD("codeRef")
-C.C2=new H.GD("coveredPercentageFormatted")
 C.h1=new H.GD("currentHash")
-C.tv=new H.GD("currentHashUri")
 C.Na=new H.GD("devtools")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
@@ -24474,153 +24638,148 @@
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
 C.WQ=new H.GD("field")
-C.SK=new H.GD("fileAndLine")
+C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
-C.yg=new H.GD("functionRef")
-C.D2=new H.GD("hasCurrentIsolate")
-C.K7=new H.GD("hits")
+C.zS=new H.GD("hasDisassembly")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
 C.fn=new H.GD("instance")
-C.i6=new H.GD("instruction")
 C.zD=new H.GD("internal")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
+C.za=new H.GD("isolates")
 C.Gd=new H.GD("json")
 C.fy=new H.GD("kind")
+C.hf=new H.GD("label")
 C.QL=new H.GD("last")
 C.Wn=new H.GD("length")
 C.EV=new H.GD("library")
-C.cg=new H.GD("libraryRef")
 C.Cv=new H.GD("line")
+C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.US=new H.GD("messageType")
+C.h2=new H.GD("message")
 C.fQ=new H.GD("methodCountSelected")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
+C.VJ=new H.GD("object")
 C.ap=new H.GD("oldHeapUsed")
-C.tI=new H.GD("percent")
 C.vb=new H.GD("profile")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
 C.mE=new H.GD("response")
+C.Aa=new H.GD("results")
 C.iF=new H.GD("rootLib")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
 C.fX=new H.GD("script")
-C.Be=new H.GD("scriptRef")
 C.eC=new H.GD("[]=")
-C.Kt=new H.GD("shortName")
-C.MB=new H.GD("text")
-C.p1=new H.GD("ticks")
-C.jI=new H.GD("topExclusiveCodes")
+C.V0=new H.GD("showCoverage")
+C.mi=new H.GD("text")
 C.ch=new H.GD("topFrame")
+C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
 C.Fh=new H.GD("url")
-C.ct=new H.GD("userName")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
-C.DD=new H.GD("vm")
 C.KS=new H.GD("vmName")
-C.z9=new H.GD("void")
+C.v6=new H.GD("void")
 C.lx=A.tz.prototype
 C.SX=H.mm('qC')
 C.WP=new H.Lm(C.SX,"K",0)
 C.SL=H.mm('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.QJ=H.mm('xh')
-C.wW=new H.Lm(C.QJ,"T",0)
+C.Yn=H.mm('xh')
+C.wW=new H.Lm(C.Yn,"T",0)
 C.Gsc=H.mm('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
 C.RP=H.mm('hx')
 C.Ln=H.mm('Dg')
 C.z6Y=H.mm('Tg')
+C.IZ=H.mm('rm')
 C.eY=H.mm('n6')
 C.Vh=H.mm('Pz')
-C.I5=H.mm('JG')
+C.zq=H.mm('Qa')
+C.tf=H.mm('Zt')
+C.RJ=H.mm('JG')
+C.Ye=H.mm('qW')
 C.z7=H.mm('G6')
 C.Ma=H.mm('F1')
 C.nY=H.mm('a')
 C.Yc=H.mm('iP')
+C.jRs=H.mm('Be')
 C.kA=H.mm('u7')
 C.PT=H.mm('I2')
 C.Wup=H.mm('LZ')
 C.P0k=H.mm('lI')
-C.Lz=H.mm('PO')
 C.T1=H.mm('Wy')
 C.hG=H.mm('ir')
 C.aj=H.mm('fI')
-C.Qw=H.mm('Fv')
 C.la=H.mm('ZX')
 C.G4=H.mm('CN')
 C.O4=H.mm('double')
 C.yw=H.mm('int')
-C.Mh=H.mm('Zt')
-C.Lf0=H.mm('uwf')
 C.RcY=H.mm('aQ')
-C.ld=H.mm('AX')
+C.KJ=H.mm('mk')
 C.yiu=H.mm('knI')
-C.oW=H.mm('Ya5')
 C.iN=H.mm('yc')
 C.HI=H.mm('Pg')
 C.ila=H.mm('xI')
 C.lk=H.mm('mJ')
 C.lpG=H.mm('LU')
+C.Yte=H.mm('KL')
 C.mR=H.mm('fl')
 C.jV=H.mm('rF')
-C.JZ=H.mm('E7')
-C.wd=H.mm('vj')
+C.SB=H.mm('E7')
+C.Tq=H.mm('vj')
 C.JW=H.mm('Ww')
-C.Rg=H.mm('yb')
-C.wHJ=H.mm('Kz')
+C.qo=H.mm('jY')
+C.wH=H.mm('Kz')
 C.cx5=H.mm('m8')
 C.l49=H.mm('uL')
 C.yQ=H.mm('EH')
 C.Im=H.mm('X6')
-C.GG=H.mm('PF')
 C.FU=H.mm('lw')
-C.p5=H.mm('oM')
-C.yD=H.mm('E0')
+C.rd6=H.mm('E0')
 C.nG=H.mm('zt')
 C.yG=H.mm('nm')
-C.vA=H.mm('tz')
-C.ow=H.mm('E9')
-C.PV=H.mm('wM')
+C.px=H.mm('tz')
+C.epC=H.mm('Jc')
+C.Fd=H.mm('E9')
 C.Db=H.mm('String')
-C.EP=H.mm('NM')
 C.Bm=H.mm('XP')
-C.Tn=H.mm('T2')
 C.hg=H.mm('hd')
-C.dd=H.mm('pR')
-C.Ud8=H.mm('Ps')
-C.Io=H.mm('HT')
+C.Fv=H.mm('ob')
+C.Wza=H.mm('pR')
 C.HL=H.mm('bool')
 C.Qf=H.mm('Null')
 C.HH=H.mm('dynamic')
+C.l6=H.mm('iL')
 C.Gp=H.mm('cw')
 C.ri=H.mm('yy')
 C.CS=H.mm('vm')
 C.Hk=H.mm('Gk')
 C.hN=H.mm('oI')
+C.r6=H.mm('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
-C.Qh=R.Zt.prototype
 C.ol=W.u9.prototype
-C.hi=H.VM(new W.hP(W.pq()),[W.OJ])
+C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
 $.libraries_to_load = {}
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
@@ -24652,8 +24811,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","Md","Mi","Mu","NZ","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wj","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Yh","Z","Z1","Z2","ZB","ZL","ZZ","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gFR","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJh","gJo","gJp","gKE","gKM","gKV","gLA","gLW","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gSS","gTB","gTq","gUQ","gUV","gUj","gUo","gUp","gUy","gUz","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gah","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geH","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","gi9","giC","giO","gig","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkX","gkc","gkf","gkg","gkp","gl0","gl7","gm0","gm2","gmH","gmW","gmm","gn9","gng","gnv","gnx","goE","goc","gor","gpC","gpD","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grp","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","guy","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxH","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzf","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","np","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sFR","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJh","sJo","sKM","sKV","sLA","sLW","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sSS","sTB","sTq","sUQ","sUo","sUp","sUy","sUz","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sah","sai","sbG","sbP","sbV","scC","scL","sdU","seH","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","siC","sig","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skX","skc","skf","skg","skp","sl7","sm0","sm2","smH","sn9","sng","snv","snx","soE","soc","spC","spD","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","suy","svH","svL","svk","svt","swd","sxH","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szf","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","uW","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yM","yN","yc","yn","yq","yu","yx","yy","z2","zV","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.Lz,S.PO,{created:S.O5},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.Mh,R.Zt,{created:R.xip},C.Lf0,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.wH},C.yiu,A.knI,{created:A.Th},C.oW,A.Ya5,{created:A.EL},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.Rg,N.yb,{created:N.N0},C.wHJ,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.yD,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.vA,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.Io,F.HT,{created:F.Fe},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY}]
+$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24696,14 +24855,13 @@
     return e.message;
   }
 }())})
-I.$lazy($,"_codeMatcher","rC","Ks",function(){return new H.VR(H.v4("/code/",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptMatcher","lF","hK",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
-I.$lazy($,"currentIsolateMatcher","qY","oy",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"validationPattern","zP","R0",function(){return new H.VR(H.v4("^(?:[a-zA-Z$][a-zA-Z$0-9_]*\\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|-|unary-|\\[\\]=|~|==|\\[\\]|\\*|/|%|~/|\\+|<<|>>|>=|>|<=|<|&|\\^|\\|)$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
-I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.z9)})
+I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
 I.$lazy($,"currentJsMirrorSystem","GR","Cm",function(){return new H.Sn(null,new H.Lj(init.globalState.N0))})
 I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
@@ -24711,25 +24869,25 @@
 I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
-I.$lazy($,"_splitRe","Um","qG",function(){return new H.VR(H.v4("^(?:([^:/?#]+):)?(?://(?:([^/?#]*)@)?(?:([\\w\\d\\-\\u0100-\\uffff.%]*)|\\[([A-Fa-f0-9:.]*)\\])(?::([0-9]+))?)?([^?#[]+)?(?:\\?([^#]*))?(?:#(.*))?$",!1,!0,!1),null,null)})
 I.$lazy($,"_safeConsole","wk","pl",function(){return new W.QZ()})
 I.$lazy($,"webkitEvents","fD","Vp",function(){return H.B7(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],P.L5(null,null,null,null,null))})
 I.$lazy($,"context","eo","cM",function(){return P.ND(function() { return this; }())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
+I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.YJ().call$0()})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().call$0()})
 I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
 I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
 I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_objectType","Cy","Tf",function(){return P.re(C.nY)})
+I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w10().call$0()})
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().call$0()})
 I.$lazy($,"bindPattern","ZA","VC",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.va)
@@ -24743,20 +24901,24 @@
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
 I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
-I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().Aq.gcZ().gFP()})
+I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().call$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Uf(),"-",new K.Ra(),"*",new K.wJY(),"/",new K.zOQ(),"==",new K.W6o(),"!=",new K.MdQ(),">",new K.YJG(),">=",new K.DOe(),"<",new K.lPa(),"<=",new K.Ufa(),"||",new K.Raa(),"&&",new K.w0(),"|",new K.w4()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w5(),"-",new K.w7(),"!",new K.w9()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().call$0()})
+I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Ra(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.lP()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.Uf()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","sender","e","msg","message","x","record","value","memberName",{func:"pd",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","objectId","id","members",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"xN",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb","lead","tail",{func:"P2",ret:J.im,args:[P.Rz,P.Rz]},"formattedString",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,G.No,{func:"qo",ret:P.Z0},C.nJ,C.mI,{func:"Hw",args:[P.Z0]},{func:"Wy",ret:G.bv},{func:"Gt",args:[G.bv]},"ResponseError","errorType","label","row",[P.Z0,J.O,G.rj],[J.Q,G.kx],[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},{func:"NA",ret:G.CM},{func:"Ve",args:[G.CM]},{func:"I0",ret:J.O},{func:"cH",ret:J.im},{func:"Z5",args:[J.im]},"address","coverages","modelName",{func:"Tz",void:true,args:[null,null]},"st","timer","response",{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},"event","so",J.im,J.O,{func:"fP",ret:J.GW},{func:"Ku",args:[J.GW]},[J.Q,G.Q4],"calls","codes","instructionList","profileCode",{func:"VL",args:[G.kx,G.kx]},[J.Q,G.c2],C.Us,{func:"dt",ret:P.cX},"lineNumber","hits",{func:"cM",void:true,args:[P.Z0]},"k",[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",V.qC,{func:"ru",ret:G.mL},"E",P.Z0,G.bv,[P.Z0,J.O,W.cv],"done",B.Ur,H.Tp,"trace",J.kn,Q.xI,Z.KU,G.kx,{func:"bR",ret:G.kx},{func:"VI",args:[G.kx]},F.qbd,"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Ds,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","elements","offset","comp","key1","key2",{func:"Q5",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"hs",ret:J.kn,args:[J.im]},"digit",{func:"an",ret:J.im,args:[J.im]},"part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",G.Q4,{func:"JA",ret:G.Q4},{func:"Qs",args:[G.Q4]},E.pv,F.Vfx,A.Urj,N.oub,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.c4r,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.Squ,S.Vf,R.Zt,"codeCaller",{func:"SR",args:[G.Vi]},J.Q,G.XN,{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[G.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[G.bv]},{func:"bN",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.KUl,"profile",S.PO,Z.tuj,M.mHk,"logLevel","rec",{func:"IM",args:[N.HV]},G.mL,{func:"pu",args:[G.mL]},L.Vct,Z.uL,A.D13,A.WZq,A.pva,A.cda,A.qFb,A.rna,A.Vba,V.waa,{func:"wA",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"pT",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.JB]},{func:"Zg",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"D8",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"mM",args:[U.hw]},Q.V0,A.T5,G.rj,{func:"ls",ret:G.rj},{func:"PF",args:[G.rj]},{func:"Yg",ret:J.O,args:[G.c2]},U.oaa,"coverage",Q.Sq,K.q2,X.q3,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"Lr",ret:G.No},{func:"AfY",args:[G.No]},R.Dsd,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -24825,9 +24987,9 @@
   init.currentScript = currentScript;
 
   if (typeof dartMainRunner === "function") {
-    dartMainRunner(function() { H.oT(E.nE()); });
+    dartMainRunner((function(a){H.oT(E.nE(),a)}), []);
   } else {
-    H.oT(E.nE());
+    (function(a){H.oT(E.nE(),a)})([]);
   }
 })
 function init(){I.p={}
@@ -24955,41 +25117,41 @@
 $desc=$collectedClasses.qE
 if($desc instanceof Array)$desc=$desc[1]
 qE.prototype=$desc
-function pa(){}pa.builtin$cls="pa"
-if(!"name" in pa)pa.name="pa"
-$desc=$collectedClasses.pa
+function zw(){}zw.builtin$cls="zw"
+if(!"name" in zw)zw.name="zw"
+$desc=$collectedClasses.zw
 if($desc instanceof Array)$desc=$desc[1]
-pa.prototype=$desc
-function Gh(){}Gh.builtin$cls="Gh"
-if(!"name" in Gh)Gh.name="Gh"
-$desc=$collectedClasses.Gh
+zw.prototype=$desc
+function Ps(){}Ps.builtin$cls="Ps"
+if(!"name" in Ps)Ps.name="Ps"
+$desc=$collectedClasses.Ps
 if($desc instanceof Array)$desc=$desc[1]
-Gh.prototype=$desc
-Gh.prototype.gN=function(receiver){return receiver.target}
-Gh.prototype.gt5=function(receiver){return receiver.type}
-Gh.prototype.st5=function(receiver,v){return receiver.type=v}
-Gh.prototype.gcC=function(receiver){return receiver.hash}
-Gh.prototype.scC=function(receiver,v){return receiver.hash=v}
-Gh.prototype.gmH=function(receiver){return receiver.href}
+Ps.prototype=$desc
+Ps.prototype.gN=function(receiver){return receiver.target}
+Ps.prototype.gt5=function(receiver){return receiver.type}
+Ps.prototype.st5=function(receiver,v){return receiver.type=v}
+Ps.prototype.gcC=function(receiver){return receiver.hash}
+Ps.prototype.scC=function(receiver,v){return receiver.hash=v}
+Ps.prototype.gmH=function(receiver){return receiver.href}
 function A0(){}A0.builtin$cls="A0"
 if(!"name" in A0)A0.name="A0"
 $desc=$collectedClasses.A0
 if($desc instanceof Array)$desc=$desc[1]
 A0.prototype=$desc
-function na(){}na.builtin$cls="na"
-if(!"name" in na)na.name="na"
-$desc=$collectedClasses.na
+function Sb(){}Sb.builtin$cls="Sb"
+if(!"name" in Sb)Sb.name="Sb"
+$desc=$collectedClasses.Sb
 if($desc instanceof Array)$desc=$desc[1]
-na.prototype=$desc
-na.prototype.gN=function(receiver){return receiver.target}
-na.prototype.gcC=function(receiver){return receiver.hash}
-na.prototype.scC=function(receiver,v){return receiver.hash=v}
-na.prototype.gmH=function(receiver){return receiver.href}
-function Mr(){}Mr.builtin$cls="Mr"
-if(!"name" in Mr)Mr.name="Mr"
-$desc=$collectedClasses.Mr
+Sb.prototype=$desc
+Sb.prototype.gN=function(receiver){return receiver.target}
+Sb.prototype.gcC=function(receiver){return receiver.hash}
+Sb.prototype.scC=function(receiver,v){return receiver.hash=v}
+Sb.prototype.gmH=function(receiver){return receiver.href}
+function vp(){}vp.builtin$cls="vp"
+if(!"name" in vp)vp.name="vp"
+$desc=$collectedClasses.vp
 if($desc instanceof Array)$desc=$desc[1]
-Mr.prototype=$desc
+vp.prototype=$desc
 function zx(){}zx.builtin$cls="zx"
 if(!"name" in zx)zx.name="zx"
 $desc=$collectedClasses.zx
@@ -25013,22 +25175,22 @@
 if($desc instanceof Array)$desc=$desc[1]
 W2.prototype=$desc
 W2.prototype.gO3=function(receiver){return receiver.url}
-function it(){}it.builtin$cls="it"
-if(!"name" in it)it.name="it"
-$desc=$collectedClasses.it
+function zJ(){}zJ.builtin$cls="zJ"
+if(!"name" in zJ)zJ.name="zJ"
+$desc=$collectedClasses.zJ
 if($desc instanceof Array)$desc=$desc[1]
-it.prototype=$desc
+zJ.prototype=$desc
 function Az(){}Az.builtin$cls="Az"
 if(!"name" in Az)Az.name="Az"
 $desc=$collectedClasses.Az
 if($desc instanceof Array)$desc=$desc[1]
 Az.prototype=$desc
 Az.prototype.gt5=function(receiver){return receiver.type}
-function QP(){}QP.builtin$cls="QP"
-if(!"name" in QP)QP.name="QP"
-$desc=$collectedClasses.QP
+function Fy(){}Fy.builtin$cls="Fy"
+if(!"name" in Fy)Fy.name="Fy"
+$desc=$collectedClasses.Fy
 if($desc instanceof Array)$desc=$desc[1]
-QP.prototype=$desc
+Fy.prototype=$desc
 function QW(){}QW.builtin$cls="QW"
 if(!"name" in QW)QW.name="QW"
 $desc=$collectedClasses.QW
@@ -25041,11 +25203,11 @@
 QW.prototype.st5=function(receiver,v){return receiver.type=v}
 QW.prototype.gP=function(receiver){return receiver.value}
 QW.prototype.sP=function(receiver,v){return receiver.value=v}
-function jr(){}jr.builtin$cls="jr"
-if(!"name" in jr)jr.name="jr"
-$desc=$collectedClasses.jr
+function ca(){}ca.builtin$cls="ca"
+if(!"name" in ca)ca.name="ca"
+$desc=$collectedClasses.ca
 if($desc instanceof Array)$desc=$desc[1]
-jr.prototype=$desc
+ca.prototype=$desc
 function Ny(){}Ny.builtin$cls="Ny"
 if(!"name" in Ny)Ny.name="Ny"
 $desc=$collectedClasses.Ny
@@ -25069,12 +25231,12 @@
 $desc=$collectedClasses.BR
 if($desc instanceof Array)$desc=$desc[1]
 BR.prototype=$desc
-function di(){}di.builtin$cls="di"
-if(!"name" in di)di.name="di"
-$desc=$collectedClasses.di
+function wT(){}wT.builtin$cls="wT"
+if(!"name" in wT)wT.name="wT"
+$desc=$collectedClasses.wT
 if($desc instanceof Array)$desc=$desc[1]
-di.prototype=$desc
-di.prototype.gRn=function(receiver){return receiver.data}
+wT.prototype=$desc
+wT.prototype.gRn=function(receiver){return receiver.data}
 function d7(){}d7.builtin$cls="d7"
 if(!"name" in d7)d7.name="d7"
 $desc=$collectedClasses.d7
@@ -25101,21 +25263,21 @@
 if($desc instanceof Array)$desc=$desc[1]
 vHT.prototype=$desc
 vHT.prototype.gbG=function(receiver){return receiver.options}
-function n0(){}n0.builtin$cls="n0"
-if(!"name" in n0)n0.name="n0"
-$desc=$collectedClasses.n0
+function hh(){}hh.builtin$cls="hh"
+if(!"name" in hh)hh.name="hh"
+$desc=$collectedClasses.hh
 if($desc instanceof Array)$desc=$desc[1]
-n0.prototype=$desc
+hh.prototype=$desc
 function Em(){}Em.builtin$cls="Em"
 if(!"name" in Em)Em.name="Em"
 $desc=$collectedClasses.Em
 if($desc instanceof Array)$desc=$desc[1]
 Em.prototype=$desc
-function pt(){}pt.builtin$cls="pt"
-if(!"name" in pt)pt.name="pt"
-$desc=$collectedClasses.pt
+function NWk(){}NWk.builtin$cls="NWk"
+if(!"name" in NWk)NWk.name="NWk"
+$desc=$collectedClasses.NWk
 if($desc instanceof Array)$desc=$desc[1]
-pt.prototype=$desc
+NWk.prototype=$desc
 function rV(){}rV.builtin$cls="rV"
 if(!"name" in rV)rV.name="rV"
 $desc=$collectedClasses.rV
@@ -25207,27 +25369,27 @@
 if($desc instanceof Array)$desc=$desc[1]
 hH.prototype=$desc
 hH.prototype.goc=function(receiver){return receiver.name}
-function Aa(){}Aa.builtin$cls="Aa"
-if(!"name" in Aa)Aa.name="Aa"
-$desc=$collectedClasses.Aa
+function QU(){}QU.builtin$cls="QU"
+if(!"name" in QU)QU.name="QU"
+$desc=$collectedClasses.QU
 if($desc instanceof Array)$desc=$desc[1]
-Aa.prototype=$desc
-Aa.prototype.gtT=function(receiver){return receiver.code}
+QU.prototype=$desc
+QU.prototype.gtT=function(receiver){return receiver.code}
 function u5(){}u5.builtin$cls="u5"
 if(!"name" in u5)u5.name="u5"
 $desc=$collectedClasses.u5
 if($desc instanceof Array)$desc=$desc[1]
 u5.prototype=$desc
-function Tq(){}Tq.builtin$cls="Tq"
-if(!"name" in Tq)Tq.name="Tq"
-$desc=$collectedClasses.Tq
+function h4(){}h4.builtin$cls="h4"
+if(!"name" in h4)h4.name="h4"
+$desc=$collectedClasses.h4
 if($desc instanceof Array)$desc=$desc[1]
-Tq.prototype=$desc
-Tq.prototype.gB=function(receiver){return receiver.length}
-Tq.prototype.gbP=function(receiver){return receiver.method}
-Tq.prototype.goc=function(receiver){return receiver.name}
-Tq.prototype.soc=function(receiver,v){return receiver.name=v}
-Tq.prototype.gN=function(receiver){return receiver.target}
+h4.prototype=$desc
+h4.prototype.gB=function(receiver){return receiver.length}
+h4.prototype.gbP=function(receiver){return receiver.method}
+h4.prototype.goc=function(receiver){return receiver.name}
+h4.prototype.soc=function(receiver,v){return receiver.name=v}
+h4.prototype.gN=function(receiver){return receiver.target}
 function W4(){}W4.builtin$cls="W4"
 if(!"name" in W4)W4.name="W4"
 $desc=$collectedClasses.W4
@@ -25248,11 +25410,11 @@
 $desc=$collectedClasses.tA
 if($desc instanceof Array)$desc=$desc[1]
 tA.prototype=$desc
-function wa(){}wa.builtin$cls="wa"
-if(!"name" in wa)wa.name="wa"
-$desc=$collectedClasses.wa
+function xn(){}xn.builtin$cls="xn"
+if(!"name" in xn)xn.name="xn"
+$desc=$collectedClasses.xn
 if($desc instanceof Array)$desc=$desc[1]
-wa.prototype=$desc
+xn.prototype=$desc
 function Uq(){}Uq.builtin$cls="Uq"
 if(!"name" in Uq)Uq.name="Uq"
 $desc=$collectedClasses.Uq
@@ -25279,13 +25441,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
-zU.prototype.gys=function(receiver){return receiver.status}
-zU.prototype.gpo=function(receiver){return receiver.statusText}
-function rk(){}rk.builtin$cls="rk"
-if(!"name" in rk)rk.name="rk"
-$desc=$collectedClasses.rk
+function wa(){}wa.builtin$cls="wa"
+if(!"name" in wa)wa.name="wa"
+$desc=$collectedClasses.wa
 if($desc instanceof Array)$desc=$desc[1]
-rk.prototype=$desc
+wa.prototype=$desc
 function tX(){}tX.builtin$cls="tX"
 if(!"name" in tX)tX.name="tX"
 $desc=$collectedClasses.tX
@@ -25314,7 +25474,7 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
-Mi.prototype.gaK=function(receiver){return receiver.list}
+Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
 Mi.prototype.gLA=function(receiver){return receiver.src}
@@ -25403,12 +25563,12 @@
 if($desc instanceof Array)$desc=$desc[1]
 aB.prototype=$desc
 aB.prototype.gG1=function(receiver){return receiver.message}
-function fJ(){}fJ.builtin$cls="fJ"
-if(!"name" in fJ)fJ.name="fJ"
-$desc=$collectedClasses.fJ
+function W7(){}W7.builtin$cls="W7"
+if(!"name" in W7)W7.name="W7"
+$desc=$collectedClasses.W7
 if($desc instanceof Array)$desc=$desc[1]
-fJ.prototype=$desc
-fJ.prototype.gG1=function(receiver){return receiver.message}
+W7.prototype=$desc
+W7.prototype.gG1=function(receiver){return receiver.message}
 function BK(){}BK.builtin$cls="BK"
 if(!"name" in BK)BK.name="BK"
 $desc=$collectedClasses.BK
@@ -25420,6 +25580,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 Rv.prototype=$desc
 Rv.prototype.gjO=function(receiver){return receiver.id}
+Rv.prototype.gph=function(receiver){return receiver.label}
 function HO(){}HO.builtin$cls="HO"
 if(!"name" in HO)HO.name="HO"
 $desc=$collectedClasses.HO
@@ -25435,11 +25596,11 @@
 $desc=$collectedClasses.ZY
 if($desc instanceof Array)$desc=$desc[1]
 ZY.prototype=$desc
-function Hy(){}Hy.builtin$cls="Hy"
-if(!"name" in Hy)Hy.name="Hy"
-$desc=$collectedClasses.Hy
+function cx(){}cx.builtin$cls="cx"
+if(!"name" in cx)cx.name="cx"
+$desc=$collectedClasses.cx
 if($desc instanceof Array)$desc=$desc[1]
-Hy.prototype=$desc
+cx.prototype=$desc
 function EeC(){}EeC.builtin$cls="EeC"
 if(!"name" in EeC)EeC.name="EeC"
 $desc=$collectedClasses.EeC
@@ -25455,11 +25616,11 @@
 Qb.prototype=$desc
 Qb.prototype.gP=function(receiver){return receiver.value}
 Qb.prototype.sP=function(receiver,v){return receiver.value=v}
-function Vu(){}Vu.builtin$cls="Vu"
-if(!"name" in Vu)Vu.name="Vu"
-$desc=$collectedClasses.Vu
+function PG(){}PG.builtin$cls="PG"
+if(!"name" in PG)PG.name="PG"
+$desc=$collectedClasses.PG
 if($desc instanceof Array)$desc=$desc[1]
-Vu.prototype=$desc
+PG.prototype=$desc
 function xe(){}xe.builtin$cls="xe"
 if(!"name" in xe)xe.name="xe"
 $desc=$collectedClasses.xe
@@ -25476,42 +25637,42 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function Imr(){}Imr.builtin$cls="Imr"
-if(!"name" in Imr)Imr.name="Imr"
-$desc=$collectedClasses.Imr
+function ab(){}ab.builtin$cls="ab"
+if(!"name" in ab)ab.name="ab"
+$desc=$collectedClasses.ab
 if($desc instanceof Array)$desc=$desc[1]
-Imr.prototype=$desc
-Imr.prototype.gjO=function(receiver){return receiver.id}
-Imr.prototype.goc=function(receiver){return receiver.name}
-Imr.prototype.gt5=function(receiver){return receiver.type}
+ab.prototype=$desc
+ab.prototype.gjO=function(receiver){return receiver.id}
+ab.prototype.goc=function(receiver){return receiver.name}
+ab.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
 if($desc instanceof Array)$desc=$desc[1]
 Ve.prototype=$desc
-function CX(){}CX.builtin$cls="CX"
-if(!"name" in CX)CX.name="CX"
-$desc=$collectedClasses.CX
+function Wp(){}Wp.builtin$cls="Wp"
+if(!"name" in Wp)Wp.name="Wp"
+$desc=$collectedClasses.Wp
 if($desc instanceof Array)$desc=$desc[1]
-CX.prototype=$desc
+Wp.prototype=$desc
 function H9(){}H9.builtin$cls="H9"
 if(!"name" in H9)H9.name="H9"
 $desc=$collectedClasses.H9
 if($desc instanceof Array)$desc=$desc[1]
 H9.prototype=$desc
-function FI(){}FI.builtin$cls="FI"
-if(!"name" in FI)FI.name="FI"
-$desc=$collectedClasses.FI
+function o4(){}o4.builtin$cls="o4"
+if(!"name" in o4)o4.name="o4"
+$desc=$collectedClasses.o4
 if($desc instanceof Array)$desc=$desc[1]
-FI.prototype=$desc
-FI.prototype.gjL=function(receiver){return receiver.oldValue}
-FI.prototype.gN=function(receiver){return receiver.target}
-FI.prototype.gt5=function(receiver){return receiver.type}
-function oU(){}oU.builtin$cls="oU"
-if(!"name" in oU)oU.name="oU"
-$desc=$collectedClasses.oU
+o4.prototype=$desc
+o4.prototype.gjL=function(receiver){return receiver.oldValue}
+o4.prototype.gN=function(receiver){return receiver.target}
+o4.prototype.gt5=function(receiver){return receiver.type}
+function Q0(){}Q0.builtin$cls="Q0"
+if(!"name" in Q0)Q0.name="Q0"
+$desc=$collectedClasses.Q0
 if($desc instanceof Array)$desc=$desc[1]
-oU.prototype=$desc
+Q0.prototype=$desc
 function ih(){}ih.builtin$cls="ih"
 if(!"name" in ih)ih.name="ih"
 $desc=$collectedClasses.ih
@@ -25559,6 +25720,8 @@
 $desc=$collectedClasses.l9
 if($desc instanceof Array)$desc=$desc[1]
 l9.prototype=$desc
+l9.prototype.gph=function(receiver){return receiver.label}
+l9.prototype.sph=function(receiver,v){return receiver.label=v}
 function Ql(){}Ql.builtin$cls="Ql"
 if(!"name" in Ql)Ql.name="Ql"
 $desc=$collectedClasses.Ql
@@ -25566,6 +25729,8 @@
 Ql.prototype=$desc
 Ql.prototype.gMB=function(receiver){return receiver.form}
 Ql.prototype.gvH=function(receiver){return receiver.index}
+Ql.prototype.gph=function(receiver){return receiver.label}
+Ql.prototype.sph=function(receiver,v){return receiver.label=v}
 Ql.prototype.gP=function(receiver){return receiver.value}
 Ql.prototype.sP=function(receiver,v){return receiver.value=v}
 function Xp(){}Xp.builtin$cls="Xp"
@@ -25584,11 +25749,11 @@
 $desc=$collectedClasses.bP
 if($desc instanceof Array)$desc=$desc[1]
 bP.prototype=$desc
-function FH(){}FH.builtin$cls="FH"
-if(!"name" in FH)FH.name="FH"
-$desc=$collectedClasses.FH
+function mX(){}mX.builtin$cls="mX"
+if(!"name" in mX)mX.name="mX"
+$desc=$collectedClasses.mX
 if($desc instanceof Array)$desc=$desc[1]
-FH.prototype=$desc
+mX.prototype=$desc
 function SN(){}SN.builtin$cls="SN"
 if(!"name" in SN)SN.name="SN"
 $desc=$collectedClasses.SN
@@ -25615,11 +25780,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function GT(){}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+GT.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25703,36 +25868,50 @@
 if($desc instanceof Array)$desc=$desc[1]
 I0.prototype=$desc
 I0.prototype.gpQ=function(receiver){return receiver.applyAuthorStyles}
-function CY(){}CY.builtin$cls="CY"
-if(!"name" in CY)CY.name="CY"
-$desc=$collectedClasses.CY
+function QR(){}QR.builtin$cls="QR"
+if(!"name" in QR)QR.name="QR"
+$desc=$collectedClasses.QR
 if($desc instanceof Array)$desc=$desc[1]
-CY.prototype=$desc
-CY.prototype.gLA=function(receiver){return receiver.src}
-CY.prototype.gt5=function(receiver){return receiver.type}
-CY.prototype.st5=function(receiver,v){return receiver.type=v}
-function Wt(){}Wt.builtin$cls="Wt"
-if(!"name" in Wt)Wt.name="Wt"
-$desc=$collectedClasses.Wt
+QR.prototype=$desc
+QR.prototype.gLA=function(receiver){return receiver.src}
+QR.prototype.gt5=function(receiver){return receiver.type}
+QR.prototype.st5=function(receiver,v){return receiver.type=v}
+function Sc(){}Sc.builtin$cls="Sc"
+if(!"name" in Sc)Sc.name="Sc"
+$desc=$collectedClasses.Sc
 if($desc instanceof Array)$desc=$desc[1]
-Wt.prototype=$desc
+Sc.prototype=$desc
 function uaa(){}uaa.builtin$cls="uaa"
 if(!"name" in uaa)uaa.name="uaa"
 $desc=$collectedClasses.uaa
 if($desc instanceof Array)$desc=$desc[1]
 uaa.prototype=$desc
-function Hd(){}Hd.builtin$cls="Hd"
-if(!"name" in Hd)Hd.name="Hd"
-$desc=$collectedClasses.Hd
+uaa.prototype.gPK=function(receiver){return receiver.results}
+function yg(){}yg.builtin$cls="yg"
+if(!"name" in yg)yg.name="yg"
+$desc=$collectedClasses.yg
 if($desc instanceof Array)$desc=$desc[1]
-Hd.prototype=$desc
-Hd.prototype.gkc=function(receiver){return receiver.error}
-Hd.prototype.gG1=function(receiver){return receiver.message}
+yg.prototype=$desc
+function mG(){}mG.builtin$cls="mG"
+if(!"name" in mG)mG.name="mG"
+$desc=$collectedClasses.mG
+if($desc instanceof Array)$desc=$desc[1]
+mG.prototype=$desc
+mG.prototype.gkc=function(receiver){return receiver.error}
+mG.prototype.gG1=function(receiver){return receiver.message}
 function Ul(){}Ul.builtin$cls="Ul"
 if(!"name" in Ul)Ul.name="Ul"
 $desc=$collectedClasses.Ul
 if($desc instanceof Array)$desc=$desc[1]
 Ul.prototype=$desc
+Ul.prototype.gPK=function(receiver){return receiver.results}
+function uj(){}uj.builtin$cls="uj"
+if(!"name" in uj)uj.name="uj"
+$desc=$collectedClasses.uj
+if($desc instanceof Array)$desc=$desc[1]
+uj.prototype=$desc
+uj.prototype.gV5=function(receiver){return receiver.isFinal}
+uj.prototype.gB=function(receiver){return receiver.length}
 function G5(){}G5.builtin$cls="G5"
 if(!"name" in G5)G5.name="G5"
 $desc=$collectedClasses.G5
@@ -25755,11 +25934,11 @@
 Lx.prototype=$desc
 Lx.prototype.gt5=function(receiver){return receiver.type}
 Lx.prototype.st5=function(receiver,v){return receiver.type=v}
-function Er(){}Er.builtin$cls="Er"
-if(!"name" in Er)Er.name="Er"
-$desc=$collectedClasses.Er
+function fh(){}fh.builtin$cls="fh"
+if(!"name" in fh)fh.name="fh"
+$desc=$collectedClasses.fh
 if($desc instanceof Array)$desc=$desc[1]
-Er.prototype=$desc
+fh.prototype=$desc
 function qk(){}qk.builtin$cls="qk"
 if(!"name" in qk)qk.name="qk"
 $desc=$collectedClasses.qk
@@ -25780,11 +25959,11 @@
 $desc=$collectedClasses.tV
 if($desc instanceof Array)$desc=$desc[1]
 tV.prototype=$desc
-function KP(){}KP.builtin$cls="KP"
-if(!"name" in KP)KP.name="KP"
-$desc=$collectedClasses.KP
+function BT(){}BT.builtin$cls="BT"
+if(!"name" in BT)BT.name="BT"
+$desc=$collectedClasses.BT
 if($desc instanceof Array)$desc=$desc[1]
-KP.prototype=$desc
+BT.prototype=$desc
 function yY(){}yY.builtin$cls="yY"
 if(!"name" in yY)yY.name="yY"
 $desc=$collectedClasses.yY
@@ -25815,11 +25994,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 xV.prototype=$desc
 xV.prototype.gRn=function(receiver){return receiver.data}
-function Dn(){}Dn.builtin$cls="Dn"
-if(!"name" in Dn)Dn.name="Dn"
-$desc=$collectedClasses.Dn
+function FH(){}FH.builtin$cls="FH"
+if(!"name" in FH)FH.name="FH"
+$desc=$collectedClasses.FH
 if($desc instanceof Array)$desc=$desc[1]
-Dn.prototype=$desc
+FH.prototype=$desc
 function y6(){}y6.builtin$cls="y6"
 if(!"name" in y6)y6.name="y6"
 $desc=$collectedClasses.y6
@@ -25832,6 +26011,8 @@
 RH.prototype=$desc
 RH.prototype.gfY=function(receiver){return receiver.kind}
 RH.prototype.sfY=function(receiver,v){return receiver.kind=v}
+RH.prototype.gph=function(receiver){return receiver.label}
+RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
 function pU(){}pU.builtin$cls="pU"
 if(!"name" in pU)pU.name="pU"
@@ -25843,11 +26024,11 @@
 $desc=$collectedClasses.OJ
 if($desc instanceof Array)$desc=$desc[1]
 OJ.prototype=$desc
-function Qa(){}Qa.builtin$cls="Qa"
-if(!"name" in Qa)Qa.name="Qa"
-$desc=$collectedClasses.Qa
+function Mf(){}Mf.builtin$cls="Mf"
+if(!"name" in Mf)Mf.name="Mf"
+$desc=$collectedClasses.Mf
 if($desc instanceof Array)$desc=$desc[1]
-Qa.prototype=$desc
+Mf.prototype=$desc
 function dp(){}dp.builtin$cls="dp"
 if(!"name" in dp)dp.name="dp"
 $desc=$collectedClasses.dp
@@ -25863,11 +26044,11 @@
 $desc=$collectedClasses.aG
 if($desc instanceof Array)$desc=$desc[1]
 aG.prototype=$desc
-function J6(){}J6.builtin$cls="J6"
-if(!"name" in J6)J6.name="J6"
-$desc=$collectedClasses.J6
+function fA(){}fA.builtin$cls="fA"
+if(!"name" in fA)fA.name="fA"
+$desc=$collectedClasses.fA
 if($desc instanceof Array)$desc=$desc[1]
-J6.prototype=$desc
+fA.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -25875,7 +26056,6 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
-u9.prototype.gys=function(receiver){return receiver.status}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -25884,11 +26064,11 @@
 Bn.prototype.goc=function(receiver){return receiver.name}
 Bn.prototype.gP=function(receiver){return receiver.value}
 Bn.prototype.sP=function(receiver,v){return receiver.value=v}
-function hq(){}hq.builtin$cls="hq"
-if(!"name" in hq)hq.name="hq"
-$desc=$collectedClasses.hq
+function Eb(){}Eb.builtin$cls="Eb"
+if(!"name" in Eb)Eb.name="Eb"
+$desc=$collectedClasses.Eb
 if($desc instanceof Array)$desc=$desc[1]
-hq.prototype=$desc
+Eb.prototype=$desc
 function UL(){}UL.builtin$cls="UL"
 if(!"name" in UL)UL.name="UL"
 $desc=$collectedClasses.UL
@@ -25924,21 +26104,31 @@
 $desc=$collectedClasses.F2
 if($desc instanceof Array)$desc=$desc[1]
 F2.prototype=$desc
-function nL(){}nL.builtin$cls="nL"
-if(!"name" in nL)nL.name="nL"
-$desc=$collectedClasses.nL
+function VB(){}VB.builtin$cls="VB"
+if(!"name" in VB)VB.name="VB"
+$desc=$collectedClasses.VB
 if($desc instanceof Array)$desc=$desc[1]
-nL.prototype=$desc
-function QV(){}QV.builtin$cls="QV"
-if(!"name" in QV)QV.name="QV"
-$desc=$collectedClasses.QV
+VB.prototype=$desc
+function Cy(){}Cy.builtin$cls="Cy"
+if(!"name" in Cy)Cy.name="Cy"
+$desc=$collectedClasses.Cy
 if($desc instanceof Array)$desc=$desc[1]
-QV.prototype=$desc
+Cy.prototype=$desc
 function q0(){}q0.builtin$cls="q0"
 if(!"name" in q0)q0.name="q0"
 $desc=$collectedClasses.q0
 if($desc instanceof Array)$desc=$desc[1]
 q0.prototype=$desc
+function c5(){}c5.builtin$cls="c5"
+if(!"name" in c5)c5.name="c5"
+$desc=$collectedClasses.c5
+if($desc instanceof Array)$desc=$desc[1]
+c5.prototype=$desc
+function LO(){}LO.builtin$cls="LO"
+if(!"name" in LO)LO.name="LO"
+$desc=$collectedClasses.LO
+if($desc instanceof Array)$desc=$desc[1]
+LO.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -25977,11 +26167,11 @@
 $desc=$collectedClasses.NE
 if($desc instanceof Array)$desc=$desc[1]
 NE.prototype=$desc
-function lC(){}lC.builtin$cls="lC"
-if(!"name" in lC)lC.name="lC"
-$desc=$collectedClasses.lC
+function Ak(){}Ak.builtin$cls="Ak"
+if(!"name" in Ak)Ak.name="Ak"
+$desc=$collectedClasses.Ak
 if($desc instanceof Array)$desc=$desc[1]
-lC.prototype=$desc
+Ak.prototype=$desc
 function y5(){}y5.builtin$cls="y5"
 if(!"name" in y5)y5.name="y5"
 $desc=$collectedClasses.y5
@@ -26002,11 +26192,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function mk(){}mk.builtin$cls="mk"
-if(!"name" in mk)mk.name="mk"
-$desc=$collectedClasses.mk
+function vO(){}vO.builtin$cls="vO"
+if(!"name" in vO)vO.name="vO"
+$desc=$collectedClasses.vO
 if($desc instanceof Array)$desc=$desc[1]
-mk.prototype=$desc
+vO.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26032,13 +26222,13 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
-function bd(){}bd.builtin$cls="bd"
-if(!"name" in bd)bd.name="bd"
-$desc=$collectedClasses.bd
+function lv(){}lv.builtin$cls="lv"
+if(!"name" in lv)lv.name="lv"
+$desc=$collectedClasses.lv
 if($desc instanceof Array)$desc=$desc[1]
-bd.prototype=$desc
-bd.prototype.gt5=function(receiver){return receiver.type}
-bd.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype=$desc
+lv.prototype.gt5=function(receiver){return receiver.type}
+lv.prototype.gUQ=function(receiver){return receiver.values}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
@@ -26060,11 +26250,11 @@
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
-function wf(){}wf.builtin$cls="wf"
-if(!"name" in wf)wf.name="wf"
-$desc=$collectedClasses.wf
+function kK(){}kK.builtin$cls="kK"
+if(!"name" in kK)kK.name="kK"
+$desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
-wf.prototype=$desc
+kK.prototype=$desc
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26075,11 +26265,11 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
-function Ic(){}Ic.builtin$cls="Ic"
-if(!"name" in Ic)Ic.name="Ic"
-$desc=$collectedClasses.Ic
+function NdT(){}NdT.builtin$cls="NdT"
+if(!"name" in NdT)NdT.name="NdT"
+$desc=$collectedClasses.NdT
 if($desc instanceof Array)$desc=$desc[1]
-Ic.prototype=$desc
+NdT.prototype=$desc
 function lc(){}lc.builtin$cls="lc"
 if(!"name" in lc)lc.name="lc"
 $desc=$collectedClasses.lc
@@ -26095,11 +26285,11 @@
 $desc=$collectedClasses.qM
 if($desc instanceof Array)$desc=$desc[1]
 qM.prototype=$desc
-function tk(){}tk.builtin$cls="tk"
-if(!"name" in tk)tk.name="tk"
-$desc=$collectedClasses.tk
+function Ob(){}Ob.builtin$cls="Ob"
+if(!"name" in Ob)Ob.name="Ob"
+$desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
-tk.prototype=$desc
+Ob.prototype=$desc
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
@@ -26111,11 +26301,11 @@
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
-function nh(){}nh.builtin$cls="nh"
-if(!"name" in nh)nh.name="nh"
-$desc=$collectedClasses.nh
+function NY(){}NY.builtin$cls="NY"
+if(!"name" in NY)NY.name="NY"
+$desc=$collectedClasses.NY
 if($desc instanceof Array)$desc=$desc[1]
-nh.prototype=$desc
+NY.prototype=$desc
 function EI(){}EI.builtin$cls="EI"
 if(!"name" in EI)EI.name="EI"
 $desc=$collectedClasses.EI
@@ -26127,26 +26317,26 @@
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
-function Ub(){}Ub.builtin$cls="Ub"
-if(!"name" in Ub)Ub.name="Ub"
-$desc=$collectedClasses.Ub
+function rg(){}rg.builtin$cls="rg"
+if(!"name" in rg)rg.name="rg"
+$desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
-Ub.prototype=$desc
-function kK(){}kK.builtin$cls="kK"
-if(!"name" in kK)kK.name="kK"
-$desc=$collectedClasses.kK
-if($desc instanceof Array)$desc=$desc[1]
-kK.prototype=$desc
-function eW(){}eW.builtin$cls="eW"
-if(!"name" in eW)eW.name="eW"
-$desc=$collectedClasses.eW
-if($desc instanceof Array)$desc=$desc[1]
-eW.prototype=$desc
+rg.prototype=$desc
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+function eW(){}eW.builtin$cls="eW"
+if(!"name" in eW)eW.name="eW"
+$desc=$collectedClasses.eW
+if($desc instanceof Array)$desc=$desc[1]
+eW.prototype=$desc
+function kL(){}kL.builtin$cls="kL"
+if(!"name" in kL)kL.name="kL"
+$desc=$collectedClasses.kL
+if($desc instanceof Array)$desc=$desc[1]
+kL.prototype=$desc
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
@@ -26195,11 +26385,11 @@
 $desc=$collectedClasses.vd
 if($desc instanceof Array)$desc=$desc[1]
 vd.prototype=$desc
-function uzr(){}uzr.builtin$cls="uzr"
-if(!"name" in uzr)uzr.name="uzr"
-$desc=$collectedClasses.uzr
+function Jq(){}Jq.builtin$cls="Jq"
+if(!"name" in Jq)Jq.name="Jq"
+$desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
-uzr.prototype=$desc
+Jq.prototype=$desc
 function Yd(){}Yd.builtin$cls="Yd"
 if(!"name" in Yd)Yd.name="Yd"
 $desc=$collectedClasses.Yd
@@ -26210,11 +26400,11 @@
 $desc=$collectedClasses.kN
 if($desc instanceof Array)$desc=$desc[1]
 kN.prototype=$desc
-function lZ(){}lZ.builtin$cls="lZ"
-if(!"name" in lZ)lZ.name="lZ"
-$desc=$collectedClasses.lZ
+function AW(){}AW.builtin$cls="AW"
+if(!"name" in AW)AW.name="AW"
+$desc=$collectedClasses.AW
 if($desc instanceof Array)$desc=$desc[1]
-lZ.prototype=$desc
+AW.prototype=$desc
 function Gr(){}Gr.builtin$cls="Gr"
 if(!"name" in Gr)Gr.name="Gr"
 $desc=$collectedClasses.Gr
@@ -26226,11 +26416,11 @@
 $desc=$collectedClasses.XE
 if($desc instanceof Array)$desc=$desc[1]
 XE.prototype=$desc
-function mO(){}mO.builtin$cls="mO"
-if(!"name" in mO)mO.name="mO"
-$desc=$collectedClasses.mO
+function GH(){}GH.builtin$cls="GH"
+if(!"name" in GH)GH.name="GH"
+$desc=$collectedClasses.GH
 if($desc instanceof Array)$desc=$desc[1]
-mO.prototype=$desc
+GH.prototype=$desc
 function lo(){}lo.builtin$cls="lo"
 if(!"name" in lo)lo.name="lo"
 $desc=$collectedClasses.lo
@@ -26318,11 +26508,11 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
-function tL(){}tL.builtin$cls="tL"
-if(!"name" in tL)tL.name="tL"
-$desc=$collectedClasses.tL
+function Dn(){}Dn.builtin$cls="Dn"
+if(!"name" in Dn)Dn.name="Dn"
+$desc=$collectedClasses.Dn
 if($desc instanceof Array)$desc=$desc[1]
-tL.prototype=$desc
+Dn.prototype=$desc
 function pyk(){}pyk.builtin$cls="pyk"
 if(!"name" in pyk)pyk.name="pyk"
 $desc=$collectedClasses.pyk
@@ -26334,11 +26524,11 @@
 $desc=$collectedClasses.ZD
 if($desc instanceof Array)$desc=$desc[1]
 ZD.prototype=$desc
-function rD(){}rD.builtin$cls="rD"
-if(!"name" in rD)rD.name="rD"
-$desc=$collectedClasses.rD
+function Rlr(){}Rlr.builtin$cls="Rlr"
+if(!"name" in Rlr)Rlr.name="Rlr"
+$desc=$collectedClasses.Rlr
 if($desc instanceof Array)$desc=$desc[1]
-rD.prototype=$desc
+Rlr.prototype=$desc
 function wD(){}wD.builtin$cls="wD"
 if(!"name" in wD)wD.name="wD"
 $desc=$collectedClasses.wD
@@ -26370,11 +26560,11 @@
 $desc=$collectedClasses.mj
 if($desc instanceof Array)$desc=$desc[1]
 mj.prototype=$desc
-function cB(){}cB.builtin$cls="cB"
-if(!"name" in cB)cB.name="cB"
-$desc=$collectedClasses.cB
+function hW(){}hW.builtin$cls="hW"
+if(!"name" in hW)hW.name="hW"
+$desc=$collectedClasses.hW
 if($desc instanceof Array)$desc=$desc[1]
-cB.prototype=$desc
+hW.prototype=$desc
 function uY(){}uY.builtin$cls="uY"
 if(!"name" in uY)uY.name="uY"
 $desc=$collectedClasses.uY
@@ -26385,11 +26575,11 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function GK(){}GK.builtin$cls="GK"
-if(!"name" in GK)GK.name="GK"
-$desc=$collectedClasses.GK
+function AX(){}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-GK.prototype=$desc
+AX.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
@@ -26425,21 +26615,21 @@
 $desc=$collectedClasses.xt
 if($desc instanceof Array)$desc=$desc[1]
 xt.prototype=$desc
-function VJ(){}VJ.builtin$cls="VJ"
-if(!"name" in VJ)VJ.name="VJ"
-$desc=$collectedClasses.VJ
+function tG(){}tG.builtin$cls="tG"
+if(!"name" in tG)tG.name="tG"
+$desc=$collectedClasses.tG
 if($desc instanceof Array)$desc=$desc[1]
-VJ.prototype=$desc
+tG.prototype=$desc
 function P0(){}P0.builtin$cls="P0"
 if(!"name" in P0)P0.name="P0"
 $desc=$collectedClasses.P0
 if($desc instanceof Array)$desc=$desc[1]
 P0.prototype=$desc
-function xlX(){}xlX.builtin$cls="xlX"
-if(!"name" in xlX)xlX.name="xlX"
-$desc=$collectedClasses.xlX
+function kh(){}kh.builtin$cls="kh"
+if(!"name" in kh)kh.name="kh"
+$desc=$collectedClasses.kh
 if($desc instanceof Array)$desc=$desc[1]
-xlX.prototype=$desc
+kh.prototype=$desc
 function SQ(){}SQ.builtin$cls="SQ"
 if(!"name" in SQ)SQ.name="SQ"
 $desc=$collectedClasses.SQ
@@ -26492,16 +26682,16 @@
 $desc=$collectedClasses.dE
 if($desc instanceof Array)$desc=$desc[1]
 dE.prototype=$desc
-function Eb(){}Eb.builtin$cls="Eb"
-if(!"name" in Eb)Eb.name="Eb"
-$desc=$collectedClasses.Eb
+function IJ(){}IJ.builtin$cls="IJ"
+if(!"name" in IJ)IJ.name="IJ"
+$desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
-Eb.prototype=$desc
-function dT(){}dT.builtin$cls="dT"
-if(!"name" in dT)dT.name="dT"
-$desc=$collectedClasses.dT
+IJ.prototype=$desc
+function aH(){}aH.builtin$cls="aH"
+if(!"name" in aH)aH.name="aH"
+$desc=$collectedClasses.aH
 if($desc instanceof Array)$desc=$desc[1]
-dT.prototype=$desc
+aH.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26593,11 +26783,11 @@
 $desc=$collectedClasses.vT
 if($desc instanceof Array)$desc=$desc[1]
 vT.prototype=$desc
-function qa(){}qa.builtin$cls="qa"
-if(!"name" in qa)qa.name="qa"
-$desc=$collectedClasses.qa
+function VP(){}VP.builtin$cls="VP"
+if(!"name" in VP)VP.name="VP"
+$desc=$collectedClasses.VP
 if($desc instanceof Array)$desc=$desc[1]
-qa.prototype=$desc
+VP.prototype=$desc
 function BQ(){}BQ.builtin$cls="BQ"
 if(!"name" in BQ)BQ.name="BQ"
 $desc=$collectedClasses.BQ
@@ -26608,12 +26798,14 @@
 $desc=$collectedClasses.O
 if($desc instanceof Array)$desc=$desc[1]
 O.prototype=$desc
-function PK(a){this.a=a}PK.builtin$cls="PK"
+function PK(a,b){this.a=a
+this.b=b}PK.builtin$cls="PK"
 if(!"name" in PK)PK.name="PK"
 $desc=$collectedClasses.PK
 if($desc instanceof Array)$desc=$desc[1]
 PK.prototype=$desc
-function JO(b){this.b=b}JO.builtin$cls="JO"
+function JO(a,c){this.a=a
+this.c=c}JO.builtin$cls="JO"
 if(!"name" in JO)JO.name="JO"
 $desc=$collectedClasses.JO
 if($desc instanceof Array)$desc=$desc[1]
@@ -26635,18 +26827,21 @@
 $desc=$collectedClasses.f0
 if($desc instanceof Array)$desc=$desc[1]
 f0.prototype=$desc
-f0.prototype.gi2=function(){return this.i2}
-f0.prototype.si2=function(v){return this.i2=v}
+f0.prototype.gi2=function(receiver){return this.i2}
+f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,RW,C9,lJ){this.jO=jO
+function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
 this.Qy=Qy
+this.PX=PX
 this.RW=RW
 this.C9=C9
-this.lJ=lJ}aX.builtin$cls="aX"
+this.lJ=lJ
+this.Jp=Jp
+this.pa=pa}aX.builtin$cls="aX"
 if(!"name" in aX)aX.name="aX"
 $desc=$collectedClasses.aX
 if($desc instanceof Array)$desc=$desc[1]
@@ -26656,8 +26851,13 @@
 aX.prototype.gEE=function(){return this.EE}
 aX.prototype.gRW=function(){return this.RW}
 aX.prototype.gC9=function(){return this.C9}
-function cC(Rk,bZ){this.Rk=Rk
-this.bZ=bZ}cC.builtin$cls="cC"
+function oU(a){this.a=a}oU.builtin$cls="oU"
+if(!"name" in oU)oU.name="oU"
+$desc=$collectedClasses.oU
+if($desc instanceof Array)$desc=$desc[1]
+oU.prototype=$desc
+function cC(Rk,GL){this.Rk=Rk
+this.GL=GL}cC.builtin$cls="cC"
 if(!"name" in cC)cC.name="cC"
 $desc=$collectedClasses.cC
 if($desc instanceof Array)$desc=$desc[1]
@@ -26667,15 +26867,15 @@
 $desc=$collectedClasses.RA
 if($desc instanceof Array)$desc=$desc[1]
 RA.prototype=$desc
-function IY(Aq,i3,G1){this.Aq=Aq
+function IY(F1,i3,G1){this.F1=F1
 this.i3=i3
 this.G1=G1}IY.builtin$cls="IY"
 if(!"name" in IY)IY.name="IY"
 $desc=$collectedClasses.IY
 if($desc instanceof Array)$desc=$desc[1]
 IY.prototype=$desc
-IY.prototype.gAq=function(receiver){return this.Aq}
-IY.prototype.sAq=function(receiver,v){return this.Aq=v}
+IY.prototype.gF1=function(receiver){return this.F1}
+IY.prototype.sF1=function(receiver,v){return this.F1=v}
 IY.prototype.gG1=function(receiver){return this.G1}
 IY.prototype.sG1=function(receiver,v){return this.G1=v}
 function JH(){}JH.builtin$cls="JH"
@@ -26683,15 +26883,24 @@
 $desc=$collectedClasses.JH
 if($desc instanceof Array)$desc=$desc[1]
 JH.prototype=$desc
-function jl(a,b,c,d,e){this.a=a
+function jl(a,b,c,d,e,f){this.a=a
 this.b=b
 this.c=c
 this.d=d
-this.e=e}jl.builtin$cls="jl"
+this.e=e
+this.f=f}jl.builtin$cls="jl"
 if(!"name" in jl)jl.name="jl"
 $desc=$collectedClasses.jl
 if($desc instanceof Array)$desc=$desc[1]
 jl.prototype=$desc
+function Vg(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}Vg.builtin$cls="Vg"
+if(!"name" in Vg)Vg.name="Vg"
+$desc=$collectedClasses.Vg
+if($desc instanceof Array)$desc=$desc[1]
+Vg.prototype=$desc
 function Iy(){}Iy.builtin$cls="Iy"
 if(!"name" in Iy)Iy.name="Iy"
 $desc=$collectedClasses.Iy
@@ -26757,22 +26966,22 @@
 $desc=$collectedClasses.HU
 if($desc instanceof Array)$desc=$desc[1]
 HU.prototype=$desc
-function oo(){}oo.builtin$cls="oo"
-if(!"name" in oo)oo.name="oo"
-$desc=$collectedClasses.oo
+function Nt(){}Nt.builtin$cls="Nt"
+if(!"name" in Nt)Nt.name="Nt"
+$desc=$collectedClasses.Nt
 if($desc instanceof Array)$desc=$desc[1]
-oo.prototype=$desc
+Nt.prototype=$desc
 function OW(a,b){this.a=a
 this.b=b}OW.builtin$cls="OW"
 if(!"name" in OW)OW.name="OW"
 $desc=$collectedClasses.OW
 if($desc instanceof Array)$desc=$desc[1]
 OW.prototype=$desc
-function Dd(){}Dd.builtin$cls="Dd"
-if(!"name" in Dd)Dd.name="Dd"
-$desc=$collectedClasses.Dd
+function Tf(){}Tf.builtin$cls="Tf"
+if(!"name" in Tf)Tf.name="Tf"
+$desc=$collectedClasses.Tf
 if($desc instanceof Array)$desc=$desc[1]
-Dd.prototype=$desc
+Tf.prototype=$desc
 function AP(){}AP.builtin$cls="AP"
 if(!"name" in AP)AP.name="AP"
 $desc=$collectedClasses.AP
@@ -26831,18 +27040,12 @@
 if($desc instanceof Array)$desc=$desc[1]
 LPe.prototype=$desc
 LPe.prototype.gB=function(receiver){return this.B}
-function bw(a,b){this.a=a
-this.b=b}bw.builtin$cls="bw"
-if(!"name" in bw)bw.name="bw"
-$desc=$collectedClasses.bw
+function LD(a,b){this.a=a
+this.b=b}LD.builtin$cls="LD"
+if(!"name" in LD)LD.name="LD"
+$desc=$collectedClasses.LD
 if($desc instanceof Array)$desc=$desc[1]
-bw.prototype=$desc
-function WT(a,b){this.a=a
-this.b=b}WT.builtin$cls="WT"
-if(!"name" in WT)WT.name="WT"
-$desc=$collectedClasses.WT
-if($desc instanceof Array)$desc=$desc[1]
-WT.prototype=$desc
+LD.prototype=$desc
 function jJ(a){this.a=a}jJ.builtin$cls="jJ"
 if(!"name" in jJ)jJ.name="jJ"
 $desc=$collectedClasses.jJ
@@ -26887,18 +27090,26 @@
 $desc=$collectedClasses.F3
 if($desc instanceof Array)$desc=$desc[1]
 F3.prototype=$desc
-function FD(mr,Rn,XZ,Rv,hG,Mo,AM){this.mr=mr
+function FD(mr,Rn,XZ,Rv,hG,Mo,AM,NE){this.mr=mr
 this.Rn=Rn
 this.XZ=XZ
 this.Rv=Rv
 this.hG=hG
 this.Mo=Mo
-this.AM=AM}FD.builtin$cls="FD"
+this.AM=AM
+this.NE=NE}FD.builtin$cls="FD"
 if(!"name" in FD)FD.name="FD"
 $desc=$collectedClasses.FD
 if($desc instanceof Array)$desc=$desc[1]
 FD.prototype=$desc
 FD.prototype.gRn=function(receiver){return this.Rn}
+function Nv(a,b,c){this.a=a
+this.b=b
+this.c=c}Nv.builtin$cls="Nv"
+if(!"name" in Nv)Nv.name="Nv"
+$desc=$collectedClasses.Nv
+if($desc instanceof Array)$desc=$desc[1]
+Nv.prototype=$desc
 function Cj(a,b,c){this.a=a
 this.b=b
 this.c=c}Cj.builtin$cls="Cj"
@@ -27007,22 +27218,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(Jy){this.Jy=Jy}Ll.builtin$cls="Ll"
+function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
 if(!"name" in Ll)Ll.name="Ll"
 $desc=$collectedClasses.Ll
 if($desc instanceof Array)$desc=$desc[1]
 Ll.prototype=$desc
-function dN(Jy){this.Jy=Jy}dN.builtin$cls="dN"
-if(!"name" in dN)dN.name="dN"
-$desc=$collectedClasses.dN
+function D2(QW){this.QW=QW}D2.builtin$cls="D2"
+if(!"name" in D2)D2.name="D2"
+$desc=$collectedClasses.D2
 if($desc instanceof Array)$desc=$desc[1]
-dN.prototype=$desc
-function GT(oc){this.oc=oc}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+D2.prototype=$desc
+function my(oc){this.oc=oc}my.builtin$cls="my"
+if(!"name" in my)my.name="my"
+$desc=$collectedClasses.my
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
-GT.prototype.goc=function(receiver){return this.oc}
+my.prototype=$desc
+my.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27118,7 +27329,6 @@
 $desc=$collectedClasses.EK
 if($desc instanceof Array)$desc=$desc[1]
 EK.prototype=$desc
-EK.prototype.gQK=function(){return this.QK}
 function KW(Gf,rv){this.Gf=Gf
 this.rv=rv}KW.builtin$cls="KW"
 if(!"name" in KW)KW.name="KW"
@@ -27139,19 +27349,19 @@
 $desc=$collectedClasses.tQ
 if($desc instanceof Array)$desc=$desc[1]
 tQ.prototype=$desc
-function mL(Z6,zf,AJ,Eb,AP,fn){this.Z6=Z6
+function mL(Z6,zf,Eb,AJ,AP,Lk){this.Z6=Z6
 this.zf=zf
-this.AJ=AJ
 this.Eb=Eb
+this.AJ=AJ
 this.AP=AP
-this.fn=fn}mL.builtin$cls="mL"
+this.Lk=Lk}mL.builtin$cls="mL"
 if(!"name" in mL)mL.name="mL"
 $desc=$collectedClasses.mL
 if($desc instanceof Array)$desc=$desc[1]
 mL.prototype=$desc
 mL.prototype.gZ6=function(){return this.Z6}
 mL.prototype.gZ6.$reflectable=1
-mL.prototype.gzf=function(receiver){return this.zf}
+mL.prototype.gzf=function(){return this.zf}
 mL.prototype.gzf.$reflectable=1
 function Kf(Yb){this.Yb=Yb}Kf.builtin$cls="Kf"
 if(!"name" in Kf)Kf.name="Kf"
@@ -27166,79 +27376,10 @@
 if($desc instanceof Array)$desc=$desc[1]
 qu.prototype=$desc
 qu.prototype.gbG=function(receiver){return this.bG}
-function bv(zf,rI,we,jF,XR,Z0,hI,am,y6,c8,LE,qU,yg,YG,jy,AP,fn){this.zf=zf
-this.rI=rI
-this.we=we
-this.jF=jF
-this.XR=XR
-this.Z0=Z0
-this.hI=hI
-this.am=am
-this.y6=y6
-this.c8=c8
-this.LE=LE
-this.qU=qU
-this.yg=yg
-this.YG=YG
-this.jy=jy
-this.AP=AP
-this.fn=fn}bv.builtin$cls="bv"
-if(!"name" in bv)bv.name="bv"
-$desc=$collectedClasses.bv
-if($desc instanceof Array)$desc=$desc[1]
-bv.prototype=$desc
-bv.prototype.gzf=function(receiver){return this.zf}
-bv.prototype.gXR=function(){return this.XR}
-bv.prototype.gXR.$reflectable=1
-bv.prototype.gZ0=function(){return this.Z0}
-bv.prototype.gZ0.$reflectable=1
-bv.prototype.gLE=function(){return this.LE}
-bv.prototype.gLE.$reflectable=1
-function eS(a){this.a=a}eS.builtin$cls="eS"
-if(!"name" in eS)eS.name="eS"
-$desc=$collectedClasses.eS
-if($desc instanceof Array)$desc=$desc[1]
-eS.prototype=$desc
-function IQ(b){this.b=b}IQ.builtin$cls="IQ"
-if(!"name" in IQ)IQ.name="IQ"
-$desc=$collectedClasses.IQ
-if($desc instanceof Array)$desc=$desc[1]
-IQ.prototype=$desc
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function at(a,b){this.a=a
-this.b=b}at.builtin$cls="at"
-if(!"name" in at)at.name="at"
-$desc=$collectedClasses.at
-if($desc instanceof Array)$desc=$desc[1]
-at.prototype=$desc
-function wu(a,b){this.a=a
-this.b=b}wu.builtin$cls="wu"
-if(!"name" in wu)wu.name="wu"
-$desc=$collectedClasses.wu
-if($desc instanceof Array)$desc=$desc[1]
-wu.prototype=$desc
-function Vc(c,d){this.c=c
-this.d=d}Vc.builtin$cls="Vc"
-if(!"name" in Vc)Vc.name="Vc"
-$desc=$collectedClasses.Vc
-if($desc instanceof Array)$desc=$desc[1]
-Vc.prototype=$desc
-function KQ(a,b){this.a=a
-this.b=b}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
-if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
-function dZ(ec,jF,JL,MU,AP,fn){this.ec=ec
-this.jF=jF
+function dZ(ec,JL,AP,Lk){this.ec=ec
 this.JL=JL
-this.MU=MU
 this.AP=AP
-this.fn=fn}dZ.builtin$cls="dZ"
+this.Lk=Lk}dZ.builtin$cls="dZ"
 if(!"name" in dZ)dZ.name="dZ"
 $desc=$collectedClasses.dZ
 if($desc instanceof Array)$desc=$desc[1]
@@ -27249,142 +27390,6 @@
 $desc=$collectedClasses.Qe
 if($desc instanceof Array)$desc=$desc[1]
 Qe.prototype=$desc
-function GH(a){this.a=a}GH.builtin$cls="GH"
-if(!"name" in GH)GH.name="GH"
-$desc=$collectedClasses.GH
-if($desc instanceof Array)$desc=$desc[1]
-GH.prototype=$desc
-function Q4(Yu,m7,L4,NC,xb,AP,fn){this.Yu=Yu
-this.m7=m7
-this.L4=L4
-this.NC=NC
-this.xb=xb
-this.AP=AP
-this.fn=fn}Q4.builtin$cls="Q4"
-if(!"name" in Q4)Q4.name="Q4"
-$desc=$collectedClasses.Q4
-if($desc instanceof Array)$desc=$desc[1]
-Q4.prototype=$desc
-Q4.prototype.gYu=function(){return this.Yu}
-Q4.prototype.gYu.$reflectable=1
-Q4.prototype.gm7=function(){return this.m7}
-Q4.prototype.gm7.$reflectable=1
-Q4.prototype.gL4=function(){return this.L4}
-Q4.prototype.gL4.$reflectable=1
-function WAE(Zd){this.Zd=Zd}WAE.builtin$cls="WAE"
-if(!"name" in WAE)WAE.name="WAE"
-$desc=$collectedClasses.WAE
-if($desc instanceof Array)$desc=$desc[1]
-WAE.prototype=$desc
-function N8(Yu,pO,Iw){this.Yu=Yu
-this.pO=pO
-this.Iw=Iw}N8.builtin$cls="N8"
-if(!"name" in N8)N8.name="N8"
-$desc=$collectedClasses.N8
-if($desc instanceof Array)$desc=$desc[1]
-N8.prototype=$desc
-N8.prototype.gYu=function(){return this.Yu}
-function Vi(tT,Av){this.tT=tT
-this.Av=Av}Vi.builtin$cls="Vi"
-if(!"name" in Vi)Vi.name="Vi"
-$desc=$collectedClasses.Vi
-if($desc instanceof Array)$desc=$desc[1]
-Vi.prototype=$desc
-Vi.prototype.gtT=function(receiver){return this.tT}
-Vi.prototype.gAv=function(){return this.Av}
-function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,tQ,Ge,hI,HJ,AP,fn){this.fY=fY
-this.vg=vg
-this.Mb=Mb
-this.a0=a0
-this.VS=VS
-this.hw=hw
-this.fF=fF
-this.Du=Du
-this.va=va
-this.tQ=tQ
-this.Ge=Ge
-this.hI=hI
-this.HJ=HJ
-this.AP=AP
-this.fn=fn}kx.builtin$cls="kx"
-if(!"name" in kx)kx.name="kx"
-$desc=$collectedClasses.kx
-if($desc instanceof Array)$desc=$desc[1]
-kx.prototype=$desc
-kx.prototype.gfY=function(receiver){return this.fY}
-kx.prototype.ga0=function(){return this.a0}
-kx.prototype.gVS=function(){return this.VS}
-kx.prototype.gfF=function(){return this.fF}
-kx.prototype.gDu=function(){return this.Du}
-kx.prototype.gva=function(){return this.va}
-kx.prototype.gva.$reflectable=1
-function fx(){}fx.builtin$cls="fx"
-if(!"name" in fx)fx.name="fx"
-$desc=$collectedClasses.fx
-if($desc instanceof Array)$desc=$desc[1]
-fx.prototype=$desc
-function CM(Aq,tm,hV){this.Aq=Aq
-this.tm=tm
-this.hV=hV}CM.builtin$cls="CM"
-if(!"name" in CM)CM.name="CM"
-$desc=$collectedClasses.CM
-if($desc instanceof Array)$desc=$desc[1]
-CM.prototype=$desc
-CM.prototype.gAq=function(receiver){return this.Aq}
-CM.prototype.ghV=function(){return this.hV}
-function xn(a){this.a=a}xn.builtin$cls="xn"
-if(!"name" in xn)xn.name="xn"
-$desc=$collectedClasses.xn
-if($desc instanceof Array)$desc=$desc[1]
-xn.prototype=$desc
-function vu(){}vu.builtin$cls="vu"
-if(!"name" in vu)vu.name="vu"
-$desc=$collectedClasses.vu
-if($desc instanceof Array)$desc=$desc[1]
-vu.prototype=$desc
-function c2(Rd,ye,i0,AP,fn){this.Rd=Rd
-this.ye=ye
-this.i0=i0
-this.AP=AP
-this.fn=fn}c2.builtin$cls="c2"
-if(!"name" in c2)c2.name="c2"
-$desc=$collectedClasses.c2
-if($desc instanceof Array)$desc=$desc[1]
-c2.prototype=$desc
-c2.prototype.gRd=function(receiver){return this.Rd}
-c2.prototype.gRd.$reflectable=1
-function rj(I2,VG,pw,tq,Sw,iA,AP,fn){this.I2=I2
-this.VG=VG
-this.pw=pw
-this.tq=tq
-this.Sw=Sw
-this.iA=iA
-this.AP=AP
-this.fn=fn}rj.builtin$cls="rj"
-if(!"name" in rj)rj.name="rj"
-$desc=$collectedClasses.rj
-if($desc instanceof Array)$desc=$desc[1]
-rj.prototype=$desc
-rj.prototype.gSw=function(){return this.Sw}
-rj.prototype.gSw.$reflectable=1
-function af(Aq){this.Aq=Aq}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gAq=function(receiver){return this.Aq}
-function SI(YY,Aq,rI,we,R9,wv,V2,me){this.YY=YY
-this.Aq=Aq
-this.rI=rI
-this.we=we
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}SI.builtin$cls="SI"
-if(!"name" in SI)SI.name="SI"
-$desc=$collectedClasses.SI
-if($desc instanceof Array)$desc=$desc[1]
-SI.prototype=$desc
 function Y2(eT,yt,wd,oH){this.eT=eT
 this.yt=yt
 this.wd=wd
@@ -27400,89 +27405,21 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rO,WT,AP,fn){this.rO=rO
+function XN(rI,WT,AP,Lk){this.rI=rI
 this.WT=WT
 this.AP=AP
-this.fn=fn}XN.builtin$cls="XN"
+this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
 $desc=$collectedClasses.XN
 if($desc instanceof Array)$desc=$desc[1]
 XN.prototype=$desc
 XN.prototype.gWT=function(receiver){return this.WT}
 XN.prototype.gWT.$reflectable=1
-function No(ec,i2){this.ec=ec
-this.i2=i2}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.sec=function(v){return this.ec=v}
-No.prototype.gi2=function(){return this.i2}
-No.prototype.gi2.$reflectable=1
-function PG(){}PG.builtin$cls="PG"
-if(!"name" in PG)PG.name="PG"
-$desc=$collectedClasses.PG
-if($desc instanceof Array)$desc=$desc[1]
-PG.prototype=$desc
-function YW(){}YW.builtin$cls="YW"
-if(!"name" in YW)YW.name="YW"
-$desc=$collectedClasses.YW
-if($desc instanceof Array)$desc=$desc[1]
-YW.prototype=$desc
-function BO(a){this.a=a}BO.builtin$cls="BO"
-if(!"name" in BO)BO.name="BO"
-$desc=$collectedClasses.BO
-if($desc instanceof Array)$desc=$desc[1]
-BO.prototype=$desc
-function Yu(a,b){this.a=a
-this.b=b}Yu.builtin$cls="Yu"
-if(!"name" in Yu)Yu.name="Yu"
-$desc=$collectedClasses.Yu
-if($desc instanceof Array)$desc=$desc[1]
-Yu.prototype=$desc
-function y2(c){this.c=c}y2.builtin$cls="y2"
-if(!"name" in y2)y2.name="y2"
-$desc=$collectedClasses.y2
-if($desc instanceof Array)$desc=$desc[1]
-y2.prototype=$desc
-function Hq(d){this.d=d}Hq.builtin$cls="Hq"
-if(!"name" in Hq)Hq.name="Hq"
-$desc=$collectedClasses.Hq
-if($desc instanceof Array)$desc=$desc[1]
-Hq.prototype=$desc
-function Pl(a){this.a=a}Pl.builtin$cls="Pl"
-if(!"name" in Pl)Pl.name="Pl"
-$desc=$collectedClasses.Pl
-if($desc instanceof Array)$desc=$desc[1]
-Pl.prototype=$desc
-function XK(Yu,ec,i2,AP,fn){this.Yu=Yu
-this.ec=ec
-this.i2=i2
+function G6(BW,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
 this.AP=AP
-this.fn=fn}XK.builtin$cls="XK"
-if(!"name" in XK)XK.name="XK"
-$desc=$collectedClasses.XK
-if($desc instanceof Array)$desc=$desc[1]
-XK.prototype=$desc
-XK.prototype.gYu=function(){return this.Yu}
-function ho(Ct,pL,ec,i2,AP,fn){this.Ct=Ct
-this.pL=pL
-this.ec=ec
-this.i2=i2
+this.Lk=Lk
 this.AP=AP
-this.fn=fn}ho.builtin$cls="ho"
-if(!"name" in ho)ho.name="ho"
-$desc=$collectedClasses.ho
-if($desc instanceof Array)$desc=$desc[1]
-ho.prototype=$desc
-function G6(BW,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
-this.AP=AP
-this.fn=fn
-this.pC=pC
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27499,30 +27436,17 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Ur(){}Ur.builtin$cls="Ur"
-if(!"name" in Ur)Ur.name="Ur"
-$desc=$collectedClasses.Ur
+function Vf(){}Vf.builtin$cls="Vf"
+if(!"name" in Vf)Vf.name="Vf"
+$desc=$collectedClasses.Vf
 if($desc instanceof Array)$desc=$desc[1]
-Ur.prototype=$desc
-function j3(a){this.a=a}j3.builtin$cls="j3"
-if(!"name" in j3)j3.name="j3"
-$desc=$collectedClasses.j3
-if($desc instanceof Array)$desc=$desc[1]
-j3.prototype=$desc
-function i0(){}i0.builtin$cls="i0"
-if(!"name" in i0)i0.name="i0"
-$desc=$collectedClasses.i0
-if($desc instanceof Array)$desc=$desc[1]
-i0.prototype=$desc
-function Tg(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+Vf.prototype=$desc
+function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27535,14 +27459,11 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Ps(F0,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27550,39 +27471,26 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Ps.builtin$cls="Ps"
-if(!"name" in Ps)Ps.name="Ps"
-$desc=$collectedClasses.Ps
+this.X0=X0}Jc.builtin$cls="Jc"
+if(!"name" in Jc)Jc.name="Jc"
+$desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
-Ps.prototype=$desc
-Ps.prototype.gF0=function(receiver){return receiver.F0}
-Ps.prototype.gF0.$reflectable=1
-Ps.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Ps.prototype.sF0.$reflectable=1
-function KU(){}KU.builtin$cls="KU"
-if(!"name" in KU)KU.name="KU"
-$desc=$collectedClasses.KU
+Jc.prototype=$desc
+Jc.prototype.gF0=function(receiver){return receiver.F0}
+Jc.prototype.gF0.$reflectable=1
+Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
+Jc.prototype.sF0.$reflectable=1
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-KU.prototype=$desc
-function RI(a){this.a=a}RI.builtin$cls="RI"
-if(!"name" in RI)RI.name="RI"
-$desc=$collectedClasses.RI
-if($desc instanceof Array)$desc=$desc[1]
-RI.prototype=$desc
-function Ye(){}Ye.builtin$cls="Ye"
-if(!"name" in Ye)Ye.name="Ye"
-$desc=$collectedClasses.Ye
-if($desc instanceof Array)$desc=$desc[1]
-Ye.prototype=$desc
-function CN(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+pv.prototype=$desc
+function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27595,14 +27503,11 @@
 $desc=$collectedClasses.CN
 if($desc instanceof Array)$desc=$desc[1]
 CN.prototype=$desc
-function HT(eJ,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
+function Be(Xx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xx=Xx
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27610,27 +27515,27 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}HT.builtin$cls="HT"
-if(!"name" in HT)HT.name="HT"
-$desc=$collectedClasses.HT
+this.X0=X0}Be.builtin$cls="Be"
+if(!"name" in Be)Be.name="Be"
+$desc=$collectedClasses.Be
 if($desc instanceof Array)$desc=$desc[1]
-HT.prototype=$desc
-HT.prototype.geJ=function(receiver){return receiver.eJ}
-HT.prototype.geJ.$reflectable=1
-HT.prototype.seJ=function(receiver,v){return receiver.eJ=v}
-HT.prototype.seJ.$reflectable=1
-function qbd(){}qbd.builtin$cls="qbd"
-if(!"name" in qbd)qbd.name="qbd"
-$desc=$collectedClasses.qbd
+Be.prototype=$desc
+Be.prototype.gXx=function(receiver){return receiver.Xx}
+Be.prototype.gXx.$reflectable=1
+Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
+Be.prototype.sXx.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-qbd.prototype=$desc
-function E0(zh,HX,Uy,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
+Vfx.prototype=$desc
+function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27655,18 +27560,18 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
-function lw(GV,Hu,nx,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
+Dsd.prototype=$desc
+function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27764,32 +27669,14 @@
 $desc=$collectedClasses.kV
 if($desc instanceof Array)$desc=$desc[1]
 kV.prototype=$desc
-function rR(OI,T6,TQ,lo){this.OI=OI
+function rR(OI,T6,C2,lo){this.OI=OI
 this.T6=T6
-this.TQ=TQ
+this.C2=C2
 this.lo=lo}rR.builtin$cls="rR"
 if(!"name" in rR)rR.name="rR"
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function H6(l6,FT){this.l6=l6
-this.FT=FT}H6.builtin$cls="H6"
-if(!"name" in H6)H6.name="H6"
-$desc=$collectedClasses.H6
-if($desc instanceof Array)$desc=$desc[1]
-H6.prototype=$desc
-function wB(l6,FT){this.l6=l6
-this.FT=FT}wB.builtin$cls="wB"
-if(!"name" in wB)wB.name="wB"
-$desc=$collectedClasses.wB
-if($desc instanceof Array)$desc=$desc[1]
-wB.prototype=$desc
-function U1(OI,FT){this.OI=OI
-this.FT=FT}U1.builtin$cls="U1"
-if(!"name" in U1)U1.name="U1"
-$desc=$collectedClasses.U1
-if($desc instanceof Array)$desc=$desc[1]
-U1.prototype=$desc
 function SJ(){}SJ.builtin$cls="SJ"
 if(!"name" in SJ)SJ.name="SJ"
 $desc=$collectedClasses.SJ
@@ -27800,11 +27687,11 @@
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Qr(){}Qr.builtin$cls="Qr"
-if(!"name" in Qr)Qr.name="Qr"
-$desc=$collectedClasses.Qr
+function Tv(){}Tv.builtin$cls="Tv"
+if(!"name" in Tv)Tv.name="Tv"
+$desc=$collectedClasses.Tv
 if($desc instanceof Array)$desc=$desc[1]
-Qr.prototype=$desc
+Tv.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27821,23 +27708,23 @@
 if($desc instanceof Array)$desc=$desc[1]
 GD.prototype=$desc
 GD.prototype.gfN=function(receiver){return this.fN}
-function Sn(L5,Aq){this.L5=L5
-this.Aq=Aq}Sn.builtin$cls="Sn"
+function Sn(L5,F1){this.L5=L5
+this.F1=F1}Sn.builtin$cls="Sn"
 if(!"name" in Sn)Sn.name="Sn"
 $desc=$collectedClasses.Sn
 if($desc instanceof Array)$desc=$desc[1]
 Sn.prototype=$desc
-Sn.prototype.gAq=function(receiver){return this.Aq}
+Sn.prototype.gF1=function(receiver){return this.F1}
 function nI(){}nI.builtin$cls="nI"
 if(!"name" in nI)nI.name="nI"
 $desc=$collectedClasses.nI
 if($desc instanceof Array)$desc=$desc[1]
 nI.prototype=$desc
-function TY(){}TY.builtin$cls="TY"
-if(!"name" in TY)TY.name="TY"
-$desc=$collectedClasses.TY
+function jU(){}jU.builtin$cls="jU"
+if(!"name" in jU)jU.name="jU"
+$desc=$collectedClasses.jU
 if($desc instanceof Array)$desc=$desc[1]
-TY.prototype=$desc
+jU.prototype=$desc
 function Lj(MA){this.MA=MA}Lj.builtin$cls="Lj"
 if(!"name" in Lj)Lj.name="Lj"
 $desc=$collectedClasses.Lj
@@ -27848,14 +27735,14 @@
 $desc=$collectedClasses.mb
 if($desc instanceof Array)$desc=$desc[1]
 mb.prototype=$desc
-function am(If){this.If=If}am.builtin$cls="am"
-if(!"name" in am)am.name="am"
-$desc=$collectedClasses.am
+function cb(If){this.If=If}cb.builtin$cls="cb"
+if(!"name" in cb)cb.name="cb"
+$desc=$collectedClasses.cb
 if($desc instanceof Array)$desc=$desc[1]
-am.prototype=$desc
-am.prototype.gIf=function(){return this.If}
-function cw(XP,xW,Nz,LQ,If){this.XP=XP
-this.xW=xW
+cb.prototype=$desc
+cb.prototype.gIf=function(){return this.If}
+function cw(XP,yG,Nz,LQ,If){this.XP=XP
+this.yG=yG
 this.Nz=Nz
 this.LQ=LQ
 this.If=If}cw.builtin$cls="cw"
@@ -27914,10 +27801,10 @@
 $desc=$collectedClasses.YX
 if($desc instanceof Array)$desc=$desc[1]
 YX.prototype=$desc
-function BI(AY,XW,BB,Ra,If){this.AY=AY
+function BI(AY,XW,BB,i1,If){this.AY=AY
 this.XW=XW
 this.BB=BB
-this.Ra=Ra
+this.i1=i1
 this.If=If}BI.builtin$cls="BI"
 if(!"name" in BI)BI.name="BI"
 $desc=$collectedClasses.BI
@@ -27946,7 +27833,7 @@
 $desc=$collectedClasses.mg
 if($desc instanceof Array)$desc=$desc[1]
 mg.prototype=$desc
-function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If){this.NK=NK
+function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If){this.NK=NK
 this.EZ=EZ
 this.ut=ut
 this.Db=Db
@@ -27959,7 +27846,7 @@
 this.qu=qu
 this.qN=qN
 this.qm=qm
-this.Ra=Ra
+this.i1=i1
 this.RH=RH
 this.If=If}bl.builtin$cls="bl"
 if(!"name" in bl)bl.name="bl"
@@ -27986,7 +27873,7 @@
 $desc=$collectedClasses.Ax
 if($desc instanceof Array)$desc=$desc[1]
 Ax.prototype=$desc
-function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If){this.Cr=Cr
+function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If){this.Cr=Cr
 this.Tx=Tx
 this.H8=H8
 this.Ht=Ht
@@ -28005,9 +27892,9 @@
 this.xO=xO
 this.qm=qm
 this.UF=UF
-this.Ra=Ra
+this.i1=i1
 this.RH=RH
-this.nz=nz
+this.jE=jE
 this.If=If}Wf.builtin$cls="Wf"
 if(!"name" in Wf)Wf.name="Wf"
 $desc=$collectedClasses.Wf
@@ -28025,21 +27912,21 @@
 $desc=$collectedClasses.Ei
 if($desc instanceof Array)$desc=$desc[1]
 Ei.prototype=$desc
-function U7(b){this.b=b}U7.builtin$cls="U7"
-if(!"name" in U7)U7.name="U7"
-$desc=$collectedClasses.U7
+function Ci(b){this.b=b}Ci.builtin$cls="Ci"
+if(!"name" in Ci)Ci.name="Ci"
+$desc=$collectedClasses.Ci
 if($desc instanceof Array)$desc=$desc[1]
-U7.prototype=$desc
+Ci.prototype=$desc
 function t0(a){this.a=a}t0.builtin$cls="t0"
 if(!"name" in t0)t0.name="t0"
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,nz,Ay,le,If){this.ao=ao
+function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
-this.nz=nz
+this.jE=jE
 this.Ay=Ay
 this.le=le
 this.If=If}Ld.builtin$cls="Ld"
@@ -28048,7 +27935,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 Ld.prototype=$desc
 Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(){return this.V5}
+Ld.prototype.gV5=function(receiver){return this.V5}
 Ld.prototype.gFo=function(){return this.Fo}
 Ld.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
@@ -28057,14 +27944,14 @@
 $desc=$collectedClasses.Sz
 if($desc instanceof Array)$desc=$desc[1]
 Sz.prototype=$desc
-function Zk(dl,Yq,lT,hB,Fo,xV,qx,nz,le,wM,H3,If){this.dl=dl
+function Zk(dl,Yq,lT,hB,Fo,xV,qx,jE,le,wM,H3,If){this.dl=dl
 this.Yq=Yq
 this.lT=lT
 this.hB=hB
 this.Fo=Fo
 this.xV=xV
 this.qx=qx
-this.nz=nz
+this.jE=jE
 this.le=le
 this.wM=wM
 this.H3=H3
@@ -28183,16 +28070,16 @@
 JI.prototype.siE=function(v){return this.iE=v}
 JI.prototype.gSJ=function(){return this.SJ}
 JI.prototype.sSJ=function(v){return this.SJ=v}
-function LO(iE,SJ){this.iE=iE
-this.SJ=SJ}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function WVu(iE,SJ){this.iE=iE
+this.SJ=SJ}WVu.builtin$cls="WVu"
+if(!"name" in WVu)WVu.name="WVu"
+$desc=$collectedClasses.WVu
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
-LO.prototype.giE=function(){return this.iE}
-LO.prototype.siE=function(v){return this.iE=v}
-LO.prototype.gSJ=function(){return this.SJ}
-LO.prototype.sSJ=function(v){return this.SJ=v}
+WVu.prototype=$desc
+WVu.prototype.giE=function(){return this.iE}
+WVu.prototype.siE=function(v){return this.iE=v}
+WVu.prototype.gSJ=function(){return this.SJ}
+WVu.prototype.sSJ=function(v){return this.SJ=v}
 function dz(nL,QC,Gv,iE,SJ,WX,Ip){this.nL=nL
 this.QC=QC
 this.Gv=Gv
@@ -28238,19 +28125,6 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
-function j7(a,b){this.a=a
-this.b=b}j7.builtin$cls="j7"
-if(!"name" in j7)j7.name="j7"
-$desc=$collectedClasses.j7
-if($desc instanceof Array)$desc=$desc[1]
-j7.prototype=$desc
-function ff(a,c,d){this.a=a
-this.c=c
-this.d=d}ff.builtin$cls="ff"
-if(!"name" in ff)ff.name="ff"
-$desc=$collectedClasses.ff
-if($desc instanceof Array)$desc=$desc[1]
-ff.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28282,22 +28156,28 @@
 $desc=$collectedClasses.da
 if($desc instanceof Array)$desc=$desc[1]
 da.prototype=$desc
-function xw(a){this.a=a}xw.builtin$cls="xw"
-if(!"name" in xw)xw.name="xw"
-$desc=$collectedClasses.xw
+function pV(a){this.a=a}pV.builtin$cls="pV"
+if(!"name" in pV)pV.name="pV"
+$desc=$collectedClasses.pV
 if($desc instanceof Array)$desc=$desc[1]
-xw.prototype=$desc
-function dm(b){this.b=b}dm.builtin$cls="dm"
-if(!"name" in dm)dm.name="dm"
-$desc=$collectedClasses.dm
+pV.prototype=$desc
+function U7(b){this.b=b}U7.builtin$cls="U7"
+if(!"name" in U7)U7.name="U7"
+$desc=$collectedClasses.U7
 if($desc instanceof Array)$desc=$desc[1]
-dm.prototype=$desc
+U7.prototype=$desc
 function rH(a,b){this.a=a
 this.b=b}rH.builtin$cls="rH"
 if(!"name" in rH)rH.name="rH"
 $desc=$collectedClasses.rH
 if($desc instanceof Array)$desc=$desc[1]
 rH.prototype=$desc
+function cX(c,d){this.c=c
+this.d=d}cX.builtin$cls="cX"
+if(!"name" in cX)cX.name="cX"
+$desc=$collectedClasses.cX
+if($desc instanceof Array)$desc=$desc[1]
+cX.prototype=$desc
 function ZL(a,b,c){this.a=a
 this.b=b
 this.c=c}ZL.builtin$cls="ZL"
@@ -28305,39 +28185,39 @@
 $desc=$collectedClasses.ZL
 if($desc instanceof Array)$desc=$desc[1]
 ZL.prototype=$desc
-function rq(b,c,d,e){this.b=b
-this.c=c
+function rq(b,d,e,f){this.b=b
 this.d=d
-this.e=e}rq.builtin$cls="rq"
+this.e=e
+this.f=f}rq.builtin$cls="rq"
 if(!"name" in rq)rq.name="rq"
 $desc=$collectedClasses.rq
 if($desc instanceof Array)$desc=$desc[1]
 rq.prototype=$desc
-function RW(c,b,f,UI){this.c=c
+function RW(c,b,UI,bK){this.c=c
 this.b=b
-this.f=f
-this.UI=UI}RW.builtin$cls="RW"
+this.UI=UI
+this.bK=bK}RW.builtin$cls="RW"
 if(!"name" in RW)RW.name="RW"
 $desc=$collectedClasses.RW
 if($desc instanceof Array)$desc=$desc[1]
 RW.prototype=$desc
-function RT(c,b,bK,Gq,Rm){this.c=c
+function RT(c,b,Gq,Rm,w3){this.c=c
 this.b=b
-this.bK=bK
 this.Gq=Gq
-this.Rm=Rm}RT.builtin$cls="RT"
+this.Rm=Rm
+this.w3=w3}RT.builtin$cls="RT"
 if(!"name" in RT)RT.name="RT"
 $desc=$collectedClasses.RT
 if($desc instanceof Array)$desc=$desc[1]
 RT.prototype=$desc
-function jZ(c,w3){this.c=c
-this.w3=w3}jZ.builtin$cls="jZ"
+function jZ(c,HZ){this.c=c
+this.HZ=HZ}jZ.builtin$cls="jZ"
 if(!"name" in jZ)jZ.name="jZ"
 $desc=$collectedClasses.jZ
 if($desc instanceof Array)$desc=$desc[1]
 jZ.prototype=$desc
-function FZ(a,HZ){this.a=a
-this.HZ=HZ}FZ.builtin$cls="FZ"
+function FZ(a,mG){this.a=a
+this.mG=mG}FZ.builtin$cls="FZ"
 if(!"name" in FZ)FZ.name="FZ"
 $desc=$collectedClasses.FZ
 if($desc instanceof Array)$desc=$desc[1]
@@ -28356,14 +28236,14 @@
 $desc=$collectedClasses.qh
 if($desc instanceof Array)$desc=$desc[1]
 qh.prototype=$desc
-function tG(a,b,c,d){this.a=a
+function YJ(a,b,c,d){this.a=a
 this.b=b
 this.c=c
-this.d=d}tG.builtin$cls="tG"
-if(!"name" in tG)tG.name="tG"
-$desc=$collectedClasses.tG
+this.d=d}YJ.builtin$cls="YJ"
+if(!"name" in YJ)YJ.name="YJ"
+$desc=$collectedClasses.YJ
 if($desc instanceof Array)$desc=$desc[1]
-tG.prototype=$desc
+YJ.prototype=$desc
 function jv(e,f){this.e=e
 this.f=f}jv.builtin$cls="jv"
 if(!"name" in jv)jv.name="jv"
@@ -28376,11 +28256,11 @@
 $desc=$collectedClasses.LB
 if($desc instanceof Array)$desc=$desc[1]
 LB.prototype=$desc
-function zn(bK){this.bK=bK}zn.builtin$cls="zn"
-if(!"name" in zn)zn.name="zn"
-$desc=$collectedClasses.zn
+function DO(bK){this.bK=bK}DO.builtin$cls="DO"
+if(!"name" in DO)DO.name="DO"
+$desc=$collectedClasses.DO
 if($desc instanceof Array)$desc=$desc[1]
-zn.prototype=$desc
+DO.prototype=$desc
 function lz(a,b,c,d){this.a=a
 this.b=b
 this.c=c
@@ -28430,17 +28310,17 @@
 $desc=$collectedClasses.eN
 if($desc instanceof Array)$desc=$desc[1]
 eN.prototype=$desc
-function PI(a){this.a=a}PI.builtin$cls="PI"
+function B5(a){this.a=a}B5.builtin$cls="B5"
+if(!"name" in B5)B5.name="B5"
+$desc=$collectedClasses.B5
+if($desc instanceof Array)$desc=$desc[1]
+B5.prototype=$desc
+function PI(a,b){this.a=a
+this.b=b}PI.builtin$cls="PI"
 if(!"name" in PI)PI.name="PI"
 $desc=$collectedClasses.PI
 if($desc instanceof Array)$desc=$desc[1]
 PI.prototype=$desc
-function uO(a,b){this.a=a
-this.b=b}uO.builtin$cls="uO"
-if(!"name" in uO)uO.name="uO"
-$desc=$collectedClasses.uO
-if($desc instanceof Array)$desc=$desc[1]
-uO.prototype=$desc
 function j4(a,b){this.a=a
 this.b=b}j4.builtin$cls="j4"
 if(!"name" in j4)j4.name="j4"
@@ -28488,19 +28368,19 @@
 $desc=$collectedClasses.Z5
 if($desc instanceof Array)$desc=$desc[1]
 Z5.prototype=$desc
-function ii(a,b,c){this.a=a
+function j5(a,b,c){this.a=a
 this.b=b
-this.c=c}ii.builtin$cls="ii"
+this.c=c}j5.builtin$cls="j5"
+if(!"name" in j5)j5.name="j5"
+$desc=$collectedClasses.j5
+if($desc instanceof Array)$desc=$desc[1]
+j5.prototype=$desc
+function ii(a,d){this.a=a
+this.d=d}ii.builtin$cls="ii"
 if(!"name" in ii)ii.name="ii"
 $desc=$collectedClasses.ii
 if($desc instanceof Array)$desc=$desc[1]
 ii.prototype=$desc
-function ib(a,d){this.a=a
-this.d=d}ib.builtin$cls="ib"
-if(!"name" in ib)ib.name="ib"
-$desc=$collectedClasses.ib
-if($desc instanceof Array)$desc=$desc[1]
-ib.prototype=$desc
 function MO(){}MO.builtin$cls="MO"
 if(!"name" in MO)MO.name="MO"
 $desc=$collectedClasses.MO
@@ -28552,13 +28432,13 @@
 $desc=$collectedClasses.ez
 if($desc instanceof Array)$desc=$desc[1]
 ez.prototype=$desc
-function ti(aw){this.aw=aw}ti.builtin$cls="ti"
-if(!"name" in ti)ti.name="ti"
-$desc=$collectedClasses.ti
+function fIm(aw){this.aw=aw}fIm.builtin$cls="fIm"
+if(!"name" in fIm)fIm.name="fIm"
+$desc=$collectedClasses.fIm
 if($desc instanceof Array)$desc=$desc[1]
-ti.prototype=$desc
-ti.prototype.gaw=function(){return this.aw}
-ti.prototype.saw=function(v){return this.aw=v}
+fIm.prototype=$desc
+fIm.prototype.gaw=function(){return this.aw}
+fIm.prototype.saw=function(v){return this.aw=v}
 function LV(P,aw){this.P=P
 this.aw=aw}LV.builtin$cls="LV"
 if(!"name" in LV)LV.name="LV"
@@ -28611,12 +28491,12 @@
 $desc=$collectedClasses.uR
 if($desc instanceof Array)$desc=$desc[1]
 uR.prototype=$desc
-function Q0(a,b){this.a=a
-this.b=b}Q0.builtin$cls="Q0"
-if(!"name" in Q0)Q0.name="Q0"
-$desc=$collectedClasses.Q0
+function GU(a,b){this.a=a
+this.b=b}GU.builtin$cls="GU"
+if(!"name" in GU)GU.name="GU"
+$desc=$collectedClasses.GU
 if($desc instanceof Array)$desc=$desc[1]
-Q0.prototype=$desc
+GU.prototype=$desc
 function YR(){}YR.builtin$cls="YR"
 if(!"name" in YR)YR.name="YR"
 $desc=$collectedClasses.YR
@@ -28647,17 +28527,11 @@
 $desc=$collectedClasses.t3
 if($desc instanceof Array)$desc=$desc[1]
 t3.prototype=$desc
-function dq(Em,Sb){this.Em=Em
-this.Sb=Sb}dq.builtin$cls="dq"
-if(!"name" in dq)dq.name="dq"
-$desc=$collectedClasses.dq
+function tU(){}tU.builtin$cls="tU"
+if(!"name" in tU)tU.name="tU"
+$desc=$collectedClasses.tU
 if($desc instanceof Array)$desc=$desc[1]
-dq.prototype=$desc
-function lO(){}lO.builtin$cls="lO"
-if(!"name" in lO)lO.name="lO"
-$desc=$collectedClasses.lO
-if($desc instanceof Array)$desc=$desc[1]
-lO.prototype=$desc
+tU.prototype=$desc
 function aY(){}aY.builtin$cls="aY"
 if(!"name" in aY)aY.name="aY"
 $desc=$collectedClasses.aY
@@ -28695,11 +28569,11 @@
 $desc=$collectedClasses.e4
 if($desc instanceof Array)$desc=$desc[1]
 e4.prototype=$desc
-function JB(){}JB.builtin$cls="JB"
-if(!"name" in JB)JB.name="JB"
-$desc=$collectedClasses.JB
+function dl(){}dl.builtin$cls="dl"
+if(!"name" in dl)dl.name="dl"
+$desc=$collectedClasses.dl
 if($desc instanceof Array)$desc=$desc[1]
-JB.prototype=$desc
+dl.prototype=$desc
 function Id(oh){this.oh=oh}Id.builtin$cls="Id"
 if(!"name" in Id)Id.name="Id"
 $desc=$collectedClasses.Id
@@ -28740,12 +28614,12 @@
 $desc=$collectedClasses.dv
 if($desc instanceof Array)$desc=$desc[1]
 dv.prototype=$desc
-function pV(c,d){this.c=c
-this.d=d}pV.builtin$cls="pV"
-if(!"name" in pV)pV.name="pV"
-$desc=$collectedClasses.pV
+function ph(c,d){this.c=c
+this.d=d}ph.builtin$cls="ph"
+if(!"name" in ph)ph.name="ph"
+$desc=$collectedClasses.ph
 if($desc instanceof Array)$desc=$desc[1]
-pV.prototype=$desc
+ph.prototype=$desc
 function uo(eT,zU,R1){this.eT=eT
 this.zU=zU
 this.R1=R1}uo.builtin$cls="uo"
@@ -28772,11 +28646,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function nU(){}nU.builtin$cls="nU"
-if(!"name" in nU)nU.name="nU"
-$desc=$collectedClasses.nU
+function W5(){}W5.builtin$cls="W5"
+if(!"name" in W5)W5.name="W5"
+$desc=$collectedClasses.W5
 if($desc instanceof Array)$desc=$desc[1]
-nU.prototype=$desc
+W5.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -28873,36 +28747,6 @@
 $desc=$collectedClasses.S9
 if($desc instanceof Array)$desc=$desc[1]
 S9.prototype=$desc
-function ey(X5,vv,OX,OB,H9,lX,zN){this.X5=X5
-this.vv=vv
-this.OX=OX
-this.OB=OB
-this.H9=H9
-this.lX=lX
-this.zN=zN}ey.builtin$cls="ey"
-if(!"name" in ey)ey.name="ey"
-$desc=$collectedClasses.ey
-if($desc instanceof Array)$desc=$desc[1]
-ey.prototype=$desc
-function xd(m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN){this.m6=m6
-this.Q6=Q6
-this.ac=ac
-this.X5=X5
-this.vv=vv
-this.OX=OX
-this.OB=OB
-this.H9=H9
-this.lX=lX
-this.zN=zN}xd.builtin$cls="xd"
-if(!"name" in xd)xd.name="xd"
-$desc=$collectedClasses.xd
-if($desc instanceof Array)$desc=$desc[1]
-xd.prototype=$desc
-function v6(a){this.a=a}v6.builtin$cls="v6"
-if(!"name" in v6)v6.name="v6"
-$desc=$collectedClasses.v6
-if($desc instanceof Array)$desc=$desc[1]
-v6.prototype=$desc
 function db(kh,S4,DG,zQ){this.kh=kh
 this.S4=S4
 this.DG=DG
@@ -28931,11 +28775,11 @@
 $desc=$collectedClasses.N6
 if($desc instanceof Array)$desc=$desc[1]
 N6.prototype=$desc
-function Rr(){}Rr.builtin$cls="Rr"
-if(!"name" in Rr)Rr.name="Rr"
-$desc=$collectedClasses.Rr
+function UB(){}UB.builtin$cls="UB"
+if(!"name" in UB)UB.name="UB"
+$desc=$collectedClasses.UB
 if($desc instanceof Array)$desc=$desc[1]
-Rr.prototype=$desc
+UB.prototype=$desc
 function YO(X5,vv,OX,OB,DM){this.X5=X5
 this.vv=vv
 this.OX=OX
@@ -29052,11 +28896,11 @@
 jp.prototype=$desc
 jp.prototype.gP=function(receiver){return this.P}
 jp.prototype.sP=function(receiver,v){return this.P=v}
-function vX(){}vX.builtin$cls="vX"
-if(!"name" in vX)vX.name="vX"
-$desc=$collectedClasses.vX
+function GZ(){}GZ.builtin$cls="GZ"
+if(!"name" in GZ)GZ.name="GZ"
+$desc=$collectedClasses.GZ
 if($desc instanceof Array)$desc=$desc[1]
-vX.prototype=$desc
+GZ.prototype=$desc
 function Ba(Cw,ac,aY,iW,P6,qT,bb){this.Cw=Cw
 this.ac=ac
 this.aY=aY
@@ -29078,13 +28922,13 @@
 $desc=$collectedClasses.bF
 if($desc instanceof Array)$desc=$desc[1]
 bF.prototype=$desc
-function LD(a,b,c){this.a=a
+function BW(a,b,c){this.a=a
 this.b=b
-this.c=c}LD.builtin$cls="LD"
-if(!"name" in LD)LD.name="LD"
-$desc=$collectedClasses.LD
+this.c=c}BW.builtin$cls="BW"
+if(!"name" in BW)BW.name="BW"
+$desc=$collectedClasses.BW
 if($desc instanceof Array)$desc=$desc[1]
-LD.prototype=$desc
+BW.prototype=$desc
 function S6B(){}S6B.builtin$cls="S6B"
 if(!"name" in S6B)S6B.name="S6B"
 $desc=$collectedClasses.S6B
@@ -29100,8 +28944,8 @@
 $desc=$collectedClasses.uM
 if($desc instanceof Array)$desc=$desc[1]
 uM.prototype=$desc
-function DN(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function DN(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}DN.builtin$cls="DN"
@@ -29109,8 +28953,8 @@
 $desc=$collectedClasses.DN
 if($desc instanceof Array)$desc=$desc[1]
 DN.prototype=$desc
-function ZM(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function ZM(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}ZM.builtin$cls="ZM"
@@ -29118,8 +28962,8 @@
 $desc=$collectedClasses.ZM
 if($desc instanceof Array)$desc=$desc[1]
 ZM.prototype=$desc
-function HW(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function HW(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}HW.builtin$cls="HW"
@@ -29142,23 +28986,23 @@
 $desc=$collectedClasses.Uk
 if($desc instanceof Array)$desc=$desc[1]
 Uk.prototype=$desc
-function wI(){}wI.builtin$cls="wI"
-if(!"name" in wI)wI.name="wI"
-$desc=$collectedClasses.wI
+function zF(){}zF.builtin$cls="zF"
+if(!"name" in zF)zF.name="zF"
+$desc=$collectedClasses.zF
 if($desc instanceof Array)$desc=$desc[1]
-wI.prototype=$desc
+zF.prototype=$desc
 function Zi(){}Zi.builtin$cls="Zi"
 if(!"name" in Zi)Zi.name="Zi"
 $desc=$collectedClasses.Zi
 if($desc instanceof Array)$desc=$desc[1]
 Zi.prototype=$desc
-function Ud(Pc,FN){this.Pc=Pc
+function Ud(Ct,FN){this.Ct=Ct
 this.FN=FN}Ud.builtin$cls="Ud"
 if(!"name" in Ud)Ud.name="Ud"
 $desc=$collectedClasses.Ud
 if($desc instanceof Array)$desc=$desc[1]
 Ud.prototype=$desc
-function K8(Pc,FN){this.Pc=Pc
+function K8(Ct,FN){this.Ct=Ct
 this.FN=FN}K8.builtin$cls="K8"
 if(!"name" in K8)K8.name="K8"
 $desc=$collectedClasses.K8
@@ -29180,9 +29024,9 @@
 $desc=$collectedClasses.Cf
 if($desc instanceof Array)$desc=$desc[1]
 Cf.prototype=$desc
-function Sh(WE,Mw,JN){this.WE=WE
-this.Mw=Mw
-this.JN=JN}Sh.builtin$cls="Sh"
+function Sh(iY,Vy,qi){this.iY=iY
+this.Vy=Vy
+this.qi=qi}Sh.builtin$cls="Sh"
 if(!"name" in Sh)Sh.name="Sh"
 $desc=$collectedClasses.Sh
 if($desc instanceof Array)$desc=$desc[1]
@@ -29203,7 +29047,7 @@
 $desc=$collectedClasses.E3
 if($desc instanceof Array)$desc=$desc[1]
 E3.prototype=$desc
-function Rw(vn,ZP,EN){this.vn=vn
+function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
 if(!"name" in Rw)Rw.name="Rw"
@@ -29230,11 +29074,11 @@
 $desc=$collectedClasses.a2
 if($desc instanceof Array)$desc=$desc[1]
 a2.prototype=$desc
-function Rz(){}Rz.builtin$cls="Rz"
-if(!"name" in Rz)Rz.name="Rz"
-$desc=$collectedClasses.Rz
+function Tx(){}Tx.builtin$cls="Tx"
+if(!"name" in Tx)Tx.name="Tx"
+$desc=$collectedClasses.Tx
 if($desc instanceof Array)$desc=$desc[1]
-Rz.prototype=$desc
+Tx.prototype=$desc
 function iP(y3,aL){this.y3=y3
 this.aL=aL}iP.builtin$cls="iP"
 if(!"name" in iP)iP.name="iP"
@@ -29252,21 +29096,6 @@
 $desc=$collectedClasses.Rq
 if($desc instanceof Array)$desc=$desc[1]
 Rq.prototype=$desc
-function Hn(){}Hn.builtin$cls="Hn"
-if(!"name" in Hn)Hn.name="Hn"
-$desc=$collectedClasses.Hn
-if($desc instanceof Array)$desc=$desc[1]
-Hn.prototype=$desc
-function Zl(){}Zl.builtin$cls="Zl"
-if(!"name" in Zl)Zl.name="Zl"
-$desc=$collectedClasses.Zl
-if($desc instanceof Array)$desc=$desc[1]
-Zl.prototype=$desc
-function B5(){}B5.builtin$cls="B5"
-if(!"name" in B5)B5.name="B5"
-$desc=$collectedClasses.B5
-if($desc instanceof Array)$desc=$desc[1]
-B5.prototype=$desc
 function a6(Fq){this.Fq=Fq}a6.builtin$cls="a6"
 if(!"name" in a6)a6.name="a6"
 $desc=$collectedClasses.a6
@@ -29304,16 +29133,16 @@
 $desc=$collectedClasses.bJ
 if($desc instanceof Array)$desc=$desc[1]
 bJ.prototype=$desc
-function Np(){}Np.builtin$cls="Np"
-if(!"name" in Np)Np.name="Np"
-$desc=$collectedClasses.Np
+function yd(){}yd.builtin$cls="yd"
+if(!"name" in yd)yd.name="yd"
+$desc=$collectedClasses.yd
 if($desc instanceof Array)$desc=$desc[1]
-Np.prototype=$desc
-function mp(uF,UP,mP,SA,FZ){this.uF=uF
+yd.prototype=$desc
+function mp(uF,UP,mP,SA,mZ){this.uF=uF
 this.UP=UP
 this.mP=mP
 this.SA=SA
-this.FZ=FZ}mp.builtin$cls="mp"
+this.mZ=mZ}mp.builtin$cls="mp"
 if(!"name" in mp)mp.name="mp"
 $desc=$collectedClasses.mp
 if($desc instanceof Array)$desc=$desc[1]
@@ -29341,6 +29170,11 @@
 $desc=$collectedClasses.UV
 if($desc instanceof Array)$desc=$desc[1]
 UV.prototype=$desc
+function kF(){}kF.builtin$cls="kF"
+if(!"name" in kF)kF.name="kF"
+$desc=$collectedClasses.kF
+if($desc instanceof Array)$desc=$desc[1]
+kF.prototype=$desc
 function VS(){}VS.builtin$cls="VS"
 if(!"name" in VS)VS.name="VS"
 $desc=$collectedClasses.VS
@@ -29379,11 +29213,11 @@
 $desc=$collectedClasses.EH
 if($desc instanceof Array)$desc=$desc[1]
 EH.prototype=$desc
-function cX(){}cX.builtin$cls="cX"
-if(!"name" in cX)cX.name="cX"
-$desc=$collectedClasses.cX
+function QV(){}QV.builtin$cls="QV"
+if(!"name" in QV)QV.name="QV"
+$desc=$collectedClasses.QV
 if($desc instanceof Array)$desc=$desc[1]
-cX.prototype=$desc
+QV.prototype=$desc
 function AC(){}AC.builtin$cls="AC"
 if(!"name" in AC)AC.name="AC"
 $desc=$collectedClasses.AC
@@ -29438,29 +29272,34 @@
 $desc=$collectedClasses.uq
 if($desc instanceof Array)$desc=$desc[1]
 uq.prototype=$desc
-function iD(NN,HC,r0,Fi,ku,tP,Ka,hO,yW){this.NN=NN
+function iD(NN,HC,r0,Fi,ku,tP,Ka,YG,yW){this.NN=NN
 this.HC=HC
 this.r0=r0
 this.Fi=Fi
 this.ku=ku
 this.tP=tP
 this.Ka=Ka
-this.hO=hO
+this.YG=YG
 this.yW=yW}iD.builtin$cls="iD"
 if(!"name" in iD)iD.name="iD"
 $desc=$collectedClasses.iD
 if($desc instanceof Array)$desc=$desc[1]
 iD.prototype=$desc
+function hP(){}hP.builtin$cls="hP"
+if(!"name" in hP)hP.name="hP"
+$desc=$collectedClasses.hP
+if($desc instanceof Array)$desc=$desc[1]
+hP.prototype=$desc
+function Uo(a){this.a=a}Uo.builtin$cls="Uo"
+if(!"name" in Uo)Uo.name="Uo"
+$desc=$collectedClasses.Uo
+if($desc instanceof Array)$desc=$desc[1]
+Uo.prototype=$desc
 function hb(){}hb.builtin$cls="hb"
 if(!"name" in hb)hb.name="hb"
 $desc=$collectedClasses.hb
 if($desc instanceof Array)$desc=$desc[1]
 hb.prototype=$desc
-function XX(){}XX.builtin$cls="XX"
-if(!"name" in XX)XX.name="XX"
-$desc=$collectedClasses.XX
-if($desc instanceof Array)$desc=$desc[1]
-XX.prototype=$desc
 function Kd(){}Kd.builtin$cls="Kd"
 if(!"name" in Kd)Kd.name="Kd"
 $desc=$collectedClasses.Kd
@@ -29622,26 +29461,46 @@
 $desc=$collectedClasses.nNL
 if($desc instanceof Array)$desc=$desc[1]
 nNL.prototype=$desc
-function ecX(){}ecX.builtin$cls="ecX"
-if(!"name" in ecX)ecX.name="ecX"
-$desc=$collectedClasses.ecX
+function ma(){}ma.builtin$cls="ma"
+if(!"name" in ma)ma.name="ma"
+$desc=$collectedClasses.ma
 if($desc instanceof Array)$desc=$desc[1]
-ecX.prototype=$desc
-function kI(){}kI.builtin$cls="kI"
-if(!"name" in kI)kI.name="kI"
-$desc=$collectedClasses.kI
+ma.prototype=$desc
+function Ou(){}Ou.builtin$cls="Ou"
+if(!"name" in Ou)Ou.name="Ou"
+$desc=$collectedClasses.Ou
 if($desc instanceof Array)$desc=$desc[1]
-kI.prototype=$desc
+Ou.prototype=$desc
 function yoo(){}yoo.builtin$cls="yoo"
 if(!"name" in yoo)yoo.name="yoo"
 $desc=$collectedClasses.yoo
 if($desc instanceof Array)$desc=$desc[1]
 yoo.prototype=$desc
+function ecX(){}ecX.builtin$cls="ecX"
+if(!"name" in ecX)ecX.name="ecX"
+$desc=$collectedClasses.ecX
+if($desc instanceof Array)$desc=$desc[1]
+ecX.prototype=$desc
+function zLC(){}zLC.builtin$cls="zLC"
+if(!"name" in zLC)zLC.name="zLC"
+$desc=$collectedClasses.zLC
+if($desc instanceof Array)$desc=$desc[1]
+zLC.prototype=$desc
 function w1p(){}w1p.builtin$cls="w1p"
 if(!"name" in w1p)w1p.name="w1p"
 $desc=$collectedClasses.w1p
 if($desc instanceof Array)$desc=$desc[1]
 w1p.prototype=$desc
+function dxW(){}dxW.builtin$cls="dxW"
+if(!"name" in dxW)dxW.name="dxW"
+$desc=$collectedClasses.dxW
+if($desc instanceof Array)$desc=$desc[1]
+dxW.prototype=$desc
+function kEI(){}kEI.builtin$cls="kEI"
+if(!"name" in kEI)kEI.name="kEI"
+$desc=$collectedClasses.kEI
+if($desc instanceof Array)$desc=$desc[1]
+kEI.prototype=$desc
 function tJ(){}tJ.builtin$cls="tJ"
 if(!"name" in tJ)tJ.name="tJ"
 $desc=$collectedClasses.tJ
@@ -29766,11 +29625,11 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function hP(vm){this.vm=vm}hP.builtin$cls="hP"
-if(!"name" in hP)hP.name="hP"
-$desc=$collectedClasses.hP
+function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+if(!"name" in bO)bO.name="bO"
+$desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
-hP.prototype=$desc
+bO.prototype=$desc
 function Gm(){}Gm.builtin$cls="Gm"
 if(!"name" in Gm)Gm.name="Gm"
 $desc=$collectedClasses.Gm
@@ -29815,11 +29674,11 @@
 $desc=$collectedClasses.O7
 if($desc instanceof Array)$desc=$desc[1]
 O7.prototype=$desc
-function IU(){}IU.builtin$cls="IU"
-if(!"name" in IU)IU.name="IU"
-$desc=$collectedClasses.IU
+function hq(){}hq.builtin$cls="hq"
+if(!"name" in hq)hq.name="hq"
+$desc=$collectedClasses.hq
 if($desc instanceof Array)$desc=$desc[1]
-IU.prototype=$desc
+hq.prototype=$desc
 function E4(eh){this.eh=eh}E4.builtin$cls="E4"
 if(!"name" in E4)E4.name="E4"
 $desc=$collectedClasses.E4
@@ -29850,7 +29709,7 @@
 $desc=$collectedClasses.DV
 if($desc instanceof Array)$desc=$desc[1]
 DV.prototype=$desc
-function Hp(){}Hp.builtin$cls="Hp"
+function Hp(a){this.a=a}Hp.builtin$cls="Hp"
 if(!"name" in Hp)Hp.name="Hp"
 $desc=$collectedClasses.Hp
 if($desc instanceof Array)$desc=$desc[1]
@@ -29900,11 +29759,11 @@
 $desc=$collectedClasses.Ms
 if($desc instanceof Array)$desc=$desc[1]
 Ms.prototype=$desc
-function ac(){}ac.builtin$cls="ac"
-if(!"name" in ac)ac.name="ac"
-$desc=$collectedClasses.ac
+function Fw(){}Fw.builtin$cls="Fw"
+if(!"name" in Fw)Fw.name="Fw"
+$desc=$collectedClasses.Fw
 if($desc instanceof Array)$desc=$desc[1]
-ac.prototype=$desc
+Fw.prototype=$desc
 function RS(){}RS.builtin$cls="RS"
 if(!"name" in RS)RS.name="RS"
 $desc=$collectedClasses.RS
@@ -29920,10 +29779,10 @@
 $desc=$collectedClasses.Ys
 if($desc instanceof Array)$desc=$desc[1]
 Ys.prototype=$desc
-function Lw(ew,yz,nV,Li){this.ew=ew
+function Lw(ew,yz,nV,f9){this.ew=ew
 this.yz=yz
 this.nV=nV
-this.Li=Li}Lw.builtin$cls="Lw"
+this.f9=f9}Lw.builtin$cls="Lw"
 if(!"name" in Lw)Lw.name="Lw"
 $desc=$collectedClasses.Lw
 if($desc instanceof Array)$desc=$desc[1]
@@ -29958,11 +29817,11 @@
 $desc=$collectedClasses.Dg
 if($desc instanceof Array)$desc=$desc[1]
 Dg.prototype=$desc
-function Ob(){}Ob.builtin$cls="Ob"
-if(!"name" in Ob)Ob.name="Ob"
-$desc=$collectedClasses.Ob
+function Ui(){}Ui.builtin$cls="Ui"
+if(!"name" in Ui)Ui.name="Ui"
+$desc=$collectedClasses.Ui
 if($desc instanceof Array)$desc=$desc[1]
-Ob.prototype=$desc
+Ui.prototype=$desc
 function Ip(){}Ip.builtin$cls="Ip"
 if(!"name" in Ip)Ip.name="Ip"
 $desc=$collectedClasses.Ip
@@ -29973,47 +29832,21 @@
 $desc=$collectedClasses.Pg
 if($desc instanceof Array)$desc=$desc[1]
 Pg.prototype=$desc
-function Nb(){}Nb.builtin$cls="Nb"
-if(!"name" in Nb)Nb.name="Nb"
-$desc=$collectedClasses.Nb
+function ObS(){}ObS.builtin$cls="ObS"
+if(!"name" in ObS)ObS.name="ObS"
+$desc=$collectedClasses.ObS
 if($desc instanceof Array)$desc=$desc[1]
-Nb.prototype=$desc
+ObS.prototype=$desc
 function nA(){}nA.builtin$cls="nA"
 if(!"name" in nA)nA.name="nA"
 $desc=$collectedClasses.nA
 if($desc instanceof Array)$desc=$desc[1]
 nA.prototype=$desc
-function Fv(m0,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.m0=m0
+function E9(Py,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}Fv.builtin$cls="Fv"
-if(!"name" in Fv)Fv.name="Fv"
-$desc=$collectedClasses.Fv
-if($desc instanceof Array)$desc=$desc[1]
-Fv.prototype=$desc
-Fv.prototype.gm0=function(receiver){return receiver.m0}
-Fv.prototype.gm0.$reflectable=1
-Fv.prototype.sm0=function(receiver,v){return receiver.m0=v}
-Fv.prototype.sm0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
-if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
-function E9(Py,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30030,20 +29863,63 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
-function m8(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+tuj.prototype=$desc
+function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
+this.Ab=Ab
+this.Ln=Ln
+this.y4=y4
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}rm.builtin$cls="rm"
+if(!"name" in rm)rm.name="rm"
+$desc=$collectedClasses.rm
+if($desc instanceof Array)$desc=$desc[1]
+rm.prototype=$desc
+rm.prototype.gfn=function(receiver){return receiver.fn}
+rm.prototype.gfn.$reflectable=1
+rm.prototype.sfn=function(receiver,v){return receiver.fn=v}
+rm.prototype.sfn.$reflectable=1
+rm.prototype.gAb=function(receiver){return receiver.Ab}
+rm.prototype.gAb.$reflectable=1
+rm.prototype.sAb=function(receiver,v){return receiver.Ab=v}
+rm.prototype.sAb.$reflectable=1
+rm.prototype.gLn=function(receiver){return receiver.Ln}
+rm.prototype.gLn.$reflectable=1
+rm.prototype.sLn=function(receiver,v){return receiver.Ln=v}
+rm.prototype.sLn.$reflectable=1
+rm.prototype.gy4=function(receiver){return receiver.y4}
+rm.prototype.gy4.$reflectable=1
+rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
+rm.prototype.sy4.$reflectable=1
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
+if($desc instanceof Array)$desc=$desc[1]
+Vct.prototype=$desc
+function YW(a){this.a=a}YW.builtin$cls="YW"
+if(!"name" in YW)YW.name="YW"
+$desc=$collectedClasses.YW
+if($desc instanceof Array)$desc=$desc[1]
+YW.prototype=$desc
+function m8(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30056,14 +29932,11 @@
 $desc=$collectedClasses.m8
 if($desc instanceof Array)$desc=$desc[1]
 m8.prototype=$desc
-function Gk(vt,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
+function Gk(vt,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30080,30 +29953,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function Urj(){}Urj.builtin$cls="Urj"
-if(!"name" in Urj)Urj.name="Urj"
-$desc=$collectedClasses.Urj
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Urj.prototype=$desc
-function e5(a){this.a=a}e5.builtin$cls="e5"
-if(!"name" in e5)e5.name="e5"
-$desc=$collectedClasses.e5
-if($desc instanceof Array)$desc=$desc[1]
-e5.prototype=$desc
-function Ni(){}Ni.builtin$cls="Ni"
-if(!"name" in Ni)Ni.name="Ni"
-$desc=$collectedClasses.Ni
-if($desc instanceof Array)$desc=$desc[1]
-Ni.prototype=$desc
-function AX(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+D13.prototype=$desc
+function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30111,19 +29971,16 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+this.X0=X0}qW.builtin$cls="qW"
+if(!"name" in qW)qW.name="qW"
+$desc=$collectedClasses.qW
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
-function yb(Z8,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
+qW.prototype=$desc
+function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30131,31 +29988,21 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}yb.builtin$cls="yb"
-if(!"name" in yb)yb.name="yb"
-$desc=$collectedClasses.yb
+this.X0=X0}mk.builtin$cls="mk"
+if(!"name" in mk)mk.name="mk"
+$desc=$collectedClasses.mk
 if($desc instanceof Array)$desc=$desc[1]
-yb.prototype=$desc
-yb.prototype.gZ8=function(receiver){return receiver.Z8}
-yb.prototype.gZ8.$reflectable=1
-yb.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
-yb.prototype.sZ8.$reflectable=1
-function oub(){}oub.builtin$cls="oub"
-if(!"name" in oub)oub.name="oub"
-$desc=$collectedClasses.oub
+mk.prototype=$desc
+mk.prototype.gZ8=function(receiver){return receiver.Z8}
+mk.prototype.gZ8.$reflectable=1
+mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
+mk.prototype.sZ8.$reflectable=1
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-oub.prototype=$desc
-function QR(a){this.a=a}QR.builtin$cls="QR"
-if(!"name" in QR)QR.name="QR"
-$desc=$collectedClasses.QR
-if($desc instanceof Array)$desc=$desc[1]
-QR.prototype=$desc
-function Yx(){}Yx.builtin$cls="Yx"
-if(!"name" in Yx)Yx.name="Yx"
-$desc=$collectedClasses.Yx
-if($desc instanceof Array)$desc=$desc[1]
-Yx.prototype=$desc
-function NM(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
+WZq.prototype=$desc
+function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
 this.CO=CO
@@ -30166,12 +30013,9 @@
 this.Ol=Ol
 this.X3=X3
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30179,56 +30023,56 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}NM.builtin$cls="NM"
-if(!"name" in NM)NM.name="NM"
-$desc=$collectedClasses.NM
+this.X0=X0}jY.builtin$cls="jY"
+if(!"name" in jY)jY.name="jY"
+$desc=$collectedClasses.jY
 if($desc instanceof Array)$desc=$desc[1]
-NM.prototype=$desc
-NM.prototype.gGQ=function(receiver){return receiver.GQ}
-NM.prototype.gGQ.$reflectable=1
-NM.prototype.sGQ=function(receiver,v){return receiver.GQ=v}
-NM.prototype.sGQ.$reflectable=1
-NM.prototype.gJ0=function(receiver){return receiver.J0}
-NM.prototype.gJ0.$reflectable=1
-NM.prototype.sJ0=function(receiver,v){return receiver.J0=v}
-NM.prototype.sJ0.$reflectable=1
-NM.prototype.gOc=function(receiver){return receiver.Oc}
-NM.prototype.gOc.$reflectable=1
-NM.prototype.sOc=function(receiver,v){return receiver.Oc=v}
-NM.prototype.sOc.$reflectable=1
-NM.prototype.gCO=function(receiver){return receiver.CO}
-NM.prototype.gCO.$reflectable=1
-NM.prototype.sCO=function(receiver,v){return receiver.CO=v}
-NM.prototype.sCO.$reflectable=1
-NM.prototype.gbV=function(receiver){return receiver.bV}
-NM.prototype.gbV.$reflectable=1
-NM.prototype.sbV=function(receiver,v){return receiver.bV=v}
-NM.prototype.sbV.$reflectable=1
-NM.prototype.gkg=function(receiver){return receiver.kg}
-NM.prototype.gkg.$reflectable=1
-NM.prototype.skg=function(receiver,v){return receiver.kg=v}
-NM.prototype.skg.$reflectable=1
-NM.prototype.gLY=function(receiver){return receiver.LY}
-NM.prototype.gLY.$reflectable=1
-NM.prototype.sLY=function(receiver,v){return receiver.LY=v}
-NM.prototype.sLY.$reflectable=1
-NM.prototype.gq3=function(receiver){return receiver.q3}
-NM.prototype.gq3.$reflectable=1
-NM.prototype.sq3=function(receiver,v){return receiver.q3=v}
-NM.prototype.sq3.$reflectable=1
-NM.prototype.gOl=function(receiver){return receiver.Ol}
-NM.prototype.gOl.$reflectable=1
-NM.prototype.sOl=function(receiver,v){return receiver.Ol=v}
-NM.prototype.sOl.$reflectable=1
-NM.prototype.gX3=function(receiver){return receiver.X3}
-NM.prototype.gX3.$reflectable=1
-NM.prototype.sX3=function(receiver,v){return receiver.X3=v}
-NM.prototype.sX3.$reflectable=1
-function c4r(){}c4r.builtin$cls="c4r"
-if(!"name" in c4r)c4r.name="c4r"
-$desc=$collectedClasses.c4r
+jY.prototype=$desc
+jY.prototype.gGQ=function(receiver){return receiver.GQ}
+jY.prototype.gGQ.$reflectable=1
+jY.prototype.sGQ=function(receiver,v){return receiver.GQ=v}
+jY.prototype.sGQ.$reflectable=1
+jY.prototype.gJ0=function(receiver){return receiver.J0}
+jY.prototype.gJ0.$reflectable=1
+jY.prototype.sJ0=function(receiver,v){return receiver.J0=v}
+jY.prototype.sJ0.$reflectable=1
+jY.prototype.gOc=function(receiver){return receiver.Oc}
+jY.prototype.gOc.$reflectable=1
+jY.prototype.sOc=function(receiver,v){return receiver.Oc=v}
+jY.prototype.sOc.$reflectable=1
+jY.prototype.gCO=function(receiver){return receiver.CO}
+jY.prototype.gCO.$reflectable=1
+jY.prototype.sCO=function(receiver,v){return receiver.CO=v}
+jY.prototype.sCO.$reflectable=1
+jY.prototype.gbV=function(receiver){return receiver.bV}
+jY.prototype.gbV.$reflectable=1
+jY.prototype.sbV=function(receiver,v){return receiver.bV=v}
+jY.prototype.sbV.$reflectable=1
+jY.prototype.gkg=function(receiver){return receiver.kg}
+jY.prototype.gkg.$reflectable=1
+jY.prototype.skg=function(receiver,v){return receiver.kg=v}
+jY.prototype.skg.$reflectable=1
+jY.prototype.gLY=function(receiver){return receiver.LY}
+jY.prototype.gLY.$reflectable=1
+jY.prototype.sLY=function(receiver,v){return receiver.LY=v}
+jY.prototype.sLY.$reflectable=1
+jY.prototype.gq3=function(receiver){return receiver.q3}
+jY.prototype.gq3.$reflectable=1
+jY.prototype.sq3=function(receiver,v){return receiver.q3=v}
+jY.prototype.sq3.$reflectable=1
+jY.prototype.gOl=function(receiver){return receiver.Ol}
+jY.prototype.gOl.$reflectable=1
+jY.prototype.sOl=function(receiver,v){return receiver.Ol=v}
+jY.prototype.sOl.$reflectable=1
+jY.prototype.gX3=function(receiver){return receiver.X3}
+jY.prototype.gX3.$reflectable=1
+jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
+jY.prototype.sX3.$reflectable=1
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-c4r.prototype=$desc
+pva.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30239,16 +30083,16 @@
 $desc=$collectedClasses.jm
 if($desc instanceof Array)$desc=$desc[1]
 jm.prototype=$desc
-function xj(a){this.a=a}xj.builtin$cls="xj"
+function ke(a){this.a=a}ke.builtin$cls="ke"
+if(!"name" in ke)ke.name="ke"
+$desc=$collectedClasses.ke
+if($desc instanceof Array)$desc=$desc[1]
+ke.prototype=$desc
+function xj(){}xj.builtin$cls="xj"
 if(!"name" in xj)xj.name="xj"
 $desc=$collectedClasses.xj
 if($desc instanceof Array)$desc=$desc[1]
 xj.prototype=$desc
-function VB(){}VB.builtin$cls="VB"
-if(!"name" in VB)VB.name="VB"
-$desc=$collectedClasses.VB
-if($desc instanceof Array)$desc=$desc[1]
-VB.prototype=$desc
 function aI(b,c){this.b=b
 this.c=c}aI.builtin$cls="aI"
 if(!"name" in aI)aI.name="aI"
@@ -30277,12 +30121,12 @@
 $desc=$collectedClasses.Tm
 if($desc instanceof Array)$desc=$desc[1]
 Tm.prototype=$desc
-function q1(a,Gq){this.a=a
-this.Gq=Gq}q1.builtin$cls="q1"
-if(!"name" in q1)q1.name="q1"
-$desc=$collectedClasses.q1
+function ib(a,Gq){this.a=a
+this.Gq=Gq}ib.builtin$cls="ib"
+if(!"name" in ib)ib.name="ib"
+$desc=$collectedClasses.ib
 if($desc instanceof Array)$desc=$desc[1]
-q1.prototype=$desc
+ib.prototype=$desc
 function CA(a,b){this.a=a
 this.b=b}CA.builtin$cls="CA"
 if(!"name" in CA)CA.name="CA"
@@ -30327,7 +30171,7 @@
 $desc=$collectedClasses.uQ
 if($desc instanceof Array)$desc=$desc[1]
 uQ.prototype=$desc
-function D7(F1,h2){this.F1=F1
+function D7(qt,h2){this.qt=qt
 this.h2=h2}D7.builtin$cls="D7"
 if(!"name" in D7)D7.name="D7"
 $desc=$collectedClasses.D7
@@ -30343,15 +30187,12 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30369,19 +30210,11 @@
 $desc=$collectedClasses.Js
 if($desc instanceof Array)$desc=$desc[1]
 Js.prototype=$desc
-function fM(){}fM.builtin$cls="fM"
-if(!"name" in fM)fM.name="fM"
-$desc=$collectedClasses.fM
-if($desc instanceof Array)$desc=$desc[1]
-fM.prototype=$desc
-function hx(Xh,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
+function hx(Xh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30398,42 +30231,16 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function Squ(){}Squ.builtin$cls="Squ"
-if(!"name" in Squ)Squ.name="Squ"
-$desc=$collectedClasses.Squ
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
 if($desc instanceof Array)$desc=$desc[1]
-Squ.prototype=$desc
-function PO(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+cda.prototype=$desc
+function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
-if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
-PO.prototype.gpC=function(receiver){return receiver.pC}
-PO.prototype.gpC.$reflectable=1
-PO.prototype.spC=function(receiver,v){return receiver.pC=v}
-PO.prototype.spC.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
-if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
-function u7(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30446,17 +30253,16 @@
 $desc=$collectedClasses.u7
 if($desc instanceof Array)$desc=$desc[1]
 u7.prototype=$desc
-function fW(a){this.a=a}fW.builtin$cls="fW"
-if(!"name" in fW)fW.name="fW"
-$desc=$collectedClasses.fW
+u7.prototype.gtf=function(receiver){return receiver.tf}
+u7.prototype.gtf.$reflectable=1
+u7.prototype.stf=function(receiver,v){return receiver.tf=v}
+u7.prototype.stf.$reflectable=1
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-fW.prototype=$desc
-function Ey(b){this.b=b}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function qm(Aq,tT,eT,yt,wd,oH,z3,AP,fn){this.Aq=Aq
+waa.prototype=$desc
+function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
 this.yt=yt
@@ -30464,34 +30270,31 @@
 this.oH=oH
 this.z3=z3
 this.AP=AP
-this.fn=fn}qm.builtin$cls="qm"
+this.Lk=Lk}qm.builtin$cls="qm"
 if(!"name" in qm)qm.name="qm"
 $desc=$collectedClasses.qm
 if($desc instanceof Array)$desc=$desc[1]
 qm.prototype=$desc
-qm.prototype.gAq=function(receiver){return this.Aq}
+qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function vO(a){this.a=a}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(a){this.a=a}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
-function E7(SS,fb,qY,qO,Hm,pD,eH,vk,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.SS=SS
+TI.prototype=$desc
+function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Dt=Dt
+this.BA=BA
+this.FT=FT
+this.vk=vk
 this.fb=fb
-this.qY=qY
 this.qO=qO
 this.Hm=Hm
-this.pD=pD
-this.eH=eH
-this.vk=vk
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30504,54 +30307,47 @@
 $desc=$collectedClasses.E7
 if($desc instanceof Array)$desc=$desc[1]
 E7.prototype=$desc
-E7.prototype.gSS=function(receiver){return receiver.SS}
-E7.prototype.gSS.$reflectable=1
-E7.prototype.sSS=function(receiver,v){return receiver.SS=v}
-E7.prototype.sSS.$reflectable=1
+E7.prototype.gpD=function(receiver){return receiver.pD}
+E7.prototype.gpD.$reflectable=1
+E7.prototype.spD=function(receiver,v){return receiver.pD=v}
+E7.prototype.spD.$reflectable=1
+E7.prototype.gDt=function(receiver){return receiver.Dt}
+E7.prototype.gDt.$reflectable=1
+E7.prototype.gBA=function(receiver){return receiver.BA}
+E7.prototype.gBA.$reflectable=1
+E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
+E7.prototype.sBA.$reflectable=1
+E7.prototype.gFT=function(receiver){return receiver.FT}
+E7.prototype.gFT.$reflectable=1
+E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
+E7.prototype.sFT.$reflectable=1
+E7.prototype.gvk=function(receiver){return receiver.vk}
+E7.prototype.gvk.$reflectable=1
+E7.prototype.svk=function(receiver,v){return receiver.vk=v}
+E7.prototype.svk.$reflectable=1
 E7.prototype.gfb=function(receiver){return receiver.fb}
 E7.prototype.gfb.$reflectable=1
-E7.prototype.gqY=function(receiver){return receiver.qY}
-E7.prototype.gqY.$reflectable=1
-E7.prototype.sqY=function(receiver,v){return receiver.qY=v}
-E7.prototype.sqY.$reflectable=1
 E7.prototype.gqO=function(receiver){return receiver.qO}
 E7.prototype.gqO.$reflectable=1
 E7.prototype.gHm=function(receiver){return receiver.Hm}
 E7.prototype.gHm.$reflectable=1
 E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
 E7.prototype.sHm.$reflectable=1
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.geH=function(receiver){return receiver.eH}
-E7.prototype.geH.$reflectable=1
-E7.prototype.seH=function(receiver,v){return receiver.eH=v}
-E7.prototype.seH.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-function KUl(){}KUl.builtin$cls="KUl"
-if(!"name" in KUl)KUl.name="KUl"
-$desc=$collectedClasses.KUl
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-KUl.prototype=$desc
+V4.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Mf(){}Mf.builtin$cls="Mf"
-if(!"name" in Mf)Mf.name="Mf"
-$desc=$collectedClasses.Mf
-if($desc instanceof Array)$desc=$desc[1]
-Mf.prototype=$desc
-function Kz(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30564,12 +30360,21 @@
 $desc=$collectedClasses.Kz
 if($desc instanceof Array)$desc=$desc[1]
 Kz.prototype=$desc
-function vj(eb,kf,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
+Kz.prototype.gPw=function(receiver){return receiver.Pw}
+Kz.prototype.gPw.$reflectable=1
+Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+Kz.prototype.sPw.$reflectable=1
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
+if($desc instanceof Array)$desc=$desc[1]
+V9.prototype=$desc
+function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30590,20 +30395,17 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
-function LU(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+V10.prototype=$desc
+function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30616,14 +30418,11 @@
 $desc=$collectedClasses.LU
 if($desc instanceof Array)$desc=$desc[1]
 LU.prototype=$desc
-function T2(N7,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
+function KL(N7,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30631,30 +30430,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}T2.builtin$cls="T2"
-if(!"name" in T2)T2.name="T2"
-$desc=$collectedClasses.T2
+this.X0=X0}KL.builtin$cls="KL"
+if(!"name" in KL)KL.name="KL"
+$desc=$collectedClasses.KL
 if($desc instanceof Array)$desc=$desc[1]
-T2.prototype=$desc
-T2.prototype.gN7=function(receiver){return receiver.N7}
-T2.prototype.gN7.$reflectable=1
-T2.prototype.sN7=function(receiver,v){return receiver.N7=v}
-T2.prototype.sN7.$reflectable=1
-function mHk(){}mHk.builtin$cls="mHk"
-if(!"name" in mHk)mHk.name="mHk"
-$desc=$collectedClasses.mHk
+KL.prototype=$desc
+KL.prototype.gN7=function(receiver){return receiver.N7}
+KL.prototype.gN7.$reflectable=1
+KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
+KL.prototype.sN7.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
 if($desc instanceof Array)$desc=$desc[1]
-mHk.prototype=$desc
-function Jq(a){this.a=a}Jq.builtin$cls="Jq"
-if(!"name" in Jq)Jq.name="Jq"
-$desc=$collectedClasses.Jq
-if($desc instanceof Array)$desc=$desc[1]
-Jq.prototype=$desc
-function Yn(){}Yn.builtin$cls="Yn"
-if(!"name" in Yn)Yn.name="Yn"
-$desc=$collectedClasses.Yn
-if($desc instanceof Array)$desc=$desc[1]
-Yn.prototype=$desc
+V11.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30708,66 +30497,35 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function PF(Gj,ah,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
-this.ah=ah
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}PF.builtin$cls="PF"
-if(!"name" in PF)PF.name="PF"
-$desc=$collectedClasses.PF
+function T4(T9,Bu){this.T9=T9
+this.Bu=Bu}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-PF.prototype=$desc
-PF.prototype.gGj=function(receiver){return receiver.Gj}
-PF.prototype.gGj.$reflectable=1
-PF.prototype.sGj=function(receiver,v){return receiver.Gj=v}
-PF.prototype.sGj.$reflectable=1
-PF.prototype.gah=function(receiver){return receiver.ah}
-PF.prototype.gah.$reflectable=1
-PF.prototype.sah=function(receiver,v){return receiver.ah=v}
-PF.prototype.sah.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+T4.prototype=$desc
+function tzK(){}tzK.builtin$cls="tzK"
+if(!"name" in tzK)tzK.name="tzK"
+$desc=$collectedClasses.tzK
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
-function fA(T9,Bu){this.T9=T9
-this.Bu=Bu}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
-if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
-function Qz(){}Qz.builtin$cls="Qz"
-if(!"name" in Qz)Qz.name="Qz"
-$desc=$collectedClasses.Qz
-if($desc instanceof Array)$desc=$desc[1]
-Qz.prototype=$desc
+tzK.prototype=$desc
 function jA(oc){this.oc=oc}jA.builtin$cls="jA"
 if(!"name" in jA)jA.name="jA"
 $desc=$collectedClasses.jA
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function Jo(){}Jo.builtin$cls="Jo"
-if(!"name" in Jo)Jo.name="Jo"
-$desc=$collectedClasses.Jo
+function PO(){}PO.builtin$cls="PO"
+if(!"name" in PO)PO.name="PO"
+$desc=$collectedClasses.PO
 if($desc instanceof Array)$desc=$desc[1]
-Jo.prototype=$desc
-function c5(){}c5.builtin$cls="c5"
-if(!"name" in c5)c5.name="c5"
-$desc=$collectedClasses.c5
+PO.prototype=$desc
+function oBi(){}oBi.builtin$cls="oBi"
+if(!"name" in oBi)oBi.name="oBi"
+$desc=$collectedClasses.oBi
 if($desc instanceof Array)$desc=$desc[1]
-c5.prototype=$desc
-function F1(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+oBi.prototype=$desc
+function F1(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30780,13 +30538,13 @@
 $desc=$collectedClasses.F1
 if($desc instanceof Array)$desc=$desc[1]
 F1.prototype=$desc
-function aQ(uy,ZC,Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
-this.ZC=ZC
+function aQ(KU,V4,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+this.V4=V4
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30799,29 +30557,29 @@
 $desc=$collectedClasses.aQ
 if($desc instanceof Array)$desc=$desc[1]
 aQ.prototype=$desc
-aQ.prototype.guy=function(receiver){return receiver.uy}
-aQ.prototype.guy.$reflectable=1
-aQ.prototype.suy=function(receiver,v){return receiver.uy=v}
-aQ.prototype.suy.$reflectable=1
-aQ.prototype.gZC=function(receiver){return receiver.ZC}
-aQ.prototype.gZC.$reflectable=1
-aQ.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-aQ.prototype.sZC.$reflectable=1
+aQ.prototype.gKU=function(receiver){return receiver.KU}
+aQ.prototype.gKU.$reflectable=1
+aQ.prototype.sKU=function(receiver,v){return receiver.KU=v}
+aQ.prototype.sKU.$reflectable=1
+aQ.prototype.gV4=function(receiver){return receiver.V4}
+aQ.prototype.gV4.$reflectable=1
+aQ.prototype.sV4=function(receiver,v){return receiver.V4=v}
+aQ.prototype.sV4.$reflectable=1
 aQ.prototype.gJo=function(receiver){return receiver.Jo}
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function Ya5(uy,ZC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
-this.ZC=ZC
+V12.prototype=$desc
+function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+this.V4=V4
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30829,30 +30587,31 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Ya5.builtin$cls="Ya5"
-if(!"name" in Ya5)Ya5.name="Ya5"
-$desc=$collectedClasses.Ya5
+this.X0=X0}Qa.builtin$cls="Qa"
+if(!"name" in Qa)Qa.name="Qa"
+$desc=$collectedClasses.Qa
 if($desc instanceof Array)$desc=$desc[1]
-Ya5.prototype=$desc
-Ya5.prototype.guy=function(receiver){return receiver.uy}
-Ya5.prototype.guy.$reflectable=1
-Ya5.prototype.suy=function(receiver,v){return receiver.uy=v}
-Ya5.prototype.suy.$reflectable=1
-Ya5.prototype.gZC=function(receiver){return receiver.ZC}
-Ya5.prototype.gZC.$reflectable=1
-Ya5.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-Ya5.prototype.sZC.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+Qa.prototype=$desc
+Qa.prototype.gKU=function(receiver){return receiver.KU}
+Qa.prototype.gKU.$reflectable=1
+Qa.prototype.sKU=function(receiver,v){return receiver.KU=v}
+Qa.prototype.sKU.$reflectable=1
+Qa.prototype.gV4=function(receiver){return receiver.V4}
+Qa.prototype.gV4.$reflectable=1
+Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
+Qa.prototype.sV4.$reflectable=1
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
-function Ww(rU,SB,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
+V13.prototype=$desc
+function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
+this.Hq=Hq
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30873,16 +30632,20 @@
 Ww.prototype.gSB.$reflectable=1
 Ww.prototype.sSB=function(receiver,v){return receiver.SB=v}
 Ww.prototype.sSB.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+Ww.prototype.gHq=function(receiver){return receiver.Hq}
+Ww.prototype.gHq.$reflectable=1
+Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
+Ww.prototype.sHq.$reflectable=1
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
-function tz(Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+V14.prototype=$desc
+function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30899,19 +30662,17 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
-function fl(Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+V15.prototype=$desc
+function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+this.iy=iy
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30928,20 +30689,21 @@
 fl.prototype.gJo.$reflectable=1
 fl.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 fl.prototype.sJo.$reflectable=1
-function qFb(){}qFb.builtin$cls="qFb"
-if(!"name" in qFb)qFb.name="qFb"
-$desc=$collectedClasses.qFb
+fl.prototype.giy=function(receiver){return receiver.iy}
+fl.prototype.giy.$reflectable=1
+fl.prototype.siy=function(receiver,v){return receiver.iy=v}
+fl.prototype.siy.$reflectable=1
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-qFb.prototype=$desc
-function oM(Ap,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
+V16.prototype=$desc
+function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30949,33 +30711,30 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}oM.builtin$cls="oM"
-if(!"name" in oM)oM.name="oM"
-$desc=$collectedClasses.oM
+this.X0=X0}Zt.builtin$cls="Zt"
+if(!"name" in Zt)Zt.name="Zt"
+$desc=$collectedClasses.Zt
 if($desc instanceof Array)$desc=$desc[1]
-oM.prototype=$desc
-oM.prototype.gAp=function(receiver){return receiver.Ap}
-oM.prototype.gAp.$reflectable=1
-oM.prototype.sAp=function(receiver,v){return receiver.Ap=v}
-oM.prototype.sAp.$reflectable=1
-oM.prototype.gJo=function(receiver){return receiver.Jo}
-oM.prototype.gJo.$reflectable=1
-oM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-oM.prototype.sJo.$reflectable=1
-function rna(){}rna.builtin$cls="rna"
-if(!"name" in rna)rna.name="rna"
-$desc=$collectedClasses.rna
+Zt.prototype=$desc
+Zt.prototype.gAp=function(receiver){return receiver.Ap}
+Zt.prototype.gAp.$reflectable=1
+Zt.prototype.sAp=function(receiver,v){return receiver.Ap=v}
+Zt.prototype.sAp.$reflectable=1
+Zt.prototype.gJo=function(receiver){return receiver.Jo}
+Zt.prototype.gJo.$reflectable=1
+Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+Zt.prototype.sJo.$reflectable=1
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-rna.prototype=$desc
-function wM(Au,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
+V17.prototype=$desc
+function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30983,30 +30742,30 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}wM.builtin$cls="wM"
-if(!"name" in wM)wM.name="wM"
-$desc=$collectedClasses.wM
+this.X0=X0}iL.builtin$cls="iL"
+if(!"name" in iL)iL.name="iL"
+$desc=$collectedClasses.iL
 if($desc instanceof Array)$desc=$desc[1]
-wM.prototype=$desc
-wM.prototype.gAu=function(receiver){return receiver.Au}
-wM.prototype.gAu.$reflectable=1
-wM.prototype.sAu=function(receiver,v){return receiver.Au=v}
-wM.prototype.sAu.$reflectable=1
-wM.prototype.gJo=function(receiver){return receiver.Jo}
-wM.prototype.gJo.$reflectable=1
-wM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-wM.prototype.sJo.$reflectable=1
-function Vba(){}Vba.builtin$cls="Vba"
-if(!"name" in Vba)Vba.name="Vba"
-$desc=$collectedClasses.Vba
+iL.prototype=$desc
+iL.prototype.gAu=function(receiver){return receiver.Au}
+iL.prototype.gAu.$reflectable=1
+iL.prototype.sAu=function(receiver,v){return receiver.Au=v}
+iL.prototype.sAu.$reflectable=1
+iL.prototype.gJo=function(receiver){return receiver.Jo}
+iL.prototype.gJo.$reflectable=1
+iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+iL.prototype.sJo.$reflectable=1
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-Vba.prototype=$desc
-function lI(k5,xH,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+V18.prototype=$desc
+function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
 this.xH=xH
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31027,13 +30786,13 @@
 lI.prototype.gxH.$reflectable=1
 lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
 lI.prototype.sxH.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
-function uL(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+V19.prototype=$desc
+function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31064,18 +30823,18 @@
 $desc=$collectedClasses.qI
 if($desc instanceof Array)$desc=$desc[1]
 qI.prototype=$desc
-qI.prototype.gWA=function(){return this.WA}
+qI.prototype.gWA=function(receiver){return this.WA}
 qI.prototype.goc=function(receiver){return this.oc}
 qI.prototype.gjL=function(receiver){return this.jL}
 qI.prototype.gzZ=function(receiver){return this.zZ}
-function J3(b9,kK,Sv,rk,YX,B6,AP,fn){this.b9=b9
+function J3(b9,kK,Sv,rk,YX,B6,AP,Lk){this.b9=b9
 this.kK=kK
 this.Sv=Sv
 this.rk=rk
 this.YX=YX
 this.B6=B6
 this.AP=AP
-this.fn=fn}J3.builtin$cls="J3"
+this.Lk=Lk}J3.builtin$cls="J3"
 if(!"name" in J3)J3.name="J3"
 $desc=$collectedClasses.J3
 if($desc instanceof Array)$desc=$desc[1]
@@ -31130,7 +30889,7 @@
 $desc=$collectedClasses.DA
 if($desc instanceof Array)$desc=$desc[1]
 DA.prototype=$desc
-DA.prototype.gWA=function(){return this.WA}
+DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
 function nd(){}nd.builtin$cls="nd"
 if(!"name" in nd)nd.name="nd"
@@ -31153,27 +30912,27 @@
 $desc=$collectedClasses.lS
 if($desc instanceof Array)$desc=$desc[1]
 lS.prototype=$desc
-function xh(L1,AP,fn){this.L1=L1
+function xh(L1,AP,Lk){this.L1=L1
 this.AP=AP
-this.fn=fn}xh.builtin$cls="xh"
+this.Lk=Lk}xh.builtin$cls="xh"
 if(!"name" in xh)xh.name="xh"
 $desc=$collectedClasses.xh
 if($desc instanceof Array)$desc=$desc[1]
 xh.prototype=$desc
-function wn(b3,xg,h3,AP,fn){this.b3=b3
+function wn(b3,xg,h3,AP,Lk){this.b3=b3
 this.xg=xg
 this.h3=h3
 this.AP=AP
-this.fn=fn}wn.builtin$cls="wn"
+this.Lk=Lk}wn.builtin$cls="wn"
 if(!"name" in wn)wn.name="wn"
 $desc=$collectedClasses.wn
 if($desc instanceof Array)$desc=$desc[1]
 wn.prototype=$desc
-function Ay(){}Ay.builtin$cls="Ay"
-if(!"name" in Ay)Ay.name="Ay"
-$desc=$collectedClasses.Ay
+function er(){}er.builtin$cls="er"
+if(!"name" in er)er.name="er"
+$desc=$collectedClasses.er
 if($desc instanceof Array)$desc=$desc[1]
-Ay.prototype=$desc
+er.prototype=$desc
 function Bj(a){this.a=a}Bj.builtin$cls="Bj"
 if(!"name" in Bj)Bj.name="Bj"
 $desc=$collectedClasses.Bj
@@ -31191,9 +30950,9 @@
 HA.prototype.gG3=function(receiver){return this.G3}
 HA.prototype.gjL=function(receiver){return this.jL}
 HA.prototype.gzZ=function(receiver){return this.zZ}
-function qC(Zp,AP,fn){this.Zp=Zp
+function qC(Zp,AP,Lk){this.Zp=Zp
 this.AP=AP
-this.fn=fn}qC.builtin$cls="qC"
+this.Lk=Lk}qC.builtin$cls="qC"
 if(!"name" in qC)qC.name="qC"
 $desc=$collectedClasses.qC
 if($desc instanceof Array)$desc=$desc[1]
@@ -31208,14 +30967,14 @@
 $desc=$collectedClasses.Lo
 if($desc instanceof Array)$desc=$desc[1]
 Lo.prototype=$desc
-function WR(ay,YB,BK,kN,cs,cT,AP,fn){this.ay=ay
+function WR(ay,YB,BK,kN,cs,cT,AP,Lk){this.ay=ay
 this.YB=YB
 this.BK=BK
 this.kN=kN
 this.cs=cs
 this.cT=cT
 this.AP=AP
-this.fn=fn}WR.builtin$cls="WR"
+this.Lk=Lk}WR.builtin$cls="WR"
 if(!"name" in WR)WR.name="WR"
 $desc=$collectedClasses.WR
 if($desc instanceof Array)$desc=$desc[1]
@@ -31239,11 +30998,11 @@
 $desc=$collectedClasses.C4
 if($desc instanceof Array)$desc=$desc[1]
 C4.prototype=$desc
-function YJ(){}YJ.builtin$cls="YJ"
-if(!"name" in YJ)YJ.name="YJ"
-$desc=$collectedClasses.YJ
+function Md(){}Md.builtin$cls="Md"
+if(!"name" in Md)Md.name="Md"
+$desc=$collectedClasses.Md
 if($desc instanceof Array)$desc=$desc[1]
-YJ.prototype=$desc
+Md.prototype=$desc
 function km(a){this.a=a}km.builtin$cls="km"
 if(!"name" in km)km.name="km"
 $desc=$collectedClasses.km
@@ -31254,7 +31013,7 @@
 $desc=$collectedClasses.Zj
 if($desc instanceof Array)$desc=$desc[1]
 Zj.prototype=$desc
-function XP(zx,kw,aa,RT,Q7,NF,hf,xX,cI,lD,Gd,Ei){this.zx=zx
+function XP(zx,kw,aa,RT,Q7,NF,hf,xX,cI,lD,Gd,Ve){this.zx=zx
 this.kw=kw
 this.aa=aa
 this.RT=RT
@@ -31265,7 +31024,7 @@
 this.cI=cI
 this.lD=lD
 this.Gd=Gd
-this.Ei=Ei}XP.builtin$cls="XP"
+this.Ve=Ve}XP.builtin$cls="XP"
 if(!"name" in XP)XP.name="XP"
 $desc=$collectedClasses.XP
 if($desc instanceof Array)$desc=$desc[1]
@@ -31305,11 +31064,11 @@
 $desc=$collectedClasses.MX
 if($desc instanceof Array)$desc=$desc[1]
 MX.prototype=$desc
-function w10(){}w10.builtin$cls="w10"
-if(!"name" in w10)w10.name="w10"
-$desc=$collectedClasses.w10
+function w12(){}w12.builtin$cls="w12"
+if(!"name" in w12)w12.name="w12"
+$desc=$collectedClasses.w12
 if($desc instanceof Array)$desc=$desc[1]
-w10.prototype=$desc
+w12.prototype=$desc
 function r3y(a){this.a=a}r3y.builtin$cls="r3y"
 if(!"name" in r3y)r3y.name="r3y"
 $desc=$collectedClasses.r3y
@@ -31409,8 +31168,8 @@
 $desc=$collectedClasses.Bf
 if($desc instanceof Array)$desc=$desc[1]
 Bf.prototype=$desc
-function ir(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+function ir(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31423,11 +31182,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
-if(!"name" in jpR)jpR.name="jpR"
-$desc=$collectedClasses.jpR
+function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
+if(!"name" in Sa)Sa.name="Sa"
+$desc=$collectedClasses.Sa
 if($desc instanceof Array)$desc=$desc[1]
-jpR.prototype=$desc
+Sa.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31460,11 +31219,11 @@
 $desc=$collectedClasses.V3
 if($desc instanceof Array)$desc=$desc[1]
 V3.prototype=$desc
-function Bl(){}Bl.builtin$cls="Bl"
-if(!"name" in Bl)Bl.name="Bl"
-$desc=$collectedClasses.Bl
+function rD(){}rD.builtin$cls="rD"
+if(!"name" in rD)rD.name="rD"
+$desc=$collectedClasses.rD
 if($desc instanceof Array)$desc=$desc[1]
-Bl.prototype=$desc
+rD.prototype=$desc
 function Fn(){}Fn.builtin$cls="Fn"
 if(!"name" in Fn)Fn.name="Fn"
 $desc=$collectedClasses.Fn
@@ -31552,17 +31311,17 @@
 $desc=$collectedClasses.Xy
 if($desc instanceof Array)$desc=$desc[1]
 Xy.prototype=$desc
-function G0(a){this.a=a}G0.builtin$cls="G0"
-if(!"name" in G0)G0.name="G0"
-$desc=$collectedClasses.G0
+function uK(a){this.a=a}uK.builtin$cls="uK"
+if(!"name" in uK)uK.name="uK"
+$desc=$collectedClasses.uK
 if($desc instanceof Array)$desc=$desc[1]
-G0.prototype=$desc
-function mY(a9,Cu,uI,Y7,AP,fn){this.a9=a9
+uK.prototype=$desc
+function mY(a9,Cu,uI,Y7,AP,Lk){this.a9=a9
 this.Cu=Cu
 this.uI=uI
 this.Y7=Y7
 this.AP=AP
-this.fn=fn}mY.builtin$cls="mY"
+this.Lk=Lk}mY.builtin$cls="mY"
 if(!"name" in mY)mY.name="mY"
 $desc=$collectedClasses.mY
 if($desc instanceof Array)$desc=$desc[1]
@@ -31578,10 +31337,10 @@
 $desc=$collectedClasses.mB
 if($desc instanceof Array)$desc=$desc[1]
 mB.prototype=$desc
-function XF(vq,L1,AP,fn){this.vq=vq
+function XF(vq,L1,AP,Lk){this.vq=vq
 this.L1=L1
 this.AP=AP
-this.fn=fn}XF.builtin$cls="XF"
+this.Lk=Lk}XF.builtin$cls="XF"
 if(!"name" in XF)XF.name="XF"
 $desc=$collectedClasses.XF
 if($desc instanceof Array)$desc=$desc[1]
@@ -31592,11 +31351,6 @@
 $desc=$collectedClasses.bX
 if($desc instanceof Array)$desc=$desc[1]
 bX.prototype=$desc
-function Uf(){}Uf.builtin$cls="Uf"
-if(!"name" in Uf)Uf.name="Uf"
-$desc=$collectedClasses.Uf
-if($desc instanceof Array)$desc=$desc[1]
-Uf.prototype=$desc
 function Ra(){}Ra.builtin$cls="Ra"
 if(!"name" in Ra)Ra.name="Ra"
 $desc=$collectedClasses.Ra
@@ -31667,11 +31421,16 @@
 $desc=$collectedClasses.w7
 if($desc instanceof Array)$desc=$desc[1]
 w7.prototype=$desc
-function w9(){}w9.builtin$cls="w9"
-if(!"name" in w9)w9.name="w9"
-$desc=$collectedClasses.w9
+function w10(){}w10.builtin$cls="w10"
+if(!"name" in w10)w10.name="w10"
+$desc=$collectedClasses.w10
 if($desc instanceof Array)$desc=$desc[1]
-w9.prototype=$desc
+w10.prototype=$desc
+function w11(){}w11.builtin$cls="w11"
+if(!"name" in w11)w11.name="w11"
+$desc=$collectedClasses.w11
+if($desc instanceof Array)$desc=$desc[1]
+w11.prototype=$desc
 function c4(a){this.a=a}c4.builtin$cls="c4"
 if(!"name" in c4)c4.name="c4"
 $desc=$collectedClasses.c4
@@ -31686,14 +31445,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 z6.prototype=$desc
 z6.prototype.geT=function(receiver){return this.eT}
-function Ay0(bO,Lv){this.bO=bO
-this.Lv=Lv}Ay0.builtin$cls="Ay0"
-if(!"name" in Ay0)Ay0.name="Ay0"
-$desc=$collectedClasses.Ay0
+z6.prototype.gk8=function(){return this.k8}
+function Ay(bO,Lv){this.bO=bO
+this.Lv=Lv}Ay.builtin$cls="Ay"
+if(!"name" in Ay)Ay.name="Ay"
+$desc=$collectedClasses.Ay
 if($desc instanceof Array)$desc=$desc[1]
-Ay0.prototype=$desc
-Ay0.prototype.sbO=function(v){return this.bO=v}
-Ay0.prototype.gLv=function(){return this.Lv}
+Ay.prototype=$desc
+Ay.prototype.sbO=function(v){return this.bO=v}
+Ay.prototype.gLv=function(){return this.Lv}
 function Ed(Jd){this.Jd=Jd}Ed.builtin$cls="Ed"
 if(!"name" in Ed)Ed.name="Ed"
 $desc=$collectedClasses.Ed
@@ -31794,19 +31554,19 @@
 if($desc instanceof Array)$desc=$desc[1]
 mv.prototype=$desc
 mv.prototype.gwz=function(){return this.wz}
-function mG(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
+function iv(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
 this.T8=T8
 this.KL=KL
 this.bO=bO
 this.tj=tj
 this.Lv=Lv
-this.k6=k6}mG.builtin$cls="mG"
-if(!"name" in mG)mG.name="mG"
-$desc=$collectedClasses.mG
+this.k6=k6}iv.builtin$cls="iv"
+if(!"name" in iv)iv.name="iv"
+$desc=$collectedClasses.iv
 if($desc instanceof Array)$desc=$desc[1]
-mG.prototype=$desc
-mG.prototype.gBb=function(){return this.Bb}
-mG.prototype.gT8=function(){return this.T8}
+iv.prototype=$desc
+iv.prototype.gBb=function(){return this.Bb}
+iv.prototype.gT8=function(){return this.T8}
 function uA(a,b){this.a=a
 this.b=b}uA.builtin$cls="uA"
 if(!"name" in uA)uA.name="uA"
@@ -31856,11 +31616,11 @@
 $desc=$collectedClasses.ja
 if($desc instanceof Array)$desc=$desc[1]
 ja.prototype=$desc
-function zw(d){this.d=d}zw.builtin$cls="zw"
-if(!"name" in zw)zw.name="zw"
-$desc=$collectedClasses.zw
+function ey(d){this.d=d}ey.builtin$cls="ey"
+if(!"name" in ey)ey.name="ey"
+$desc=$collectedClasses.ey
 if($desc instanceof Array)$desc=$desc[1]
-zw.prototype=$desc
+ey.prototype=$desc
 function fa(hP,re,KL,bO,tj,Lv,k6){this.hP=hP
 this.re=re
 this.KL=KL
@@ -32090,16 +31850,16 @@
 $desc=$collectedClasses.fr
 if($desc instanceof Array)$desc=$desc[1]
 fr.prototype=$desc
-function cfS(){}cfS.builtin$cls="cfS"
-if(!"name" in cfS)cfS.name="cfS"
-$desc=$collectedClasses.cfS
+function d2(){}d2.builtin$cls="d2"
+if(!"name" in d2)d2.name="d2"
+$desc=$collectedClasses.d2
 if($desc instanceof Array)$desc=$desc[1]
-cfS.prototype=$desc
-function JG(kW,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
+d2.prototype=$desc
+function JG(kW,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32116,23 +31876,20 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V0(){}V0.builtin$cls="V0"
-if(!"name" in V0)V0.name="V0"
-$desc=$collectedClasses.V0
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V0.prototype=$desc
-function knI(zw,AP,fn,tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
+V20.prototype=$desc
+function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32154,14 +31911,12 @@
 $desc=$collectedClasses.T5
 if($desc instanceof Array)$desc=$desc[1]
 T5.prototype=$desc
-function fI(Uz,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+this.HJ=HJ
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32178,30 +31933,432 @@
 fI.prototype.gUz.$reflectable=1
 fI.prototype.sUz=function(receiver,v){return receiver.Uz=v}
 fI.prototype.sUz.$reflectable=1
-function oaa(){}oaa.builtin$cls="oaa"
-if(!"name" in oaa)oaa.name="oaa"
-$desc=$collectedClasses.oaa
+fI.prototype.gHJ=function(receiver){return receiver.HJ}
+fI.prototype.gHJ.$reflectable=1
+fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
+fI.prototype.sHJ.$reflectable=1
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-oaa.prototype=$desc
-function qq(a){this.a=a}qq.builtin$cls="qq"
+V21.prototype=$desc
+function qq(a,b){this.a=a
+this.b=b}qq.builtin$cls="qq"
 if(!"name" in qq)qq.name="qq"
 $desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
 qq.prototype=$desc
-function FC(){}FC.builtin$cls="FC"
-if(!"name" in FC)FC.name="FC"
-$desc=$collectedClasses.FC
+function G8(F1){this.F1=F1}G8.builtin$cls="G8"
+if(!"name" in G8)G8.name="G8"
+$desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
-FC.prototype=$desc
-function xI(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+G8.prototype=$desc
+G8.prototype.gF1=function(receiver){return this.F1}
+function fJ(F1,A4){this.F1=F1
+this.A4=A4}fJ.builtin$cls="fJ"
+if(!"name" in fJ)fJ.name="fJ"
+$desc=$collectedClasses.fJ
+if($desc instanceof Array)$desc=$desc[1]
+fJ.prototype=$desc
+function q1(a){this.a=a}q1.builtin$cls="q1"
+if(!"name" in q1)q1.name="q1"
+$desc=$collectedClasses.q1
+if($desc instanceof Array)$desc=$desc[1]
+q1.prototype=$desc
+function jx(F1,A4){this.F1=F1
+this.A4=A4}jx.builtin$cls="jx"
+if(!"name" in jx)jx.name="jx"
+$desc=$collectedClasses.jx
+if($desc instanceof Array)$desc=$desc[1]
+jx.prototype=$desc
+function yT(){}yT.builtin$cls="yT"
+if(!"name" in yT)yT.name="yT"
+$desc=$collectedClasses.yT
+if($desc instanceof Array)$desc=$desc[1]
+yT.prototype=$desc
+function Cn(){}Cn.builtin$cls="Cn"
+if(!"name" in Cn)Cn.name="Cn"
+$desc=$collectedClasses.Cn
+if($desc instanceof Array)$desc=$desc[1]
+Cn.prototype=$desc
+function du(F1,A4){this.F1=F1
+this.A4=A4}du.builtin$cls="du"
+if(!"name" in du)du.name="du"
+$desc=$collectedClasses.du
+if($desc instanceof Array)$desc=$desc[1]
+du.prototype=$desc
+function xc(F1,A4){this.F1=F1
+this.A4=A4}xc.builtin$cls="xc"
+if(!"name" in xc)xc.name="xc"
+$desc=$collectedClasses.xc
+if($desc instanceof Array)$desc=$desc[1]
+xc.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+this.fq=fq
+this.ne=ne
+this.PH=PH
+this.pw=pw
+this.v9=v9
+this.zb=zb
+this.KT=KT
+this.f5=f5
+this.cL=cL
+this.LE=LE
+this.Cf=Cf
+this.W1=W1
+this.S9=S9
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}bv.builtin$cls="bv"
+if(!"name" in bv)bv.name="bv"
+$desc=$collectedClasses.bv
+if($desc instanceof Array)$desc=$desc[1]
+bv.prototype=$desc
+bv.prototype.gzf=function(){return this.zf}
+bv.prototype.gbN=function(){return this.KT}
+bv.prototype.sbN=function(v){return this.KT=v}
+bv.prototype.gGR=function(){return this.f5}
+bv.prototype.sGR=function(v){return this.f5=v}
+bv.prototype.gLE=function(){return this.LE}
+bv.prototype.gLE.$reflectable=1
+function D3(){}D3.builtin$cls="D3"
+if(!"name" in D3)D3.name="D3"
+$desc=$collectedClasses.D3
+if($desc instanceof Array)$desc=$desc[1]
+D3.prototype=$desc
+function KQ(a){this.a=a}KQ.builtin$cls="KQ"
+if(!"name" in KQ)KQ.name="KQ"
+$desc=$collectedClasses.KQ
+if($desc instanceof Array)$desc=$desc[1]
+KQ.prototype=$desc
+function Qq(a){this.a=a}Qq.builtin$cls="Qq"
+if(!"name" in Qq)Qq.name="Qq"
+$desc=$collectedClasses.Qq
+if($desc instanceof Array)$desc=$desc[1]
+Qq.prototype=$desc
+function Qd(Gt,i2,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.Gt=Gt
+this.i2=i2
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}Qd.builtin$cls="Qd"
+if(!"name" in Qd)Qd.name="Qd"
+$desc=$collectedClasses.Qd
+if($desc instanceof Array)$desc=$desc[1]
+Qd.prototype=$desc
+Qd.prototype.gi2=function(receiver){return this.i2}
+Qd.prototype.gi2.$reflectable=1
+function i6(a,b){this.a=a
+this.b=b}i6.builtin$cls="i6"
+if(!"name" in i6)i6.name="i6"
+$desc=$collectedClasses.i6
+if($desc instanceof Array)$desc=$desc[1]
+i6.prototype=$desc
+function r2(c){this.c=c}r2.builtin$cls="r2"
+if(!"name" in r2)r2.name="r2"
+$desc=$collectedClasses.r2
+if($desc instanceof Array)$desc=$desc[1]
+r2.prototype=$desc
+function JB(d){this.d=d}JB.builtin$cls="JB"
+if(!"name" in JB)JB.name="JB"
+$desc=$collectedClasses.JB
+if($desc instanceof Array)$desc=$desc[1]
+JB.prototype=$desc
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
+if($desc instanceof Array)$desc=$desc[1]
+qj.prototype=$desc
+function BH(a){this.a=a}BH.builtin$cls="BH"
+if(!"name" in BH)BH.name="BH"
+$desc=$collectedClasses.BH
+if($desc instanceof Array)$desc=$desc[1]
+BH.prototype=$desc
+function SI(RF,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.RF=RF
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}SI.builtin$cls="SI"
+if(!"name" in SI)SI.name="SI"
+$desc=$collectedClasses.SI
+if($desc instanceof Array)$desc=$desc[1]
+SI.prototype=$desc
+function pt(J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+this.LD=LD
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}pt.builtin$cls="pt"
+if(!"name" in pt)pt.name="pt"
+$desc=$collectedClasses.pt
+if($desc instanceof Array)$desc=$desc[1]
+pt.prototype=$desc
+function wVq(){}wVq.builtin$cls="wVq"
+if(!"name" in wVq)wVq.name="wVq"
+$desc=$collectedClasses.wVq
+if($desc instanceof Array)$desc=$desc[1]
+wVq.prototype=$desc
+function c2(Rd,a4){this.Rd=Rd
+this.a4=a4}c2.builtin$cls="c2"
+if(!"name" in c2)c2.name="c2"
+$desc=$collectedClasses.c2
+if($desc instanceof Array)$desc=$desc[1]
+c2.prototype=$desc
+c2.prototype.gRd=function(receiver){return this.Rd}
+c2.prototype.gRd.$reflectable=1
+c2.prototype.ga4=function(receiver){return this.a4}
+c2.prototype.ga4.$reflectable=1
+function rj(Sw,u9,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.Sw=Sw
+this.u9=u9
+this.Gz=Gz
+this.J6=J6
+this.Ge=Ge
+this.wA=wA
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}rj.builtin$cls="rj"
+if(!"name" in rj)rj.name="rj"
+$desc=$collectedClasses.rj
+if($desc instanceof Array)$desc=$desc[1]
+rj.prototype=$desc
+rj.prototype.gSw=function(){return this.Sw}
+rj.prototype.gSw.$reflectable=1
+rj.prototype.gu9=function(){return this.u9}
+rj.prototype.gu9.$reflectable=1
+function dZL(){}dZL.builtin$cls="dZL"
+if(!"name" in dZL)dZL.name="dZL"
+$desc=$collectedClasses.dZL
+if($desc instanceof Array)$desc=$desc[1]
+dZL.prototype=$desc
+function N8(Yu,Du,fF){this.Yu=Yu
+this.Du=Du
+this.fF=fF}N8.builtin$cls="N8"
+if(!"name" in N8)N8.name="N8"
+$desc=$collectedClasses.N8
+if($desc instanceof Array)$desc=$desc[1]
+N8.prototype=$desc
+N8.prototype.gYu=function(){return this.Yu}
+N8.prototype.gDu=function(){return this.Du}
+N8.prototype.gfF=function(){return this.fF}
+function Q4(Yu,m7,L4,AP,Lk){this.Yu=Yu
+this.m7=m7
+this.L4=L4
+this.AP=AP
+this.Lk=Lk}Q4.builtin$cls="Q4"
+if(!"name" in Q4)Q4.name="Q4"
+$desc=$collectedClasses.Q4
+if($desc instanceof Array)$desc=$desc[1]
+Q4.prototype=$desc
+Q4.prototype.gYu=function(){return this.Yu}
+Q4.prototype.gYu.$reflectable=1
+Q4.prototype.gm7=function(){return this.m7}
+Q4.prototype.gm7.$reflectable=1
+Q4.prototype.gL4=function(){return this.L4}
+Q4.prototype.gL4.$reflectable=1
+function WAE(uX){this.uX=uX}WAE.builtin$cls="WAE"
+if(!"name" in WAE)WAE.name="WAE"
+$desc=$collectedClasses.WAE
+if($desc instanceof Array)$desc=$desc[1]
+WAE.prototype=$desc
+function Vi(tT,Av){this.tT=tT
+this.Av=Av}Vi.builtin$cls="Vi"
+if(!"name" in Vi)Vi.name="Vi"
+$desc=$collectedClasses.Vi
+if($desc instanceof Array)$desc=$desc[1]
+Vi.prototype=$desc
+Vi.prototype.gtT=function(receiver){return this.tT}
+Vi.prototype.gAv=function(){return this.Av}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+this.jv=jv
+this.Du=Du
+this.fF=fF
+this.vg=vg
+this.Mb=Mb
+this.VS=VS
+this.hw=hw
+this.va=va
+this.yP=yP
+this.mM=mM
+this.qH=qH
+this.MO=MO
+this.oc=oc
+this.zz=zz
+this.TD=TD
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}kx.builtin$cls="kx"
+if(!"name" in kx)kx.name="kx"
+$desc=$collectedClasses.kx
+if($desc instanceof Array)$desc=$desc[1]
+kx.prototype=$desc
+kx.prototype.gDu=function(){return this.Du}
+kx.prototype.gDu.$reflectable=1
+kx.prototype.sDu=function(v){return this.Du=v}
+kx.prototype.sDu.$reflectable=1
+kx.prototype.gfF=function(){return this.fF}
+kx.prototype.gfF.$reflectable=1
+kx.prototype.sfF=function(v){return this.fF=v}
+kx.prototype.sfF.$reflectable=1
+kx.prototype.gvg=function(){return this.vg}
+kx.prototype.gvg.$reflectable=1
+kx.prototype.svg=function(v){return this.vg=v}
+kx.prototype.svg.$reflectable=1
+kx.prototype.gMb=function(){return this.Mb}
+kx.prototype.gMb.$reflectable=1
+kx.prototype.sMb=function(v){return this.Mb=v}
+kx.prototype.sMb.$reflectable=1
+kx.prototype.gVS=function(){return this.VS}
+kx.prototype.gVS.$reflectable=1
+kx.prototype.ghw=function(){return this.hw}
+kx.prototype.ghw.$reflectable=1
+kx.prototype.gva=function(){return this.va}
+kx.prototype.gva.$reflectable=1
+kx.prototype.gyP=function(){return this.yP}
+kx.prototype.gyP.$reflectable=1
+kx.prototype.goc=function(receiver){return this.oc}
+kx.prototype.soc=function(receiver,v){return this.oc=v}
+kx.prototype.gzz=function(){return this.zz}
+kx.prototype.szz=function(v){return this.zz=v}
+function w8F(){}w8F.builtin$cls="w8F"
+if(!"name" in w8F)w8F.name="w8F"
+$desc=$collectedClasses.w8F
+if($desc instanceof Array)$desc=$desc[1]
+w8F.prototype=$desc
+function fx(){}fx.builtin$cls="fx"
+if(!"name" in fx)fx.name="fx"
+$desc=$collectedClasses.fx
+if($desc instanceof Array)$desc=$desc[1]
+fx.prototype=$desc
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function UZ(a,b,c){this.a=a
+this.b=b
+this.c=c}UZ.builtin$cls="UZ"
+if(!"name" in UZ)UZ.name="UZ"
+$desc=$collectedClasses.UZ
+if($desc instanceof Array)$desc=$desc[1]
+UZ.prototype=$desc
+function No(tl){this.tl=tl}No.builtin$cls="No"
+if(!"name" in No)No.name="No"
+$desc=$collectedClasses.No
+if($desc instanceof Array)$desc=$desc[1]
+No.prototype=$desc
+No.prototype.gtl=function(){return this.tl}
+No.prototype.gtl.$reflectable=1
+No.prototype.stl=function(v){return this.tl=v}
+No.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+this.tl=tl
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}XK.builtin$cls="XK"
+if(!"name" in XK)XK.name="XK"
+$desc=$collectedClasses.XK
+if($desc instanceof Array)$desc=$desc[1]
+XK.prototype=$desc
+XK.prototype.gYu=function(){return this.Yu}
+function dT(){}dT.builtin$cls="dT"
+if(!"name" in dT)dT.name="dT"
+$desc=$collectedClasses.dT
+if($desc instanceof Array)$desc=$desc[1]
+dT.prototype=$desc
+function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+this.yb=yb
+this.tl=tl
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}ho.builtin$cls="ho"
+if(!"name" in ho)ho.name="ho"
+$desc=$collectedClasses.ho
+if($desc instanceof Array)$desc=$desc[1]
+ho.prototype=$desc
+function ob(mC,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.mC=mC
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}ob.builtin$cls="ob"
+if(!"name" in ob)ob.name="ob"
+$desc=$collectedClasses.ob
+if($desc instanceof Array)$desc=$desc[1]
+ob.prototype=$desc
+ob.prototype.gmC=function(receiver){return receiver.mC}
+ob.prototype.gmC.$reflectable=1
+ob.prototype.smC=function(receiver,v){return receiver.mC=v}
+ob.prototype.smC.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
+if($desc instanceof Array)$desc=$desc[1]
+V22.prototype=$desc
+function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32222,19 +32379,16 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Sq(){}Sq.builtin$cls="Sq"
-if(!"name" in Sq)Sq.name="Sq"
-$desc=$collectedClasses.Sq
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Sq.prototype=$desc
-function nm(Va,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
+Ds.prototype=$desc
+function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32251,19 +32405,16 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function q2(){}q2.builtin$cls="q2"
-if(!"name" in q2)q2.name="q2"
-$desc=$collectedClasses.q2
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-q2.prototype=$desc
-function uwf(Up,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Up=Up
+V23.prototype=$desc
+function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32271,30 +32422,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}uwf.builtin$cls="uwf"
-if(!"name" in uwf)uwf.name="uwf"
-$desc=$collectedClasses.uwf
+this.X0=X0}Vu.builtin$cls="Vu"
+if(!"name" in Vu)Vu.name="Vu"
+$desc=$collectedClasses.Vu
 if($desc instanceof Array)$desc=$desc[1]
-uwf.prototype=$desc
-uwf.prototype.gUp=function(receiver){return receiver.Up}
-uwf.prototype.gUp.$reflectable=1
-uwf.prototype.sUp=function(receiver,v){return receiver.Up=v}
-uwf.prototype.sUp.$reflectable=1
-function q3(){}q3.builtin$cls="q3"
-if(!"name" in q3)q3.name="q3"
-$desc=$collectedClasses.q3
+Vu.prototype=$desc
+Vu.prototype.gB3=function(receiver){return receiver.B3}
+Vu.prototype.gB3.$reflectable=1
+Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
+Vu.prototype.sB3.$reflectable=1
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-q3.prototype=$desc
-function At(a){this.a=a}At.builtin$cls="At"
-if(!"name" in At)At.name="At"
-$desc=$collectedClasses.At
-if($desc instanceof Array)$desc=$desc[1]
-At.prototype=$desc
-function Sb(){}Sb.builtin$cls="Sb"
-if(!"name" in Sb)Sb.name="Sb"
-$desc=$collectedClasses.Sb
-if($desc instanceof Array)$desc=$desc[1]
-Sb.prototype=$desc
+V24.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32302,38 +32443,38 @@
 $desc=$collectedClasses.V2
 if($desc instanceof Array)$desc=$desc[1]
 V2.prototype=$desc
-function BT(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
+function D8(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}BT.builtin$cls="BT"
-if(!"name" in BT)BT.name="BT"
-$desc=$collectedClasses.BT
+this.ay=ay}D8.builtin$cls="D8"
+if(!"name" in D8)D8.name="D8"
+$desc=$collectedClasses.D8
 if($desc instanceof Array)$desc=$desc[1]
-BT.prototype=$desc
-function jY(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
+D8.prototype=$desc
+function zP(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}jY.builtin$cls="jY"
-if(!"name" in jY)jY.name="jY"
-$desc=$collectedClasses.jY
+this.ay=ay}zP.builtin$cls="zP"
+if(!"name" in zP)zP.name="zP"
+$desc=$collectedClasses.zP
 if($desc instanceof Array)$desc=$desc[1]
-jY.prototype=$desc
+zP.prototype=$desc
 function H2(){}H2.builtin$cls="H2"
 if(!"name" in H2)H2.name="H2"
 $desc=$collectedClasses.H2
 if($desc instanceof Array)$desc=$desc[1]
 H2.prototype=$desc
-function DO(){}DO.builtin$cls="DO"
-if(!"name" in DO)DO.name="DO"
-$desc=$collectedClasses.DO
+function lP(){}lP.builtin$cls="lP"
+if(!"name" in lP)lP.name="lP"
+$desc=$collectedClasses.lP
 if($desc instanceof Array)$desc=$desc[1]
-DO.prototype=$desc
+lP.prototype=$desc
 function fTP(a){this.a=a}fTP.builtin$cls="fTP"
 if(!"name" in fTP)fTP.name="fTP"
 $desc=$collectedClasses.fTP
@@ -32405,27 +32546,27 @@
 $desc=$collectedClasses.ee
 if($desc instanceof Array)$desc=$desc[1]
 ee.prototype=$desc
-function XI(Cd,wd,N2,Te){this.Cd=Cd
+function K6(Cd,wd,N2,Te){this.Cd=Cd
 this.wd=wd
 this.N2=N2
-this.Te=Te}XI.builtin$cls="XI"
-if(!"name" in XI)XI.name="XI"
-$desc=$collectedClasses.XI
+this.Te=Te}K6.builtin$cls="K6"
+if(!"name" in K6)K6.name="K6"
+$desc=$collectedClasses.K6
 if($desc instanceof Array)$desc=$desc[1]
-XI.prototype=$desc
-XI.prototype.gCd=function(receiver){return this.Cd}
-XI.prototype.gwd=function(receiver){return this.wd}
-XI.prototype.gN2=function(){return this.N2}
-XI.prototype.gTe=function(){return this.Te}
-function hs(N1,mD,Ck){this.N1=N1
+K6.prototype=$desc
+K6.prototype.gCd=function(receiver){return this.Cd}
+K6.prototype.gwd=function(receiver){return this.wd}
+K6.prototype.gN2=function(){return this.N2}
+K6.prototype.gTe=function(){return this.Te}
+function TU(N1,mD,Ck){this.N1=N1
 this.mD=mD
-this.Ck=Ck}hs.builtin$cls="hs"
-if(!"name" in hs)hs.name="hs"
-$desc=$collectedClasses.hs
+this.Ck=Ck}TU.builtin$cls="TU"
+if(!"name" in TU)TU.name="TU"
+$desc=$collectedClasses.TU
 if($desc instanceof Array)$desc=$desc[1]
-hs.prototype=$desc
-hs.prototype.gN1=function(){return this.N1}
-hs.prototype.sCk=function(v){return this.Ck=v}
+TU.prototype=$desc
+TU.prototype.gN1=function(){return this.N1}
+TU.prototype.sCk=function(v){return this.Ck=v}
 function yp(KO,qW,k8){this.KO=KO
 this.qW=qW
 this.k8=k8}yp.builtin$cls="yp"
@@ -32433,6 +32574,7 @@
 $desc=$collectedClasses.yp
 if($desc instanceof Array)$desc=$desc[1]
 yp.prototype=$desc
+yp.prototype.gk8=function(){return this.k8}
 function ug(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}ug.builtin$cls="ug"
@@ -32440,10 +32582,10 @@
 $desc=$collectedClasses.ug
 if($desc instanceof Array)$desc=$desc[1]
 ug.prototype=$desc
-function DT(lr,xT,kr,Dsl,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
+function DT(lr,xT,kr,Mf,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
 this.xT=xT
 this.kr=kr
-this.Dsl=Dsl
+this.Mf=Mf
 this.QO=QO
 this.jH=jH
 this.mj=mj
@@ -32468,11 +32610,11 @@
 $desc=$collectedClasses.OB
 if($desc instanceof Array)$desc=$desc[1]
 OB.prototype=$desc
-function lP(){}lP.builtin$cls="lP"
-if(!"name" in lP)lP.name="lP"
-$desc=$collectedClasses.lP
+function Uf(){}Uf.builtin$cls="Uf"
+if(!"name" in Uf)Uf.name="Uf"
+$desc=$collectedClasses.Uf
 if($desc instanceof Array)$desc=$desc[1]
-lP.prototype=$desc
+Uf.prototype=$desc
 function p8(ud,lr,eS,ay){this.ud=ud
 this.lr=lr
 this.eS=eS
@@ -32519,21 +32661,21 @@
 $desc=$collectedClasses.TG
 if($desc instanceof Array)$desc=$desc[1]
 TG.prototype=$desc
-function ts(){}ts.builtin$cls="ts"
-if(!"name" in ts)ts.name="ts"
-$desc=$collectedClasses.ts
+function VU(){}VU.builtin$cls="VU"
+if(!"name" in VU)VU.name="VU"
+$desc=$collectedClasses.VU
 if($desc instanceof Array)$desc=$desc[1]
-ts.prototype=$desc
+VU.prototype=$desc
 function Kj(a){this.a=a}Kj.builtin$cls="Kj"
 if(!"name" in Kj)Kj.name="Kj"
 $desc=$collectedClasses.Kj
 if($desc instanceof Array)$desc=$desc[1]
 Kj.prototype=$desc
-function VU(b){this.b=b}VU.builtin$cls="VU"
-if(!"name" in VU)VU.name="VU"
-$desc=$collectedClasses.VU
+function R7(b){this.b=b}R7.builtin$cls="R7"
+if(!"name" in R7)R7.name="R7"
+$desc=$collectedClasses.R7
 if($desc instanceof Array)$desc=$desc[1]
-VU.prototype=$desc
+R7.prototype=$desc
 function Ya(yT,kU){this.yT=yT
 this.kU=kU}Ya.builtin$cls="Ya"
 if(!"name" in Ya)Ya.name="Ya"
@@ -32566,11 +32708,11 @@
 $desc=$collectedClasses.wl
 if($desc instanceof Array)$desc=$desc[1]
 wl.prototype=$desc
-function T4(){}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function ve(){}ve.builtin$cls="ve"
+if(!"name" in ve)ve.name="ve"
+$desc=$collectedClasses.ve
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+ve.prototype=$desc
 function TR(qP){this.qP=qP}TR.builtin$cls="TR"
 if(!"name" in TR)TR.name="TR"
 $desc=$collectedClasses.TR
@@ -32582,30 +32724,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-function Zt(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}Zt.builtin$cls="Zt"
-if(!"name" in Zt)Zt.name="Zt"
-$desc=$collectedClasses.Zt
-if($desc instanceof Array)$desc=$desc[1]
-Zt.prototype=$desc
-Zt.prototype.gJh=function(receiver){return receiver.Jh}
-Zt.prototype.gJh.$reflectable=1
-Zt.prototype.sJh=function(receiver,v){return receiver.Jh=v}
-Zt.prototype.sJh.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
-if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
-return[qE,pa,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,Yr,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,Tq,W4,jP,Cz,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,Hy,EeC,Qb,Vu,xe,Hw,bn,Imr,Ve,CX,H9,FI,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,Hd,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,KP,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Qa,dp,vw,aG,J6,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,mT,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,wf,n5,bb,Ic,lc,Xu,qM,tk,me,oB,nh,EI,MI,Ub,kK,eW,um,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,mO,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,uY,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,VJ,P0,xlX,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,Eb,dT,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,qa,BQ,O,PK,JO,f0,aX,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,Dd,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,bv,eS,IQ,TI,at,wu,Vc,KQ,dZ,Qe,GH,Q4,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,af,SI,Y2,XN,No,PG,YW,BO,Yu,y2,Hq,Pl,XK,ho,G6,Ur,j3,i0,Tg,Ps,KU,RI,Ye,CN,HT,qbd,E0,Ds,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,LO,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,yU,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Rz,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ecX,kI,yoo,w1p,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,hP,Gm,Of,Qg,W9,vZ,dW,Dk,O7,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,pv,E9,Vfx,m8,Gk,Urj,e5,Ni,AX,yb,oub,QR,Yx,NM,c4r,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,Squ,PO,Vf,u7,fW,Ey,qm,vO,E7,KUl,SV,Mf,Kz,vj,tuj,LU,T2,mHk,Jq,Yn,TJ,dG,qV,HV,em,Lb,PF,Vct,fA,Qz,jA,Jo,c5,F1,aQ,D13,Ya5,WZq,Ww,pva,tz,cda,fl,qFb,oM,rna,wM,Vba,lI,waa,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,YJ,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w10,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w9,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,cfS,JG,V0,knI,T5,fI,oaa,qq,FC,xI,Sq,nm,q2,uwf,q3,At,Sb,V2,BT,jY,H2,DO,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,lP,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,T4,TR,VD,Zt,Dsd]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 45ad494..7edc4c9 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -13,9 +13,6 @@
 <body><polymer-element name="observatory-element">
   
 </polymer-element>
-<polymer-element name="isolate-element" extends="observatory-element">
-  
-</polymer-element>
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -154,10 +151,10 @@
     </style>
     <li>
       <template if="{{ active }}">
-        <button class="active" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="active" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
       <template if="{{ !active }}">
-        <button class="idle" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="idle" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
     </li>
   </template>
@@ -171,40 +168,40 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="isolate-element">
+<polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="isolate-element">
+<polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(library['id']) }}" anchor="{{ library['name'] }}" last="{{ last }}">
+    <nav-menu link="{{ library.hashLink }}" anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="isolate-element">
+<polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(cls['id']) }}" anchor="{{ cls['user_name'] }}" last="{{ last }}">
+    <nav-menu link="{{ cls.hashLink }}" anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
 
-<polymer-element name="breakpoint-list" extends="isolate-element">
+<polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -226,7 +223,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="service-ref" extends="isolate-element">
+<polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
 <template>
@@ -239,9 +236,9 @@
     <div class="row">
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-danger">
-        <div class="panel-heading">{{ error['errorType'] }}</div>
+        <div class="panel-heading">{{ error.kind }}</div>
         <div class="panel-body">
-          <p>{{ error['text'] }}</p>
+          <p>{{ error.message }}</p>
         </div>
       </div>
     </div>
@@ -257,7 +254,7 @@
   var
   </template>
   <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
   </template>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </div>
@@ -311,52 +308,56 @@
     <style>
       .member {
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 1px 0 1px 1em;
       }
     </style>
     <div>
-      <template if="{{ isUnexpectedRef(ref['type']) }}">
-        unexpected reference type &lt;{{ ref['type'] }}&gt;
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNullRef(ref['type']) }}">
-        <div title="{{ hoverText }}">{{ name }}</div>
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre>{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ (isStringRef(ref['type']) ||
-                        isBoolRef(ref['type']) ||
-                        isIntRef(ref['type'])) }}">
-        <a href="{{ url }}">{{ name }}</a>
+      <template if="{{ isNull(ref.serviceType) }}">
+        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
       </template>
 
-      <template if="{{ isClosureRef(ref['type']) }}">
+      <template if="{{ (isString(ref.serviceType) ||
+                        isBool(ref.serviceType) ||
+                        isInt(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['preview'] }}</a>
+      </template>
+
+      <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstanceRef(ref['type']) }}">
+      <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
         </curly-block>
       </template>
 
-      <template if="{{ isListRef(ref['type']) }}">
+      <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -372,13 +373,13 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="class-view" extends="isolate-element">
+</polymer-element><polymer-element name="class-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -386,12 +387,13 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-warning">
         <div class="panel-heading">
-          class <strong>{{ cls['user_name'] }}</strong>
+          class <strong>{{ cls.name }}</strong>
           <template if="{{ cls['super']['type'] != 'Null' }}">
             extends
-            <class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
+            <class-ref ref="{{ cls['super'] }}"></class-ref>
           </template>
-          <library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
+          <p></p>
+          <library-ref ref="{{ cls['library'] }}"></library-ref>
         </div>
         <div class="panel-body">
           <table class="table table-hover">
@@ -421,8 +423,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref ref="{{ field }}"></field-ref></td>
+                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -436,8 +438,8 @@
               </thead>
               <tbody>
                 <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
-                  <td><function-ref app="{{ app }}" ref="{{ function }}" internal=""></function-ref></td>
+                  <td><function-ref ref="{{ function }}"></function-ref></td>
+                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -457,46 +459,77 @@
   <a href="{{ url }}">{{ name }}</a>
 </template>
 
-</polymer-element><polymer-element name="disassembly-entry" extends="observatory-element">
-  <template>
-  <div class="row">
-      <div class="col-md-2">{{ instruction.formattedTicks() }}</div>
-      <div class="col-md-2">{{ instruction.formattedAddress() }}</div>
-      <div class="col-md-4">
-        <code>{{ instruction.machine }} {{ instruction.human }}</code>
-      </div>
-  </div>
-  </template>
-  
-</polymer-element><polymer-element name="code-view" extends="isolate-element">
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Implement code refresh -->
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="{{ cssPanelClass }}">
-        <div class="panel-heading">
-          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
-        </div>
-        <div class="panel-body">
-          <div class="row">
-              <div class="col-md-2"><strong>Samples</strong></div>
-              <div class="col-md-2"><strong>Address</strong></div>
-              <div><strong>Instruction</strong></div>
-          </div>
-          <template repeat="{{ instruction in code.instructions }}">
-            <disassembly-entry instruction="{{ instruction }}">
-            </disassembly-entry>
-          </template>
-        </div>
-      </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">kind</td>
+          <td class="member">{{code.kind}}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">function</td>
+          <td class="member">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Inclusive</td>
+          <td class="member">{{ code.formattedInclusiveTicks }}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Exclusive</td>
+          <td class="member">{{ code.formattedExclusiveTicks }}</td>
+        </tr>
+      </tbody></table>
     </div>
-  </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
   </template>
   
 </polymer-element>
@@ -512,17 +545,98 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="field-view" extends="isolate-element">
+</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+  <template>
+    <style>
+      .textbox {
+        width: 80ex;
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .bigtextbox {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .button {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .radios {
+        display: inline;
+      }
+      .radios label{
+        padding-left: 15px;
+      }
+      .historyExpr, .historyValue {
+        vertical-align: text-top;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .historyExpr a {
+        display: block;
+        color: black;
+        text-decoration: none;
+        padding: 6px 6px;
+        cursor: pointer;
+        white-space: pre-line;
+      }
+      .historyExpr a:hover {
+        background-color: #e1f5fe
+      }
+      .historyValue {
+        display: block;
+        padding: 6px 6px;
+      }
+    </style>
+    <form>
+      <template if="{{ lineMode == '1-line' }}">
+        <input class="textbox" type="text" value="{{ text }}">
+      </template>
+      <template if="{{ lineMode == 'N-line' }}">
+        <textarea class="bigtextbox" rows="5" cols="80" value="{{ text }}"></textarea>
+      </template>
+
+      <input class="button" type="submit" value="Evaluate" on-click="{{ eval }}">
+      <div class="radios" on-change="{{ updateLineMode }}">
+        <label for="1-line">1-line
+          <input type="radio" name="lineMode" value="1-line" checked="">
+        </label>
+        <label for="N-line">N-line
+          <input type="radio" name="lineMode" value="N-line">
+        </label>
+      </div>
+    </form>
+
+    <br>
+    <template if="{{ results.isNotEmpty }}">
+      <table>
+        <tbody><tr template="" repeat="{{ result in results }}">
+          <td class="historyExpr">
+            <a class="expr" on-click="{{ selectExpr }}" expr="{{ result['expr'] }}">{{ result['expr'] }}</a>
+          </td>
+          <td class="historyValue">
+            <template if="{{ result['value'] == null }}">
+              <div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
+            </template>
+            <template if="{{ result['value'] != null }}">
+              <instance-ref isolate="{{ isolate }}" ref="{{ result['value'] }}">
+              </instance-ref>
+            </template>
+          </td>
+        </tr>
+      </tbody></table>
+    </template>
+  </template>
+</polymer-element>
+
+
+<polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner']['type'] == '@Class' }}">
+      <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Library' }}">
+        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -536,7 +650,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref ref="{{ field['owner'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -555,7 +669,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
@@ -565,19 +679,19 @@
   </template>
   
 </polymer-element>
-<polymer-element name="function-view" extends="isolate-element">
+<polymer-element name="function-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -586,12 +700,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref ref="{{ function['code'] }}"></code-ref>
+          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
@@ -634,7 +748,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-summary" extends="isolate-element">
+<polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -659,9 +773,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
-            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
+            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
+            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -694,7 +808,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ isolate.hashLink('allocationprofile') }}">
+        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -705,7 +819,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -713,8 +827,8 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref isolate="{{ isolate }}" ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+          (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
           <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
         </template>
@@ -725,10 +839,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="vm-element" extends="observatory-element">
-  
-</polymer-element>
-<polymer-element name="isolate-list" extends="vm-element">
+<polymer-element name="isolate-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -736,7 +847,7 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in vm.isolates.values }}">
+      <template repeat="{{ isolate in isolates.isolates.values }}">
       	<li class="list-group-item">
         <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
@@ -745,50 +856,119 @@
   </template>
   
 </polymer-element>
-<polymer-element name="instance-view" extends="isolate-element">
+<polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Add nav refresh here. -->
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-         Instance of
-         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <template if="{{ instance['error'] == null }}">
-            <table class="table table-hover">
-              <tbody>
-                <tr>
-                  <td>Preview</td><td>{{ instance['preview'] }}</td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ instance['error'] != null }}">
-            <error-view error_obj="{{ instance['error'] }}"></error-view>
-          </template>
-        </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .memberBold {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <template if="{{ instance['error'] != null }}">
+      <error-view error_obj="{{ instance['error'] }}"></error-view>
+    </template>
+
+    <template if="{{ instance['error'] == null }}">
+      <div class="content">
+        <!-- TODO(turnidge): Handle null instances. -->
+        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <table>
+          <tbody><tr>
+            <td class="memberBold">class</td>
+            <td class="member">
+              <class-ref ref="{{ instance['class'] }}">
+              </class-ref>
+            </td>
+          </tr>
+          <tr template="" if="{{ instance['preview'] != null }}">
+            <td class="memberBold">preview</td>
+            <td class="member">{{ instance['preview'] }}</td>
+          </tr>
+          <tr>
+            <td class="memberBold">size</td>
+            <td class="member">{{ instance['size'] | formatSize }}</td>
+          </tr>
+        </tbody></table>
       </div>
-    </div>
-    </div>
+
+      <hr>
+
+      <div class="content">
+        <template if="{{ instance['fields'].isNotEmpty }}">
+          fields ({{ instance['fields'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
+                <td class="member">
+                  <field-ref ref="{{ field['decl'] }}"></field-ref>
+                </td>
+                <td class="member">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['nativeFields'].isNotEmpty }}">
+          native fields ({{ instance['nativeFields'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
+                <td class="member">[{{ field['index']}}]</td>
+                <td class="member">[{{ field['value']}}]</td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['elements'].isNotEmpty }}">
+          elements ({{ instance['elements'].length }})
+          <curly-block>
+            <table>
+              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
+                <td class="member">[{{ element['index']}}]</td>
+                <td class="member">
+                  <instance-ref ref="{{ element['value'] }}">
+                  </instance-ref>
+                </td>
+              </tr>
+            </tbody></table>
+          </curly-block>
+        </template>
+      </div>
+
+      <hr>
+
+      <div class="content">
+        <eval-box callback="{{ eval }}"></eval-box>
+      </div>
+      <br><br><br><br>
+      <br><br><br><br>
+    </template>
   </template>
   
 </polymer-element>
@@ -822,12 +1002,12 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-view" extends="isolate-element">
+<polymer-element name="library-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -836,10 +1016,10 @@
     <tbody>
       <tr template="" repeat="{{ script in library['scripts']}}">
         <td>
-          {{ script['kind'] }}
+          {{ script.kind }}
         </td>
         <td>
-          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
+          <script-ref ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -849,7 +1029,7 @@
     <tbody>
       <tr template="" repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
+          <library-ref ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -858,8 +1038,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -868,7 +1048,7 @@
     <tbody>
       <tr template="" repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
+          <function-ref ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -884,10 +1064,10 @@
     <tbody>
       <tr template="" repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
+          <class-ref ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal=""></class-ref>
+          <class-ref ref="{{ cls }}" internal=""></class-ref>
         </td>
       </tr>
     </tbody>
@@ -896,11 +1076,54 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="isolate-element">
+<polymer-element name="isolate-profile" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <div class="row">
+      <div class="col-md-12">
+        <span>Top</span>
+        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
+          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
+        </select>
+        <span>exclusive methods</span>
+      </div>
+    </div>
+    <div class="row">
+      <div class="col-md-12">
+        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
+      </div>
+    </div>
+    <table id="tableTree" class="table table-hover">
+      <thead>
+        <tr>
+          <th>Method</th>
+          <th>Exclusive</th>
+          <th>Caller</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+            <code-ref ref="{{ row.code }}"></code-ref>
+          </td>
+          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+        </tr>
+      </tbody>
+    </table>
+  </template>
+  
+</polymer-element>
+<polymer-element name="heap-profile" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
@@ -963,72 +1186,31 @@
 </template>
 
 </polymer-element>
-<polymer-element name="isolate-profile" extends="isolate-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
-        <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
-          <th>Inclusive</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
-          </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
-        </tr>
-      </tbody>
-    </table>
-  </template>
-  
-</polymer-element>
-<polymer-element name="script-view" extends="isolate-element">
+<polymer-element name="script-view" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}">
+    <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
-    <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
+    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
+    <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
+      <li>
+        <input type="checkbox" checked="{{ showCoverage }}">
+        <label>Show Coverage Data</label>
+      </li>
+    </nav-menu>
+    <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <div class="row">
     <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">
-      <button on-click="{{refreshCoverage}}">Refresh Coverage</button>
-      {{ script.scriptRef['user_name'] }}
-      {{ script.coveredPercentageFormatted() }}
-      </div>
+      <div class="panel-heading">Script source for: {{ script.name }}</div>
       <div class="panel-body">
         <table style="width:100%">
           <tbody>
-          <tr template="" repeat="{{ line in script.linesForDisplay }}">
+          <tr template="" repeat="{{ line in script.lines }}">
             <td style="{{ hitsStyle(line) }}">  </td>
             <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
             <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
@@ -1041,7 +1223,7 @@
 </template>
 
 </polymer-element>
-<polymer-element name="stack-frame" extends="isolate-element">
+<polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
       .member {
@@ -1055,15 +1237,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref isolate="{{ isolate }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
         <curly-block>
           <table>
             <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
               <td class="member">{{ v['name']}}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </tbody></table>
@@ -1077,11 +1259,11 @@
   </template>
   
 </polymer-element>
-<polymer-element name="stack-trace" extends="isolate-element">
+<polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -1096,7 +1278,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
@@ -1104,78 +1286,14 @@
   </template>
   
 </polymer-element>
-<polymer-element name="message-viewer" extends="observatory-element">
-  <!--
-    This is a big switch statement which instantiates the custom element
-    designated to display the message type.
-  -->
-  <template>
-  	<!-- If the message type is an IsolateList -->
-    <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list vm="{{ app.vm }}"></isolate-list>
-    </template>
-    <!-- If the message type is a StackTrace -->
-    <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
-    </template>
-    <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
-    </template>
-    <template if="{{ messageType == 'Error' }}">
-      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
-    </template>
-    <template if="{{ messageType == 'Library' }}">
-      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
-    </template>
-    <template if="{{ messageType == 'Class' }}">
-      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
-    </template>
-    <template if="{{ messageType == 'Field' }}">
-      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
-    </template>
-    <template if="{{ messageType == 'Closure' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Instance' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Array' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'String' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Bool' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Smi' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Function' }}">
-      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
-    </template>
-    <template if="{{ messageType == 'Code' }}">
-      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
-    </template>
-    <template if="{{ messageType == 'Script' }}">
-      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
-    </template>
-    <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
-    </template>
-    <template if="{{ messageType == 'Profile' }}">
-      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
-    </template>
-    <!-- Add new views and message types in the future here. -->
-  </template>
+<polymer-element name="service-view" extends="observatory-element">
+  <!-- This element explicitly manages the child elements to avoid setting
+       an observable property on the old element to an invalid type. -->
   
 </polymer-element>
 <polymer-element name="response-viewer" extends="observatory-element">
   <template>
-    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
+    <service-view object="{{ app.response }}"></service-view>
   </template>
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index a8bb6e0..8bf51c1 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -8542,8 +8542,8 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.2.0-dev.5.15.
-(function($){function dart() {}var A=new dart
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+(function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
 delete B.x
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAp:"__$library",gAu:"__$cls",gBW:"__$msg",gCO:"_oldPieChart",gF0:"__$cls",gGQ:"_newPieDataTable",gGV:"__$expanded",gGj:"_message",gHX:"__$displayValue",gHm:"tree",gHu:"__$busy",gJ0:"_newPieChart",gJh:"__$vm",gJo:"__$last",gKM:"$",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPy:"__$error",gRd:"line",gSB:"__$active",gSS:"__$methodCountSelected",gSw:"lines",gUp:"__$trace",gUy:"_collapsed",gUz:"__$script",gVa:"__$frame",gWT:"rows",gX3:"_first",gXR:"scripts",gXh:"__$instance",gYu:"address",gZ0:"codes",gZ6:"locationManager",gZ8:"__$function",gZC:"__$anchor",ga:"a",gah:"__$app",gb:"b",gbV:"_combinedDataTable",geH:"__$sampleCount",geJ:"__$code",geb:"__$json",gfb:"methodCounts",gi2:"isolates",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm0:"__$instruction",gm7:"machine",gnx:"__$callback",goH:"columns",gpC:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqY:"__$topExclusiveCodes",grU:"__$callback",gtT:"code",gtY:"__$ref",guy:"__$link",gvH:"index",gva:"instructions",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={DI:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",b7:"ALLOCATED_BEFORE_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",pC:"ACCUMULATED",r1K:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8825,7 +8825,7 @@
 if(typeof z!=="number")return z.g()
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"call$1","eh",2,0,null,11,[]],
+return y[x]},"call$1","Tj",2,0,null,11,[]],
 Nq:[function(a,b){var z,y,x
 z=J.e1(a)
 if(z==null)return
@@ -8836,10 +8836,10 @@
 return y[x][b]},"call$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
-n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 $isGv:true,
 "%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
@@ -8851,7 +8851,7 @@
 $isbool:true},
 Jh:{
 "^":"Null/Gv;",
-n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,109,[]],
 bu:[function(a){return"null"},"call$0","gXo",0,0,null],
 giO:function(a){return 0},
 gbx:function(a){return C.Qf}},
@@ -8866,41 +8866,41 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,23,[]],
+a.push(b)},"call$1","ght",2,0,null,28,[]],
 KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,47,[]],
+return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,47,[],23,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
-return!0}return!1},"call$1","gRI",2,0,null,129,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,115,[]],
+return!0}return!1},"call$1","guH",2,0,null,132,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,332,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,115,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
+aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 zV:[function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gnr",0,2,null,333,334,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,292,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){H.K0(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
+return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
@@ -8916,15 +8916,15 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,120,[],121,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,115,[]],
+this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,123,[],124,[]],
+Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.ZE(a,0,a.length-1,b)},"call$1","gH7",0,2,null,77,133,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
-Pk:[function(a,b,c){return H.eX(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
+H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
-return!1},"call$1","gdj",2,0,null,104,[]],
+return!1},"call$1","gdj",2,0,null,109,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 bu:[function(a){return H.mx(a,"[","]")},"call$0","gXo",0,0,null],
@@ -8932,27 +8932,27 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
 sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b<0)throw H.b(P.N(b))
+if(b<0)throw H.b(new P.bJ("value "+H.d(b)))
 if(!!a.fixed$length)H.vh(P.f("set length"))
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
-if(b>=a.length||b<0)throw H.b(new P.bJ("value "+H.d(b)))
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
+if(b>=a.length||b<0)throw H.b(P.N(b))
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
 $isList:true,
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{Qi:function(a,b){var z
 if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
 z=H.VM(new Array(a),[b])
@@ -8976,73 +8976,71 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,188,[]],
+return 1}else return-1},"call$1","gYc",2,0,null,187,[]],
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gKG",2,0,null,188,[]],
+JV:[function(a,b){return a%b},"call$1","gDH",2,0,null,187,[]],
 yu:[function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
 return z+0}throw H.b(P.f(''+a))},"call$0","gDi",0,0,null],
-HG:[function(a){return this.yu(this.UD(a))},"call$0","gD5",0,0,null],
+HG:[function(a){return this.yu(this.UD(a))},"call$0","gA0",0,0,null],
 UD:[function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},"call$0","gE8",0,0,null],
 yM:[function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,338,[]],
+return z},"call$1","gfE",2,0,null,335,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,28,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
 J:[function(a){return-a},"call$0","gVd",0,0,null],
 g:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a+b},"call$1","gF1n",2,0,null,104,[]],
+return a+b},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},"call$1","gTG",2,0,null,104,[]],
+return a-b},"call$1","gTG",2,0,null,109,[]],
 V:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a/b},"call$1","gJj",2,0,null,104,[]],
+return a/b},"call$1","gJj",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a*b},"call$1","gEH",2,0,null,104,[]],
+return a*b},"call$1","gEH",2,0,null,109,[]],
 Y:[function(a,b){var z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
-else return z+b},"call$1","gQR",2,0,null,104,[]],
+else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,104,[]],
-cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,104,[]],
+else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
-return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,104,[]],
-W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,104,[]],
+return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
+W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,109,[]],
 m:[function(a,b){var z
 if(b<0)throw H.b(new P.AT(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gyp",2,0,null,104,[]],
+z=a>>z>>>0}return z},"call$1","gyp",2,0,null,109,[]],
 GG:[function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gMe",2,0,null,104,[]],
+z=a>>z>>>0}return z},"call$1","gMe",2,0,null,109,[]],
 i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a&b)>>>0},"call$1","gAU",2,0,null,104,[]],
-k:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a|b)>>>0},"call$1","gX9",2,0,null,104,[]],
+return(a&b)>>>0},"call$1","gAU",2,0,null,109,[]],
 w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},"call$1","gttE",2,0,null,104,[]],
+return(a^b)>>>0},"call$1","gttE",2,0,null,109,[]],
 C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},"call$1","gix",2,0,null,104,[]],
+return a<b},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},"call$1","gh1",2,0,null,104,[]],
+return a>b},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a<=b},"call$1","gf5",2,0,null,104,[]],
+return a<=b},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a>=b},"call$1","gNH",2,0,null,104,[]],
+return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"zc,LN"}},
+static:{"^":"SAz,LN"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9056,17 +9054,17 @@
 $isnum:true},
 vT:{
 "^":"im;"},
-qa:{
+VP:{
 "^":"vT;"},
 BQ:{
-"^":"qa;"},
+"^":"VP;"},
 O:{
 "^":"String/Gv;",
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,47,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,339,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9077,21 +9075,21 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,335,26,[],120,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
-return a+b},"call$1","gF1n",2,0,null,104,[]],
+return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
 z=b.length
 y=a.length
 if(z>y)return!1
-return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,104,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,105,[],106,[]],
-Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,98,[]],
+return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,109,[]],
+h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,110,[],111,[]],
+Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,103,[]],
 Qi:[function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-if(typeof b==="string"){z=c+b.length
+z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)}return J.I8(b,a,c)!=null},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,335,98,[],47,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,19 +9098,35 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 if(J.z8(c,a.length))throw H.b(P.N(c))
-return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,77,80,[],130,[]],
+return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v
-for(z=a.length,y=0;y<z;){if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x===32||x===13||J.Ga(x))++y
-else break}if(y===z)return""
-for(w=z;!0;w=v){v=w-1
-if(v<0)H.vh(P.N(v))
-if(v>=z)H.vh(P.N(v))
-x=a.charCodeAt(v)
-if(x===32||x===13||J.Ga(x));else break}if(y===0&&w===z)return a
-return a.substring(y,w)},"call$0","gZH",0,0,null],
+bS:[function(a){var z,y,x,w,v,u,t,s
+z=a.trim()
+y=z.length
+if(y===0)return z
+x=this.j(z,0)
+if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
+v=z.charCodeAt(w)
+if(v===32||v===13||J.Ga(v))++w
+else break}if(w===y)return""}else w=0
+u=y-1
+t=this.j(z,u)
+if(t===133||t===65279)for(;!0;u=s){s=u-1
+if(s<0)H.vh(P.N(s))
+if(s>=y)H.vh(P.N(s))
+v=z.charCodeAt(s)
+if(v===32||v===13||J.Ga(v));else break}else u=y
+if(w===0&&u===y)return z
+return z.substring(w,u)},"call$0","gZH",0,0,null],
+U:[function(a,b){var z,y
+if(typeof b!=="number")return H.s(b)
+if(0>=b)return""
+if(b===1||a.length===0)return a
+if(b!==b>>>0)throw H.b(C.IU)
+for(z=a,y="";!0;){if((b&1)===1)y=z+y
+b=b>>>1
+if(b===0)break
+z+=z}return y},"call$1","gEH",2,0,null,337,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
@@ -9120,7 +9134,7 @@
 z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,98,[],120,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9131,17 +9145,17 @@
 x=c
 while(!0){if(typeof x!=="number")return x.F()
 if(!(x>=0))break
-if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,98,[],120,[]],
+if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,335,104,[],80,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
 if(typeof b!=="string")throw H.b(new P.AT(b))
 if(a===b)z=0
 else z=a<b?-1:1
-return z},"call$1","gYc",2,0,null,104,[]],
+return z},"call$1","gYc",2,0,null,109,[]],
 bu:[function(a){return a},"call$0","gXo",0,0,null],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
@@ -9153,51 +9167,63 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(b)
+zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
 return z},"call$2","Ag",4,0,null,14,[],15,[]],
-oT:[function(a){var z,y,x,w,v
-z=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
-z.i6(a)
-init.globalState=z
+ox:[function(){var z=init.globalState.Xz
+z.GL=z.GL-1},"call$0","q4",0,0,null],
+oT:[function(a,b){var z,y,x,w,v,u
+z={}
+z.a=b
+b=b
+z.a=b
+if(b==null){b=[]
+z.a=b
+y=b}else y=b
+x=J.x(y)
+if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y.i6(a)
+init.globalState=y
 if(init.globalState.EF===!0)return
-z=init.globalState
-y=z.Hg
-z.Hg=y+1
-z=P.L5(null,null,null,J.im,H.yo)
-x=P.Ls(null,null,null,J.im)
-w=new H.yo(0,null,!1)
-v=new H.aX(y,z,x,new I(),w,P.Jz(),!1,[],P.Ls(null,null,null,null))
-x.h(0,0)
-v.aU(0,w)
-init.globalState.Nr=v
-init.globalState.N0=v
-z=H.N7()
-y=H.KT(z,[z]).BD(a)
-if(y)v.vV(new H.PK(a))
-else{z=H.KT(z,[z,z]).BD(a)
-if(z)v.vV(new H.JO(a))
-else v.vV(a)}init.globalState.Xz.bL()},"call$1","wr",2,0,null,16,[]],
+y=init.globalState
+x=y.Hg
+y.Hg=x+1
+y=P.L5(null,null,null,J.im,H.yo)
+w=P.Ls(null,null,null,J.im)
+v=new H.yo(0,null,!1)
+u=new H.aX(x,y,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+w.h(0,0)
+u.aU(0,v)
+init.globalState.Nr=u
+init.globalState.N0=u
+y=H.N7()
+x=H.KT(y,[y]).BD(a)
+if(x)u.vV(0,new H.PK(z,a))
+else{y=H.KT(y,[y,y]).BD(a)
+if(y)u.vV(0,new H.JO(z,a))
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
-if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.ZV()
+if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
+if(init.globalState.EF===!0)return H.fU()
 return},"call$0","dY",0,0,null],
-ZV:[function(){var z,y
+fU:[function(){var z,y
 z=new Error().stack
 if(z==null){z=(function() {try { throw new Error() } catch(e) { return e.stack }})()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+z+"\""))},"call$0","Sx",0,0,null],
-Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"call$0","mZ",0,0,null],
+Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h
 z=H.Hh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
@@ -9206,37 +9232,39 @@
 v=y.t(z,"args")
 u=H.Hh(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
-s=H.Hh(y.t(z,"replyTo"))
+s=y.t(z,"startPaused")
+r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState
-r=y.Hg
-y.Hg=r+1
+q=y.Hg
+y.Hg=q+1
 y=P.L5(null,null,null,J.im,H.yo)
-q=P.Ls(null,null,null,J.im)
-p=new H.yo(0,null,!1)
-o=new H.aX(r,y,q,new I(),p,P.Jz(),!1,[],P.Ls(null,null,null,null))
-q.h(0,0)
-o.aU(0,p)
-init.globalState.Xz.Rk.NZ(0,new H.IY(o,new H.jl(w,v,u,t,s),"worker-start"))
-init.globalState.N0=o
+p=P.Ls(null,null,null,J.im)
+o=new H.yo(0,null,!1)
+n=new H.aX(q,y,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,!1)
+p.h(0,0)
+n.aU(0,o)
+init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
+init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":r=y.t(z,"functionName")
-n=y.t(z,"uri")
-q=y.t(z,"args")
-p=y.t(z,"msg")
-m=y.t(z,"isSpawnUri")
+case"spawn-worker":q=y.t(z,"functionName")
+m=y.t(z,"uri")
+p=y.t(z,"args")
+o=y.t(z,"msg")
+l=y.t(z,"isSpawnUri")
+k=y.t(z,"startPaused")
 y=y.t(z,"replyPort")
-if(n==null)n=$.Cl()
-l=new Worker(n)
-l.onmessage=function(e) { H.Mg(l, e); }
-k=init.globalState
-j=k.hJ
-k.hJ=j+1
-$.p6().u(0,l,j)
-init.globalState.XC.u(0,j,l)
-l.postMessage(H.Gy(H.B7(["command","start","id",j,"replyTo",H.Gy(y),"args",q,"msg",H.Gy(p),"isSpawnUri",m,"functionName",r],P.L5(null,null,null,null,null))))
+if(m==null)m=$.Cl()
+j=new Worker(m)
+j.onmessage=function(e) { H.Mg(j, e); }
+i=init.globalState
+h=i.hJ
+i.hJ=h+1
+$.p6().u(0,j,h)
+init.globalState.XC.u(0,h,j)
+j.postMessage(H.Gy(H.B7(["command","start","id",h,"replyTo",H.Gy(y),"args",p,"msg",H.Gy(o),"isSpawnUri",l,"startPaused",k,"functionName",q],P.L5(null,null,null,null,null))))
 break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
+case"message":if(y.t(z,"port")!=null)J.Sq(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
 case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
@@ -9246,39 +9274,51 @@
 case"log":H.ZF(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.vd
-r=H.Gy(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
+q=H.Gy(H.B7(["command","print","msg",z],P.L5(null,null,null,null,null)))
 y.toString
-self.postMessage(r)}else P.JS(y.t(z,"msg"))
+self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,17,[],18,[]],
+default:}},"call$2","NB",4,0,null,18,[],19,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,19,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+Ws:[function(a,b,c,d,e,f){var z,y,x,w
+z=init.globalState.N0
+y=z.jO
+$.te=$.te+("_"+y)
+$.eb=$.eb+("_"+y)
+y=z.EE
+x=init.globalState.N0.jO
+w=z.Qy
+J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
+x=new H.Vg(a,b,c,d)
+if(e===!0){z.v8(w,w)
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,20,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","m6",2,0,null,20,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,21,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,21,[]],
+else return a},"call$1","jr",2,0,null,22,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
 PK:{
-"^":"Tp:113;a",
-call$0:[function(){this.a.call$1([])},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,b",
+call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:113;b",
-call$0:[function(){this.b.call$2([],null)},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,c",
+call$0:[function(){this.c.call$2(this.a.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2@,vd,XC,w2<",
+"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2*,vd,XC,w2<",
 i6:function(a){var z,y,x,w
 z=$.Qm()==null
 y=$.Nl()
@@ -9297,9 +9337,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,RW<,C9<,lJ",
+"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
 v8:[function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0},"call$2","gfU",4,0,null,340,[],341,[]],
+if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
+this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9315,30 +9356,55 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}},"call$1","gtS",2,0,null,341,[]],
-vV:[function(a){var z,y
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+iK:[function(a){var z=this.Jp
+if(z==null){z=[]
+this.Jp=z}if(J.kE(z,a))return
+this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+Hh:[function(a){var z=this.Jp
+if(z==null)return
+J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+MZ:[function(a,b){if(!this.PX.n(0,a))return
+this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
+else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-try{y=a.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,141,[]],
+try{y=b.call$0()}finally{init.globalState.N0=z
+if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,143,[]],
 Ds:[function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
-default:P.JS("UNKOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,20,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,342,[]],
+case"add-ondone":this.iK(z.t(a,1))
+break
+case"remove-ondone":this.Hh(z.t(a,1))
+break
+case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
+break
+case"ping":this.Wq(z.t(a,1),z.t(a,2))
+break
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,342,[],343,[]],
-PC:[function(){var z=this.jO
-if(this.Gx.X5-this.fW.X5>0)init.globalState.i2.u(0,z,this)
-else init.globalState.i2.Rz(0,z)},"call$0","gi8",0,0,null],
+z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
+else this.UM()},"call$0","gi8",0,0,null],
+UM:[function(){J.V1(init.globalState.i2,this.jO)
+var z=this.Jp
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},"call$0","gAh",0,0,null],
 $isaX:true},
+oU:{
+"^":"Tp:115;a",
+call$0:[function(){J.Sq(this.a,null)},"call$0",null,0,0,null,"call"],
+$isEH:true},
 cC:{
-"^":"a;Rk,bZ",
+"^":"a;Rk,GL",
 Jc:[function(){var z,y,x,w,v
 z=this.Rk
 y=z.av
@@ -9350,12 +9416,12 @@
 v=x[y]
 x[y]=null
 z.av=(y+1&w-1)>>>0
-return v},"call$0","glk",0,0,null],
+return v},"call$0","gRe",0,0,null],
 xB:[function(){var z,y,x
 z=this.Jc()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)===!0&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.i2.X5===0&&y.Xz.bZ===0){y=y.vd
+if(y.EF===!0&&J.FN(y.i2)===!0&&y.Xz.GL===0){y=y.vd
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
@@ -9372,34 +9438,31 @@
 w.toString
 self.postMessage(v)}},"call$0","gcP",0,0,null]},
 RA:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
-"^":"a;Aq*,i3,G1*",
-VU:[function(){if(this.Aq.gRW()){this.Aq.gC9().push(this)
-return}this.Aq.vV(this.i3)},"call$0","gbF",0,0,null],
+"^":"a;F1*,i3,G1*",
+VU:[function(){if(this.F1.gRW()){this.F1.gC9().push(this)
+return}J.yn(this.F1,this.i3)},"call$0","gjF",0,0,null],
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:113;a,b,c,d,e",
-call$0:[function(){var z,y,x,w,v,u
-z=this.a
-y=this.b
-x=this.c
-w=init.globalState.N0
-v=w.jO
-$.te=$.te+("_"+v)
-$.eb=$.eb+("_"+v)
-J.H4(this.e,["spawned",new H.Z6(w.EE,init.globalState.N0.jO),w.Qy])
-if(this.d!==!0)z.call$1(x)
-else{v=H.N7()
-u=H.KT(v,[v,v]).BD(z)
-if(u)z.call$2(y,x)
-else{x=H.KT(v,[v]).BD(z)
-if(x)z.call$1(y)
+"^":"Tp:115;a,b,c,d,e,f",
+call$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"call$0",null,0,0,null,"call"],
+$isEH:true},
+Vg:{
+"^":"Tp:114;a,b,c,d",
+call$0:[function(){var z,y,x
+if(this.d!==!0)this.a.call$1(this.c)
+else{z=this.a
+y=H.N7()
+x=H.KT(y,[y,y]).BD(z)
+if(x)z.call$2(this.b,this.c)
+else{y=H.KT(y,[y]).BD(z)
+if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Iy:{
@@ -9407,10 +9470,10 @@
 $isbC:true},
 Z6:{
 "^":"Iy;JE,Jz",
-wR:[function(a,b){var z,y,x,w,v
+zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
-x=init.globalState.i2.t(0,y)
+x=J.UQ(init.globalState.i2,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
@@ -9420,16 +9483,16 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,20,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
 Ua:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -9437,15 +9500,15 @@
 $isEH:true},
 ns:{
 "^":"Iy;hQ,bv,Jz",
-wR:[function(a,b){var z,y
+zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,20,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
 z=J.c1(this.hQ,16)
 y=J.c1(this.Jz,8)
@@ -9467,23 +9530,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,344,[]],
+this.wy(b)},"call$1","gT5",2,0,null,345,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
-"^":"Dd;CN,il",
+"^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,21,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,21,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
 NO:{
-"^":"oo;il",
+"^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,21,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,21,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9491,17 +9554,17 @@
 y=z.t(a,1)
 x=z.t(a,2)
 w=z.t(a,3)
-if(J.de(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
+if(J.de(y,init.globalState.oL)){v=J.UQ(init.globalState.i2,x)
 if(v==null)return
 u=v.Zt(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,68,[]],
-Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gID",2,0,null,68,[]]},
+return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,73,[]],
+Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gID",2,0,null,73,[]]},
 fP:{
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],345,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9510,28 +9573,28 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],345,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
-Xq:[function(){return},"call$0","gt6",0,0,null]},
+Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
 "^":"a;",
 h7:[function(a){var z
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,21,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
 if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isIU)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,21,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,21,[]]},
-oo:{
+if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9543,7 +9606,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gqb",2,0,null,68,[]],
+z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9553,31 +9616,31 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,149,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
+return z.a},"call$1","gnM",2,0,null,151,[]],
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
 OW:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,42,[],211,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
 $isEH:true},
-Dd:{
+Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,21,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,68,[]],
+return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,149,[]],
+return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,151,[]],
 mE:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -9587,14 +9650,14 @@
 w=0
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},"call$1","gBv",2,0,null,68,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,21,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,21,[]]},
+x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,21,[]],
+return this.XE(a)},"call$1","gia",2,0,null,26,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9604,7 +9667,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gN3",2,0,null,21,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9615,7 +9678,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,21,[]],
+return x},"call$1","gMS",2,0,null,26,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9629,19 +9692,15 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,21,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,21,[]]},
+return z},"call$1","gwq",2,0,null,26,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
-ed:[function(){var z,y,x
-z=$.jk()
-if(z.setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-y=this.p9
-if(y==null)return
-x=init.globalState.Xz
-x.bZ=x.bZ-1
-if(this.Kf)z.clearTimeout(y)
-else z.clearInterval(y)
+ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.p9==null)return
+H.ox()
+if(this.Kf)$.jk().clearTimeout(this.p9)
+else $.jk().clearInterval(this.p9)
 this.p9=null}else throw H.b(P.f("Canceling a timer."))},"call$0","gZS",0,0,null],
 Qa:function(a,b){var z,y
 if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
@@ -9652,21 +9711,20 @@
 z.Rk.NZ(0,new H.IY(y,new H.FA(this,b),"timer"))
 this.zu=!0}else{z=$.jk()
 if(z.setTimeout!=null){y=init.globalState.Xz
-y.bZ=y.bZ+1
+y.GL=y.GL+1
 this.p9=z.setTimeout(H.tR(new H.Av(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
 static:{cy:function(a,b){var z=new H.yH(!0,!1,null)
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:112;c,d",
+"^":"Tp:114;c,d",
 call$0:[function(){this.c.p9=null
-var z=init.globalState.Xz
-z.bZ=z.bZ-1
+H.ox()
 this.d.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ku:{
@@ -9688,14 +9746,14 @@
 z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
 y=b.ng
-return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,104,[]],
+return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
-$isIU:true}}],["_js_helper","dart:_js_helper",,H,{
+$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 wV:[function(a,b){var z,y
 if(b!=null){z=b.x
 if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],22,[]],
+return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9703,12 +9761,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","Sa",2,0,null,23,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,24,[]],
+return z},"call$1","mQ",2,0,null,28,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,25,26,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9735,7 +9793,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,27,[],28,[],29,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9743,7 +9801,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,27,[],29,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9757,7 +9815,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","ma",2,0,null,30,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9767,12 +9825,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,31,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,32,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9787,13 +9845,13 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,33,[],34,[],35,[],36,[],37,[],38,[],39,[],40,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,41,[]],
+return a.date},"call$1","j1",2,0,null,46,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],42,[]],
+return a[b]},"call$2","De",4,0,null,6,[],47,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],42,[],23,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
@@ -9802,8 +9860,8 @@
 if(b!=null){z.a=0+b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],43,[],44,[]],
-Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -9813,17 +9871,17 @@
 w=x.Rv
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=x.Rn,s=0;s<u;++s){r=s+w
-v.u(0,init.metadata[t[2*r+u+3]],init.metadata[x.BX(0,r)])}z.a=!1
+for(u=x.hG,t=0;t<u;++t){s=t+w
+v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
-J.bj(b,v.gUQ(v))
-return y.apply(a,b)}q=[]
-p=0+b.length
-C.Nm.FV(q,b)
-y=a["call$"+p]
+C.Nm.FV(b,v.gUQ(v))
+return y.apply(a,b)}r=[]
+q=0+b.length
+C.Nm.FV(r,b)
+y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,q)},"call$3","ra",6,0,null,15,[],43,[],44,[]],
+return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
 pL:[function(a){if(a=="String")return C.Kn
 if(a=="int")return C.wq
 if(a=="double")return C.yX
@@ -9831,21 +9889,21 @@
 if(a=="bool")return C.Fm
 if(a=="List")return C.l0
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,45,[]],
+return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,46,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,41,[],47,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
 z.name=""}else z.toString=H.Ju
-return z},"call$1","Vb",2,0,null,48,[]],
+return z},"call$1","Cr",2,0,null,53,[]],
 Ju:[function(){return J.AG(this.dartException)},"call$0","Eu",0,0,null],
 vh:[function(a){var z
 if(a==null)a=new P.LK()
@@ -9853,7 +9911,7 @@
 z.dartException=a
 if("defineProperty" in Object){Object.defineProperty(z, "message", { get: H.Ju })
 z.name=""}else z.toString=H.Ju
-throw z},"call$1","wZ",2,0,null,48,[]],
+throw z},"call$1","wZ",2,0,null,53,[]],
 Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
 if(a==null)return
@@ -9893,28 +9951,28 @@
 return z.call$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.call$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.call$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"call$1","v2",2,0,null,48,[]],
+return a},"call$1","v2",2,0,null,53,[]],
 CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
 else return H.eQ(a)},"call$1","Zs",2,0,null,6,[]],
 B7:[function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"call$2","nD",4,0,null,50,[],51,[]],
+b.u(0,a[y],a[x])}return b},"call$2","nD",4,0,null,55,[],56,[]],
 ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,52,[],14,[],53,[],54,[],55,[],56,[],57,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
 z=(function(closure, arity, context, invoke) {  return function(a1, a2, a3, a4) {     return invoke(closure, context, arity, a1, a2, a3, a4);  };})(a,b,init.globalState.N0,H.ft)
 a.$identity=z
-return z},"call$2","qN",4,0,null,52,[],58,[]],
+return z},"call$2","qN",4,0,null,57,[],63,[]],
 iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
@@ -9943,7 +10001,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,41,[],59,[],60,[],61,[],62,[],63,[]],
+return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -9951,7 +10009,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,58,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -9968,7 +10026,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","Fw",4,0,null,15,[],64,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -9979,51 +10037,51 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,58,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
 if(typeof dart_precompiled=="function")return H.Z4(y,z,a)
-else if(y===1){x="return this."+H.d(H.oN())+"."+z+"(this."+H.d(H.Wz())+");"
+else if(y===1){x="return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(x+H.d(w))}else if(1<y&&y<28){v="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y-1).join(",")
-x="return function("+v+"){return this."+H.d(H.oN())+"."+z+"(this."+H.d(H.Wz())+","+v+");"
+x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,41,[],59,[],60,[],61,[],62,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,23,[],66,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,23,[],66,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,67,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,69,[],70,[],71,[]],
-uK:[function(a,b){var z=a.name
+H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
+Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"call$2","iw",4,0,null,72,[],73,[]],
-N7:[function(){return C.KZ},"call$0","cI",0,0,null],
+return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
+N7:[function(){return C.KZ},"call$0","Se",0,0,null],
 mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"call$2","aa",4,0,null,74,[],75,[]],
+return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"call$1","Qn",2,0,null,74,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,74,[],76,[]],
+return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Cn",6,0,null,74,[],76,[],47,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,74,[],47,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.call$1(a)
-else return},"call$2$onTypeVariable","bR",2,3,null,77,11,[],78,[]],
+else return},"call$2$onTypeVariable","bR",2,3,null,82,11,[],83,[]],
 ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
@@ -10033,33 +10091,33 @@
 if(v!=null)w=!1
 u=H.Ko(v,c)
 u=typeof u==="string"?u:H.d(u)
-z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,77,79,[],80,[],78,[]],
+z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,82,84,[],85,[],83,[]],
 dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","om",2,0,null,6,[]],
+return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","Yx",2,0,null,6,[]],
 Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,81,[],82,[]],
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,86,[],87,[]],
 RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"call$4","Ym",8,0,null,6,[],83,[],84,[],85,[]],
+return H.hv(H.Y9(y[d],z),c)},"call$4","Ym",8,0,null,6,[],88,[],89,[],90,[]],
 hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"call$2","QY",4,0,null,86,[],87,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,88,[],89,[],90,[]],
-Gq:[function(a,b){var z,y
+return!0},"call$2","QY",4,0,null,91,[],92,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,93,[],94,[],95,[]],
+XY:[function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"call$2","TU",4,0,null,91,[],87,[]],
+return H.t1(y,b)},"call$2","tk",4,0,null,96,[],92,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -10077,7 +10135,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,86,[],87,[]],
+return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,91,[],92,[]],
 Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -10087,7 +10145,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,86,[],87,[],92,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,91,[],92,[],97,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -10098,7 +10156,7 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","oq",4,0,null,86,[],87,[]],
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,91,[],92,[]],
 Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
@@ -10120,12 +10178,12 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,86,[],87,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","lv",6,0,null,15,[],41,[],82,[]],
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
 uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,93,[]],
-Su:[function(a){return H.eQ(a)},"call$1","cx",2,0,null,6,[]],
-bm:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","C5",6,0,null,93,[],66,[],23,[]],
+return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
+wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10151,16 +10209,16 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
-return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,93,[]],
+return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,98,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
-return b},"call$2","qF",4,0,null,93,[],7,[]],
+return b},"call$2","qF",4,0,null,98,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"call$1","oe",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,94,[],95,[],8,[]],
+else return J.Qu(z,c,null,null)},"call$3","di",6,0,null,99,[],100,[],8,[]],
 XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},"call$0","Ki",0,0,null],
@@ -10192,8 +10250,8 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"call$0","Bk",0,0,null],
-ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,96,[],97,[]],
+$.x7=new H.VX(t)},"call$0","Hb",0,0,null],
+ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,101,[],102,[]],
 ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
@@ -10203,13 +10261,13 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,102,[],103,[]],
+else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.rY(b)
 if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,41,[],104,[],80,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10223,7 +10281,7 @@
 if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,41,[],105,[],106,[]],
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -10236,36 +10294,35 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,42,[],211,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return this.Ix()},"call$0","gyP",0,0,null],
-FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,104,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
+FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
 LPe:{
 "^":"oH;B>,HV,tc",
-di:[function(a){return this.gUQ(this).Vr(0,new H.bw(this,a))},"call$1","gmc",2,0,null,102,[]],
+di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
-if(a==="__proto__")return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,42,[]],
-t:[function(a,b){if(typeof b!=="string")return
-if(!this.x4(b))return
-return this.HV[b]},"call$1","gIA",2,0,null,42,[]],
-aN:[function(a,b){J.kH(this.tc,new H.WT(this,b))},"call$1","gjw",2,0,null,115,[]],
+if("__proto__"===a)return!1
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+t:[function(a,b){if(!this.x4(b))return
+return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+aN:[function(a,b){var z,y,x
+z=this.tc
+for(y=0;y<z.length;++y){x=z[y]
+b.call$2(x,this.TZ(x))}},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
-bw:{
+LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,23,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
-WT:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.b.call$2(a,this.a.t(0,a))},"call$1",null,2,0,null,42,[],"call"],
-$isEH:true},
 jJ:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,42,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10323,8 +10380,8 @@
 else z=null}s=!0}else s=!1
 if(typeof u=="function"){if(!("$reflectable" in u))H.Hz(J.GL(this.gWa()))
 if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gLk",2,0,null,6,[]],
-static:{"^":"hAw,oY,Y8"}},
+else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gpW",2,0,null,6,[]],
+static:{"^":"hAw,HT,zl"}},
 A2:{
 "^":"a;Pi<,mr,eK<,Ot",
 gpf:function(){return!1},
@@ -10334,7 +10391,7 @@
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
+b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
@@ -10353,25 +10410,48 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,145,[],82,[]]},
+return this.mr.apply(v,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
 F3:{
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,145,[],331,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM",
+"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
 BX:[function(a,b){var z=this.Rv
+if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,347,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+Fk:[function(a){var z=this.Rv
+if(a<z)return
+if(!this.Mo||this.hG===1)return this.BX(0,a)
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+KE:[function(a){var z=this.Rv
+if(a<z)return
+if(!this.Mo||this.hG===1)return this.XL(a)
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+e4:[function(a){var z,y,x,w,v,u,t
+z={}
+if(this.NE==null){y=this.hG
+this.NE=Array(y)
+x=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.im])
+for(w=this.Rv,v=this.Rn,u=0;u<y;++u){t=w+u
+x.u(0,init.metadata[v[2*t+y+3]],t)}z.a=0
+y=x.gvc(x)
+y=P.F(y,!0,H.ip(y,"mW",0))
+H.rd(y,null)
+H.bQ(y,new H.Nv(z,this,x))}z=this.NE
+if(a<0||a>=z.length)return H.e(z,a)
+return z[a]},"call$1","gIK",2,0,null,350,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,348,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
 gx5:function(){return this.mr.$reflectionName},
-static:{"^":"t4,FV,C1,kj",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -10379,20 +10459,31 @@
 y=z[0]
 x=y>>1
 w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2])}}},
+return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
+Nv:{
+"^":"Tp:30;a,b,c",
+call$1:[function(a){var z,y,x
+z=this.b.NE
+y=this.a
+x=y.a
+y.a=x+1
+y=this.c.t(0,a)
+if(x>=z.length)return H.e(z,x)
+z[x]=y},"call$1",null,2,0,null,12,[],"call"],
+$isEH:true},
 Cj:{
-"^":"Tp:349;a,b,c",
+"^":"Tp:352;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b)
-z.a=z.a+1},"call$2",null,4,0,null,12,[],46,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:349;a,b",
+"^":"Tp:352;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,347,[],23,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10410,7 +10501,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,20,[]],
+return y},"call$1","gul",2,0,null,22,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10420,20 +10511,20 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,20,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
   } catch (e) {
     return e.message;
   }
-}(a)},"call$1","LS",2,0,null,49,[]],Mj:[function(a){return function($expr$) {
+}(a)},"call$1","LS",2,0,null,54,[]],Mj:[function(a){return function($expr$) {
   try {
     $expr$.$method$;
   } catch (e) {
     return e.message;
   }
-}(a)},"call$1","cl",2,0,null,49,[]]}},
+}(a)},"call$1","cl",2,0,null,54,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
 bu:[function(a){var z=this.Ga
@@ -10447,8 +10538,8 @@
 z=this.Ga
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.EP
-if(y==null)return"NoSuchMethodError: Cannot call \""+z+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+z+"\" on \""+y+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
 $ismp:true,
 $isGe:true,
 static:{T3:function(a,b){var z,y
@@ -10461,10 +10552,10 @@
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"call$1",null,2,0,null,160,[],"call"],
+return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
@@ -10477,23 +10568,23 @@
 this.ui=z
 return z},"call$0","gXo",0,0,null]},
 dr:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:113;b,c",
+"^":"Tp:115;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:113;d,e,f",
+"^":"Tp:115;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:113;UI,bK,Gq,Rm",
+"^":"Tp:115;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:113;w3,HZ,mG,xC,cj",
+"^":"Tp:115;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
@@ -10510,35 +10601,35 @@
 if(this===b)return!0
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,104,[]],
+return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
 if(z==null)y=H.eQ(this.nw)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"call$1","PR",2,0,null,52,[]],yS:[function(a){return a.EP},"call$1","h0",2,0,null,52,[]],oN:[function(){var z=$.bf
+static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"call$1","PR",2,0,null,57,[]],yS:[function(a){return a.EP},"call$1","MZ",2,0,null,57,[]],oN:[function(){var z=$.bf
 if(z==null){z=H.B3("self")
 $.bf=z}return z},"call$0","uT",0,0,null],Wz:[function(){var z=$.P4
 if(z==null){z=H.B3("receiver")
-$.P4=z}return z},"call$0","TT",0,0,null],B3:[function(a){var z,y,x,w,v
+$.P4=z}return z},"call$0","qY",0,0,null],B3:[function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"call$1","ec",2,0,null,65,[]]}},
+if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
 Ll:{
-"^":"a;Jy"},
-dN:{
-"^":"a;Jy"},
-GT:{
+"^":"a;QW"},
+D2:{
+"^":"a;QW"},
+my:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
 bu:[function(a){return this.G1},"call$0","gXo",0,0,null],
 $isGe:true,
-static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+a+" to incompatible type "+H.d(b))}}},
+static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 Eq:{
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -10548,9 +10639,9 @@
 tD:{
 "^":"lb;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,49,[]],
+return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,91,[]],
+return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,96,[]],
 za:[function(){var z,y,x,w,v,u,t
 z={ "func": "dynafunc" }
 y=this.dw
@@ -10585,7 +10676,7 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","eL",2,0,null,68,[]]}},
+return z},"call$1","At",2,0,null,73,[]]}},
 hJ:{
 "^":"lb;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
@@ -10596,7 +10687,7 @@
 za:[function(){var z,y
 z=this.oc
 y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+z+"'")
+if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},"call$0","gpA",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
@@ -10607,11 +10698,11 @@
 z=this.oc
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+z+"<...>'")
+if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},"call$0","gpA",0,0,null],
-bu:[function(a){return this.oc+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
+bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
 bu:[function(a){return"Unsupported operation: "+this.K9},"call$0","gXo",0,0,null],
@@ -10632,22 +10723,22 @@
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:350;b",
-call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,91,[],94,[],"call"],
+"^":"Tp:353;b",
+call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:25;c",
-call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,94,[],"call"],
+"^":"Tp:30;c",
+call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
 "^":"a;Ej,Ii,Ua",
@@ -10667,16 +10758,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,339,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,339,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,339,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,26,[],120,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10687,15 +10778,15 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,26,[],120,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,335,26,[],120,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
 $isVR:true,
-$iscT:true,
+$isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -10703,12 +10794,12 @@
 w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","ka",8,0,null,98,[],99,[],100,[],101,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","ka",8,0,null,103,[],104,[],105,[],106,[]]}},
 EK:{
-"^":"a;zO,QK<",
+"^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10718,7 +10809,7 @@
 "^":"mW;Gf,rv",
 gA:function(a){return new H.Pb(this.Gf,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$ascX:function(){return[P.Od]}},
+$asQV:function(){return[P.Od]}},
 Pb:{
 "^":"a;VV,rv,Wh",
 gl:function(){return this.Wh},
@@ -10739,42 +10830,35 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,351,[]],
+return this.zO},"call$1","gIA",2,0,null,354,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"call$1","vN",2,0,107,108,[]],
-js:[function(a,b){return J.pb(b,new G.BO(a))},"call$2","o4",4,0,null,110,[],111,[]],
+return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-352,zf>-353,AJ,Eb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gn9:[function(a){return this.AJ},null,null,1,0,354,"response",355,356],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,357,23,[],"response",355],
-gAq:[function(a){return this.Eb},null,null,1,0,358,"isolate",355,356],
-sAq:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,359,23,[],"isolate",355],
-Ww:[function(a,b){var z=H.B7(["type","Error","errorType",b,"text",a],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-this.AJ=F.Wi(this,C.mE,this.AJ,z)
-N.Jx("").hh(a)},function(a){return this.Ww(a,"ResponseError")},"AI","call$2",null,"gug",2,2,null,360,20,[],361,[]],
-TR:[function(){this.zf.sec(this)
-var z=this.Z6
+"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
+gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+Da:[function(){var z=this.Z6
 z.sec(this)
-z.kI()},"call$0","gIo",0,0,null],
-US:function(){this.TR()},
-hq:function(){this.TR()},
-static:{"^":"Tj,pQ"}},
+z.kI()},"call$0","gLW",0,0,null],
+US:function(){this.Da()},
+hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],362,[]],
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
 lb:[function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gGL",0,0,null],
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,363,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10782,219 +10866,18 @@
 if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
 x=J.U6(z)
 y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gIK",0,0,null],
+y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gmf",0,0,null],
 W2:[function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])},"call$1","gW8",2,0,null,186,[]]},
-bv:{
-"^":["Pi;zf>,rI,we,jF,XR<-364,Z0<-365,hI,am,y6,c8,LE<-366,qU,yg,YG,jy,AP,fn",null,null,null,null,function(){return[C.mI]},function(){return[C.mI]},null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gAq:function(a){return this},
-gPj:function(a){return this.rI},
-gjO:function(a){return this.rI},
-zr:[function(a){return this.zf.Sl(this.rI).ml(new G.eS(this)).ml(new G.IQ(this))},"call$0","gvC",0,0,null],
-Mq:[function(a){return H.d(this.rI)+"/"+H.d(a)},"call$1","gLc",2,0,367,109,[],"relativeLink",355],
-rn:[function(a){return"#/"+(H.d(this.rI)+"/"+H.d(a))},"call$1","gHP",2,0,367,109,[],"hashLink",355],
-gB1:[function(a){return this.jF},null,null,1,0,368,"profile",355,356],
-sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,369,23,[],"profile",355],
-goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
-soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
-gzz:[function(){return this.am},null,null,1,0,370,"vmName",355,356],
-szz:[function(a){this.am=F.Wi(this,C.KS,this.am,a)},null,null,3,0,25,23,[],"vmName",355],
-gw2:[function(){return this.y6},null,null,1,0,354,"entry",355,356],
-sw2:[function(a){this.y6=F.Wi(this,C.tP,this.y6,a)},null,null,3,0,357,23,[],"entry",355],
-gVc:[function(){return this.c8},null,null,1,0,370,"rootLib",355,356],
-sVc:[function(a){this.c8=F.Wi(this,C.iF,this.c8,a)},null,null,3,0,25,23,[],"rootLib",355],
-gCi:[function(){return this.qU},null,null,1,0,371,"newHeapUsed",355,356],
-sCi:[function(a){this.qU=F.Wi(this,C.IO,this.qU,a)},null,null,3,0,372,23,[],"newHeapUsed",355],
-guq:[function(){return this.yg},null,null,1,0,371,"oldHeapUsed",355,356],
-suq:[function(a){this.yg=F.Wi(this,C.ap,this.yg,a)},null,null,3,0,372,23,[],"oldHeapUsed",355],
-gUu:[function(){return this.YG},null,null,1,0,354,"topFrame",355,356],
-sUu:[function(a){this.YG=F.Wi(this,C.ch,this.YG,a)},null,null,3,0,357,23,[],"topFrame",355],
-gNh:[function(a){return this.jy},null,null,1,0,370,"fileAndLine",355,356],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.jy=F.Wi(this,C.SK,this.jy,b)},null,null,3,0,25,23,[],"fileAndLine",355],
-eC:[function(a){var z,y,x,w
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"Isolate")){N.Jx("").hh("Unexpected message type in Isolate.update: "+H.d(z.t(a,"type")))
-return}if(z.t(a,"rootLib")==null||z.t(a,"timers")==null||z.t(a,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(a))
-return}y=J.UQ(z.t(a,"rootLib"),"id")
-this.c8=F.Wi(this,C.iF,this.c8,y)
-y=z.t(a,"name")
-this.am=F.Wi(this,C.KS,this.am,y)
-if(z.t(a,"entry")!=null){y=z.t(a,"entry")
-y=F.Wi(this,C.tP,this.y6,y)
-this.y6=y
-y=J.UQ(y,"name")
-this.hI=F.Wi(this,C.YS,this.hI,y)}else this.hI=F.Wi(this,C.YS,this.hI,"root isolate")
-if(z.t(a,"topFrame")!=null){y=z.t(a,"topFrame")
-this.YG=F.Wi(this,C.ch,this.YG,y)}x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(a,"timers"),new G.TI(x))
-y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
-y=J.UQ(z.t(a,"heap"),"usedNew")
-this.qU=F.Wi(this,C.IO,this.qU,y)
-z=J.UQ(z.t(a,"heap"),"usedOld")
-this.yg=F.Wi(this,C.ap,this.yg,z)},"call$1","gpn",2,0,null,149,[]],
-bu:[function(a){return H.d(this.rI)},"call$0","gXo",0,0,null],
-hv:[function(a){var z,y,x,w
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.kE(y.t(z,x),a)===!0)return y.t(z,x);++x}return},"call$1","gER",2,0,null,373,[]],
-R7:[function(){var z,y,x,w
-N.Jx("").To("Reset all code ticks.")
-z=this.Z0
-y=J.U6(z)
-x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.t(z,x).FB();++x}},"call$0","gve",0,0,null],
-oe:[function(a){var z,y,x,w,v,u,t
-for(z=J.GP(a),y=this.XR,x=J.U6(y);z.G();){w=z.gl()
-v=J.U6(w)
-u=J.UQ(v.t(w,"script"),"id")
-t=x.t(y,u)
-if(t==null){t=G.Ak(v.t(w,"script"))
-x.u(y,u,t)}t.hC(v.t(w,"hits"))}},"call$1","gHY",2,0,null,374,[]],
-tx:[function(a,b,c){var z,y,x
-z=H.B7(["type",a,b,c],P.L5(null,null,null,null,null))
-y=this.zf.ec
-y.toString
-x=R.Jk(z)
-y.AJ=F.Wi(y,C.mE,y.AJ,x)},"call$3","gmk",6,0,null,11,[],375,[],285,[]],
-XT:[function(a,b){var z,y,x
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isew){z=W.qc(a.target)
-y=J.RE(z)
-x=H.d(y.gys(z))+" "+y.gpo(z)
-if(y.gys(z)===0)x="No service found. Did you run with --enable-vm-service ?"
-this.zf.ec.Ww(x,"RequestError")}else this.zf.ec.AI(H.d(a)+" "+H.d(b))},"call$2","gdT",4,0,376,18,[],377,[]],
-n1:[function(a){var z,y,x
-z=G.Ep(a)
-y=J.x(z)
-if(y.n(z,0)){this.zf.ec.AI(a+" is not a valid code request.")
-return}x=this.hv(z)
-if(x!=null){N.Jx("").To("Found code with 0x"+y.WZ(z,16)+" in isolate.")
-this.tx("Code","code",x)
-return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.at(this,z)).OA(this.gdT())},"call$1","gN8",2,0,null,109,[]],
-PL:[function(a){var z,y
-z=J.UQ(this.XR,a)
-y=z!=null
-if(y&&!z.giI()){N.Jx("").To("Found script "+H.d(J.UQ(z.gKC(),"name"))+" in isolate")
-this.tx("Script","script",z)
-return}if(y){this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.wu(this,z))
-return}this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.Vc(this,a))},"call$1","gdk",2,0,null,109,[]],
-ox:[function(a){var z,y
-z=$.Ks().Ej
-y=typeof a!=="string"
-if(y)H.vh(new P.AT(a))
-if(z.test(a)){this.n1(a)
-return}z=$.hK().Ej
-if(y)H.vh(new P.AT(a))
-if(z.test(a)){this.PL(a)
-return}return this.zf.Sl(H.d(this.rI)+"/"+a).ml(new G.KQ(this,a))},"call$1","gVw",2,0,null,109,[]],
-oX:[function(a){return this.zf.Sl(H.d(this.rI)+"/"+H.d(a))},"call$1","guZ",2,0,null,109,[]],
-$isd3:true,
-static:{"^":"rC,lF",Ep:[function(a){var z,y,x,w,v,u
-z=$.Ks().R4(0,a)
-if(z==null)return 0
-try{x=z.gQK().input
-w=z
-v=w.gQK().index
-w=w.gQK()
-if(0>=w.length)return H.e(w,0)
-w=J.q8(w[0])
-if(typeof w!=="number")return H.s(w)
-y=H.BU(C.xB.yn(x,v+w),16,null)
-return y}catch(u){H.Ru(u)
-return 0}},"call$1","VP",2,0,null,109,[]]}},
-eS:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.eC(a)},"call$1",null,2,0,null,191,[],"call"],
-$isEH:true},
-IQ:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
-$isEH:true},
-TI:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,378,[],"call"],
-$isEH:true},
-at:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z,y,x,w,v
-z=R.Jk([])
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.B7([],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-w=J.U6(a)
-v=new G.kx(C.l8,H.BU(w.t(a,"start"),16,null),H.BU(w.t(a,"end"),16,null),[],[],[],0,0,z,y,x,null,null,null,null)
-v.NV(a)
-N.Jx("").To("Added code with 0x"+J.u1(this.b,16)+" to isolate.")
-x=this.a
-J.bi(x.Z0,v)
-x.tx("Code","code",v)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-wu:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z=this.b
-z.qi(J.UQ(a,"source"))
-N.Jx("").To("Grabbed script "+H.d(J.UQ(z.gKC(),"name"))+" source.")
-this.a.tx("Script","script",z)},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-Vc:{
-"^":"Tp:107;c,d",
-call$1:[function(a){var z,y
-z=G.Ak(a)
-N.Jx("").To("Added script "+H.d(J.UQ(z.VG,"name"))+" to isolate.")
-y=this.c
-y.tx("Script","script",z)
-J.kW(y.XR,this.d,z)},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:107;a,b",
-call$1:[function(a){var z,y
-z=this.a
-y=J.U6(a)
-y=new G.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,y.t(a,"id"),y.t(a,"type"),null,null,null,null)
-y.wp(z,a)
-return y},"call$1",null,2,0,null,191,[],"call"],
-$isEH:true},
+this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
-"^":"Pi;ec?,jF,JL,MU,AP,fn",
-guw:function(a){return this.ec},
-gB1:[function(a){return this.jF},null,null,1,0,380,"profile",355,356],
-sB1:[function(a,b){this.jF=F.Wi(this,C.vb,this.jF,b)},null,null,3,0,381,23,[],"profile",355],
-gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",355,356],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,25,23,[],"currentHash",355],
-gXX:[function(){return this.MU},null,null,1,0,382,"currentHashUri",355,356],
-sXX:[function(a){this.MU=F.Wi(this,C.tv,this.MU,a)},null,null,3,0,383,23,[],"currentHashUri",355],
+"^":"Pi;ec?,JL,AP,Lk",
+gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
-vI:[function(){var z,y,x,w,v
-z=$.oy().R4(0,this.JL)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-v=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.Nj(x,w,v+y)},"call$0","gzJ",0,0,null],
-V4:[function(){var z,y,x,w
-z=$.oy().R4(0,this.JL)
+e8:[function(){var z,y,x,w
+z=$.wM().R4(0,this.JL)
 if(z==null)return
 y=z.QK
 x=y.input
@@ -11002,332 +10885,46 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$0","gdQ",0,0,null],
-gwB:[function(){return this.vI()!=null},null,null,1,0,380,"hasCurrentIsolate",356],
-R6:[function(){var z=this.vI()
+return C.xB.yn(x,w+y)},"call$0","gIZ",0,0,null],
+R6:[function(){var z,y,x,w
+z=$.QJ().R4(0,this.JL)
 if(z==null)return""
-return J.D8(z,2)},"call$0","gKo",0,0,null],
+y=z.QK
+x=y.input
+w=y.index
+if(0>=y.length)return H.e(y,0)
+y=J.q8(y[0])
+if(typeof y!=="number")return H.s(y)
+return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return this.ec.zf.AQ(z)},"call$0","gjf",0,0,358,"currentIsolate",356],
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
 S7:[function(){var z=J.Co(C.ol.gmW(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
 if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
-df:[function(){var z,y,x,w
+rR:[function(a){var z=this.ec
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+df:[function(){var z,y,x
 z=J.Co(C.ol.gmW(window))
-z=F.Wi(this,C.h1,this.JL,z)
-this.JL=z
-y=J.D8(z,1)
+this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
-x=this.Pr()
-z.Eb=F.Wi(z,C.Z8,z.Eb,x)
-x=P.r6($.qG().ej(y))
-this.MU=F.Wi(this,C.tv,this.MU,x)
-if(this.ec.Eb==null){N.Jx("").j2("Refreshing isolates.")
-this.ec.zf.r3()
-return}w=this.V4()
-N.Jx("").To("Asking "+H.d(J.F8(this.ec.Eb))+" for "+w)
-this.ec.Eb.ox(w).ml(new G.GH(this))},"call$0","glq",0,0,null],
-static:{"^":"x4,Qq,qY"}},
+y=this.Pr()
+z.Eb=F.Wi(z,C.Z8,z.Eb,y)
+z=this.ec
+if(z.Eb==null){J.am(J.dm(z.zf)).ml(this.gf8())
+return}x=this.e8()
+this.ec.Eb.ox(x).ml(this.gf8())},"call$0","glq",0,0,null],
+static:{"^":"K3D,m6,vi"}},
 Qe:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-F.Wi(z,C.D2,z.vI()==null,z.vI()!=null)
-z.df()},"call$1",null,2,0,null,384,[],"call"],
+z.df()},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
-GH:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=this.a.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1",null,2,0,null,385,[],"call"],
-$isEH:true},
-Q4:{
-"^":["Pi;Yu<-386,m7<-387,L4<-387,NC,xb,AP,fn",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-ga0:[function(){return this.NC},null,null,1,0,371,"ticks",355,356],
-sa0:[function(a){this.NC=F.Wi(this,C.p1,this.NC,a)},null,null,3,0,372,23,[],"ticks",355],
-gGK:[function(){return this.xb},null,null,1,0,388,"percent",355,356],
-sGK:[function(a){this.xb=F.Wi(this,C.tI,this.xb,a)},null,null,3,0,389,23,[],"percent",355],
-oS:[function(){var z=this.xb
-if(z==null||J.Hb(z,0))return""
-return J.Ez(this.xb,2)+"% ("+H.d(this.NC)+")"},"call$0","gu3",0,0,370,"formattedTicks",356],
-xt:[function(){return"0x"+J.u1(this.Yu,16)},"call$0","gDa",0,0,370,"formattedAddress",356]},
-WAE:{
-"^":"a;Zd",
-bu:[function(a){return"CodeKind."+this.Zd},"call$0","gXo",0,0,null],
-static:{"^":"r1,pg,WAg",CQ:[function(a){var z=J.x(a)
-if(z.n(a,"Native"))return C.nj
-else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
-throw H.b(P.hS())},"call$1","Tx",2,0,null,86,[]]}},
-N8:{
-"^":"a;Yu<,pO,Iw"},
-Vi:{
-"^":"a;tT>,Av<"},
-kx:{
-"^":["Pi;fY>,vg,Mb,a0<,VS<,hw,fF<,Du<,va<-390,tQ,Ge,hI,HJ,AP,fn",null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null],
-gkx:[function(){return this.tQ},null,null,1,0,354,"functionRef",355,356],
-skx:[function(a){this.tQ=F.Wi(this,C.yg,this.tQ,a)},null,null,3,0,357,23,[],"functionRef",355],
-gZN:[function(){return this.Ge},null,null,1,0,354,"codeRef",355,356],
-sZN:[function(a){this.Ge=F.Wi(this,C.EX,this.Ge,a)},null,null,3,0,357,23,[],"codeRef",355],
-goc:[function(a){return this.hI},null,null,1,0,370,"name",355,356],
-soc:[function(a,b){this.hI=F.Wi(this,C.YS,this.hI,b)},null,null,3,0,25,23,[],"name",355],
-giK:[function(){return this.HJ},null,null,1,0,370,"userName",355,356],
-siK:[function(a){this.HJ=F.Wi(this,C.ct,this.HJ,a)},null,null,3,0,25,23,[],"userName",355],
-R3:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-this.fF=H.BU(z.t(b,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(b,"exclusive_ticks"),null,null)
-y=z.t(b,"ticks")
-if(y!=null&&J.z8(J.q8(y),0)){z=J.U6(y)
-x=this.a0
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(y,w),16,null)
-t=H.BU(z.t(y,w+1),null,null)
-x.push(new G.N8(u,H.BU(z.t(y,w+2),null,null),t))
-w+=3}}},"call$1","gOT",2,0,null,149,[]],
-QQ:[function(){return this.uL(this.VS)},"call$0","gyj",0,0,null],
-dJ:[function(a){return this.KU(this.VS,a)},"call$1","gf7",2,0,null,141,[]],
-uL:[function(a){var z,y,x
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]),y=0;z.G();){x=z.lo.gAv()
-if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","grr",2,0,null,391,[]],
-KU:[function(a,b){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gKZ",4,0,null,391,[],141,[]],
-xF:[function(a,b){var z=J.U6(a)
-this.lC(this.VS,z.t(a,"callers"),b)
-this.lC(this.hw,z.t(a,"callees"),b)},"call$2","gL0",4,0,null,141,[],392,[]],
-lC:[function(a,b,c){var z,y,x,w,v
-C.Nm.sB(a,0)
-z=J.U6(b)
-y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new G.Vi(c[w],v))
-y+=2}H.ZE(a,0,a.length-1,new G.fx())},"call$3","gPG",6,0,null,391,[],239,[],392,[]],
-FB:[function(){this.fF=0
-this.Du=0
-C.Nm.sB(this.a0,0)
-for(var z=J.GP(this.va);z.G();)z.gl().sa0(0)},"call$0","gNB",0,0,null],
-iv:[function(a){var z,y,x,w,v
-z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(J.de(x.t(a,w),""))break c$0
-y.h(z,new G.Q4(H.BU(x.t(a,w),null,null),x.t(a,w+1),x.t(a,w+2),0,null,null,null))}w+=3}},"call$1","goU",2,0,null,393,[]],
-tg:[function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},"call$1","gdj",2,0,null,373,[]],
-NV:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"function")
-y=R.Jk(y)
-this.tQ=F.Wi(this,C.yg,this.tQ,y)
-y=R.Jk(a)
-this.Ge=F.Wi(this,C.EX,this.Ge,y)
-y=z.t(a,"name")
-this.hI=F.Wi(this,C.YS,this.hI,y)
-y=z.t(a,"user_name")
-this.HJ=F.Wi(this,C.ct,this.HJ,y)
-if(z.t(a,"disassembly")!=null)this.iv(z.t(a,"disassembly"))},
-$iskx:true},
-fx:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
-CM:{
-"^":"a;Aq>,tm,hV<",
-j8:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.U6(a)
-if(!J.de(z.t(a,"type"),"ProfileCode"))return
-y=this.Aq
-x=y.hv(H.BU(J.UQ(z.t(a,"code"),"start"),16,null))
-if(x==null){w=G.CQ(z.t(a,"kind"))
-v=z.t(a,"code")
-z=J.U6(v)
-u=H.BU(z.t(v,"start"),16,null)
-t=H.BU(z.t(v,"end"),16,null)
-s=z.t(v,"name")
-r=z.t(v,"user_name")
-q=R.Jk([])
-p=H.B7([],P.L5(null,null,null,null,null))
-p=R.Jk(p)
-o=H.B7([],P.L5(null,null,null,null,null))
-o=R.Jk(o)
-x=new G.kx(w,u,t,[],[],[],0,0,q,p,o,s,null,null,null)
-x.Ge=F.Wi(x,C.EX,o,v)
-o=z.t(v,"function")
-q=R.Jk(o)
-x.tQ=F.Wi(x,C.yg,x.tQ,q)
-x.HJ=F.Wi(x,C.ct,x.HJ,r)
-if(z.t(v,"disassembly")!=null){x.iv(z.t(v,"disassembly"))
-z.u(v,"disassembly",null)}J.bi(y.gZ0(),x)}J.JD(x,a)
-this.tm.push(x)},"call$1","gWF",2,0,null,394,[]],
-T0:[function(a){var z,y
-z=this.Aq.gZ0()
-y=J.w1(z)
-y.GT(z,new G.vu())
-if(J.u6(y.gB(z),a)||J.de(a,0))return z
-return y.D6(z,0,a)},"call$1","gmZ",2,0,null,127,[]],
-uH:function(a,b){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"codes")
-this.hV=z.t(b,"samples")
-z=J.U6(y)
-N.Jx("").To("Creating profile from "+H.d(this.hV)+" samples and "+H.d(z.gB(y))+" code objects.")
-this.Aq.R7()
-x=this.tm
-C.Nm.sB(x,0)
-z.aN(y,new G.xn(this))
-w=0
-while(!0){v=z.gB(y)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-if(w>=x.length)return H.e(x,w)
-x[w].xF(z.t(y,w),x);++w}C.Nm.sB(x,0)},
-static:{hh:function(a,b){var z=new G.CM(a,H.VM([],[G.kx]),0)
-z.uH(a,b)
-return z}}},
-xn:{
-"^":"Tp:107;a",
-call$1:[function(a){var z,y,x,w
-try{this.a.j8(a)}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-N.Jx("").wF("Error processing code object. "+H.d(z)+" "+H.d(y),z,y)}},"call$1",null,2,0,null,141,[],"call"],
-$isEH:true},
-vu:{
-"^":"Tp:395;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
-c2:{
-"^":["Pi;Rd>-386,ye,i0,AP,fn",function(){return[C.mI]},null,null,null,null],
-gu9:[function(){return this.ye},null,null,1,0,371,"hits",355,356],
-su9:[function(a){this.ye=F.Wi(this,C.K7,this.ye,a)},null,null,3,0,372,23,[],"hits",355],
-ga4:[function(a){return this.i0},null,null,1,0,370,"text",355,356],
-sa4:[function(a,b){this.i0=F.Wi(this,C.MB,this.i0,b)},null,null,3,0,25,23,[],"text",355],
-goG:function(){return J.J5(this.ye,0)},
-gVt:function(){return J.z8(this.ye,0)},
-$isc2:true},
-rj:{
-"^":["Pi;I2,VG,pw,tq,Sw<-396,iA,AP,fn",null,null,null,null,function(){return[C.mI]},null,null,null],
-gfY:[function(a){return this.I2},null,null,1,0,370,"kind",355,356],
-sfY:[function(a,b){this.I2=F.Wi(this,C.fy,this.I2,b)},null,null,3,0,25,23,[],"kind",355],
-gKC:[function(){return this.VG},null,null,1,0,354,"scriptRef",355,356],
-sKC:[function(a){this.VG=F.Wi(this,C.Be,this.VG,a)},null,null,3,0,357,23,[],"scriptRef",355],
-gQT:[function(){return this.pw},null,null,1,0,370,"shortName",355,397],
-sQT:[function(a){this.pw=F.Wi(this,C.Kt,this.pw,a)},null,null,3,0,25,23,[],"shortName",355],
-gBi:[function(){return this.tq},null,null,1,0,354,"libraryRef",355,356],
-sBi:[function(a){this.tq=F.Wi(this,C.cg,this.tq,a)},null,null,3,0,357,23,[],"libraryRef",355],
-giI:function(){return this.iA},
-gHh:[function(){return J.Pr(this.Sw,1)},null,null,1,0,398,"linesForDisplay",356],
-H2:[function(a){var z,y,x,w
-z=this.Sw
-y=J.U6(z)
-x=J.Wx(a)
-if(x.F(a,y.gB(z)))y.sB(z,x.g(a,1))
-w=y.t(z,a)
-if(w==null){w=new G.c2(a,-1,"",null,null)
-y.u(z,a,w)}return w},"call$1","git",2,0,null,399,[]],
-qi:[function(a){var z,y,x,w
-if(a==null)return
-N.Jx("").To("Loading source for "+H.d(J.UQ(this.VG,"name")))
-z=J.uH(a,"\n")
-this.iA=z.length===0
-for(y=0;y<z.length;y=x){x=y+1
-w=this.H2(x)
-if(y>=z.length)return H.e(z,y)
-J.c9(w,z[y])}},"call$1","gUe",2,0,null,27,[]],
-hC:[function(a){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-this.H2(z.t(a,y)).su9(z.t(a,y+1))
-y+=2}F.Wi(this,C.C2,"","("+C.CD.yM(this.Nk(),1)+"% covered)")},"call$1","geL",2,0,null,400,[]],
-Nk:[function(){var z,y,x,w
-for(z=J.GP(this.Sw),y=0,x=0;z.G();){w=z.gl()
-if(w==null)continue
-if(!w.goG())continue;++x
-if(!w.gVt())continue;++y}if(x===0)return 0
-return y/x*100},"call$0","gUO",0,0,388,"coveredPercentage",356],
-Jt:[function(){return"("+C.CD.yM(this.Nk(),1)+"% covered)"},"call$0","gic",0,0,370,"coveredPercentageFormatted",356],
-Ea:function(a){var z,y
-z=J.U6(a)
-y=H.B7(["id",z.t(a,"id"),"name",z.t(a,"name"),"user_name",z.t(a,"user_name")],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-this.VG=F.Wi(this,C.Be,this.VG,y)
-y=J.D8(z.t(a,"name"),J.WB(J.eJ(z.t(a,"name"),"/"),1))
-this.pw=F.Wi(this,C.Kt,this.pw,y)
-y=z.t(a,"library")
-y=R.Jk(y)
-this.tq=F.Wi(this,C.cg,this.tq,y)
-y=z.t(a,"kind")
-this.I2=F.Wi(this,C.fy,this.I2,y)
-this.qi(z.t(a,"source"))},
-$isrj:true,
-static:{Ak:function(a){var z,y,x
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=H.B7([],P.L5(null,null,null,null,null))
-y=R.Jk(y)
-x=H.VM([],[G.c2])
-x=R.Jk(x)
-x=new G.rj(null,z,null,y,x,!0,null,null)
-x.Ea(a)
-return x}}},
-af:{
-"^":"d3;Aq>",
-gPj:function(a){return H.d(this.Aq.rI)+"/"+H.d(this.rI)},
-gjO:function(a){return this.rI}},
-SI:{
-"^":"af;YY,Aq,rI,we,R9,wv,V2,me",
-zr:[function(a){var z=this.Aq
-z.zf.Sl(H.d(z.rI)+"/"+H.d(this.rI)).ml(this.gE7())
-return P.Ab(this,null)},"call$0","gvC",0,0,null],
-Tn:[function(a){var z=this.YY
-z.V1(0)
-z.FV(0,a)},"call$1","gE7",2,0,401,191,[]],
-FV:[function(a,b){return this.YY.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
-V1:[function(a){return this.YY.V1(0)},"call$0","gyP",0,0,null],
-di:[function(a){return this.YY.Zp.di(a)},"call$1","gmc",2,0,null,277,[]],
-x4:[function(a){return this.YY.Zp.x4(a)},"call$1","gV9",2,0,null,402,[]],
-aN:[function(a,b){return this.YY.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
-Rz:[function(a,b){return this.YY.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
-t:[function(a,b){return this.YY.Zp.t(0,b)},"call$1","gIA",2,0,null,402,[]],
-u:[function(a,b,c){this.YY.u(0,b,c)
-return c},"call$2","gj3",4,0,null,402,[],277,[]],
-gl0:function(a){var z=this.YY.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.YY.Zp
-return z.gB(z)!==0},
-gvc:function(a){var z=this.YY.Zp
-return z.gvc(z)},
-gUQ:function(a){var z=this.YY.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.YY.Zp
-return z.gB(z)},
-wp:function(a,b){var z=this.YY
-z.V1(0)
-z.FV(0,b)},
-$isZ0:true,
-$asZ0:function(){return[null,null]}},
 Y2:{
-"^":["Pi;eT>,yt<-386,wd>-403,oH<-404",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -11337,15 +10934,15 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rO,WT>-403,AP,fn",null,function(){return[C.mI]},null,null],
+"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,405,[]],
-Mf:[function(a){var z=J.UQ(this.WT,a)
+y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
+qU:[function(a){var z=J.UQ(this.WT,a)
 if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,406,[]],
+else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
 VE:[function(a){var z,y,x,w,v,u,t
 z=this.WT
 y=J.U6(z)
@@ -11358,7 +10955,7 @@
 u=x+v+1
 t=J.UQ(w.gwd(a),v)
 if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,363,[]],
+else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -11369,159 +10966,37 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,363,[]]},
-No:{
-"^":["Pi;ec?,i2<-407",null,function(){return[C.mI]}],
-guw:[function(a){return this.ec},null,null,1,0,408,"app",356],
-Sl:[function(a){return this.GS(a).ml(new G.PG()).OA(new G.YW())},"call$1","gdI",2,0,null,265,[]],
-AQ:[function(a){var z,y,x,w,v,u
-z=this.i2
-y=J.U6(z)
-x=y.t(z,a)
-if(x!=null)return x
-w=P.L5(null,null,null,J.O,G.rj)
-w=R.Jk(w)
-v=H.VM([],[G.kx])
-u=P.L5(null,null,null,J.O,J.GW)
-u=R.Jk(u)
-x=new G.bv(this,a,"Isolate",null,w,v,"isolate",null,null,null,u,0,0,null,null,null,null)
-y.u(z,a,x)
-return x},"call$1","grE",2,0,null,110,[]],
-GR:[function(a){var z=[]
-J.kH(this.i2,new G.Yu(a,z))
-H.bQ(z,new G.y2(this))
-J.kH(a,new G.Hq(this))},"call$1","gZM",2,0,null,111,[]],
-r3:[function(){this.Sl("isolates").ml(new G.Pl(this))},"call$0","gNI",0,0,null]},
-PG:{
-"^":"Tp:107;",
-call$1:[function(a){var z,y,x,w,v
-try{z=C.xr.kV(a)
-w=R.Jk(z)
-return w}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-w=H.B7(["type","Error","errorType","DecodeError","text",H.d(y)+" "+H.d(x)],P.L5(null,null,null,null,null))
-w=R.Jk(w)
-return w}},"call$1",null,2,0,null,379,[],"call"],
-$isEH:true},
-YW:{
-"^":"Tp:107;",
-call$1:[function(a){var z=H.B7(["type","Error","errorType","FetchError","text",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,160,[],"call"],
-$isEH:true},
-BO:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,409,[],"call"],
-$isEH:true},
-Yu:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){if(G.js(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,402,[],277,[],"call"],
-$isEH:true},
-y2:{
-"^":"Tp:107;c",
-call$1:[function(a){J.V1(this.c.i2,a)},"call$1",null,2,0,null,110,[],"call"],
-$isEH:true},
-Hq:{
-"^":"Tp:107;d",
-call$1:[function(a){var z,y,x,w,v,u,t,s,r
-z=J.U6(a)
-y=z.t(a,"id")
-x=this.d
-w=x.i2
-v=J.U6(w)
-u=v.t(w,y)
-if(u==null){t=P.L5(null,null,null,J.O,G.rj)
-t=R.Jk(t)
-s=H.VM([],[G.kx])
-r=P.L5(null,null,null,J.O,J.GW)
-r=R.Jk(r)
-u=new G.bv(x,z.t(a,"id"),"Isolate",null,t,s,z.t(a,"name"),null,null,null,r,0,0,null,null,null,null)
-v.u(w,y,u)}J.KM(u)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-Pl:{
-"^":"Tp:107;a",
-call$1:[function(a){var z,y
-z=this.a
-z.GR(J.UQ(a,"members"))
-z=z.ec
-z.toString
-y=R.Jk(a)
-z.AJ=F.Wi(z,C.mE,z.AJ,y)},"call$1",null,2,0,null,149,[],"call"],
-$isEH:true},
-XK:{
-"^":["No;Yu<,ec,i2-407,AP,fn",null,null,function(){return[C.mI]},null,null],
-GS:[function(a){var z=this.Yu
-N.Jx("").To("Fetching "+H.d(a)+" from "+z)
-return W.It(C.xB.g(z,a),null,null)},"call$1","gFw",2,0,null,265,[]]},
-ho:{
-"^":["No;Ct,pL,ec,i2-407,AP,fn",null,null,null,function(){return[C.mI]},null,null],
-rz:[function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.Ct
-v=z.t(0,y)
-z.Rz(0,y)
-J.Xf(v,w)},"call$1","gcW",2,0,158,19,[]],
-GS:[function(a){var z,y,x
-z=""+this.pL
-y=H.B7([],P.L5(null,null,null,null,null))
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-y.u(0,"query","/"+H.d(a))
-this.pL=this.pL+1
-x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.Ct.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gFw",2,0,null,265,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/isolate_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/disassembly_entry.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/vm_element.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/message_viewer.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
-F.E2()},"call$0","nE",0,0,112]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Ur;BW%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grs:[function(a){return a.BW},null,null,1,0,354,"msg",355,397],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,357,23,[],"msg",355],
-RF:[function(a,b){a.pC.oX("breakpoints").ml(new B.j3(a)).OA(new B.i0()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
+yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.jy]},
-static:{Dw:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.BW=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{Dw:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.J0.ZL(a)
 C.J0.G6(a)
-return a},null,null,0,0,113,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[414],
-Ur:{
-"^":"PO+Pi;",
-$isd3:true},
-j3:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sBW(z,y.ct(z,C.UX,y.gBW(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+BreakpointListElement_refresh_closure":[415],
-i0:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing breakpoint-list: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+BreakpointListElement_refresh_closure":[415]}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[380],
+Vf:{
+"^":"uL+Pi;",
+$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11535,15 +11010,15 @@
 a.X0=w
 C.YZ.ZL(a)
 C.YZ.G6(a)
-return a},null,null,0,0,113,"new ClassRefElement$created"]}},
-"+ClassRefElement":[418]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,115,"new ClassRefElement$created"]}},
+"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
-Ps:{
-"^":["KU;F0%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.F0},null,null,1,0,354,"cls",355,397],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,357,23,[],"cls",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.F0,"id")).ml(new Z.RI(a)).OA(new Z.Ye()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.aQx]},
+Jc:{
+"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
+sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
+yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11555,27 +11030,14 @@
 a.X0=w
 C.kk.ZL(a)
 C.kk.G6(a)
-return a},null,null,0,0,113,"new ClassViewElement$created"]}},
-"+ClassViewElement":[419],
-KU:{
-"^":"PO+Pi;",
-$isd3:true},
-RI:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sF0(z,y.ct(z,C.XA,y.gF0(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+ClassViewElement_refresh_closure":[415],
-Ye:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing class-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+ClassViewElement_refresh_closure":[415]}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+return a},null,null,0,0,115,"new ClassViewElement$created"]}},
+"+ClassViewElement":[384],
+pv:{
+"^":"uL+Pi;",
+$isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11589,15 +11051,21 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.G6(a)
-return a},null,null,0,0,113,"new CodeRefElement$created"]}},
-"+CodeRefElement":[418]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,115,"new CodeRefElement$created"]}},
+"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
-HT:{
-"^":["qbd;eJ%-420,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtT:[function(a){return a.eJ},null,null,1,0,421,"code",355,397],
-stT:[function(a,b){a.eJ=this.ct(a,C.b1,a.eJ,b)},null,null,3,0,422,23,[],"code",355],
-grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
-"@":function(){return[C.xW]},
+Be:{
+"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+i4:[function(a){var z
+Z.uL.prototype.i4.call(this,a)
+z=a.Xx
+if(z==null)return
+J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
+yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
+"@":function(){return[C.xz]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11609,34 +11077,34 @@
 a.X0=w
 C.YD.ZL(a)
 C.YD.G6(a)
-return a},null,null,0,0,113,"new CodeViewElement$created"]}},
-"+CodeViewElement":[423],
-qbd:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new CodeViewElement$created"]}},
+"+CodeViewElement":[388],
+Vfx:{
+"^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Ds;zh%-387,HX%-387,Uy%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gl7:[function(a){return a.zh},null,null,1,0,370,"iconClass",355,356],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,25,23,[],"iconClass",355],
-gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",355,356],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,25,23,[],"displayValue",355],
-gxj:[function(a){return a.Uy},null,null,1,0,380,"collapsed"],
+"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
+gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
+gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.np(a)},null,null,3,0,381,424,[],"collapsed"],
+this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.np(a)},"call$0","gQd",0,0,112,"enteredView"],
+this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.np(a)
-this.np(a)},"call$3","gl8",6,0,425,18,[],306,[],74,[],"toggleDisplay"],
-np:[function(a){var z,y
+this.SS(a)
+this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,112,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-387,DI<-387",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11650,32 +11118,30 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.G6(a)
-return a},null,null,0,0,113,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[426],
-Ds:{
+return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[394],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-417,Hu%-417,nx%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goE:[function(a){return a.GV},null,null,1,0,380,"expanded",355,356],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,381,23,[],"expanded",355],
-gO9:[function(a){return a.Hu},null,null,1,0,380,"busy",355,356],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,381,23,[],"busy",355],
-gFR:[function(a){return a.nx},null,null,1,0,113,"callback",355,397],
+"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
+gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,107,23,[],"callback",355],
-PA:[function(a){var z
-P.JS("done callback")
-z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
+PA:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,112,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,427,128,[],188,[],283,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11691,8 +11157,8 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.G6(a)
-return a},null,null,0,0,113,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[428],
+return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[396],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11704,20 +11170,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,114,[],115,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,116,[],117,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,114,[],115,[]],
+return!1},"call$2","cs",4,0,null,116,[],117,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,114,[],116,[],117,[]],
+return b},"call$3","hp",6,0,null,116,[],118,[],119,[]],
 mx:[function(a,b,c){var z,y,x
 for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
@@ -11726,19 +11192,22 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,114,[],118,[],119,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,116,[],120,[],121,[]],
+rd:[function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,73,[],122,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,68,[],120,[],121,[]],
-Og:[function(a,b,c,d,e){var z,y
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
+qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-z=J.xH(c,b)
-if(J.de(z,0))return
+if(typeof b!=="number")return H.s(b)
+z=c-b
+if(z===0)return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
-H.tb(d,e,a,b,z)},"call$5","rK",10,0,null,68,[],120,[],121,[],105,[],122,[]],
+H.tb(d,e,a,b,z)},"call$5","it",10,0,null,73,[],123,[],124,[],110,[],125,[]],
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
@@ -11750,41 +11219,42 @@
 z=z.g(b,x)
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
-H.Og(a,z,w,a,b)
+H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.lo
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","f3",6,0,null,68,[],47,[],114,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,123,[],124,[],125,[],126,[],127,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,126,[],127,[],128,[],129,[],130,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
-for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","Yh",8,0,null,128,[],129,[],80,[],130,[]],
-eX:[function(a,b,c){var z,y
+if(c<0)c=0
+for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
+if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,131,[],132,[],85,[],133,[]],
+lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","Gf",6,0,null,128,[],129,[],80,[]],
-ZE:[function(a,b,c,d){if(J.Hb(J.xH(c,b),32))H.d1(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,128,[],131,[],132,[],133,[]],
-d1:[function(a,b,c,d){var z,y,x,w,v,u
+if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,131,[],132,[],85,[]],
+ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,131,[],134,[],135,[],122,[]],
+w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","aH",8,0,null,128,[],131,[],132,[],133,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
-y=J.IJ(J.WB(z.W(a0,b),1),6)
+y=J.Ts(J.WB(z.W(a0,b),1),6)
 x=J.Qc(b)
 w=x.g(b,y)
 v=z.W(a0,y)
-u=J.IJ(x.g(b,a0),2)
+u=J.Ts(x.g(b,a0),2)
 t=J.Wx(u)
 s=t.W(u,y)
 r=t.g(u,y)
@@ -11878,7 +11348,7 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,128,[],131,[],132,[],133,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,131,[],134,[],135,[],122,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
@@ -11887,7 +11357,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11896,13 +11366,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,129,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,132,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,430,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11922,17 +11392,16 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gnr",0,2,null,333,334,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,430,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,116,[],117,[]],
-eR:[function(a,b){return H.j5(this,b,null,null)},"call$1","gZo",2,0,null,127,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,118,[],119,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -11945,7 +11414,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11968,24 +11437,23 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,47,[]],
-eR:[function(a,b){return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,127,[]],
+return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
 qZ:[function(a,b){var z,y,x
-if(J.u6(b,0))throw H.b(P.N(b))
+if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
 y=this.SH
-if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
+if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.j5(this.l6,y,x,null)}},"call$1","grK4",2,0,null,127,[]],
+return H.q9(this.l6,y,x,null)}},"call$1","gVw",2,0,null,130,[]],
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
+if(y.C(z,0))throw H.b(new P.bJ("value "+H.d(z)))
 x=this.AN
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
+if(x!=null){if(J.u6(x,0))throw H.b(new P.bJ("value "+H.d(x)))
 if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
+static:{q9:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -12011,9 +11479,9 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
@@ -12033,10 +11501,10 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
@@ -12055,48 +11523,19 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]}},
+$asQV:function(a,b){return[b]}},
 rR:{
-"^":"a;OI,T6,TQ,lo",
+"^":"a;OI,T6,C2,lo",
 mb:function(a){return this.T6.call$1(a)},
 gl:function(){return this.lo},
 G:[function(){var z,y
-z=this.TQ
+z=this.C2
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.TQ=null
+if(y.G()){this.C2=null
 z=J.GP(this.mb(y.gl()))
-this.TQ=z}else return!1}this.lo=this.TQ.gl()
+this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-H6:{
-"^":"mW;l6,FT",
-eR:[function(a,b){return H.ke(this.l6,this.FT+b,H.Kp(this,0))},"call$1","gZo",2,0,null,292,[]],
-gA:function(a){var z=this.l6
-z=new H.U1(z.gA(z),this.FT)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-ap:function(a,b,c){},
-static:{ke:function(a,b,c){var z
-if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
-z.ap(a,b,c)
-return z}return H.mi(a,b,c)},mi:function(a,b,c){var z=H.VM(new H.H6(a,b),[c])
-z.ap(a,b,c)
-return z}}},
-wB:{
-"^":"H6;l6,FT",
-gB:function(a){var z,y
-z=this.l6
-y=J.xH(z.gB(z),this.FT)
-if(J.J5(y,0))return y
-return 0},
-$isyN:true},
-U1:{
-"^":"AC;OI,FT",
-G:[function(){var z,y
-for(z=this.OI,y=0;y<this.FT;++y)z.G()
-this.FT=0
-return z.G()},"call$0","gqy",0,0,null],
-gl:function(){return this.OI.gl()}},
 SJ:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
@@ -12104,75 +11543,76 @@
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,23,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,114,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gyP",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,47,[]]},
-Qr:{
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
+Tv:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,47,[],23,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,23,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,47,[],23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,114,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gRI",2,0,null,129,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,77,133,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gyP",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
+V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 w2Y:{
-"^":"ar+Qr;",
+"^":"ar+Tv;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,47,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
 GD:{
 "^":"a;fN>",
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
 bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"call$0","gXo",0,0,null],
 $isGD:true,
 $iswv:true,
-static:{"^":"zP",le:[function(a){var z=J.U6(a)
-if(z.gl0(a)===!0)return a
-if(z.nC(a,"_"))throw H.b(new P.AT("\""+H.d(a)+"\" is a private identifier"))
-z=$.R0().Ej
+static:{"^":"RWj,ES,quP,KG,Np,p1",u1:[function(a){var z,y
+z=J.U6(a)
+if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-if(!z.test(a))throw H.b(new P.AT("\""+H.d(a)+"\" is not an identifier or an empty String"))
-return a},"call$1","kh",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+y=y.test(a)}else y=!0
+if(y)return a
+if(z.nC(a,"_"))throw H.b(new P.AT("\""+H.d(a)+"\" is a private identifier"))
+throw H.b(new P.AT("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"call$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
 "^":"",
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
-X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,134,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
 vn:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,135,136,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,137,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,139,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -12208,15 +11648,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,134,[],137,[]],
+return x},"call$2","ER",4,0,null,136,[],139,[]],
 Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,138,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,140,[]],
 Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,138,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
 vE:[function(a,b){var z,y,x,w,v,u
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -12226,7 +11666,7 @@
 v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
 u=J.x(v)
 if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,138,[],139,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -12234,14 +11674,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","V8",4,0,null,140,[],137,[]],
+return w},"call$2","V8",4,0,null,142,[],139,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","QB",4,0,null,142,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,144,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -12258,9 +11698,9 @@
 if(typeof b==="number"){t=z.call$1(b)
 x=J.x(t)
 if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"call$2","xN",4,0,null,143,[],11,[]],
+return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,143,[],144,[]],
+return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -12270,7 +11710,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,145,[]],
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.U6(b)
 if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
@@ -12281,10 +11721,10 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,143,[],146,[],61,[],51,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,26,[],98,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -12292,9 +11732,9 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","uG",2,0,null,42,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
 Sn:{
-"^":"a;L5,Aq>",
+"^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
 z=this.L5
 if(z!=null)return z
@@ -12303,70 +11743,70 @@
 y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
 this.L5=z
 return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=P.L5(null,null,null,J.O,[J.Q,P.D4])
 y=init.libraries
 if(y==null)return z
 for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
 v=J.U6(w)
 u=v.t(w,0)
-t=v.t(w,1)
-s=P.r6($.qG().ej(t))
-r=v.t(w,2)
-q=v.t(w,3)
-p=v.t(w,4)
-o=v.t(w,5)
-n=v.t(w,6)
-m=v.t(w,7)
-l=p==null?C.xD:p()
-J.bi(z.to(u,new H.nI()),new H.Uz(s,r,q,l,o,n,m,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
+t=P.hK(v.t(w,1))
+s=v.t(w,2)
+r=v.t(w,3)
+q=v.t(w,4)
+p=v.t(w,5)
+o=v.t(w,6)
+n=v.t(w,7)
+m=q==null?C.xD:q()
+J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
-TY:{
+jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,41,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gfH",4,0,null,41,[],173,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
 $isej:true},
 Lj:{
-"^":"TY;MA",
+"^":"jU;MA",
 gOO:function(){return"Isolate"},
 gcZ:function(){var z=$.Cm().gvU().nb
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:432;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,431,[],"call"],
+"^":"Tp:400;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
 $isEH:true},
-am:{
-"^":"TY;If<",
+cb:{
+"^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,43,[],44,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
 $isNL:true,
 $isej:true},
 cw:{
-"^":"EE;XP<,xW,Nz,LQ,If",
+"^":"EE;XP<,yG,Nz,LQ,If",
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
 y=this.XP
 return(1073741823&z^17*J.v1(this.If)^19*y.giO(y))>>>0},
 gOO:function(){return"TypeVariableMirror"},
+gFo:function(){return!1},
 $iscw:true,
-$isac:true,
+$isFw:true,
 $isX9:true,
 $isNL:true,
 $isej:true},
 EE:{
-"^":"am;If",
+"^":"cb;If",
 gOO:function(){return"TypeMirror"},
 gXP:function(){return},
 gc9:function(){return H.vh(P.SY(null))},
@@ -12391,7 +11831,7 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
-x.nz=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
+x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
 PU:[function(a,b){var z,y,x,w
@@ -12403,16 +11843,16 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
-return H.vn(z.IB(this))},"call$1","gPo",2,0,null,65,[]],
+return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
 F2:[function(a,b,c){var z,y
 z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -12432,7 +11872,7 @@
 if(q){u=C.xB.yn(r,4)
 r=H.ys(u,"$",".")}p=H.Sd(r,s,!q,q)
 y.push(p)
-p.nz=this}++v}this.SD=y
+p.jE=this}++v}this.SD=y
 return y},
 gTH:function(){var z,y
 z=this.zE
@@ -12500,22 +11940,22 @@
 $isej:true,
 $isNL:true},
 uh:{
-"^":"am+M2;",
+"^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
-"^":"Un;AY<,XW,BB,Ra,If",
+"^":"Un;AY<,XW,BB,i1,If",
 gOO:function(){return"ClassMirror"},
 gIf:function(){var z,y
 z=this.BB
@@ -12527,9 +11967,9 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
-rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
+PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -12550,7 +11990,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12562,15 +12002,15 @@
 z=this.gK8()
 y=z[c]
 if(y==null){x=$.I6().t(0,c)
-w=b===0?H.j5(J.uH(c,":"),3,null,null).br(0):C.xD
+w=b===0?H.q9(J.uH(c,":"),3,null,null).br(0):C.xD
 v=new H.LI(a,x,b,d,w,null)
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],434,[],82,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
-return H.vn(b)},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
@@ -12581,7 +12021,7 @@
 else{w=H.vn(x)
 y.v=x
 y.m=w
-return w}}return this.Dm(a)},"call$1","gPo",2,0,null,65,[]],
+return w}}return this.Dm(a)},"call$1","gPo",2,0,null,70,[]],
 Dm:[function(a){var z,y,x,w,v,u,t
 z=J.GL(a)
 y=this.tu(a,1,z,C.xD)
@@ -12598,14 +12038,14 @@
 t=x.geK()?this.QN(u,v):this.x0(u,v)
 w[z]=t
 t.v=t.m=w
-return y},"call$1","gFf",2,0,null,65,[]],
+return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,110,[],435,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],435,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gpa",4,0,null,12,[],435,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -12613,7 +12053,7 @@
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
-return z},"call$1","gUJ",2,0,null,104,[]],
+return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
 t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
@@ -12621,16 +12061,21 @@
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,134,[],23,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
 $isEH:true},
 bl:{
-"^":"am;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If",
+"^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
 gOO:function(){return"ClassMirror"},
+bu:[function(a){var z,y,x
+z="ClassMirror on "+H.d(this.NK.gIf().fN)
+if(this.gw8()!=null){y=z+"<"
+x=this.gw8()
+z=y+x.zV(x,", ")+">"}return z},"call$0","gXo",0,0,null],
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
 gNy:function(){return this.NK.gNy()},
@@ -12681,8 +12126,8 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,65,[],173,[]],
-rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,65,[]],
+PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,70,[],172,[]],
+rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
 gAY:function(){var z=this.qN
@@ -12690,7 +12135,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12709,29 +12154,29 @@
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:25;a",
+"^":"Tp:30;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,437,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:107;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,87,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,92,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,438,[],"call"],
+return a},"call$1",null,2,0,null,406,[],"call"],
 $isEH:true},
 Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If",
+"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
 gaB:function(){var z,y
 z=this.Tx
@@ -12755,7 +12200,7 @@
 if(t.$reflectable==2)continue
 s=H.Sd(u,t,!1,!1)
 x.push(s)
-s.nz=a}y=H.kU(init.statics[this.Cr])
+s.jE=a}y=H.kU(init.statics[this.Cr])
 for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
 if(H.Y6(r))continue
 q=this.gXP().gae()[r]
@@ -12766,7 +12211,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.nz=a}return x},"call$1","gN4",2,0,null,439,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12782,7 +12227,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gMp",2,0,null,440,[]],
+return z},"call$1","gap",2,0,null,408,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12813,32 +12258,32 @@
 z=new H.Ei(y)
 this.gQH().nb.aN(0,z)
 this.gEz().nb.aN(0,z)
-J.kH(this.gNy(),new H.U7(y))
+J.kH(this.gNy(),new H.Ci(y))
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
 PU:[function(a,b){var z,y
 z=this.gcc().nb.t(0,a)
-if(z!=null&&z.gFo()&&!z.gV5()){y=z.gao()
+if(z!=null&&z.gFo()&&J.WO(z)!==!0){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,65,[],173,[]],
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 rN:[function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,65,[]],
+else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
-z=this.nz
+z=this.jE
 if(z==null){z=this.Tx
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.nz=H.jO(C.nY.LU).gXP()
+if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
 y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.nz
+for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
 if(z==null)throw H.b(new P.lj("Class \""+H.d(this.If.fN)+"\" has no owner"))}return z},
 gc9:function(){var z=this.xO
 if(z!=null)return z
@@ -12865,13 +12310,13 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
 y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,143,[]],
+return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -12901,30 +12346,30 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:433;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:401;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
-U7:{
-"^":"Tp:107;b",
+Ci:{
+"^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,438,[],"call"],
+return a},"call$1",null,2,0,null,406,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:442;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:410;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 Ld:{
-"^":"am;ao<,V5<,Fo<,n6,nz,Ay>,le,If",
+"^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
-gt5:function(a){return H.Jf(this.nz,init.metadata[this.Ay])},
-gXP:function(){return this.nz},
+gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
+gXP:function(){return this.jE},
 gc9:function(){var z=this.le
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,41,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gfH",4,0,null,41,[],173,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12946,7 +12391,7 @@
 s=y.yn(x,r+1)}else q=s
 p=d?$.Sl().t(0,q):$.bx().t(0,"g"+q)
 if(p==null)p=q
-if(t){o=H.YC(p+"=")
+if(t){o=H.YC(H.d(p)+"=")
 y=c.gEO()
 v=new H.a7(y,y.length,0,null)
 v.$builtinTypeInfo=[H.Kp(y,0)]
@@ -12955,7 +12400,7 @@
 return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,141,[]]}},
+return 0},"call$1","fS",2,0,null,143,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -12985,14 +12430,14 @@
 $isvr:true,
 $isej:true},
 Zk:{
-"^":"am;dl,Yq,lT<,hB<,Fo<,xV<,qx,nz,le,wM,H3,If",
+"^":"cb;dl,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
 gOO:function(){return"MethodMirror"},
 gMP:function(){var z=this.H3
 if(z!=null)return z
 this.gc9()
 return this.H3},
 tB:[function(){return"$reflectable" in this.dl},"call$0","gX1",0,0,null],
-gXP:function(){return this.nz},
+gXP:function(){return this.jE},
 gdw:function(){this.gc9()
 return this.wM},
 gc9:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
@@ -13009,7 +12454,7 @@
 if(z!=null){x=J.x(z)
 x=typeof z==="object"&&z!==null&&!!x.$isD4
 z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.nz):new H.Ar(v.hl(this.nz.gJi().gTx()),null,null,null,this.nz)}if(this.xV)this.wM=this.nz
+t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -13025,11 +12470,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,43,[],44,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,41,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gfH",4,0,null,41,[],173,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -13051,25 +12496,26 @@
 u=!1}w=H.YC(a)
 return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},
 fu:{
-"^":"am;XP<,Ay>,Q2<,Sh,BE,QY,If",
+"^":"cb;XP<,Ay>,Q2<,Sh,BE,QY,If",
 gOO:function(){return"ParameterMirror"},
 gt5:function(a){return H.Jf(this.XP,this.Ay)},
 gFo:function(){return!1},
-gV5:function(){return!1},
+gV5:function(a){return!1},
 gc9:function(){return J.C0(this.QY,new H.wt()).br(0)},
 $isYs:true,
 $isRY:true,
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:372;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 ng:{
-"^":"am;Cr<,CM,If",
+"^":"cb;Cr<,CM,If",
 gP:function(a){return this.CM},
 r6:function(a,b){return this.gP(this).call$1(b)},
 gOO:function(){return"TypedefMirror"},
+gYj:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
 gXP:function(){return H.vh(P.SY(null))},
 gc9:function(){return H.vh(P.SY(null))},
@@ -13084,9 +12530,9 @@
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
 t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,77,24,[],43,[],44,[]],
-rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,65,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,65,[],23,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -13135,23 +12581,23 @@
 z=x+"'"
 this.o3=z
 return z},"call$0","gXo",0,0,null],
-gwK:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gwK().call$2(a,b)},
-nQ:function(a){return this.gwK().call$1(a)},
+gah:function(){return H.vh(P.SY(null))},
+V7:function(a,b){return this.gah().call$2(a,b)},
+nQ:function(a){return this.gah().call$1(a)},
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:443;a",
+"^":"Tp:412;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,47,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:444;b",
+"^":"Tp:413;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -13159,33 +12605,33 @@
 if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,47,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:372;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:372;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,441,[],"call"],
+"^":"Tp:411;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,104,[]],
-Rz:[function(a,b){H.kT()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return H.kT()},"call$0","gyP",0,0,null],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
 "^":"Sk<"}],["dart._js_names","dart:_js_names",,H,{
@@ -13197,10 +12643,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,147,[],148,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","Hn",4,0,null,149,[],150,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,149,[]],
+return z},"call$1","OX",2,0,null,151,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -13209,36 +12655,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","wp",2,0,null,145,[]],
+return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:445;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,137,[],434,[],"call"],
+"^":"Tp:414;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"call$2","p3",4,0,null,150,[],151,[]],
-pH:[function(a,b){var z,y,x,w,v,u,t
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.j7(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();){w=x.lo
-v=z.c
-z.c=v+1
-w.Rx(new P.ff(z,b,v),y)}y=z.c
-if(y===0)return P.Ab(C.xD,null)
-u=Array(y)
-u.fixed$length=init
-z.b=u
-y=J.Q
-t=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=t
-return t.MM},"call$2$eagerError","pk",2,3,null,152,153,[],154,[]],
+else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
@@ -13247,7 +12673,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,112],
+throw z}},"call$0","qZ",0,0,114],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -13255,11 +12681,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","xc",2,0,null,156,[]],
+$.k8=y}},"call$1","vy",2,0,null,155,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,156,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,155,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -13275,56 +12701,56 @@
 return}catch(u){w=H.Ru(u)
 y=w
 x=new H.XO(u,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,157,[]],
-YE:[function(a){},"call$1","bZ",2,0,158,23,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,159,77,160,[],161,[]],
-dL:[function(){return},"call$0","v3",0,0,112],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
+dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,162,[],163,[],164,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,161,[],162,[],163,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,165,[],166,[],160,[],161,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,165,[],166,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,165,[],166,[],23,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=C.jn.cU(a.Fq,1000)
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,167,[],156,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,166,[],155,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,151,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,168,169,[],170,[],151,[],160,[],161,[]],
+return z},"call$1","kb",2,0,null,153,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","xP",10,0,167,168,[],169,[],153,[],159,[],160,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,171,169,[],170,[],151,[],115,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,170,168,[],169,[],153,[],117,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,172,169,[],170,[],151,[],115,[],173,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,171,168,[],169,[],153,[],117,[],172,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,174,169,[],170,[],151,[],115,[],54,[],55,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,175,169,[],170,[],151,[],115,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,176,169,[],170,[],151,[],115,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,177,169,[],170,[],151,[],115,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,178,169,[],170,[],151,[],115,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,179,169,[],170,[],151,[],167,[],156,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,180,169,[],170,[],151,[],181,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,182,181,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,173,168,[],169,[],153,[],117,[],59,[],60,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,174,168,[],169,[],153,[],117,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,175,168,[],169,[],153,[],117,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,176,168,[],169,[],153,[],117,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,177,168,[],169,[],153,[],117,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,178,168,[],169,[],153,[],166,[],155,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,179,168,[],169,[],153,[],180,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,181,180,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,183,169,[],170,[],151,[],184,[],185,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,182,168,[],169,[],153,[],183,[],184,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -13335,10 +12761,10 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,446,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gXI1",0,0,null],
+this.Ae=z^1},"call$0","gUe",0,0,null],
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
@@ -13348,10 +12774,10 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){return},"call$0","gp4",0,0,112],
-LP:[function(){return},"call$0","gZ9",0,0,112],
-static:{"^":"FJ,RG,cP"}},
-LO:{
+uO:[function(){},"call$0","gp4",0,0,114],
+LP:[function(){},"call$0","gZ9",0,0,114],
+static:{"^":"FJ,CM,cP"}},
+WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
@@ -13366,17 +12792,17 @@
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gOo",2,0,null,165,[]],
+a.siE(a)},"call$1","gOo",2,0,null,164,[]],
 j0:[function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,165,[]],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},"call$1","gOr",2,0,null,164,[]],
 q7:[function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},"call$0","gVo",0,0,null],
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"LO")},239,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gXB",2,2,447,77,160,[],161,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -13385,8 +12811,8 @@
 y=this.SL()
 this.SY()
 return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,239,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","grd",4,0,null,160,[],161,[]],
+Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,235,[]],
+V8:[function(a,b){this.pb(a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
 Qj:[function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
@@ -13410,92 +12836,67 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,429,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
-"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,239,[]],
+return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,160,[],161,[]],
+this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,165,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Zj",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
-"^":"LO;nL,QC,Gv,iE,SJ,WX,Ip",
+"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,239,[]],
+z.w6(y)}},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,160,[],161,[]],
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
 else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
 b8:{
 "^":"a;",
 $isb8:true},
-j7:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=z.c-1
-z.c=x
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"call$2",null,4,0,null,448,[],449,[],"call"],
-$isEH:true},
-ff:{
-"^":"Tp:450;a,c,d",
-call$1:[function(a){var z,y,x,w
-z=this.a
-y=z.c-1
-z.c=y
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"call$1",null,2,0,null,23,[],"call"],
-$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,451,77,23,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,447,77,160,[],161,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
+gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
 swG:function(a){if(a)this.Gv=2
 else this.Gv=0},
@@ -13507,70 +12908,72 @@
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"gVy",2,3,null,77,115,[],164,[]],
+return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"grf",2,3,null,82,117,[],163,[]],
 yd:[function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,77,164,[],430,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gE1",2,0,null,429,[]],
+return y},"call$1","gBv",2,0,null,397,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","gHa",2,0,null,23,[]],
+this.jk=a},"call$1","goU",2,0,null,28,[]],
 E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,160,[],161,[]],
+this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,297,[]],
+this.jk=a}},"call$1","gXA",2,0,null,295,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
 for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},"call$0","gDH",0,0,null],
+z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){P.GZ(a,this)
-return}y=this.L3()
+if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+else P.k3(a,this)
+else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)},"call$1","gJJ",2,0,null,23,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+R8:[function(a){var z=this.L3()
+this.Am(a)
+P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,159,77,160,[],161,[]],
-OH:[function(a){var z,y
-z=J.x(a)
-y=typeof a==="object"&&a!==null&&!!z.$isb8
-if(y);if(y)z=typeof a!=="object"||a===null||!z.$isvs||a.Gv<4
-else z=!1
-if(z){this.rX(a)
-return}if(this.Gv!==0)H.vh(P.w("Future already completed"))
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
+OH:[function(a){var z
+if(a==null);else{z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.rH(this,a))},"call$1","gZV",2,0,null,23,[]],
+this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
+this.Gv=1
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},"call$2","gFE",4,0,null,160,[],161,[]],
+this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
 L7:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
-return z},GZ:[function(a,b){var z
-b.swG(!0)
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isvs)if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)
-else a.Rx(new P.xw(b),new P.dm(b))},"call$2","mX",4,0,null,27,[],74,[]],yE:[function(a,b){var z
+return z},k3:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+if(a.Gv>=4)P.HZ(a,b)
+else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,27,[],155,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -13580,62 +12983,66 @@
 z.e.gLj().hk(J.w8(v),v.gI4())
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
-return}u=b.gLj()
-if(w&&!z.e.gLj().fC(u)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}t=$.X3
-if(t==null?u!=null:t!==u)$.X3=u
-else t=null
-x.b=null
-x.c=null
+return}x.b=!0
+u=z.e.gWj()?z.e.gDL():null
+x.c=u
 x.d=!1
-if(!w)if(b.gO1()!=null)x.b=new P.rq(x,z,b,u).call$0()
-else{x.c=z.e.gDL()
-x.b=!0}else new P.RW(z,x,b,u).call$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,u).call$0()
-if(t!=null)$.X3=t
+y=!w
+if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
+if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
+z.e.gLj().hk(J.w8(v),v.gI4())
+return}s=$.X3
+if(s==null?t!=null:s!==t)$.X3=t
+else s=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).call$0()}else new P.RW(z,x,b,t).call$0()
+if(b.gIa()!=null)new P.RT(z,x,w,b,t).call$0()
+if(s!=null)$.X3=s
 if(x.d)return
-y=x.b===!0
-if(y){s=x.c
-r=J.x(s)
-r=typeof s==="object"&&s!==null&&!!r.$isb8
-s=r}else s=!1
-if(s){q=x.c
+if(x.b===!0){y=x.c
+if(u==null?y!=null:u!==y){r=J.x(y)
+r=typeof y==="object"&&y!==null&&!!r.$isb8
+y=r}else y=!1}else y=!1
+if(y){q=x.c
 y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs&&q.Gv>=4){b.swG(!0)
+if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
 z.e=q
 y=q
-continue}P.GZ(q,b)
-return}if(y){p=b.L3()
+continue}else P.A9(q,b)
+else P.k3(q,b)
+return}}if(x.b===!0){p=b.L3()
 b.Am(x.c)}else{p=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","DU",4,0,null,27,[],155,[]]}},
+b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
 da:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-xw:{
-"^":"Tp:107;a",
-call$1:[function(a){this.a.rX(a)},"call$1",null,2,0,null,23,[],"call"],
+pV:{
+"^":"Tp:112;a",
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
-dm:{
-"^":"Tp:452;b",
-call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"call"],
+U7:{
+"^":"Tp:418;b",
+call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:113;a,b",
-call$0:[function(){this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
+"^":"Tp:115;a,b",
+call$0:[function(){P.A9(this.b,this.a)},"call$0",null,0,0,null,"call"],
+$isEH:true},
+cX:{
+"^":"Tp:115;c,d",
+call$0:[function(){this.c.R8(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:380;b,c,d,e",
+"^":"Tp:390;b,d,e,f",
 call$0:[function(){var z,y,x,w
-try{this.b.c=this.e.FI(this.d.gO1(),this.c.e.gDL())
+try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
@@ -13643,13 +13050,13 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:112;c,b,f,UI",
+"^":"Tp:114;c,b,UI,bK",
 call$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
-r=this.f
+r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{x=this.UI.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
 v=new H.XO(q,null)
 r=J.w8(z)
@@ -13662,7 +13069,7 @@
 if(x===!0&&u!=null){try{r=u
 p=H.N7()
 p=H.KT(p,[p,p]).BD(r)
-n=this.UI
+n=this.bK
 m=this.b
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
@@ -13679,14 +13086,14 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:112;c,b,bK,Gq,Rm",
+"^":"Tp:114;c,b,Gq,Rm,w3",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
-try{z.a=this.Rm.Gr(this.Gq.gIa())}catch(w){v=H.Ru(w)
+try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-if(this.bK){v=J.w8(this.c.e.gcG())
+if(this.Gq){v=J.w8(this.c.e.gcG())
 u=y
 u=v==null?u==null:v===u
 v=u}else v=!1
@@ -13695,54 +13102,54 @@
 else u.c=new P.Ca(y,x)
 u.b=!1}v=z.a
 u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Gq
+if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:107;c,w3",
-call$1:[function(a){P.HZ(this.c.e,this.w3)},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:112;c,HZ",
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:452;a,HZ",
+"^":"Tp:418;a,mG",
 call$2:[function(a,b){var z,y,x,w
 z=this.a
 y=z.a
 x=J.x(y)
 if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
 z.a=w
-w.E6(a,b)}P.HZ(z.a,this.HZ)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,77,160,[],161,[],"call"],
+w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,454,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.tG(z,this,b,y),!0,new P.zn(y),y.gbY())
-return y},"call$1","gdj",2,0,null,102,[]],
+z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gbY())
+return y},"call$1","gdj",2,0,null,107,[]],
 aN:[function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,429,[]],
+return y},"call$1","gjw",2,0,null,397,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,430,[]],
+return y},"call$1","gG2",2,0,null,398,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
 z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gbY())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gbY())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -13755,9 +13162,6 @@
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
 return y},"call$0","gRV",0,0,null],
-eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
-z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,127,[]],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13777,44 +13181,44 @@
 if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(new P.AT(z.a))
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
-z.b=this.KR(new P.ii(z,this,y),!0,new P.ib(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,47,[]],
+z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
+return y},"call$1","goY",2,0,null,52,[]],
 $isqh:true},
-tG:{
+YJ:{
 "^":"Tp;a,b,c,d",
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:381;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
+"^":"Tp:391;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-zn:{
-"^":"Tp:113;bK",
+DO:{
+"^":"Tp:115;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,129,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:107;",
-call$1:[function(a){},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:113;UI",
+"^":"Tp:115;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -13822,78 +13226,78 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,129,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:113;e,f",
+"^":"Tp:115;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:381;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,455,[],"call"],
+"^":"Tp:391;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:113;bK",
+"^":"Tp:115;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-PI:{
-"^":"Tp:107;a",
+B5:{
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,108,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
-uO:{
-"^":"Tp:113;a,b",
+PI:{
+"^":"Tp:115;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:107;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:113;c",
+"^":"Tp:115;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,239,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,235,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,23,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:113;d",
+"^":"Tp:115;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,23,[],"call"],
+z.a=a},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:113;a,c",
+"^":"Tp:115;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
-ii:{
+j5:{
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,23,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-ib:{
-"^":"Tp:113;a,d",
+ii:{
+"^":"Tp:115;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -13916,36 +13320,36 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gGE",2,0,null,456,[]],
+return w},"call$1","gmn",2,0,null,422,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
 n:[function(a,b){var z
 if(b==null)return!1
 if(this===b)return!0
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isO9)return!1
-return b.Y8===this.Y8},"call$1","gUJ",2,0,null,104,[]],
+return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
 "^":"KA;Y8<",
 tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,112],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,112]},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,114],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,114]},
 nP:{
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,457,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,29,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,458,[]],
-nB:[function(a,b){var z,y,x
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13969,19 +13373,19 @@
 Rg:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,239,[]],
+else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,235,[]],
 V8:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","grd",4,0,null,160,[],161,[]],
+else this.w6(new P.DS(a,b,null))},"call$2","gEm",4,0,null,159,[],160,[]],
 Qj:[function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,112],
-LP:[function(){},"call$0","gZ9",0,0,112],
+uO:[function(){},"call$0","gp4",0,0,114],
+LP:[function(){},"call$0","gZ9",0,0,114],
 tA:[function(){},"call$0","gQC",0,0,null],
 w6:[function(a){var z,y
 z=this.Ri
@@ -13990,19 +13394,19 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,384,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,239,[]],
+this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,235,[]],
 pb:[function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,160,[],161,[]],
+this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,159,[],160,[]],
 SY:[function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
 new P.qB(this).call$0()},"call$0","gXm",0,0,null],
@@ -14010,7 +13414,7 @@
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gc2",2,0,null,156,[]],
+this.Kl((z&4)!==0)},"call$1","gEq",2,0,null,155,[]],
 Kl:[function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
@@ -14026,11 +13430,11 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,460,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Il,X8,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
 Vo:{
-"^":"Tp:112;a,b,c",
+"^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -14046,7 +13450,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -14061,25 +13465,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
 w4:[function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gGE",2,0,null,456,[]]},
-ti:{
+return y},"call$1","gmn",2,0,null,422,[]]},
+fIm:{
 "^":"a;aw@"},
 LV:{
-"^":"ti;P>,aw",
+"^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,463,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
 DS:{
-"^":"ti;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,463,[]]},
+"^":"fIm;kc>,I4<,aw",
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,463,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -14088,9 +13492,9 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,463,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
 CR:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -14104,26 +13508,26 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,384,[]],
+this.N6=b}},"call$1","ght",2,0,null,368,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gKt",2,0,null,463,[]],
+z.dP(a)},"call$1","gTn",2,0,null,429,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
-this.zR=null},"call$0","gyP",0,0,null]},
+this.zR=null},"call$0","gRa",0,0,null]},
 v1y:{
-"^":"Tp:113;a,b,c",
+"^":"Tp:115;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:464;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,160,[],161,[],"call"],
+"^":"Tp:430;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
-Q0:{
-"^":"Tp:113;a,b",
+GU:{
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
@@ -14139,27 +13543,27 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,239,[],465,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,239,[]],
+P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,235,[]],
 V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","grd",4,0,null,160,[],161,[]],
+P.KA.prototype.V8.call(this,a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,112],
+z.yy(0)},"call$0","gp4",0,0,114],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE()},"call$0","gZ9",0,0,112],
+z.QE()},"call$0","gZ9",0,0,114],
 tA:[function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
-vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},239,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,466,160,[],161,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,112],
+vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -14175,7 +13579,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,467,[],465,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -14187,16 +13591,8 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,467,[],465,[]]},
-dq:{
-"^":"YR;Em,Sb",
-Ml:[function(a,b){var z=this.Em
-if(z>0){this.Em=z-1
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,467,[],465,[]],
-U6:function(a,b,c){},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-lO:{
+return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
@@ -14216,7 +13612,7 @@
 iT:function(a){return this.iq.call$1$specification(a)}},
 e4:{
 "^":"a;"},
-JB:{
+dl:{
 "^":"a;"},
 Id:{
 "^":"a;oh",
@@ -14224,102 +13620,102 @@
 c1:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,151,[],160,[],161,[]],
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,153,[],159,[],160,[]],
 Vn:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,151,[],115,[]],
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,153,[],117,[]],
 qG:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,151,[],115,[],173,[]],
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,153,[],117,[],172,[]],
 nA:[function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,151,[],115,[],54,[],55,[]],
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,153,[],117,[],59,[],60,[]],
 TE:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,153,[],117,[]],
 V6:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,151,[],115,[]],
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,151,[],115,[]],
+y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,153,[],117,[]],
 pX:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,151,[],167,[],115,[]],
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,153,[],166,[],117,[]],
 RB:[function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,151,[],181,[]],
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,153,[],180,[]],
 ld:[function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,151,[],184,[],185,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,468,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gSI",2,0,null,115,[]],
+return this.hk(z,y)}},"call$1","gSI",2,0,null,117,[]],
 m1:[function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,115,[],173,[]],
+return this.hk(z,y)}},"call$2","gNY",4,0,null,117,[],172,[]],
 z8:[function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,115,[],54,[],55,[]],
+return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,336,115,[],469,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,336,115,[],469,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.pV(this,z)},"call$2$runGuarded","gzg",2,3,null,336,115,[],469,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
 TF:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,173,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:107;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,173,[],"call"],
+"^":"Tp:112;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:346;a,b",
-call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
+"^":"Tp:348;a,b",
+call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
-pV:{
-"^":"Tp:346;c,d",
-call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,54,[],55,[],"call"],
+ph:{
+"^":"Tp:348;c,d",
+call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,zU<,R1",
@@ -14328,24 +13724,24 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
-c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,77,77,184,[],185,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,115,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,115,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,115,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,115,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,115,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,181,[]]},
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
+c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
+Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
+FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
+mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
+Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
+cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
+uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
+Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
 pK:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:113;c,d",
+"^":"Tp:115;c,d",
 call$0:[function(){var z,y,x
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -14357,11 +13753,11 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
-nU:{
+W5:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -14391,23 +13787,23 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,468,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,42,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,160,[],161,[]],
-c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,77,77,184,[],185,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,115,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,115,[],173,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,115,[],54,[],55,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,115,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,115,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,115,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,115,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,167,[],115,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
+c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
+Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
+FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
+mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
+Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
+cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
+uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,181,[]]}}],["dart.collection","dart:collection",,P,{
+return},"call$1","gJS",2,0,null,180,[]]}}],["dart.collection","dart:collection",,P,{
 "^":"",
-Ou:[function(a,b){return J.de(a,b)},"call$2","iv",4,0,187,128,[],188,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,189,128,[]],
+R2:[function(a,b){return J.de(a,b)},"call$2","to",4,0,186,131,[],187,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,188,131,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -14422,7 +13818,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,114,[]],
+return y.vM},"call$1","Zw",2,0,null,116,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
@@ -14455,10 +13851,8 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,114,[],190,[]],
-L5:function(a,b,c,d,e){if(b==null){if(a==null)return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])
-b=P.py()}else{if(P.J2()===b&&P.N3()===a)return H.VM(new P.ey(0,null,null,null,null,null,0),[d,e])
-if(a==null)a=P.iv()}return P.Ex(a,b,c,d,e)},
+b.push(v)},"call$2","wB",4,0,null,116,[],189,[]],
+L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
 Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w
 z={}
@@ -14470,7 +13864,7 @@
 J.kH(a,new P.ZQ(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,191,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,190,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
@@ -14483,11 +13877,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,42,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,23,[]],
-FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,104,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
+FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -14499,7 +13893,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,42,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -14515,7 +13909,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,42,[],23,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14526,17 +13920,17 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","gRI",2,0,null,42,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gyP",0,0,null],
+this.X5=0}},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y,x,w
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -14557,71 +13951,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,186,[],42,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+return z}else return},"call$2","got",4,0,null,185,[],47,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,186,[],42,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,186,[],42,[],23,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.call$2(a,b)},
+WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,42,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,42,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","gRI",2,0,null,42,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){var z=H.XY(a,this.a)
+return z},"call$1",null,2,0,null,272,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14631,12 +14025,12 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,115,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,117,[]],
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
@@ -14664,9 +14058,9 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,23,[]],
-FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,104,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
@@ -14679,7 +14073,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,42,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14692,12 +14086,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,42,[],23,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,42,[],472,[]],
+return z},"call$2","gMs",4,0,null,47,[],438,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14708,30 +14102,30 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","gRI",2,0,null,42,[]],
+return w.gS4()}},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
+this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,186,[],42,[],23,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,186,[],42,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14740,7 +14134,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,42,[],23,[]],
+return z},"call$2","gTM",4,0,null,47,[],28,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14749,13 +14143,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
+return-1},"call$2","gSP",4,0,null,436,[],47,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14764,50 +14158,18 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,471,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-ey:{
-"^":"YB;X5,vv,OX,OB,H9,lX,zN",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
-aH:[function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y){x=a[y].gkh()
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],42,[]]},
-xd:{
-"^":"YB;m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN",
-C2:function(a,b){return this.m6.call$2(a,b)},
-H5:function(a){return this.Q6.call$1(a)},
-Ef:function(a){return this.ac.call$1(a)},
-t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.YB.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,42,[]],
-x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.YB.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,42,[]],
-Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.YB.prototype.Rz.call(this,this,b)},"call$1","gRI",2,0,null,42,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
-aH:[function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;++y)if(this.C2(a[y].gkh(),b)===!0)return y
-return-1},"call$2","gSP",4,0,null,470,[],42,[]],
-static:{Ex:function(a,b,c,d,e){var z=new P.v6(d)
-return H.VM(new P.xd(a,b,z,0,null,null,null,null,null,0),[d,e])}}},
-v6:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
-$isEH:true},
 db:{
 "^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
@@ -14820,14 +14182,14 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,115,[]],
+y=y.gDG()}},"call$1","gjw",2,0,null,117,[]],
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
@@ -14839,7 +14201,7 @@
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
 return!0}}},"call$0","gqy",0,0,null]},
-Rr:{
+UB:{
 "^":"lN;",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14885,9 +14247,9 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,129,[]],
+return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14899,12 +14261,12 @@
 this.X5=this.X5-1
 this.DM=null
 y.splice(x,1)
-return!0}},"call$1","gRI",2,0,null,6,[]],
+return!0}},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){if(this.X5>0){this.DM=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gyP",0,0,null],
+this.X5=0}},"call$0","gRa",0,0,null],
 Zl:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.DM
 if(z!=null)return z
@@ -14928,28 +14290,28 @@
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,186,[],129,[]],
+return!0},"call$2","gLa",4,0,null,185,[],132,[]],
 Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,186,[],129,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
+return!0}else return!1},"call$2","got",4,0,null,185,[],132,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,470,[],129,[]],
+return-1},"call$2","gSP",4,0,null,436,[],132,[]],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 YO:{
-"^":"Rr;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,42,[]],
+"^":"UB;X5,vv,OX,OB,DM",
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,470,[],129,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14993,7 +14355,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,429,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -15017,9 +14379,9 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,129,[]],
+u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,474,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -15029,24 +14391,24 @@
 x=this.aH(y,b)
 if(x<0)return!1
 this.Vb(y.splice(x,1)[0])
-return!0}},"call$1","gRI",2,0,null,6,[]],
+return!0}},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gyP",0,0,null],
+this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
 cA:[function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,186,[],129,[]],
+return!0},"call$2","gLa",4,0,null,185,[],132,[]],
 Nv:[function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,186,[],129,[]],
+return!0},"call$2","got",4,0,null,185,[],132,[]],
 xf:[function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
@@ -15055,7 +14417,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,129,[]],
+return z},"call$1","gTM",2,0,null,132,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -15064,16 +14426,16 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,473,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,129,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,470,[],129,[]],
+return-1},"call$2","gSP",4,0,null,436,[],132,[]],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ef:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
@@ -15089,7 +14451,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,47,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -15099,20 +14461,20 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
+ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
 tg:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,129,[]],
+return!1},"call$1","gdj",2,0,null,132,[]],
 aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,115,[]],
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,117,[]],
 zV:[function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
@@ -15122,18 +14484,17 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gnr",0,2,null,333,334,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
-return!1},"call$1","gG2",2,0,null,115,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+return!1},"call$1","gG2",2,0,null,117,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,292,[]],
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
@@ -15142,33 +14503,33 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,77,430,[],475,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,47,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ar:{
 "^":"a+lD;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,47,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -15181,21 +14542,21 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,129,[]],
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,132,[]],
 Vr:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,430,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gnr",0,2,null,333,334,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,430,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,115,[]],
-eR:[function(a,b){return H.j5(a,b,null,null)},"call$1","gZo",2,0,null,127,[]],
+return z.vM},"call$1","gNU",0,2,null,330,331,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
+eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
@@ -15208,15 +14569,15 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
-this.u(a,z,b)},"call$1","ght",2,0,null,129,[]],
+this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=J.GP(b);z.G();){y=z.gl()
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
-this.u(a,x,y)}},"call$1","gDY",2,0,null,114,[]],
+this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
@@ -15224,15 +14585,15 @@
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gyP",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,77,133,[]],
+return!0}++z}return!1},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
+GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,82,122,[]],
 pZ:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gbI",4,0,null,120,[],121,[]],
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gm0",4,0,null,123,[],124,[]],
 D6:[function(a,b,c){var z,y,x,w
-if(c==null)c=this.gB(a)
+c=this.gB(a)
 this.pZ(a,b,c)
 z=J.xH(c,b)
 y=H.VM([],[H.ip(a,"lD",0)])
@@ -15241,9 +14602,9 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.j5(a,b,c,null)},"call$2","gYf",4,0,null,120,[],121,[]],
+return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -15260,20 +14621,21 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(c>=z)return-1
+if(c<0)c=0
 y=c
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],80,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],80,[]],
+return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -15282,11 +14644,11 @@
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){var z=this.t(a,b)
 this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
 this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,47,[]],
+return z},"call$1","gNM",2,0,null,52,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -15295,19 +14657,19 @@
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},"call$0","gXo",0,0,null],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 ZQ:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,402,[],277,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -15319,16 +14681,17 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,429,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
-grZ:function(a){var z,y
+gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
+grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-y=J.mQ(J.xH(y,1),this.v5.length-1)
-if(y>=z.length)return H.e(z,y)
+x=z.length
+y=(y-1&x-1)>>>0
+if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -15339,81 +14702,83 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,47,[]],
+return z[y]},"call$1","goY",2,0,null,52,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.e4(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,129,[]],
+z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=z.gB(b)
-x=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-z=x+y
+z=b.length
+y=this.gB(this)
+x=y+z
 w=this.v5
 v=w.length
-if(z>=v){u=P.ua(z)
+if(x>=v){u=P.ua(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.e4(t)
+this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.Og(t,x,z,b,0)
-this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
-if(typeof z!=="number")return H.s(z)
-s=v-z
-if(y<s){H.Og(w,z,z+y,b,0)
-this.eZ=J.WB(this.eZ,y)}else{r=y-s
-H.Og(w,z,z+s,b,0)
-z=this.v5
-H.Og(z,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,476,[]],
+H.qG(t,y,x,b,0)
+this.eZ=this.eZ+z}else{x=this.eZ
+s=v-x
+if(z<s){H.qG(w,x,x+z,b,0)
+this.eZ=this.eZ+z}else{r=z-s
+H.qG(w,x,x+s,b,0)
+x=this.v5
+H.qG(x,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
 if(J.de(y[z],b)){this.bB(z)
 this.qT=this.qT+1
-return!0}}return!1},"call$1","gRI",2,0,null,6,[]],
+return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 V1:[function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0
-this.qT=this.qT+1}},"call$0","gyP",0,0,null],
+this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y
+NZ:[function(a,b){var z,y,x
 z=this.v5
 y=this.eZ
-if(y>>>0!==y||y>=z.length)return H.e(z,y)
+x=z.length
+if(y<0||y>=x)return H.e(z,y)
 z[y]=b
-y=(y+1&this.v5.length-1)>>>0
-this.eZ=y
-if(this.av===y)this.VW()
-this.qT=this.qT+1},"call$1","gXk",2,0,null,129,[]],
+x=(y+1&x-1)>>>0
+this.eZ=x
+if(this.av===x)this.VW()
+this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5.length-1
-if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
-if(u<0||u>=w)return H.e(x,u)
-t=x[u]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-this.av=(y+1&z)>>>0
-return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
-this.eZ=y
-for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
-if(s<0||s>=w)return H.e(x,s)
-t=x[s]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-return a}},"call$1","gzv",2,0,null,477,[]],
+z=this.v5
+y=z.length
+x=y-1
+w=this.av
+v=this.eZ
+if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
+if(t<0||t>=y)return H.e(z,t)
+v=z[t]
+if(u<0||u>=y)return H.e(z,u)
+z[u]=v}if(w>=y)return H.e(z,w)
+z[w]=null
+this.av=(w+1&x)>>>0
+return(a+1&x)>>>0}else{w=(v-1&x)>>>0
+this.eZ=w
+for(u=a;u!==w;u=s){s=(u+1&x)>>>0
+if(s<0||s>=y)return H.e(z,s)
+v=z[s]
+if(u<0||u>=y)return H.e(z,u)
+z[u]=v}if(w<0||w>=y)return H.e(z,w)
+z[w]=null
+return a}},"call$1","gzv",2,0,null,444,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -15421,44 +14786,38 @@
 z=this.v5
 x=this.av
 w=z.length-x
-H.Og(y,0,w,z,x)
+H.qG(y,0,w,z,x)
 z=this.av
 x=this.v5
-H.Og(y,w,w+z,x,0)
+H.qG(y,w,w+z,x,0)
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-e4:[function(a){var z,y,x,w
+wR:[function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
-if(typeof y!=="number")return H.s(y)
-if(z<=y){x=y-z
-z=this.v5
-y=this.av
-H.Og(a,0,x,z,y)
-return x}else{y=this.v5
-w=y.length-z
-H.Og(a,0,w,y,z)
+x=this.v5
+if(z<=y){w=y-z
+H.qG(a,0,w,x,z)
+return w}else{v=x.length-z
+H.qG(a,0,v,x,z)
 z=this.eZ
-if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.Og(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,74,[]],
-Eo:function(a,b){var z
-if(typeof 8!=="number")return H.s(8)
-z=Array(8)
+H.qG(a,v,v+z,y,0)
+return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","bD",2,0,null,192,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,191,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
@@ -15480,7 +14839,7 @@
 "^":"qv;P*,G3,Bb,T8",
 r6:function(a,b){return this.P.call$1(b)},
 $asqv:function(a,b){return[a]}},
-vX:{
+GZ:{
 "^":"a;",
 vh:[function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -15516,10 +14875,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,42,[]],
+return v},"call$1","gST",2,0,null,47,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gOv",2,0,null,264,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -15531,7 +14890,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,42,[]],
+return z},"call$1","gzv",2,0,null,47,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -15542,27 +14901,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,264,[],478,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
 Ba:{
-"^":"vX;Cw,ac,aY,iW,P6,qT,bb",
+"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gcd",4,0,null,479,[],480,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,42,[]],
+return},"call$1","gIA",2,0,null,47,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","gRI",2,0,null,42,[]],
+return},"call$1","guH",2,0,null,47,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,104,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -15571,20 +14930,20 @@
 y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,115,[]],
+b.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,117,[]],
 gB:function(a){return this.P6},
 V1:[function(a){this.aY=null
 this.P6=0
-this.qT=this.qT+1},"call$0","gyP",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return new P.LD(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,23,[]],
+this.qT=this.qT+1},"call$0","gRa",0,0,null],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isBa:true,
-$asvX:function(a,b){return[a]},
+$asGZ:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -15592,47 +14951,47 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:107;a",
-call$1:[function(a){var z=H.Gq(a,this.a)
-return z},"call$1",null,2,0,null,277,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){var z=H.XY(a,this.a)
+return z},"call$1",null,2,0,null,272,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
-LD:{
-"^":"Tp:481;a,b,c",
+BW:{
+"^":"Tp:448;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,264,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-WV:[function(a){var z
-for(z=this.Ln;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,264,[]],
+p0:[function(a){var z
+for(z=this.Jt;a!=null;){z.push(a)
+a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Ln
+y=this.Jt
 if(y.length===0){this.ya=null
 return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
 C.Nm.sB(y,0)
-if(x==null)this.WV(z.aY)
+if(x==null)this.p0(z.aY)
 else{z.vh(x.G3)
-this.WV(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+this.p0(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
 this.ya=z
-this.WV(z.T8)
+this.p0(z.T8)
 return!0},"call$0","gqy",0,0,null],
-Qf:function(a,b){this.WV(a.aY)}},
+Qf:function(a,b){this.p0(a.aY)}},
 OG:{
 "^":"mW;Dn",
 gB:function(a){return this.Dn.P6},
@@ -15655,39 +15014,36 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,264,[]]},
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
 ZM:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,264,[]],
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;Dn,Ln,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,264,[]],
+"^":"S6B;Dn,Jt,qT,bb,ya",
+Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,193,[],194,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,192,[],193,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H44",4,0,null,27,[],194,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,195,6,[]],
-Md:[function(a){a.i(0,64512)
-return!1},"call$1","bO",2,0,null,13,[]],
-ZZ:[function(a,b){return(65536+(a.i(0,1023)<<10>>>0)|b&1023)>>>0},"call$2","hz",4,0,null,198,[],199,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,32,[],193,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:346;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -15697,96 +15053,48 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,18,[],"call"],
+return v},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
-wI:{
+zF:{
 "^":"a;"},
 Zi:{
 "^":"Uk;",
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
-"^":"Ge;Pc,FN",
+"^":"Ge;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
 else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
-static:{ox:function(a,b){return new P.Ud(a,b)}}},
+static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
-"^":"Ud;Pc,FN",
+"^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-pW:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.pW(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,77,27,[],194,[]],
-PN:[function(a,b){return P.Vg(a,this.gZE().Xi)},function(a){return this.PN(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,77,23,[],196,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 pD:{
-"^":"wI;Xi",
-$aswI:function(){return[P.a,J.O]}},
+"^":"zF;Xi",
+$aszF:function(){return[P.a,J.O]}},
 Cf:{
-"^":"wI;N5",
-$aswI:function(){return[J.O,P.a]}},
+"^":"zF;N5",
+$aszF:function(){return[J.O,P.a]}},
 Sh:{
-"^":"a;WE,Mw,JN",
-Tt:function(a){return this.WE.call$1(a)},
-WD:[function(a){var z=this.JN
-if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
-rl:[function(a){var z,y,x,w,v
-if(!this.IS(a)){x=a
-w=this.JN
-if(w.tg(0,x))H.vh(P.TP(x))
-w.h(0,x)
-try{z=this.Tt(a)
-if(!this.IS(z)){x=P.ox(a,null)
-throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
-y=x
-throw H.b(P.ox(a,y))}}},"call$1","gO5",2,0,null,6,[]],
-IS:[function(a){var z,y,x,w
-z={}
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.Mw.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.Mw.KF("true")
-return!0}else if(a===!1){this.Mw.KF("false")
-return!0}else if(a==null){this.Mw.KF("null")
-return!0}else if(typeof a==="string"){z=this.Mw
-z.KF("\"")
-P.NY(z,a)
-z.KF("\"")
-return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
-z=this.Mw
-z.KF("[")
-if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
-x=1
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-z.vM=z.vM+","
-this.rl(y.t(a,x));++x}}z.KF("]")
-this.JN.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
-w=this.Mw
-w.KF("{")
-z.a=!0
-y.aN(a,new P.tF(z,this))
-w.KF("}")
-this.JN.Rz(0,a)
-return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,IE,Yz,ij,fg,SW,KQz,MU,ql,NXu,CE,QVv",Vg:[function(a,b){var z
-b=P.BC()
-z=P.p9("")
-new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","ab",4,0,null,6,[],196,[]],NY:[function(a,b){var z,y,x,w,v,u,t
-z=J.U6(b)
-y=z.gB(b)
+"^":"a;iY,Vy,qi",
+Wt:function(a){return this.iY.call$1(a)},
+aK:[function(a){var z,y,x,w,v,u,t
+z=J.U6(a)
+y=z.gB(a)
 x=H.VM([],[J.im])
 if(typeof y!=="number")return H.s(y)
 w=!1
 v=0
-for(;v<y;++v){u=z.j(b,v)
+for(;v<y;++v){u=z.j(a,v)
 if(u<32){x.push(92)
 switch(u){case 8:x.push(98)
 break
@@ -15809,81 +15117,156 @@
 x.push(t<10?48+t:87+t)
 break}w=!0}else if(u===34||u===92){x.push(92)
 x.push(u)
-w=!0}else x.push(u)}a.KF(w?P.HM(x):b)},"call$2","qW",4,0,null,197,[],86,[]]}},
+w=!0}else x.push(u)}z=w?P.HM(x):a
+this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
+WD:[function(a){var z=this.qi
+if(z.tg(0,a))throw H.b(P.TP(a))
+z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+rl:[function(a){var z,y,x,w,v
+if(!this.IS(a)){x=a
+w=this.qi
+if(w.tg(0,x))H.vh(P.TP(x))
+w.h(0,x)
+try{z=this.Wt(a)
+if(!this.IS(z)){x=P.NM(a,null)
+throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
+y=x
+throw H.b(P.NM(a,y))}}},"call$1","gO5",2,0,null,6,[]],
+IS:[function(a){var z,y,x,w
+z={}
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+this.Vy.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.Vy.KF("true")
+return!0}else if(a===!1){this.Vy.KF("false")
+return!0}else if(a==null){this.Vy.KF("null")
+return!0}else if(typeof a==="string"){z=this.Vy
+z.KF("\"")
+this.aK(a)
+z.KF("\"")
+return!0}else{y=J.x(a)
+if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+z=this.Vy
+z.KF("[")
+if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
+x=1
+while(!0){w=y.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+z.vM=z.vM+","
+this.rl(y.t(a,x));++x}}z.KF("]")
+this.qi.Rz(0,a)
+return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+w=this.Vy
+w.KF("{")
+z.a=!0
+y.aN(a,new P.tF(z,this))
+w.KF("}")
+this.qi.Rz(0,a)
+return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
+static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+b=P.BC()
+z=P.p9("")
+new P.Sh(b,z,P.yv(null)).rl(a)
+return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:482;a,b",
+"^":"Tp:449;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
-if(!z.a){x=y.Mw
-x.KF(",\"")}else{x=y.Mw
-x.KF("\"")}P.NY(x,a)
+if(!z.a){x=y.Vy
+x.KF(",\"")}else{x=y.Vy
+x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.E3()}},
 E3:{
-"^":"wI;",
+"^":"zF;",
 WJ:[function(a){var z,y,x
-z=a.gB(a)
-y=H.VM(Array(z.U(0,3)),[J.im])
+z=J.U6(a)
+y=J.vX(z.gB(a),3)
+if(typeof y!=="number")return H.s(y)
+y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
-x.fJ(a,0,z)
-x.Lb(a.j(0,z.W(0,1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gmC",2,0,null,26,[]],
-$aswI:function(){return[J.O,[J.Q,J.im]]}},
+if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+$aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
-"^":"a;vn,ZP,EN",
-Lb:[function(a,b){var z,y,x,w
-if((b&64512)===56320)P.ZZ(a,b)
-else{z=this.EN
+"^":"a;WF,ZP,EN",
+Lb:[function(a,b){var z,y,x,w,v
+z=this.EN
 y=this.ZP
+if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
+w=y+1
+this.ZP=w
+v=z.length
+if(y>=v)return H.e(z,y)
+z[y]=(240|x>>>18)>>>0
+y=w+1
+this.ZP=y
+if(w>=v)return H.e(z,w)
+z[w]=128|x>>>12&63
+w=y+1
+this.ZP=w
+if(y>=v)return H.e(z,y)
+z[y]=128|x>>>6&63
+this.ZP=w+1
+if(w>=v)return H.e(z,w)
+z[w]=128|x&63
+return!0}else{w=y+1
+this.ZP=w
+v=z.length
+if(y>=v)return H.e(z,y)
+z[y]=224|a>>>12
+y=w+1
+this.ZP=y
+if(w>=v)return H.e(z,w)
+z[w]=128|a>>>6&63
 this.ZP=y+1
-x=C.jn.k(224,a.m(0,12))
-w=z.length
-if(y>=w)return H.e(z,y)
-z[y]=x
-x=this.ZP
-this.ZP=x+1
-y=a.m(0,6).i(0,63)
-if(x>=w)return H.e(z,x)
-z[x]=128|y
-y=this.ZP
-this.ZP=y+1
-x=a.i(0,63)
-if(y>=w)return H.e(z,y)
-z[y]=128|x
-return!1}},"call$2","gkL",4,0,null,483,[],484,[]],
-fJ:[function(a,b,c){var z,y,x,w,v,u
-P.Md(a.j(0,c.W(0,1)))
-for(z=this.EN,y=z.length,x=b;C.jn.C(x,c);++x){w=a.j(0,x)
-w.E(0,127)
-P.Md(w)
-w.E(0,2047)
-v=this.ZP
-if(v+2>=y)break
-this.ZP=v+1
-u=C.jn.k(224,w.m(0,12))
-if(v>=y)return H.e(z,v)
-z[v]=u
-u=this.ZP
+if(y>=v)return H.e(z,y)
+z[y]=128|a&63
+return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
+if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
+if(typeof c!=="number")return H.s(c)
+z=this.EN
+y=z.length
+x=J.rY(a)
+w=b
+for(;w<c;++w){v=x.j(a,w)
+if(v<=127){u=this.ZP
+if(u>=y)break
 this.ZP=u+1
-v=w.m(0,6).i(0,63)
+z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
+t=w+1
+if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
+s=u+1
+if(s>=y)break
+this.ZP=s
 if(u>=y)return H.e(z,u)
-z[u]=128|v
-v=this.ZP
-this.ZP=v+1
-u=w.i(0,63)
-if(v>=y)return H.e(z,v)
-z[v]=128|u}return x},"call$3","gkH",6,0,null,339,[],120,[],121,[]],
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
+z[u]=192|v>>>6
+this.ZP=s+1
+z[s]=128|v&63}else{u=this.ZP
+if(u+2>=y)break
+s=u+1
+this.ZP=s
+if(u>=y)return H.e(z,u)
+z[u]=224|v>>>12
+u=s+1
+this.ZP=u
+if(s>=y)return H.e(z,s)
+z[s]=128|v>>>6&63
+this.ZP=u+1
+if(u>=y)return H.e(z,u)
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","PM",2,0,null,44,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,200,128,[],188,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -15909,44 +15292,38 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,202,128,[],188,[]],
-xv:[function(a){return H.CU(a)},"call$1","J2",2,0,203,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,204,77,77,27,[],164,[],28,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
+NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
 return z},
-F:function(a,b,c){var z,y,x,w,v,u,t
+F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.GP(a);y.G();)z.push(y.gl())
 if(b)return z
-x=z.length
-y=Array(x)
-y.fixed$length=init
-w=H.VM(y,[c])
-for(y=z.length,v=w.length,u=0;u<x;++u){if(u>=y)return H.e(z,u)
-t=z[u]
-if(u>=v)return H.e(w,u)
-w[u]=t}return w},
+z.fixed$length=init
+return z},
 JS:[function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
-else y.call$1(z)},"call$1","Qki",2,0,null,6,[]],
+else y.call$1(z)},"call$1","Pl",2,0,null,6,[]],
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,134,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:436;a",
+"^":"Tp:404;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15955,7 +15332,7 @@
 "^":"a;",
 bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
 $isbool:true},
-Rz:{
+Tx:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -15963,29 +15340,26 @@
 if(b==null)return!1
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,104,[]],
-iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,104,[]],
+return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
+iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
-bu:[function(a){var z,y,x,w,v,u,t,s,r,q
-z=new P.B5()
-y=this.aL
-x=y?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0
-w=new P.Hn().call$1(x)
-v=z.call$1(y?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
-u=z.call$1(y?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
-t=z.call$1(y?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
-s=z.call$1(y?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
-r=z.call$1(y?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-z=y?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0
-q=new P.Zl().call$1(z)
-if(y)return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)+"Z"
-else return H.d(w)+"-"+H.d(v)+"-"+H.d(u)+" "+H.d(t)+":"+H.d(s)+":"+H.d(r)+"."+H.d(q)},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,167,[]],
+bu:[function(a){var z,y,x,w,v,u,t,s
+z=this.aL
+y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
+x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
+w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
+v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
+u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
+t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
+s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
+if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"call$0","gXo",0,0,null],
+h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,166,[]],
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,dfk,Kw,h2,mo,EQe,NXt,tp1,Xs,k3,cR,Oq,fH,Ne,Nr,bmS,lX,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=new H.VR(H.v4("^([+-]?\\d?\\d\\d\\d\\d)-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?\\+00(?::?00)?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -16001,68 +15375,65 @@
 if(6>=x.length)return H.e(x,6)
 r=y.call$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.LL(J.p0(new P.Rq().call$1(x[7]),1000))
+q=J.LL(J.vX(new P.Rq().call$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
-if(8>=x.length)return H.e(x,8)
-o=x[8]!=null
-n=H.zW(w,v,u,t,s,r,q,o)
-return P.Wu(p?n+1:n,o)}else throw H.b(P.cD(a))},"call$1","zZ",2,0,null,201,[]],Wu:function(a,b){var z=new P.iP(a,b)
+o=x.length
+if(8>=o)return H.e(x,8)
+if(x[8]!=null){if(9>=o)return H.e(x,9)
+o=x[9]
+if(o!=null){n=J.de(o,"-")?-1:1
+if(10>=x.length)return H.e(x,10)
+m=H.BU(x[10],null,null)
+if(11>=x.length)return H.e(x,11)
+l=y.call$1(x[11])
+if(typeof m!=="number")return H.s(m)
+l=J.WB(l,60*m)
+if(typeof l!=="number")return H.s(l)
+s=J.xH(s,n*l)}k=!0}else k=!1
+j=H.zW(w,v,u,t,s,r,q,k)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,197,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
-return z},Gi:function(){var z=new P.iP(Date.now(),!1)
-z.EK()
-return z}}},
-MF:{
-"^":"Tp:486;",
-call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,485,[],"call"],
-$isEH:true},
-Rq:{
-"^":"Tp:487;",
-call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,485,[],"call"],
-$isEH:true},
-Hn:{
-"^":"Tp:444;",
-call$1:[function(a){var z,y
+return z},Gq:[function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1",null,2,0,null,292,[],"call"],
-$isEH:true},
-Zl:{
-"^":"Tp:444;",
-call$1:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"call$1","Cp",2,0,null,198,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1",null,2,0,null,292,[],"call"],
+return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"call$1","wI",2,0,null,198,[]]}},
+MF:{
+"^":"Tp:453;",
+call$1:[function(a){if(a==null)return 0
+return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
 $isEH:true},
-B5:{
-"^":"Tp:444;",
-call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,292,[],"call"],
+Rq:{
+"^":"Tp:454;",
+call$1:[function(a){if(a==null)return 0
+return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
-g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,104,[]],
-W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,104,[]],
+g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,488,[]],
-Z:[function(a,b){if(b===0)throw H.b(P.zl())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,489,[]],
-C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,104,[]],
-D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,104,[]],
-E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gf5",2,0,null,104,[]],
-F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,104,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+Z:[function(a,b){if(b===0)throw H.b(P.ts())
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
+D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
+E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
+F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isa6)return!1
-return this.Fq===b.Fq},"call$1","gUJ",2,0,null,104,[]],
+return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,104,[]],
+iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
 bu:[function(a){var z,y,x,w,v
 z=new P.DW()
 y=this.Fq
@@ -16072,20 +15443,20 @@
 v=new P.P7().call$1(C.jn.JV(y,1000000))
 return""+C.jn.cU(y,3600000000)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"call$0","gXo",0,0,null],
 $isa6:true,
-static:{"^":"Kl,S4d,dk,uU,RD,b2,q9,ll,Do,f4,kTB,IJZ,iI,Vk,Nw,yn",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:444;",
+"^":"Tp:413;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
 if(a>=100)return"000"+a
 if(a>=10)return"0000"+a
-return"00000"+a},"call$1",null,2,0,null,292,[],"call"],
+return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:444;",
+"^":"Tp:413;",
 call$1:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1",null,2,0,null,292,[],"call"],
+return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -16104,11 +15475,11 @@
 "^":"AT;G1",
 bu:[function(a){return"RangeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
-Np:{
+yd:{
 "^":"Ge;",
-static:{hS:function(){return new P.Np()}}},
+static:{hS:function(){return new P.yd()}}},
 mp:{
-"^":"Ge;uF,UP,mP,SA,FZ",
+"^":"Ge;uF,UP,mP,SA,mZ",
 bu:[function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
@@ -16144,6 +15515,11 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"call$0","gXo",0,0,null],
 static:{a4:function(a){return new P.UV(a)}}},
+kF:{
+"^":"a;",
+bu:[function(a){return"Out of Memory"},"call$0","gXo",0,0,null],
+gI4:function(){return},
+$isGe:true},
 VS:{
 "^":"a;",
 bu:[function(a){return"Stack Overflow"},"call$0","gXo",0,0,null],
@@ -16165,15 +15541,15 @@
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"call$0","gXo",0,0,null],
-static:{zl:function(){return new P.eV()}}},
+static:{ts:function(){return new P.eV()}}},
 kM:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+this.oc},"call$0","gXo",0,0,null],
+bu:[function(a){return"Expando:"+H.d(this.oc)},"call$0","gXo",0,0,null],
 t:[function(a,b){var z=H.of(b,"expando$values")
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],23,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -16184,10 +15560,10 @@
 EH:{
 "^":"a;",
 $isEH:true},
-cX:{
+QV:{
 "^":"a;",
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 AC:{
 "^":"a;"},
 Z0:{
@@ -16198,10 +15574,10 @@
 bu:[function(a){return"null"},"call$0","gXo",0,0,null]},
 a:{
 "^":";",
-n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,104,[]],
+n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,331,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -16235,7 +15611,7 @@
 gl0:function(a){return this.vM.length===0},
 gor:function(a){return this.vM.length!==0},
 KF:[function(a){var z=typeof a==="string"?a:H.d(a)
-this.vM=this.vM+z},"call$1","gMG",2,0,null,93,[]],
+this.vM=this.vM+z},"call$1","gMG",2,0,null,98,[]],
 We:[function(a,b){var z,y
 z=J.GP(a)
 if(!z.G())return
@@ -16246,8 +15622,8 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gS9",2,2,null,333,474,[],334,[]],
-V1:[function(a){this.vM=""},"call$0","gyP",0,0,null],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
@@ -16261,40 +15637,34 @@
 "^":"a;",
 $isuq:true},
 iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,hO,yW",
-gWu:function(){if(J.de(this.gJf(this),""))return""
+"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
+gWu:function(){if(this.gJf(this)==="")return""
 var z=P.p9("")
 this.tb(z)
 return z.vM},
-gJf:function(a){var z,y
-z=this.NN
-if(z!=null&&J.co(z,"[")){y=J.U6(z)
-return y.Nj(z,1,J.xH(y.gB(z),1))}return z},
-gtp:function(a){var z,y
+gJf:function(a){var z
+if(C.xB.nC(this.NN,"[")){z=this.NN
+return C.xB.Nj(z,1,z.length-1)}return this.NN},
+gtp:function(a){var z
 if(J.de(this.HC,0)){z=this.Fi
-y=J.x(z)
-if(y.n(z,"http"))return 80
-if(y.n(z,"https"))return 443}return this.HC},
+if(z==="http")return 80
+if(z==="https")return 443}return this.HC},
 Ja:function(a,b){return this.tP.call$1(b)},
 x6:[function(a,b){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
-if(!J.de(this.gJf(this),"")||J.de(this.Fi,"file")){z=J.U6(y)
-z=z.gor(y)&&!z.nC(y,"/")}else z=!1
-if(z)return"/"+H.d(y)
-return y},"call$2","gbQ",4,0,null,265,[],490,[]],
-Ky:[function(a,b){var z=J.x(a)
-if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,J.WB(z.cn(a,"/"),1))+H.d(b)},"call$2","gAj",4,0,null,491,[],492,[]],
-uo:[function(a){var z=J.U6(a)
-if(J.z8(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.u8(a,"/.")!==-1},"call$1","gaO",2,0,null,265,[]],
+if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+Ky:[function(a,b){if(a==="")return"/"+H.d(b)
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
-for(y=J.uH(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
 if(J.de(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.de(z[0],"")}else v=!0
@@ -16303,94 +15673,123 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,265,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
-a.KF("@")}z=this.NN
-a.KF(z==null?"null":z)
+a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,493,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(!J.de(this.gJf(this),"")||J.de(y,"file")){z.KF("//")
+z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
 this.tb(z)}z.KF(this.r0)
 y=this.tP
 if(""!==y){z.KF("?")
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+n:[function(a,b){var z,y
 if(b==null)return!1
 z=J.RE(b)
 if(typeof b!=="object"||b===null||!z.$isiD)return!1
-return J.de(this.Fi,b.Fi)&&J.de(this.ku,b.ku)&&J.de(this.gJf(this),z.gJf(b))&&J.de(this.gtp(this),z.gtp(b))&&J.de(this.r0,b.r0)&&J.de(this.tP,b.tP)&&J.de(this.Ka,b.Ka)},"call$1","gUJ",2,0,null,104,[]],
+if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
+y=b.r0
+z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
+else z=!1
+else z=!1
+else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=new P.XZ()
 return z.call$2(this.Fi,z.call$2(this.ku,z.call$2(this.gJf(this),z.call$2(this.gtp(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.Ka,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){var z=J.x(h)
-if(z.n(h,"http")&&J.de(e,80))this.HC=0
-else if(z.n(h,"https")&&J.de(e,443))this.HC=0
+n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
+else if(h==="https"&&J.de(e,443))this.HC=0
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"Um,B4,Bx,iR,OO,My,nR,jJY,d2,n2,q7,ux,vI,SF,fd,IL,Q5,zk,yt,fC,Ft,eq,qf,ML,y3,Pk,R1,qs,lL,I9,t2,H5,wb,eK,ws,Sp,aJ,Qd,Ai,ne",r6:function(a){var z,y,x,w,v,u,t,s
-z=a.QK
-if(1>=z.length)return H.e(z,1)
-y=z[1]
-y=P.iy(y!=null?y:"")
-x=z.length
-if(2>=x)return H.e(z,2)
-w=z[2]
-w=w!=null?w:""
-if(3>=x)return H.e(z,3)
-v=z[3]
-if(4>=x)return H.e(z,4)
-v=P.K6(v,z[4])
-if(5>=x)return H.e(z,5)
-x=P.n7(z[5])
-u=z.length
-if(6>=u)return H.e(z,6)
-t=z[6]
-t=t!=null?t:""
-if(7>=u)return H.e(z,7)
-s=z[7]
-s=s!=null?s:""
-if(8>=u)return H.e(z,8)
-z=z[8]
-z=z!=null?z:""
-u=P.iy(y)
-u=new P.iD(P.L7(v),null,null,u,w,P.LE(s,null),P.UJ(z),null,null)
-u.n3(z,v,t,null,x,s,null,y,w)
-return u},R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+x=new P.hP()
+w=new P.Uo(a1)
+v=J.U6(a1)
+u=v.gB(a1)
+if(J.de(u,0))return P.R6("","",null,null,0,null,null,null,"")
+if(v.j(a1,0)!==47){if(typeof u!=="number")return H.s(u)
+t=0
+for(;s=0,t<u;t=r){r=t+1
+q=v.j(a1,t)
+if(q<128){p=q>>>4
+if(p>=8)return H.e(C.mK,p)
+p=(C.mK[p]&C.jn.W4(1,q&15))!==0}else p=!1
+if(!p){if(q===58){s=r
+t=s}else{t=r-1
+s=0}break}}}else{t=0
+s=0}if(s===t){p=s+1
+if(typeof u!=="number")return H.s(u)
+p=p<u&&v.j(a1,s)===47&&v.j(a1,p)===47}else p=!1
+if(p){o=s+2
+for(n=-1;p=J.Wx(o),m=-1,p.C(o,u);){l=p.g(o,1)
+q=v.j(a1,o)
+if(x.call$1(q)!==!0)if(q===91)o=w.call$1(l)
+else{if(J.de(n,-1)&&q===58);else{p=q===64||q===58
+o=l-1
+if(p){m=v.XU(a1,"@",o)
+if(m===-1){o=t
+break}o=m+1
+for(n=-1;p=J.Wx(o),p.C(o,u);){l=p.g(o,1)
+q=v.j(a1,o)
+if(x.call$1(q)!==!0)if(q===91)o=w.call$1(l)
+else{if(q===58){if(!J.de(n,-1))throw H.b(P.cD("Double port in host"))}else{o=l-1
+break}o=l
+n=o}else o=l}break}else{m=-1
+break}}o=l
+n=o}else o=l}}else{o=s
+m=-1
+n=-1}for(k=o;x=J.Wx(k),x.C(k,u);k=j){j=x.g(k,1)
+q=v.j(a1,k)
+if(q===63||q===35){k=j-1
+break}}x=J.Wx(k)
+if(x.C(k,u)&&v.j(a1,k)===63)for(i=k;w=J.Wx(i),w.C(i,u);i=h){h=w.g(i,1)
+if(v.j(a1,i)===35){i=h-1
+break}}else i=k
+g=s>0?v.Nj(a1,0,s-1):null
+z=0
+if(s!==o){f=s+2
+if(m>0){e=v.Nj(a1,f,m)
+f=m+1}else e=""
+w=J.Wx(n)
+if(w.D(n,0)){y=v.Nj(a1,n,o)
+try{z=H.BU(y,null,null)}catch(d){H.Ru(d)
+throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}c=v.Nj(a1,f,w.W(n,1))}else c=v.Nj(a1,f,o)}else{c=""
+e=""}b=v.Nj(a1,o,k)
+a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
+x=J.Wx(i)
+a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
+return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,202,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y,x
-if(a==null||J.FN(a)===!0)return a
-z=J.rY(a)
-if(z.j(a,0)===91){if(z.j(a,J.xH(z.gB(a),1))!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.eg(z.Nj(a,1,J.xH(z.gB(a),1)))
-return a}y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-if(z.j(a,y)===58){P.eg(a)
-return"["+H.d(a)+"]"}++y}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u,t,s
+return z},L7:[function(a){var z,y
+if(a.length===0)return a
+if(C.xB.j(a,0)===91){z=a.length-1
+if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
+P.eg(C.xB.Nj(a,1,z))
+return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(new P.bJ("value "+y))
+if(a.charCodeAt(y)===58){P.eg(a)
+return"["+a+"]"}}return a},"call$1","jC",2,0,null,203,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
-y=new P.XX()
 if(a==null)return""
-x=J.U6(a)
-w=x.gB(a)
-if(typeof w!=="number")return H.s(w)
-v=!0
-u=0
-for(;u<w;++u){t=x.j(a,u)
-if(u===0){if(!(t>=97&&t<=122))s=t>=65&&t<=90
-else s=!0
-s=!s}else s=!1
-if(s)throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-if(z.call$1(t)!==!0){if(y.call$1(t)===!0);else throw H.b(new P.AT("Illegal scheme: "+H.d(a)))
-v=!1}}return v?a:x.hc(a)},"call$1","oL",2,0,null,206,[]],LE:[function(a,b){var z,y,x
+y=a.length
+for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(new P.bJ("value "+w))
+v=a.charCodeAt(w)
+if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
+else u=!0
+u=!u}else u=!1
+if(u)throw H.b(new P.AT("Illegal scheme: "+a))
+if(z.call$1(v)!==!0){if(v<128){u=v>>>4
+if(u>=8)return H.e(C.mK,u)
+u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
+if(u);else throw H.b(new P.AT("Illegal scheme: "+a))
+x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,204,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -16399,65 +15798,59 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){if(a==null)return""
-return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,205,[],206,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,207,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
-y=new P.Gs()
-x=new P.Tw()
-w=new P.wm(a,y,new P.pm())
-v=new P.FB(a)
-z.a=null
-u=J.U6(a)
-t=u.gB(a)
-z.b=0
+y=J.U6(a).u8(a,"%")
+z.a=y
+if(y<0)return a
+x=new P.Gs()
+w=new P.Tw()
+v=new P.wm(a,x,new P.pm())
+u=new P.FB(a)
+z.b=null
+t=a.length
 z.c=0
 s=new P.Lk(z,a)
-if(typeof t!=="number")return H.s(t)
-r=0
-for(;r<t;)if(u.j(a,r)===37){r=z.b
-if(t<r+2)throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(a)))
-q=u.j(a,r+1)
-p=u.j(a,z.b+2)
-o=v.call$1(z.b+1)
-if(y.call$1(q)===!0&&y.call$1(p)===!0&&x.call$1(o)!==!0){n=z.b+3
-z.b=n
-r=n}else{s.call$0()
-r=x.call$1(o)
-m=z.a
-if(r===!0){m.toString
-l=P.O8(1,o,J.im)
-r=H.eT(l)
-m.vM=m.vM+r}else{m.toString
-m.vM=m.vM+"%"
-r=w.call$1(z.b+1)
-m.toString
-l=P.O8(1,r,J.im)
-r=H.eT(l)
-m.vM=m.vM+r
-r=z.a
-m=w.call$1(z.b+2)
+for(r=y;r<t;){if(t<r+2)throw H.b(new P.AT("Invalid percent-encoding in URI component: "+a))
+q=C.xB.j(a,r+1)
+p=C.xB.j(a,z.a+2)
+o=u.call$1(z.a+1)
+if(x.call$1(q)===!0&&x.call$1(p)===!0&&w.call$1(o)!==!0){y=z.a+3
+z.a=y
+r=y}else{s.call$0()
+r=w.call$1(o)
+n=z.b
+if(r===!0){n.toString
+m=P.O8(1,o,J.im)
+r=H.eT(m)
+n.vM=n.vM+r}else{n.toString
+n.vM=n.vM+"%"
+r=v.call$1(z.a+1)
+n.toString
+m=P.O8(1,r,J.im)
+r=H.eT(m)
+n.vM=n.vM+r
+r=z.b
+n=v.call$1(z.a+2)
 r.toString
-l=P.O8(1,m,J.im)
-m=H.eT(l)
-r.vM=r.vM+m}n=z.b+3
-z.b=n
-z.c=n
-r=n}}else{n=z.b+1
-z.b=n
-r=n}if(z.a!=null&&z.c!==r)s.call$0()
-z=z.a
-if(z==null)return a
-return J.AG(z)},"call$1","Sy",2,0,null,210,[]],n7:[function(a){if(a!=null&&!J.de(a,""))return H.BU(a,null,null)
-else return 0},"call$1","dl",2,0,null,211,[]],K6:[function(a,b){if(a!=null)return a
-if(b!=null)return b
-return""},"call$2","xX",4,0,null,212,[],213,[]],q5:[function(a){var z,y
+m=P.O8(1,n,J.im)
+n=H.eT(m)
+r.vM=r.vM+n}y=z.a+3
+z.a=y
+z.c=y
+r=y}l=C.xB.XU(a,"%",r)
+if(l>=z.a){z.a=l
+r=l}else{z.a=t
+r=t}}if(z.b==null)return a
+if(z.c!==r)s.call$0()
+return J.AG(z.b)},"call$1","Sy",2,0,null,208,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,203,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
-if(J.u6(J.q8(a),2))z.call$1("address is too short")
+if(J.q8(a)<2)z.call$1("address is too short")
 x=[]
 w=0
 u=!1
@@ -16465,29 +15858,35 @@
 while(!0){s=J.q8(a)
 if(typeof s!=="number")return H.s(s)
 if(!(t<s))break
-if(J.lE(a,t)===58){if(t===0){++t
-if(J.lE(a,t)!==58)z.call$1("invalid start colon.")
+s=a
+r=J.q8(s)
+if(typeof r!=="number")return H.s(r)
+if(t>=r)H.vh(new P.bJ("value "+t))
+if(s.charCodeAt(t)===58){if(t===0){++t
+s=a
+if(t>=J.q8(s))H.vh(new P.bJ("value "+t))
+if(s.charCodeAt(t)!==58)z.call$1("invalid start colon.")
 w=t}if(t===w){if(u)z.call$1("only one wildcard `::` is allowed")
 J.bi(x,-1)
 u=!0}else J.bi(x,y.call$2(w,t))
 w=t+1}++t}if(J.q8(x)===0)z.call$1("too few parts")
-r=J.de(w,J.q8(a))
-q=J.de(J.MQ(x),-1)
-if(r&&!q)z.call$1("expected a part after last `:`")
-if(!r)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(p){H.Ru(p)
-try{v=P.q5(J.D8(a,w))
+q=J.de(w,J.q8(a))
+p=J.de(J.MQ(x),-1)
+if(q&&!p)z.call$1("expected a part after last `:`")
+if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
+try{v=P.q5(J.ZZ(a,w))
 s=J.c1(J.UQ(v,0),8)
-o=J.UQ(v,1)
-if(typeof o!=="number")return H.s(o)
-J.bi(x,(s|o)>>>0)
-o=J.c1(J.UQ(v,2),8)
+r=J.UQ(v,1)
+if(typeof r!=="number")return H.s(r)
+J.bi(x,(s|r)>>>0)
+r=J.c1(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.bi(x,(o|s)>>>0)}catch(p){H.Ru(p)
+J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,205,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -16503,29 +15902,35 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,214,152,215,[],216,[],217,[],218,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
+hP:{
+"^":"Tp:462;",
+call$1:[function(a){var z
+if(a<128){z=a>>>4
+if(z>=8)return H.e(C.aa,z)
+z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
+return z},"call$1",null,2,0,null,461,[],"call"],
+$isEH:true},
+Uo:{
+"^":"Tp:463;a",
+call$1:[function(a){a=J.aK(this.a,"]",a)
+if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
+return a+1},"call$1",null,2,0,null,52,[],"call"],
+$isEH:true},
 hb:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
-$isEH:true},
-XX:{
-"^":"Tp:495;",
-call$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.mK,z)
-z=(C.mK[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
+return z},"call$1",null,2,0,null,461,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:107;",
-call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -16533,105 +15938,105 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,496,[],"call"],
+return z},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:495;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,496,[],"call"],
+"^":"Tp:462;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:495;",
+"^":"Tp:462;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,494,[],"call"],
+return z},"call$1",null,2,0,null,461,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:497;b,c,d",
+"^":"Tp:463;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
-y=J.lE(z,a)
+y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
-else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+H.d(z)))
-else return y},"call$1",null,2,0,null,47,[],"call"],
+else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
+else return y},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:497;e",
-call$1:[function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+H.d(z)))}}return x},"call$1",null,2,0,null,47,[],"call"],
+"^":"Tp:463;e",
+call$1:[function(a){var z,y,x,w
+for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
+if(48<=w&&w<=57)y=y*16+w-48
+else{w|=32
+if(97<=w&&w<=102)y=y*16+w-97+10
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:112;a,f",
+"^":"Tp:114;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
-y=z.a
+y=z.b
 x=z.c
 w=this.f
-v=z.b
-if(y==null)z.a=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
+v=z.a
+if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
+else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:499;",
+"^":"Tp:466;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,498,[],245,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:182;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
+"^":"Tp:181;",
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,500,[],"call"],
+return z},"call$1",null,2,0,null,467,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:182;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,19,[],"call"],
+"^":"Tp:181;",
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:501;a,b",
+"^":"Tp:468;a,b",
 call$2:[function(a,b){var z,y
-if(J.z8(J.xH(b,a),4))this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(J.Nj(this.a,a,b),16,null)
+if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
+z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,120,[],121,[],"call"],
+return z},"call$2",null,4,0,null,123,[],124,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:107;c",
+"^":"Tp:112;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,23,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,502,[],503,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,219,18,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,94,[],220,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,77,77,221,[],222,[],223,[]],
+return"transitionend"},"call$1","pq",2,0,215,19,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -16642,7 +16047,7 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,77,77,77,77,77,77,77,221,[],224,[],225,[],222,[],226,[],227,[],228,[],223,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,82,82,82,82,82,82,82,217,[],220,[],218,[],221,[],222,[],223,[],224,[],219,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
@@ -16650,23 +16055,23 @@
 try{z=a
 y=J.x(z)
 return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","EF",2,0,null,229,[]],
+return!1}},"call$1","tn",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,230,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
 qc:[function(a){var z,y
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,18,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,18,[]],
+return}else return a},"call$1","Wq",2,0,null,19,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
 Z9:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
-return P.o7(a,!0)},"call$1","cj",2,0,null,91,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,231,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,107,41,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,107,41,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,232,41,[],12,[],233,[],234,[]],
+return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -16705,29 +16110,29 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,89,[],235,[],94,[],11,[],236,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,94,[],231,[],99,[],11,[],232,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,156,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,155,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,156,[]],
+return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLOptGroupElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Vf|PO|Ur|G6|Sq|xI|Tg|KU|Ps|CN|qbd|HT|Ds|E0|LP|lw|pv|Fv|Vfx|E9|m8|Urj|Gk|AX|oub|yb|c4r|NM|pR|Squ|hx|Dsd|Zt|u7|KUl|E7|Kz|tuj|vj|LU|mHk|T2|Vct|PF|F1|D13|aQ|WZq|Ya5|pva|Ww|cda|tz|qFb|fl|rna|oM|Vba|wM|waa|lI|XP|V0|JG|T5|knI|oaa|fI|q2|nm|q3|uwf"},
-pa:{
+"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+zw:{
 "^":"Gv;",
 $isList:true,
-$asWO:function(){return[W.M5]},
+$aszM:function(){return[W.M5]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.M5]},
+$isQV:true,
+$asQV:function(){return[W.M5]},
 "%":"EntryArray"},
-Gh:{
+Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $isGv:true,
 "%":"HTMLAnchorElement"},
-na:{
+Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $isGv:true,
@@ -16742,7 +16147,7 @@
 "^":"Gv;t5:type=",
 $isAz:true,
 "%":";Blob"},
-QP:{
+Fy:{
 "^":"qE;",
 $isD0:true,
 $isGv:true,
@@ -16758,8 +16163,8 @@
 Yr:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
-di:{
-"^":"Qa;Rn:data=",
+wT:{
+"^":"Mf;Rn:data=",
 "%":"CompositionEvent"},
 He:{
 "^":"ea;",
@@ -16773,15 +16178,15 @@
 "%":"HTMLDataListElement"},
 QF:{
 "^":"KV;",
-JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,77,264,[],294,[]],
+JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16794,9 +16199,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 $isGv:true,
 "%":";DocumentFragment"},
 cm:{
@@ -16820,13 +16225,13 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,295,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,296,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,296,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
 gDD:function(a){return new W.I4(a)},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
-aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
+aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 gqn:function(a){return a.localName},
 bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
 WO:[function(a,b){if(!!a.matches)return a.matches(b)
@@ -16834,14 +16239,15 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,295,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,295,[]],
+return!1},"call$1","gMn",2,0,null,293,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
-gKE:function(a){return a.shadowRoot||a.webkitShadowRoot},
+gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
+GE:[function(a,b){return a.getAttribute(b)},"call$1","gBy",2,0,null,12,[]],
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
@@ -16859,13 +16265,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
+e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|SpeechRecognitionEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16875,40 +16282,40 @@
 "^":"Az;oc:name=",
 $ishH:true,
 "%":"File"},
-Aa:{
+QU:{
 "^":"cm;tT:code=",
 "%":"FileError"},
-Tq:{
+h4:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-wa:{
+xn:{
 "^":"Gb;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"rk;iC:responseText=,ys:status=,po:statusText=",
+"^":"wa;iC:responseText=",
 gn9:function(a){return W.Z9(a.response)},
-Yh:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,77,77,77,224,[],221,[],299,[],300,[],301,[]],
-wR:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,77,239,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
-rk:{
+wa:{
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
@@ -16923,7 +16330,7 @@
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,aK:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
@@ -16951,6 +16358,7 @@
 "%":"HTMLLinkElement"},
 cS:{
 "^":"Gv;cC:hash%,mH:href=",
+VD:[function(a){return a.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 $iscS:true,
 "%":"Location"},
@@ -16959,6 +16367,7 @@
 "%":"HTMLMapElement"},
 El:{
 "^":"qE;kc:error=,LA:src=",
+xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
 "%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
 zm:{
 "^":"Gv;tT:code=",
@@ -16969,16 +16378,16 @@
 aB:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
-fJ:{
+W7:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 Rv:{
-"^":"D0;jO:id=",
+"^":"D0;jO:id=,ph:label=",
 "%":"MediaStream"},
-Hy:{
+cx:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isHy:true,
+$iscx:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"qE;jb:content=,oc:name%",
@@ -16991,17 +16400,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"Imr;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"wR","call$2",null,"gX8",2,2,null,77,239,[],302,[]],
+"^":"ab;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
 "%":"MIDIOutput"},
-Imr:{
+ab:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
-CX:{
-"^":"Qa;",
+Wp:{
+"^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[]],
-$isCX:true,
+return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+$isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
@@ -17014,12 +16423,12 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,77,77,77,77,77,77,77,74,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
-FI:{
+o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-oU:{
+Q0:{
 "^":"Gv;",
 $isGv:true,
 "%":"Navigator"},
@@ -17030,36 +16439,36 @@
 "^":"D0;q6:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
 gyT:function(a){return new W.e7(a)},
 wg:[function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},"call$0","gRI",0,0,null],
+if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,324,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,325,[]],
-tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,104,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,325,[],326,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,325,[],327,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
 $isKV:true,
 "%":"Entity|Notation;Node"},
 yk:{
-"^":"ecX;",
+"^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 KY:{
@@ -17068,8 +16477,11 @@
 G7:{
 "^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
 "%":"HTMLObjectElement"},
+l9:{
+"^":"qE;ph:label%",
+"%":"HTMLOptGroupElement"},
 Ql:{
-"^":"qE;MB:form=,vH:index=,P:value%",
+"^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 $isQl:true,
 "%":"HTMLOptionElement"},
@@ -17106,21 +16518,33 @@
 "^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
-z=z.ev(z,new W.kI())
+z=z.ev(z,new W.Ou())
 return H.VM(new P.Yp(P.F(z,!0,H.ip(z,"mW",0))),[null])},
 $islp:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
 $isI0:true,
 "%":"ShadowRoot"},
-CY:{
+QR:{
 "^":"qE;LA:src=,t5:type%",
 "%":"HTMLSourceElement"},
-Hd:{
+uaa:{
+"^":"ea;PK:results=",
+"%":"SpeechInputEvent"},
+yg:{
+"^":"Gv;",
+"%":"SpeechInputResult"},
+mG:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
+Ul:{
+"^":"ea;PK:results=",
+"%":"SpeechRecognitionEvent"},
+uj:{
+"^":"Gv;V5:isFinal=,B:length=",
+"%":"SpeechRecognitionResult"},
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
@@ -17138,7 +16562,7 @@
 "^":"qE;",
 $istV:true,
 "%":"HTMLTableRowElement"},
-KP:{
+BT:{
 "^":"qE;",
 gWT:function(a){return H.VM(new W.Of(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
@@ -17156,25 +16580,25 @@
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 xV:{
-"^":"Qa;Rn:data=",
+"^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
-"^":"qE;fY:kind%,LA:src=",
+"^":"qE;fY:kind%,ph:label%,LA:src=",
 "%":"HTMLTrackElement"},
 OJ:{
 "^":"ea;",
 $isOJ:true,
 "%":"TransitionEvent|WebKitTransitionEvent"},
-Qa:{
+Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 u9:{
-"^":"D0;oc:name%,ys:status=",
+"^":"D0;oc:name%",
 gmW:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,156,[]],
+oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,155,[]],
 hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
@@ -17195,7 +16619,7 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
@@ -17208,7 +16632,7 @@
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-hq:{
+Eb:{
 "^":"KV;",
 $isGv:true,
 "%":"DocumentType"},
@@ -17217,60 +16641,99 @@
 $isD0:true,
 $isGv:true,
 "%":"HTMLFrameSetElement"},
-QV:{
-"^":"w1p;",
+Cy:{
+"^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,47,[],23,[]],
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,47,[]],
+return a[b]},"call$1","goY",2,0,null,52,[]],
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
+c5:{
+"^":"w1p;",
+gB:function(a){return a.length},
+t:[function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},"call$1","goY",2,0,null,52,[]],
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]},
+$isXj:true,
+"%":"SpeechInputResultList"},
+LO:{
+"^":"kEI;",
+gB:function(a){return a.length},
+t:[function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(new P.lj("No elements"))},
+Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},"call$1","goY",2,0,null,52,[]],
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]},
+$isXj:true,
+"%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,504,173,[]],
-Wt:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,504,173,[]],
-To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,173,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,182,505,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,182,505,[]],
-WL:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,504,173,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,129,[]],
+tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,132,[]],
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,47,[],23,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,23,[]],
+return b},"call$1","ght",2,0,null,28,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-z=J.x(b)
-for(z=J.GP(typeof b==="object"&&b!==null&&!!z.$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
-return!0}}return!1},"call$1","gRI",2,0,null,6,[]],
+return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
@@ -17278,29 +16741,29 @@
 x=this.MW
 if(b===y)x.appendChild(c)
 else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,47,[],129,[]],
-V1:[function(a){this.MW.textContent=""},"call$0","gyP",0,0,null],
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
 KI:[function(a,b){var z,y
 z=this.vG
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
 $asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
-$ascX:function(){return[W.cv]}},
+$aszM:function(){return[W.cv]},
+$asQV:function(){return[W.cv]}},
 wz:{
 "^":"ar;Sn,Sc",
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,47,[],23,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,77,133,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gi9:function(a){return C.mt.vo(this)},
@@ -17309,17 +16772,17 @@
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,18,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -17337,27 +16800,27 @@
 RAp:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 Gb:{
 "^":"RAp+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:107;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,506,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,507,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:107;b,c",
+"^":"Tp:112;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -17366,24 +16829,20 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,18,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:346;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,42,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){var z,y,x,w
-z=J.w1(b)
-if(typeof b==="object"&&b!==null&&!!z.$ise7){z=b.NL
-y=this.NL
-if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){var z,y
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
@@ -17391,81 +16850,108 @@
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,47,[],264,[]],
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
 KI:[function(a,b){var z,y,x
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 x=y[b]
 z.removeChild(x)
-return x},"call$1","gNM",2,0,null,47,[]],
+return x},"call$1","gNM",2,0,null,52,[]],
 Rz:[function(a,b){var z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
-return!0},"call$1","gRI",2,0,null,6,[]],
-V1:[function(a){this.NL.textContent=""},"call$0","gyP",0,0,null],
+return!0},"call$1","guH",2,0,null,6,[]],
+V1:[function(a){J.c9(this.NL,"")},"call$0","gRa",0,0,null],
 u:[function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,47,[],23,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
-$ise7:true,
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 $asar:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$ascX:function(){return[W.KV]}},
+$aszM:function(){return[W.KV]},
+$asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-ecX:{
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+ma:{
 "^":"nNL+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-kI:{
-"^":"Tp:107;",
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+Ou:{
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,18,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-w1p:{
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+ecX:{
 "^":"yoo+Gm;",
 $isList:true,
-$asWO:function(){return[W.KV]},
+$aszM:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+zLC:{
+"^":"Gv+lD;",
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]}},
+w1p:{
+"^":"zLC+Gm;",
+$isList:true,
+$aszM:function(){return[W.yg]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.yg]}},
+dxW:{
+"^":"Gv+lD;",
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]}},
+kEI:{
+"^":"dxW+Gm;",
+$isList:true,
+$aszM:function(){return[W.uj]},
+$isyN:true,
+$isQV:true,
+$asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,104,[]],
+FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,23,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
 V1:[function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gyP",0,0,null],
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,115,[]],
+b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
@@ -17483,21 +16969,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,402,[],277,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,42,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,42,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,42,[],23,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","gRI",2,0,null,42,[]],
+return y},"call$1","guH",2,0,null,47,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,264,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -17505,38 +16991,38 @@
 return z},"call$0","gt8",0,0,null],
 p5:[function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gpJ",2,0,null,86,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,115,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","gRI",2,0,null,23,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,115,[]],
+for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
+OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:107;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:346;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,509,[],129,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17545,36 +17031,36 @@
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]},
+J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
 e0:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,152,18,[],298,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,152,18,[],298,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,152,18,[],298,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
 $isqh:true},
 ie:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,18,[],"call"],
+return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,510,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
 KR:[function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17582,16 +17068,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,77,77,77,461,[],456,[],462,[],164,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
 $isqh:true},
 i2:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,384,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,18,[],"call"],
+return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17600,9 +17086,9 @@
 this.uv=null
 this.u7=null
 return},"call$0","gZS",0,0,null],
-nB:[function(a,b){if(this.uv==null)return
+Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.nB(a,null)},"yy","call$1",null,"gAK",0,2,null,77,459,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17617,57 +17103,57 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gXB()))},"call$1","ght",2,0,null,511,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","gRI",2,0,null,511,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"call$0","gJK",0,0,112],
+this.aV.cO(0)},"call$0","gJK",0,0,114],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:113;a,b",
+"^":"Tp:115;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
-hP:{
-"^":"a;vm",
-cN:function(a){return this.vm.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,152,18,[],298,[]]},
+bO:{
+"^":"a;Ob",
+cN:function(a){return this.Ob.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,114,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,77,133,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,47,[],129,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,512,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gRI",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
+KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 Of:{
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,129,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","gRI",2,0,null,129,[]],
-V1:[function(a){J.U2(this.xa)},"call$0","gyP",0,0,null],
+h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,132,[]],
+Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","guH",2,0,null,132,[]],
+V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
+z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){J.wg(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,77,133,[]],
-XU:[function(a,b,c){return J.hf(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,335,129,[],120,[]],
-Pk:[function(a,b,c){return J.pB(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gph",2,2,null,77,129,[],120,[]],
-xe:[function(a,b,c){return J.Nv(this.xa,b,c)},"call$2","gQG",4,0,null,47,[],129,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,47,[]],
-YW:[function(a,b,c,d,e){J.QQ(this.xa,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]]},
+GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
+KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17684,29 +17170,30 @@
 return!1},"call$0","gqy",0,0,null],
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"call$1",null,2,0,null,41,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,46,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,77,20,[],328,[],329,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
 gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,77,11,[],297,[],298,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,77,11,[],297,[],298,[]],
+On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
+Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
 $isD0:true,
 $isGv:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"call$1","lG",2,0,null,237,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
 scC:function(a,b){this.WK.hash=b},
 gmH:function(a){return this.WK.href},
+VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
 $iscS:true,
 $isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
@@ -17728,7 +17215,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-mk:{
+vO:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGCircleElement"},
@@ -17748,7 +17235,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEBlendElement"},
-bd:{
+lv:{
 "^":"d5;t5:type=,UQ:values=",
 $isGv:true,
 "%":"SVGFEColorMatrixElement"},
@@ -17768,7 +17255,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDiffuseLightingElement"},
-wf:{
+kK:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDisplacementMapElement"},
@@ -17776,7 +17263,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEFloodElement"},
-tk:{
+Ob:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEGaussianBlurElement"},
@@ -17796,11 +17283,11 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEOffsetElement"},
-kK:{
+um:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFESpecularLightingElement"},
-um:{
+kL:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFETileElement"},
@@ -17835,7 +17322,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGLineElement"},
-uzr:{
+Jq:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGMarkerElement"},
@@ -17843,7 +17330,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGMaskElement"},
-lZ:{
+AW:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPathElement"},
@@ -17855,7 +17342,7 @@
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolygonElement"},
-mO:{
+GH:{
 "^":"d0;",
 $isGv:true,
 "%":"SVGPolylineElement"},
@@ -17876,7 +17363,7 @@
 return a._cssClassSet},
 gwd:function(a){return H.VM(new P.D7(a,new W.e7(a)),[W.cv])},
 swd:function(a,b){var z=H.VM(new P.D7(a,new W.e7(a)),[W.cv])
-z.h2.NL.textContent=""
+J.c9(z.h2.NL,"")
 z.FV(0,b)},
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
@@ -17886,7 +17373,7 @@
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
 hy:{
 "^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,293,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
 $ishy:true,
 $isGv:true,
 "%":"SVGSVGElement"},
@@ -17925,7 +17412,7 @@
 "^":"d5;",
 $isGv:true,
 "%":"SVGCursorElement"},
-cB:{
+hW:{
 "^":"d5;",
 $isGv:true,
 "%":"SVGFEDropShadowElement"},
@@ -17945,27 +17432,27 @@
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,86,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
 TM:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-IU:{
+hq:{
 "^":"a;",
-$isIU:true,
+$ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","Kc",2,3,null,152,115,[],238,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,210,117,[],234,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,156,[],238,[],169,[],82,[]],
+d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,91,[],12,[],23,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,96,[],12,[],28,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"call$2","Cb",4,0,null,91,[],12,[]],
+return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
@@ -17977,44 +17464,45 @@
 if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
 else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
 else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp())}}},"call$1","En",2,0,107,91,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","nB",6,0,null,91,[],63,[],240,[]],
+P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,96,[],68,[],236,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
 z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
 if(z)return a
-else if(a instanceof Date)return P.Wu(a.getMilliseconds(),!1)
-else if(a.constructor===DartObject)return a.o
-else return P.ND(a)}},"call$1","Xl",2,0,195,91,[]],
+else if(a instanceof Date)return P.Wu(a.getTime(),!1)
+else if(a.constructor===$.hs())return a.o
+else return P.ND(a)}},"call$1","Xl",2,0,194,96,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,91,[]],
+else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,96,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,91,[],63,[],240,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,96,[],68,[],236,[]],
 E4:{
 "^":"a;eh",
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-return P.dU(this.eh[b])},"call$1","gIA",2,0,null,66,[]],
+return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,66,[],23,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
 giO:function(a){return 0},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,104,[]],
-Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,66,[]],
+return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
-return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gwK",2,2,null,77,224,[],268,[]],
+if(b==null)y=null
+else{b.toString
+y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
 $isE4:true,
 static:{uw:function(a,b){var z,y,x
 z=P.wY(a)
@@ -18024,9 +17512,9 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,239,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,235,[]]}},
 Gn:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -18034,10 +17522,10 @@
 if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$iscX)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"call$1",null,2,0,null,91,[],"call"],
+return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
@@ -18048,31 +17536,31 @@
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,47,[]],
+if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,47,[],23,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,23,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,114,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z
 if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,47,[],129,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,47,[]],
+return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
 YW:[function(a,b,c,d,e){var z,y,x
 if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
@@ -18086,38 +17574,37 @@
 x=[b,y]
 z=new H.nH(d,e,null)
 z.$builtinTypeInfo=[null]
-if(e<0)H.vh(P.N(e))
 C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,77,133,[]]},
+this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
-$asWO:null,
+$aszM:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 DV:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"call$1",null,2,0,null,91,[],"call"],
+return z},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:107;",
-call$1:[function(a){return new DartObject(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:107;",
-call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:107;",
-call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:107;",
-call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
 J:[function(a,b){var z
@@ -18129,7 +17616,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","yT",4,0,null,128,[],188,[]],
+return a}return a},"call$2","If",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -18137,7 +17624,7 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,128,[],188,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
@@ -18145,9 +17632,9 @@
 y=P.o1(a)
 z=J.x(y)
 if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,42,[]],
+return y.gJi()},"call$1","vG",2,0,null,47,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,42,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -18175,9 +17662,9 @@
 $isej:true,
 $isX9:true,
 $isNL:true},
-ac:{
+Fw:{
 "^":"X9;",
-$isac:true},
+$isFw:true},
 RS:{
 "^":"a;",
 $isRS:true,
@@ -18195,9 +17682,9 @@
 $isNL:true,
 $isej:true},
 Lw:{
-"^":"a;ew,yz,nV,Li"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+"^":"a;ew,yz,nV,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","A9",0,0,null],
+ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","rX",0,0,null],
 Gj:{
 "^":"U4;EV"},
 U4:{
@@ -18205,26 +17692,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,104,[]],
-Rz:[function(a,b){Q.ah()},"call$1","gRI",2,0,null,42,[]],
-V1:[function(a){return Q.ah()},"call$0","gyP",0,0,null],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,42,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,42,[],23,[]],
-FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,104,[]],
-V1:[function(a){this.EV.V1(0)},"call$0","gyP",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,42,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,23,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
+V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","gRI",2,0,null,42,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -18244,18 +17731,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,47,[],330,[]],
-XL:[function(a,b,c){if(b>>>0!=b||J.J5(b,c))this.J2(a,b,c)},"call$2","gDR",4,0,null,47,[],330,[]],
-PZ:[function(a,b,c,d){var z=d+1
-this.XL(a,b,z)
-if(c==null)return d
-this.XL(a,c,z)
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.TE(b,0,c))
-return c},"call$3","gyD",6,0,null,120,[],121,[],330,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
+return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ob|Ip|Dg|Nb|nA|Pg"},
+"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -18265,119 +17747,119 @@
 "^":"Dg;",
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]},
+$isQV:true,
+$asQV:function(){return[J.GW]},
 $isHY:true,
 "%":"Float32Array"},
 L3:{
 "^":"Dg;",
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]},
+$isQV:true,
+$asQV:function(){return[J.GW]},
 $isHY:true,
 "%":"Float64Array"},
 zz:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int32Array"},
-Eb:{
+IJ:{
 "^":"Pg;",
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-dT:{
+aH:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Uint16Array"},
 N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Uint32Array"},
 eE:{
@@ -18385,17 +17867,17 @@
 gbx:function(a){return C.nG},
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
@@ -18403,17 +17885,17 @@
 gbx:function(a){return C.eY},
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,47,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},"call$1","gIA",2,0,null,52,[]],
 u:[function(a,b,c){var z=a.length
-if(b>>>0!=b||J.J5(b,z))this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,47,[],23,[]],
-D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,77,120,[],121,[]],
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]},
+$isQV:true,
+$asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
 LZ:{
@@ -18421,8 +17903,8 @@
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.XL(a,b,z)
-this.XL(a,c,z)
+this.ZF(a,b,z)
+this.ZF(a,c,z)
 if(typeof c!=="number")return H.s(c)
 if(b>c)throw H.b(P.TE(b,0,c))
 y=c-b
@@ -18430,81 +17912,59 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,120,[],121,[],27,[],122,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
 YW:[function(a,b,c,d,e){var z=J.x(d)
 if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]}},
-Ob:{
+$isQV:true,
+$asQV:function(){return[J.GW]}},
+Ui:{
 "^":"LZ+lD;",
 $isList:true,
-$asWO:function(){return[J.GW]},
+$aszM:function(){return[J.GW]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.GW]}},
+$isQV:true,
+$asQV:function(){return[J.GW]}},
 Ip:{
-"^":"Ob+SU7;"},
+"^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
 YW:[function(a,b,c,d,e){var z=J.x(d)
 if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]}},
-Nb:{
+$isQV:true,
+$asQV:function(){return[J.im]}},
+ObS:{
 "^":"LZ+lD;",
 $isList:true,
-$asWO:function(){return[J.im]},
+$aszM:function(){return[J.im]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.im]}},
+$isQV:true,
+$asQV:function(){return[J.im]}},
 nA:{
-"^":"Nb+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
 qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,26,[]]}],["disassembly_entry_element","package:observatory/src/elements/disassembly_entry.dart",,E,{
-"^":"",
-Fv:{
-"^":["pv;m0%-513,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkX:[function(a){return a.m0},null,null,1,0,514,"instruction",355,397],
-skX:[function(a,b){a.m0=this.ct(a,C.i6,a.m0,b)},null,null,3,0,515,23,[],"instruction",355],
-"@":function(){return[C.Vy]},
-static:{AH:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.er.ZL(a)
-C.er.G6(a)
-return a},null,null,0,0,113,"new DisassemblyEntryElement$created"]}},
-"+DisassemblyEntryElement":[516],
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["Vfx;Py%-410,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gkc:[function(a){return a.Py},null,null,1,0,354,"error",355,397],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,357,23,[],"error",355],
+"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18517,16 +17977,70 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.G6(a)
-return a},null,null,0,0,113,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[517],
-Vfx:{
+return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[480],
+tuj:{
 "^":"uL+Pi;",
-$isd3:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+"^":"",
+rm:{
+"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
+gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
+gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+Ki:function(a){return this.gFR(a).call$0()},
+VN:function(a,b){return this.gFR(a).call$1(b)},
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
+gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+z=this.ct(a,C.eh,a.Ab,z)
+a.Ab=z
+if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
+lp:[function(a,b,c,d){var z,y,x
+J.xW(b)
+z=a.fn
+a.fn=this.ct(a,C.mi,z,"")
+if(a.Ln!=null){y=H.B7([],P.L5(null,null,null,null,null))
+x=R.Jk(y)
+J.kW(x,"expr",z)
+J.BM(a.y4,0,x)
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+"@":function(){return[C.Qz]},
+static:{Rp:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.Ab="1-line"
+a.y4=z
+a.SO=y
+a.B7=x
+a.X0=v
+C.Gh.ZL(a)
+C.Gh.G6(a)
+return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[488],
+Vct:{
+"^":"uL+Pi;",
+$isd3:true},
+YW:{
+"^":"Tp:112;a-82",
+call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
+$isEH:true},
+"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
-static:{Tt:[function(a){var z,y,x,w
+static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18538,16 +18052,16 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.G6(a)
-return a},null,null,0,0,113,"new FieldRefElement$created"]}},
-"+FieldRefElement":[418]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,115,"new FieldRefElement$created"]}},
+"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["Urj;vt%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gt0:[function(a){return a.vt},null,null,1,0,354,"field",355,397],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,357,23,[],"field",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.vt,"id")).ml(new A.e5(a)).OA(new A.Ni()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.vc]},
-static:{cY:[function(a){var z,y,x,w
+"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
+st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
+yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.My]},
+static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18558,29 +18072,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.G6(a)
-return a},null,null,0,0,113,"new FieldViewElement$created"]}},
-"+FieldViewElement":[518],
-Urj:{
-"^":"PO+Pi;",
-$isd3:true},
-e5:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.svt(z,y.ct(z,C.WQ,y.gvt(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+FieldViewElement_refresh_closure":[415],
-Ni:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+FieldViewElement_refresh_closure":[415]}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+return a},null,null,0,0,115,"new FieldViewElement$created"]}},
+"+FieldViewElement":[490],
+D13:{
+"^":"uL+Pi;",
+$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-AX:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.YQ]},
-static:{wH:[function(a){var z,y,x,w
+qW:{
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.R0]},
+static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18592,14 +18093,14 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.G6(a)
-return a},null,null,0,0,113,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[418]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
-yb:{
-"^":["oub;Z8%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gMj:[function(a){return a.Z8},null,null,1,0,354,"function",355,397],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,357,23,[],"function",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.Z8,"id")).ml(new N.QR(a)).OA(new N.Yx()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+mk:{
+"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
+yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18610,31 +18111,18 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.h4.ZL(a)
-C.h4.G6(a)
-return a},null,null,0,0,113,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[519],
-oub:{
-"^":"PO+Pi;",
-$isd3:true},
-QR:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sZ8(z,y.ct(z,C.nf,y.gZ8(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+FunctionViewElement_refresh_closure":[415],
-Yx:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing field-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+FunctionViewElement_refresh_closure":[415]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+C.Yu.ZL(a)
+C.Yu.G6(a)
+return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[491],
+WZq:{
+"^":"uL+Pi;",
+$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
-NM:{
-"^":["c4r;GQ%-77,J0%-77,Oc%-77,CO%-77,bV%-77,kg%-77,LY%-77,q3%-77,Ol%-410,X3%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gB1:[function(a){return a.Ol},null,null,1,0,354,"profile",355,397],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,357,23,[],"profile",355],
+jY:{
+"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
@@ -18661,7 +18149,7 @@
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
 J.kW(J.wc(a.kg),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,112,"enteredView"],
+this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z!=null){z=J.UQ(z,"members")
@@ -18674,33 +18162,35 @@
 if(this.K1(a,x))continue
 y=J.U6(x)
 w=J.UQ(y.t(x,"class"),"name")
-v=a.pC.Mq(J.UQ(y.t(x,"class"),"id"))
+v=y.t(x,"class").gHP()
 J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.Wj(a,x,0))+"</a>",this.Wj(a,x,1),this.Wj(a,x,2),this.Wj(a,x,3),this.Wj(a,x,4),this.Wj(a,x,5),this.Wj(a,x,6)])}a.GQ.lb()
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
+J.N5(a.GQ,["External",z.t(u,"external")])
 a.Oc.lb()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
 J.N5(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
-this.uB(a)},"call$0","gYs",0,0,112,"_updateChartData"],
+J.N5(a.Oc,["External",z.t(u,"external")])
+this.uB(a)},"call$0","gYs",0,0,114,"_updateChartData"],
 uB:[function(a){if(a.q3==null||a.kg==null)return
 a.kg.u5()
 a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,112,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,114,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,520,277,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18713,8 +18203,8 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,521,277,[],47,[],"_fullTableColumnValue"],
-Wj:[function(a,b,c){var z
+default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),7),J.UQ(z.t(b,"old"),7))
@@ -18728,30 +18218,34 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gPI",4,0,521,277,[],47,[],"_combinedTableColumnValue"],
-RF:[function(a,b){a.pC.oX("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-ii:[function(a,b,c,d){a.pC.oX("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,425,18,[],306,[],74,[],"resetAccumulator"],
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
+yv:[function(a,b){var z=a.Ol
+if(z==null)return
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+ii:[function(a,b,c,d){var z=a.Ol
+if(z==null)return
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gBo(a))},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,157,229,[],"profileChanged"],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.p0(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,522,523,[],"formattedAverage",356],
-uW:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gBo",2,0,522,523,[],"formattedCollections",356],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,522,523,[],"formattedTotalCollectionTime",356],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
 Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
@@ -18779,9 +18273,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,113,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"b7<-77,bQj<-77,WY<-77,V1g<-77,r1K<-77,d6<-77,pC<-77,DP<-77",op:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18791,48 +18285,48 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.RJ.ZL(a)
-C.RJ.G6(a)
-C.RJ.Dd(a)
-return a},null,null,0,0,113,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[524],
-c4r:{
-"^":"PO+Pi;",
+C.Vc.ZL(a)
+C.Vc.G6(a)
+C.Vc.Dd(a)
+return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[496],
+pva:{
+"^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:357;a-77",
+"^":"Tp:378;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[415],
+"+ nx":[489],
 jm:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
 $isEH:true},
-"+HeapProfileElement_refresh_closure":[415],
-xj:{
-"^":"Tp:357;a-77",
+"+ jm":[489],
+ke:{
+"^":"Tp:378;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,357,379,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[415],
-VB:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
+"+ ke":[489],
+xj:{
+"^":"Tp:348;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
 $isEH:true},
-"+HeapProfileElement_resetAccumulator_closure":[415]}],["html_common","dart:html_common",,P,{
+"+ xj":[489]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,23,[]],
+return y},"call$1","Lq",2,0,null,28,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,152,6,[],241,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18840,33 +18334,33 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:189;b,c",
+"^":"Tp:188;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,23,[],"call"],
+return y},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:372;d",
+"^":"Tp:411;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,441,[],"call"],
+return z[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:525;e",
+"^":"Tp:499;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:107;f,UI,bK",
+"^":"Tp:112;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -18875,7 +18369,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$iscT)throw H.b(P.SY("structured clone of RegExp"))
+if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
 if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
 if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
 if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
@@ -18888,7 +18382,7 @@
 w={}
 z.a=w
 this.bK.call$2(x,w)
-y.aN(a,new P.q1(z,this))
+y.aN(a,new P.ib(z,this))
 return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
@@ -18899,36 +18393,36 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,18,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
-q1:{
-"^":"Tp:346;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+ib:{
+"^":"Tp:348;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:189;a,b",
+"^":"Tp:188;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,23,[],"call"],
+return y},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:372;c",
+"^":"Tp:411;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,441,[],"call"],
+return z[a]},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:525;d",
+"^":"Tp:499;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,441,[],21,[],"call"],
+z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:107;e,f,UI,bK",
+"^":"Tp:112;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -18953,7 +18447,7 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,18,[],"call"],
+return y}return a},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 As:{
 "^":"a;",
@@ -18963,90 +18457,86 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"Mf","call$2",null,"gMk",2,2,null,77,23,[],508,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
-aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,115,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gnr",0,2,null,333,334,[]],
+aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
 ez:[function(a,b){var z=this.lF()
-return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,115,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,115,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,115,[]],
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
+Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gG2",2,0,null,117,[]],
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,23,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,23,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,23,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","gRI",2,0,null,23,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,114,[]],
+return y},"call$1","guH",2,0,null,28,[]],
+FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,336,337,[]],
-eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,292,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,47,[]],
-V1:[function(a){this.OS(new P.uQ())},"call$0","gyP",0,0,null],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
-return y},"call$1","gFd",2,0,null,115,[]],
+return y},"call$1","gFd",2,0,null,117,[]],
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[J.O]}},
+$isQV:true,
+$asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:107;a",
-call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:107;",
-call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 D7:{
-"^":"ar;F1,h2",
+"^":"ar;qt,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,115,[]],
+aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,47,[],23,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,23,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
 FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,114,[]],
-tg:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-return b.parentNode===this.F1},"call$1","gdj",2,0,null,102,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,77,133,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gaQ",6,2,null,335,120,[],121,[],114,[],122,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,120,[],121,[]],
-V1:[function(a){this.h2.NL.textContent=""},"call$0","gyP",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,47,[],23,[]],
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
+GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
+V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
 KI:[function(a,b){var z,y
 z=this.gzT()
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 J.QC(y)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 Rz:[function(a,b){var z,y,x
 z=J.x(b)
 if(typeof b!=="object"||b===null||!z.$iscv)return!1
@@ -19054,43 +18544,40 @@
 if(y>=z.length)return H.e(z,y)
 x=z[y]
 if(x==null?b==null:x===b){J.QC(x)
-return!0}}return!1},"call$1","gRI",2,0,null,129,[]],
+return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,47,[]],
+return z[b]},"call$1","gIA",2,0,null,52,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,292,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:107;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-goc:[function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.goc.call(this,a)
-return J.UQ(z,"preview")},null,null,1,0,370,"name"],
-gJp:[function(a){var z=a.tY
-if(z!=null)if(J.de(J.UQ(z,"type"),"@Null"))if(J.de(J.UQ(a.tY,"id"),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.de(J.UQ(a.tY,"id"),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.de(J.UQ(a.tY,"id"),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.de(J.UQ(a.tY,"id"),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.de(J.UQ(a.tY,"id"),"objects/being-initialized"))return"This object is currently being initialized."
-return""},null,null,1,0,370,"hoverText"],
-Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,113,"expander"],
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gD5:[function(a){var z=a.tY
+if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
 SF:[function(a,b,c){var z,y
-P.JS("Calling expandEvent")
-if(b===!0){z=a.pC
-y=a.tY
-z.oX(y==null?"":J.UQ(y,"id")).ml(new B.Js(a)).OA(new B.fM()).YM(c)}else{J.kW(a.tY,"fields",null)
-J.kW(a.tY,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,526,527,[],413,[],"expandEvent"],
+z=a.tY
+if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
+else{y=J.w1(z)
+y.u(z,"fields",null)
+y.u(z,"elements",null)
+c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19104,34 +18591,26 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.G6(a)
-return a},null,null,0,0,113,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[418],
+return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[383],
 Js:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y,x
+"^":"Tp:112;a-82",
+call$1:[function(a){var z,y
 z=J.U6(a)
-y=this.a
-if(J.de(z.t(a,"type"),"Null")){z.u(a,"type","@Null")
-x=J.RE(y)
-x.stY(y,x.ct(y,C.kY,x.gtY(y),a))}else{x=J.RE(y)
-J.kW(x.gtY(y),"fields",z.t(a,"fields"))
-J.kW(x.gtY(y),"elements",z.t(a,"elements"))
-J.kW(x.gtY(y),"length",z.t(a,"length"))}x=J.RE(y)
-J.kW(x.gtY(y),"fields",z.t(a,"fields"))
-J.kW(x.gtY(y),"elements",z.t(a,"elements"))
-J.kW(x.gtY(y),"length",z.t(a,"length"))},"call$1",null,2,0,107,149,[],"call"],
+if(z.t(a,"preview")!=null){z.soc(a,z.t(a,"preview"))
+a.szz(z.t(a,"preview"))}z=this.a
+y=J.RE(z)
+y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
+y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+InstanceRefElement_expandEvent_closure":[415],
-fM:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while expanding instance-ref: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+InstanceRefElement_expandEvent_closure":[415]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["Squ;Xh%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gQr:[function(a){return a.Xh},null,null,1,0,354,"instance",355,397],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,357,23,[],"instance",355],
+"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
+yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19144,39 +18623,17 @@
 a.X0=w
 C.yK.ZL(a)
 C.yK.G6(a)
-return a},null,null,0,0,113,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[528],
-Squ:{
-"^":"PO+Pi;",
-$isd3:true}}],["isolate_element","package:observatory/src/elements/isolate_element.dart",,S,{
-"^":"",
-PO:{
-"^":["Vf;pC%-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gAq:[function(a){return a.pC},null,null,1,0,358,"isolate",355,397],
-sAq:[function(a,b){a.pC=this.ct(a,C.Z8,a.pC,b)},null,null,3,0,359,23,[],"isolate",355],
-"@":function(){return[C.EA]},
-static:{O5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.wx.ZL(a)
-C.wx.G6(a)
-return a},null,null,0,0,113,"new IsolateElement$created"]}},
-"+IsolateElement":[529],
-Vf:{
+return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[503],
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["Zt;Jh-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-RF:[function(a,b){var z=[]
-J.kH(a.Jh.gi2(),new L.fW(z))
-P.pH(z,!1).ml(new L.Ey(b))},"call$1","gvC",2,0,158,413,[],"refresh"],
+"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
+yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.jF]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19189,150 +18646,134 @@
 a.X0=w
 C.b9.ZL(a)
 C.b9.G6(a)
-return a},null,null,0,0,113,"new IsolateListElement$created"]}},
-"+IsolateListElement":[530],
-fW:{
-"^":"Tp:346;a-77",
-call$2:[function(a,b){J.bi(this.a,J.KM(b))},"call$2",null,4,0,346,110,[],14,[],"call"],
-$isEH:true},
-"+IsolateListElement_refresh_closure":[415],
-Ey:{
-"^":"Tp:107;b-77",
-call$1:[function(a){return this.b.call$0()},"call$1",null,2,0,107,108,[],"call"],
-$isEH:true},
-"+IsolateListElement_refresh_closure":[415]}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+return a},null,null,0,0,115,"new IsolateListElement$created"]}},
+"+IsolateListElement":[507],
+waa:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 qm:{
-"^":["Y2;Aq>,tT>-420,eT,yt-386,wd-403,oH-404,z3,AP,fn",null,function(){return[C.mI]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
 C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-H.bQ(this.tT.gVS(),new X.vO(this))},"call$0","gz7",0,0,null],
-o8:[function(){return},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v,u
-z=this.oH
-y=this.tT
-x=this.Aq
-w=J.RE(x)
-v=J.w1(z)
-v.h(z,X.eI(y.gDu(),w.gB1(x).ghV()))
-if(c==null)v.h(z,"")
-else{u=c.tT
-v.h(z,X.eI(u.dJ(y),u.QQ()))}v.h(z,X.eI(y.gfF(),w.gB1(x).ghV()))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","uV",4,0,null,128,[],242,[]],Tl:function(a,b,c){var z,y
+J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v
+z=J.UQ(this.B1,"samples")
+y=this.oH
+x=this.tT
+w=J.w1(y)
+w.h(y,X.eI(x.gDu(),z))
+if(c==null)w.h(y,"")
+else{v=c.tT
+w.h(y,X.eI(v.dJ(x),v.QQ()))}},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-vO:{
-"^":"Tp:532;a",
+TI:{
+"^":"Tp:509;a",
 call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.Aq,J.on(a),z))},"call$1",null,2,0,null,531,[],"call"],
+J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
 $isEH:true},
 E7:{
-"^":["KUl;SS%-386,fb=-533,qY%-533,qO=-77,Hm%-534,pD%-410,eH%-387,vk%-387,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gXc:[function(a){return a.SS},null,null,1,0,371,"methodCountSelected",355,356],
-sXc:[function(a,b){a.SS=this.ct(a,C.fQ,a.SS,b)},null,null,3,0,372,23,[],"methodCountSelected",355],
-gDt:[function(a){return a.qY},null,null,1,0,535,"topExclusiveCodes",355,356],
-sDt:[function(a,b){a.qY=this.ct(a,C.jI,a.qY,b)},null,null,3,0,536,23,[],"topExclusiveCodes",355],
-gB1:[function(a){return a.pD},null,null,1,0,354,"profile",355,397],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,357,23,[],"profile",355],
-gLW:[function(a){return a.eH},null,null,1,0,370,"sampleCount",355,356],
-sLW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,25,23,[],"sampleCount",355],
-gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",355,356],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,25,23,[],"refreshTime",355],
-pM:[function(a,b){var z,y
-if(a.pD==null)return
-P.JS("profile changed")
-z=J.UQ(a.pD,"samples")
-this.IW(a,a.pC,z,a.pD)
-y=a.pC
-this.oC(a,y)
-this.f9(a,y)},"call$1","gaz",2,0,158,233,[],"profileChanged"],
+"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
+gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
+sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
+gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
+gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
+pM:[function(a,b){var z,y,x
+z=a.pD
+if(z==null)return
+y=J.UQ(z,"samples")
+x=new P.iP(Date.now(),!1)
+x.EK()
+z=J.AG(y)
+a.FT=this.ct(a,C.XU,a.FT,z)
+z=x.bu(0)
+a.vk=this.ct(a,C.Dj,a.vk,z)
+J.QP(a.pD).N3(a.pD)
+this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
 i4:[function(a){var z,y
 z=[]
 y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller","Inclusive"])
+C.Nm.FV(z,["Method","Exclusive","Caller"])
 a.Hm=new G.XN(z,y,null,null)
-y=a.pC
-this.oC(a,y)
-this.f9(a,y)},"call$0","gQd",0,0,112,"enteredView"],
-wW:[function(a,b){var z=a.pC
-this.oC(a,z)
-this.f9(a,z)},"call$1","ghj",2,0,107,233,[],"methodCountSelectedChanged"],
-RF:[function(a,b){a.pC.oX("profile").ml(new X.SV(a)).OA(new X.Mf()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-IW:[function(a,b,c,d){var z=J.AG(c)
-a.eH=this.ct(a,C.XU,a.eH,z)
-z=P.Gi().bu(0)
-a.vk=this.ct(a,C.Dj,a.vk,z)
-J.CJ(b,G.hh(b,d))
-this.oC(a,b)
-this.f9(a,b)},"call$3","gja",6,0,537,14,[],538,[],379,[],"_loadProfileData"],
-yF:[function(a,b){this.oC(a,b)
-this.f9(a,b)},"call$1","gAL",2,0,539,14,[],"_refresh"],
-f9:[function(a,b){var z,y
+this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
+wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
+yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+Cx:[function(a){var z,y,x
+if(a.pD==null)return
+z=J.UQ(a.fb,a.BA)
+y=a.Dt
+x=J.w1(y)
+x.V1(y)
+x.FV(y,J.QP(a.pD).gZ0().T0(z))
+this.zr(a)},"call$0","gBn",0,0,114,"_update"],
+Ti:[function(a){var z,y,x
+z=J.UQ(a.fb,a.BA)
+y=a.Dt
+x=J.w1(y)
+x.V1(y)
+x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
+zr:[function(a){var z,y,x
 z=[]
-for(y=J.GP(a.qY);y.G();)z.push(X.Tl(b,y.gl(),null))
-a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$1","gCK",2,0,539,14,[],"_refreshTree"],
-oC:[function(a,b){var z,y
-J.U2(a.qY)
-if(b==null||J.Tv(b)==null)return
-z=J.UQ(a.fb,a.SS)
-y=J.Tv(b).T0(z)
-J.bj(a.qY,y)},"call$1","guE",2,0,539,14,[],"_refreshTopMethods"],
-ka:[function(a,b){return"padding-left: "+H.d(J.p0(b.gyt(),16))+"px;"},"call$1","gGX",2,0,540,363,[],"padding",356],
+for(y=J.GP(a.Dt);y.G();){x=y.gl()
+z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
+this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,540,363,[],"coloring",356],
+return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.Mf(x-1)}},"call$3","gpR",6,0,541,18,[],306,[],74,[],"toggleExpanded",356],
+y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
 "@":function(){return[C.jR]},
 static:{jD:[function(a){var z,y,x,w,v
-z=R.Jk([])
+z=Q.uX(null,D.kx)
 y=$.Nd()
 x=P.Py(null,null,null,J.O,W.I0)
 w=J.O
 v=W.cv
 v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.SS=0
-a.fb=[10,20,50]
-a.qY=z
-a.qO="#tableTree"
-a.eH=""
+a.Dt=z
+a.BA=0
+a.FT=""
 a.vk=""
+a.fb=[10,20,50]
+a.qO="#tableTree"
 a.SO=y
 a.B7=x
 a.X0=v
 C.XH.ZL(a)
 C.XH.G6(a)
-return a},null,null,0,0,113,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[542],
-KUl:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[515],
+V4:{
+"^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:357;a-77",
-call$1:[function(a){var z,y,x
-z=J.UQ(a,"samples")
-N.Jx("").To("Profile contains "+H.d(z)+" samples.")
-y=this.a
-x=J.RE(y)
-x.IW(y,x.gpC(y),z,a)},"call$1",null,2,0,357,543,[],"call"],
+"^":"Tp:378;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
 $isEH:true},
-"+IsolateProfileElement_refresh_closure":[415],
-Mf:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").wF("Error refreshing profile",a,b)},"call$2",null,4,0,346,18,[],377,[],"call"],
-$isEH:true},
-"+IsolateProfileElement_refresh_closure":[415]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 Kz:{
-"^":["PO;pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19345,37 +18786,40 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.G6(a)
-return a},null,null,0,0,113,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[544]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[517],
+V9:{
+"^":"uL+Pi;",
+$isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["tuj;eb%-77,kf%-77,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gvL:[function(a){return a.eb},null,null,1,0,113,"json",355,397],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,107,23,[],"json",355],
+"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,112,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,158,233,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,370,"primitiveString"],
+a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
+yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
 gmm:[function(a){var z,y
 z=a.eb
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
 else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,370,"valueType"],
+return"Primitive"},null,null,1,0,365,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,371,"counter"],
-gaK:[function(a){var z,y
+return z},null,null,1,0,512,"counter"],
+go6:[function(a){var z,y
 z=a.eb
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,535,"list"],
+return[]},null,null,1,0,518,"list"],
 gvc:[function(a){var z,y
 z=a.eb
 y=J.RE(z)
 if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,535,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,25,42,[],"value"],
+return[]},null,null,1,0,518,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19388,17 +18832,17 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.GB.ZL(a)
-C.GB.G6(a)
-return a},null,null,0,0,113,"new JsonViewElement$created"]}},
-"+JsonViewElement":[545],
-tuj:{
+C.Yt.ZL(a)
+C.Yt.G6(a)
+return a},null,null,0,0,115,"new JsonViewElement$created"]}},
+"+JsonViewElement":[519],
+V10:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.QU]},
+"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19411,47 +18855,31 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.G6(a)
-return a},null,null,0,0,113,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[418]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
-T2:{
-"^":["mHk;N7%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.N7},null,null,1,0,354,"library",355,397],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,357,23,[],"library",355],
-RF:[function(a,b){a.pC.oX(J.UQ(a.N7,"id")).ml(new M.Jq(a)).OA(new M.Yn()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
+KL:{
+"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
+yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
 "@":function(){return[C.Gg]},
-static:{SP:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.N7=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{Ro:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.MG.ZL(a)
 C.MG.G6(a)
-return a},null,null,0,0,113,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[546],
-mHk:{
-"^":"PO+Pi;",
-$isd3:true},
-Jq:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sN7(z,y.ct(z,C.EV,y.gN7(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+LibraryViewElement_refresh_closure":[415],
-Yn:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while refreshing library-view: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+LibraryViewElement_refresh_closure":[415]}],["logging","package:logging/logging.dart",,N,{
+return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[520],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
@@ -19468,34 +18896,35 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,23,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
-y=P.Gi()
+y=new P.iP(Date.now(),!1)
+y.EK()
 x=$.xO
 $.xO=x+1
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,77,77,547,[],20,[],160,[],161,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"gEX",2,4,null,77,77,20,[],160,[],161,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,77,77,20,[],160,[],161,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,77,77,20,[],160,[],161,[]],
-wF:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.wF(a,null,null)},"j2","call$3",null,"goa",2,4,null,77,77,20,[],160,[],161,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gxx",2,4,null,77,77,20,[],160,[],161,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
+OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
 IE:[function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,22,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -19513,29 +18942,29 @@
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,104,[]],
+return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<z},"call$1","gix",2,0,null,104,[]],
+return this.P<z},"call$1","gix",2,0,null,109,[]],
 E:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<=z},"call$1","gf5",2,0,null,104,[]],
+return this.P<=z},"call$1","gER",2,0,null,109,[]],
 D:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>z},"call$1","gh1",2,0,null,104,[]],
+return this.P>z},"call$1","gh1",2,0,null,109,[]],
 F:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>=z},"call$1","gNH",2,0,null,104,[]],
+return this.P>=z},"call$1","gNH",2,0,null,109,[]],
 iM:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P-z},"call$1","gYc",2,0,null,104,[]],
+return this.P-z},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,reI,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"call$0","gXo",0,0,null],
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
 $isHV:true,
 static:{"^":"xO"}}}],["","main.dart",,F,{
 "^":"",
@@ -19547,60 +18976,30 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:549;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,548,[],"call"],
+"^":"Tp:523;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,108,[],"call"],
-$isEH:true}}],["message_viewer_element","package:observatory/src/elements/message_viewer.dart",,L,{
+A.Ok()},"call$1",null,2,0,null,113,[],"call"],
+$isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-PF:{
-"^":["Vct;Gj%-410,ah%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gG1:[function(a){return a.Gj},null,null,1,0,354,"message",397],
-guw:[function(a){return a.ah},null,null,1,0,408,"app",355,397],
-suw:[function(a,b){a.ah=this.ct(a,C.wh,a.ah,b)},null,null,3,0,551,23,[],"app",355],
-sG1:[function(a,b){if(b==null){N.Jx("").To("Viewing null message.")
-return}N.Jx("").To("Viewing message of type '"+H.d(J.UQ(b,"type"))+"'")
-a.Gj=b
-this.ct(a,C.US,"",this.gQW(a))},null,null,3,0,357,191,[],"message",397],
-gQW:[function(a){var z=a.Gj
-if(z==null||J.UQ(z,"type")==null)return"Error"
-return J.UQ(a.Gj,"type")},null,null,1,0,370,"messageType"],
-"@":function(){return[C.rc]},
-static:{A5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Wp.ZL(a)
-C.Wp.G6(a)
-return a},null,null,0,0,113,"new MessageViewerElement$created"]}},
-"+MessageViewerElement":[552],
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
-"^":"",
-fA:{
+T4:{
 "^":"a;T9,Bu",
 static:{"^":"Xd,en,pjg,PZ,xa"}},
-Qz:{
+tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-Jo:{
+PO:{
 "^":"a;"},
-c5:{
+oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-"@":function(){return[C.nW]},
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.Ug]},
 static:{z5:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19612,16 +19011,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.G6(a)
-return a},null,null,0,0,113,"new NavBarElement$created"]}},
-"+NavBarElement":[553],
+return a},null,null,0,0,115,"new NavBarElement$created"]}},
+"+NavBarElement":[524],
 aQ:{
-"^":["D13;uy%-387,ZC%-387,Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
-sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
-gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
+gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.pc]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19629,57 +19028,59 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.uy="#"
-a.ZC="---"
+a.KU="#"
+a.V4="---"
 a.Jo=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.SU.ZL(a)
 C.SU.G6(a)
-return a},null,null,0,0,113,"new NavMenuElement$created"]}},
-"+NavMenuElement":[554],
-D13:{
+return a},null,null,0,0,115,"new NavMenuElement$created"]}},
+"+NavMenuElement":[525],
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
-Ya5:{
-"^":["WZq;uy%-387,ZC%-387,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gPj:[function(a){return a.uy},null,null,1,0,370,"link",355,397],
-sPj:[function(a,b){a.uy=this.ct(a,C.dB,a.uy,b)},null,null,3,0,25,23,[],"link",355],
-gdU:[function(a){return a.ZC},null,null,1,0,370,"anchor",355,397],
-sdU:[function(a,b){a.ZC=this.ct(a,C.Es,a.ZC,b)},null,null,3,0,25,23,[],"anchor",355],
-"@":function(){return[C.qT]},
+Qa:{
+"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
+gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.uy="#"
-a.ZC="---"
+a.KU="#"
+a.V4="---"
 a.SO=z
 a.B7=y
 a.X0=w
 C.nn.ZL(a)
 C.nn.G6(a)
-return a},null,null,0,0,113,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[555],
-WZq:{
+return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[526],
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["pva;rU%-77,SB%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gFR:[function(a){return a.rU},null,null,1,0,113,"callback",355,397],
+"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,107,23,[],"callback",355],
-gxw:[function(a){return a.SB},null,null,1,0,380,"active",355,397],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,381,23,[],"active",355],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
+gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
+gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gzY",6,0,425,18,[],306,[],74,[],"buttonClick"],
-wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,112,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{ZC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19688,20 +19089,21 @@
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.SB=!1
+a.Hq="Refresh"
 a.SO=z
 a.B7=y
 a.X0=w
 C.J7.ZL(a)
 C.J7.G6(a)
-return a},null,null,0,0,113,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[556],
-pva:{
+return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[527],
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["cda;Jo%-417,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19715,17 +19117,19 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.G6(a)
-return a},null,null,0,0,113,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[557],
-cda:{
+return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[528],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["qFb;Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
 "@":function(){return[C.zaS]},
-static:{Yt:[function(a){var z,y,x,w
+static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19737,17 +19141,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.G6(a)
-return a},null,null,0,0,113,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[558],
-qFb:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[529],
+V16:{
+"^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["rna;Ap%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtD:[function(a){return a.Ap},null,null,1,0,354,"library",355,397],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,357,23,[],"library",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+Zt:{
+"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19759,19 +19163,19 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.S3.ZL(a)
-C.S3.G6(a)
-return a},null,null,0,0,113,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[559],
-rna:{
-"^":"PO+Pi;",
+C.ct.ZL(a)
+C.ct.G6(a)
+return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[530],
+V17:{
+"^":"uL+Pi;",
 $isd3:true},
-wM:{
-"^":["Vba;Au%-410,Jo%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRu:[function(a){return a.Au},null,null,1,0,354,"cls",355,397],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,357,23,[],"cls",355],
-grZ:[function(a){return a.Jo},null,null,1,0,380,"last",355,397],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,381,23,[],"last",355],
+iL:{
+"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
+grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19785,29 +19189,30 @@
 a.X0=w
 C.xE.ZL(a)
 C.xE.G6(a)
-return a},null,null,0,0,113,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[560],
-Vba:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[531],
+V18:{
+"^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["waa;k5%-417,xH%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzj:[function(a){return a.k5},null,null,1,0,380,"devtools",355,397],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,381,23,[],"devtools",355],
-guw:[function(a){return a.xH},null,null,1,0,408,"app",355,356],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,551,23,[],"app",355],
-ZB:[function(a){var z,y
-if(a.k5===!0){z=new G.ho(P.L5(null,null,null,null,null),0,null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null)
-y=C.ph.aM(window)
-H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(z.gcW()),y.Sg),[H.Kp(y,0)]).Zz()
-P.JS("Connected to DartiumVM")
-z=new G.mL(new G.dZ(null,!1,"",null,null,null),z,null,null,null,null)
+"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
+guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
+suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+ZB:[function(a){var z
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+z.pC()
+z.PI()
+z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new G.mL(new G.dZ(null,!1,"",null,null,null),new G.XK("http://127.0.0.1:8181/",null,H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),null,null),null,null,null,null)
+a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+z.pC()
+z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,113,"created"],
-"@":function(){return[C.kR]},
+a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+"@":function(){return[C.bd]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19821,49 +19226,51 @@
 C.k0.ZL(a)
 C.k0.G6(a)
 C.k0.ZB(a)
-return a},null,null,0,0,113,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[561],
-waa:{
+return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[535],
+V19:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,112,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,112,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,562,12,[],233,[],234,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,380,"applyAuthorStyles"],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
-z=J.LL(J.p0(b,1000))
+z=J.LL(J.vX(b,1000))
 y=C.jn.cU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.cU(z,60000)
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,563,564,[],"formatTime"],
-Ze:[function(a,b){var z=J.Wx(b)
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,444,565,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
 bj:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,566,567,[],"fileAndLine"],
-nt:[function(a,b){return J.de(b,"@Null")},"call$1","gYx",2,0,568,11,[],"isNullRef"],
-Qq:[function(a,b){var z=J.x(b)
-return z.n(b,"@Smi")||z.n(b,"@Mint")||z.n(b,"@Bigint")},"call$1","gBI",2,0,568,11,[],"isIntRef"],
-TJ:[function(a,b){return J.de(b,"@Bool")},"call$1","gX4",2,0,568,11,[],"isBoolRef"],
-qH:[function(a,b){return J.de(b,"@String")},"call$1","gwm",2,0,568,11,[],"isStringRef"],
-JG:[function(a,b){return J.de(b,"@Instance")},"call$1","gUq",2,0,568,11,[],"isInstanceRef"],
-CL:[function(a,b){return J.de(b,"@Closure")},"call$1","gj7",2,0,568,11,[],"isClosureRef"],
-Bk:[function(a,b){var z=J.x(b)
-return z.n(b,"@GrowableObjectArray")||z.n(b,"@Array")},"call$1","gmv",2,0,568,11,[],"isListRef"],
-VR:[function(a,b){return!C.Nm.tg(["@Null","@Smi","@Mint","@Biginit","@Bool","@String","@Closure","@Instance","@GrowableObjectArray","@Array"],b)},"call$1","gua",2,0,568,11,[],"isUnexpectedRef"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
+z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+OP:[function(a,b){var z=J.x(b)
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+Cp:[function(a,b){var z=J.x(b)
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{Hx:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19876,12 +19283,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.G6(a)
-return a},null,null,0,0,113,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,115,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","px",4,0,243,23,[],244,[],"_zeroPad"]}},
-"+ObservatoryElement":[569]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
+"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19890,46 +19297,40 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,112],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,112],
+k0:[function(a){},"call$0","gqw",0,0,114],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,114],
 BN:[function(a){var z,y,x
-z=a.fn
-a.fn=null
-y=a.AP
-if(y!=null){x=y.iE
-x=x==null?y!=null:x!==y}else x=!1
-if(x&&z!=null){x=H.VM(new P.Yp(z),[T.z2])
+z=a.Lk
+a.Lk=null
+if(this.gnz(a)&&z!=null){y=a.AP
+x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,380],
-gUV:function(a){var z,y
+return!0}return!1},"call$0","gDx",0,0,390],
+gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
-nq:[function(a,b){var z,y
-z=a.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},"call$1","gbW",2,0,null,22,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+nq:[function(a,b){if(!this.gnz(a))return
+if(a.Lk==null){a.Lk=[]
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
 "^":"a;",
 $isz2:true},
 qI:{
-"^":"z2;WA<,oc>,jL>,zZ>",
+"^":"z2;WA>,oc>,jL>,zZ>",
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
 $isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
 "^":"",
 J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
+"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,113,"value",355],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19943,14 +19344,14 @@
 x.push(w)}this.Ow()},"call$0","gM",0,0,null],
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,158,108,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,157,113,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,112],
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,114],
 cO:[function(a){var z,y
 z=this.b9
 if(z.length===0)return
@@ -19958,12 +19359,12 @@
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
 this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,113],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,113],
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,115],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,115],
 $isJ3:true},
 E5:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 Y3:[function(){var z,y,x,w,v,u,t,s,r,q
@@ -19995,36 +19396,36 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:570;a",
+"^":"Tp:544;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,170,[],151,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,169,[],153,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:171;b",
+"^":"Tp:170;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:113;c,d,e,f",
+"^":"Tp:115;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:571;UI",
+"^":"Tp:545;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,169,[],170,[],151,[],115,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:107;bK,Gq,Rm,w3",
+"^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,21,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -20062,7 +19463,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -20097,10 +19498,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,251,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,252,[],253,[],254,[]],
+return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -20111,7 +19512,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,252,[],253,[],254,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -20161,16 +19562,17 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","Lr",12,0,null,245,[],246,[],247,[],248,[],249,[],250,[]],
+return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=b.gWA()
-y=J.zj(b)
+z=J.RE(b)
+y=z.gWA(b)
+z=z.gvH(b)
 x=J.qA(b.gIl())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
 v.$builtinTypeInfo=[null]
-u=new G.DA(z,v,x,y,w)
+u=new G.DA(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
 q.jr=J.WB(q.jr,s)
@@ -20200,11 +19602,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,255,[],22,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,68,[],256,[]],
+return z},"call$2","bN",4,0,null,73,[],252,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -20214,9 +19616,9 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,68,[],256,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
 DA:{
-"^":"a;WA<,ok,Il<,jr,dM",
+"^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
 gRt:function(){return this.ok},
 gNg:function(){return this.dM},
@@ -20227,7 +19629,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gw9",2,0,null,42,[]],
+return a<z},"call$1","gcW",2,0,null,47,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -20244,8 +19646,8 @@
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
-if(z.gUV(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,93,[],257,[],233,[],234,[]],
+if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
+return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
 d3:{
 "^":"a;",
 gUj:function(a){var z=this.R9
@@ -20253,7 +19655,7 @@
 z=P.bK(this.gkk(),z,!0,null)
 this.R9=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gUV:function(a){var z,y
+gnz:function(a){var z,y
 z=this.R9
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
@@ -20270,16 +19672,16 @@
 v=new H.MH(null,J.GP(z.l6),z.T6)
 v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
 for(;v.G();){u=v.lo
-z=J.x(u)
-if(typeof u!=="object"||u===null||!z.$isRY||u.gV5()||u.gFo()||u.gq4())continue
+z=J.RE(u)
+if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
 for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
 s=J.x(t)
 if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
 x.u(0,r,y.rN(r).gAx())
 break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,112],
+this.V2=x},"call$0","gFW",0,0,114],
 B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,112],
+this.V2=null}},"call$0","gkk",0,0,114],
 BN:[function(a){var z,y,x,w
 z={}
 y=this.V2
@@ -20298,7 +19700,7 @@
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(z)
 return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,257,[],233,[],234,[]],
+ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
 nq:[function(a,b){var z,y
 z=this.R9
 if(z!=null){y=z.iE
@@ -20306,10 +19708,10 @@
 if(!z)return
 z=this.me
 if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","gbW",2,0,null,22,[]],
+this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -20319,23 +19721,23 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],233,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],229,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
-"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",355],
+"^":"Pi;L1,AP,Lk",
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},234,[],"value",355],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"Ay;b3,xg,h3,AP,fn",
+"^":"er;b3,xg,h3,AP,Lk",
 gvp:function(){var z=this.xg
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,371,"length",355],
+gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -20363,10 +19765,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,372,23,[],"length",355],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},47,[],"[]",355],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -20378,9 +19780,9 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},47,[],23,[],"[]=",355],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,380,"isEmpty",355],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,380,"isNotEmpty",355],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20389,7 +19791,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,23,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -20399,10 +19801,10 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,114,[]],
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","gRI",2,0,null,129,[]],
+return!0}return!1},"call$1","guH",2,0,null,132,[]],
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
@@ -20430,7 +19832,7 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,120,[],121,[]],
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
 xe:[function(a,b,c){var z,y,x
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
@@ -20438,7 +19840,7 @@
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
-H.Og(z,b+1,y,this,b)
+H.qG(z,b+1,y,this,b)
 y=z.length
 this.nU(y-1,y)
 y=this.xg
@@ -20446,27 +19848,27 @@
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
 if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,47,[],129,[]],
+z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
 KI:[function(a,b){var z,y
 z=this.h3
 if(b<0||b>=z.length)return H.e(z,b)
 y=z[b]
 this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,47,[]],
+return y},"call$1","gNM",2,0,null,52,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,22,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,233,[],234,[]],
-cv:[function(){var z,y,x
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
 y=G.u2(this,z)
@@ -20477,15 +19879,15 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,380],
+return!0}return!1},"call$0","gL6",0,0,390],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
-Ay:{
+er:{
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -20497,20 +19899,20 @@
 return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
 $isHA:true},
 qC:{
-"^":"Pi;Zp,AP,fn",
+"^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"NE",ret:[P.cX,a]}},this.$receiver,"qC")},"keys",355],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.cX,b]}},this.$receiver,"qC")},"values",355],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,371,"length",355],
+return z.gB(z)},null,null,1,0,512,"length",358],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,380,"isEmpty",355],
+return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,380,"isNotEmpty",355],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,572,23,[],"containsValue",355],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,572,42,[],"containsKey",355],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},42,[],"[]",355],
+return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20521,8 +19923,8 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"fK",void:true,args:[a,b]}},this.$receiver,"qC")},42,[],23,[],"[]=",355],
-FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,104,[]],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -20531,7 +19933,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","gRI",2,0,null,42,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -20539,9 +19941,10 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gyP",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,115,[]],
+F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gRa",0,0,null],
+aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+$isqC:true,
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
 z.FV(0,a)
@@ -20552,20 +19955,20 @@
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,42,[],23,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,42,[],23,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
 if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
 if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,22,[],42,[]],
+return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
 yf:[function(a,b){var z,y,x,w,v
 if(a==null)return
 x=b
@@ -20581,7 +19984,7 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"call$2","MT",4,0,null,6,[],66,[]],
+return},"call$2","MT",4,0,null,6,[],71,[]],
 h6:[function(a,b,c){var z,y,x,w,v
 if(a==null)return!1
 x=b
@@ -20598,14 +20001,14 @@
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],66,[],23,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
 dR:[function(a,b){var z,y,x,w
-z=new H.GD(H.le(H.d(b.gfN(b))+"="))
+z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
 x=y.t(0,b)
 w=J.x(x)
@@ -20617,20 +20020,20 @@
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"call$2","Cp",4,0,null,11,[],12,[]],
+a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
 return z}catch(y){H.Ru(y)
 return $.aA()}},"call$1","WV",2,0,null,11,[]],
-rd:[function(a){a=J.JA(a,$.c3(),"")
+cB:[function(a){a=J.JA(a,$.c3(),"")
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"call$1","KL",2,0,null,86,[]],
+return $.tN().zD(a)},"call$1","wf",2,0,null,91,[]],
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
+"^":"Pi;ay,YB,BK,kN,cs,cT,AP,Lk",
 E4:function(a){return this.cT.call$1(a)},
-gWA:function(){var z=this.kN
+gWA:function(a){var z=this.kN
 if(0>=z.length)return H.e(z,0)
 return z[0]},
 gP:[function(a){var z,y
@@ -20639,7 +20042,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,113,"value",355],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20656,16 +20059,16 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,504,234,[],"value",355],
+z[y]=b}},null,null,3,0,471,230,[],"value",358],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,112],
+this.XI()},"call$0","gqw",0,0,114],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,112],
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,114],
 Zy:[function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
@@ -20681,7 +20084,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,77,121,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20697,9 +20100,9 @@
 return}t=this.kN
 if(s>=t.length)return H.e(t,s)
 t[s]=u}this.ij(a)
-if(this.gUV(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
+if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,335,120,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20708,7 +20111,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,335,77,120,[],121,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20732,12 +20135,12 @@
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gCf",2,0,null,441,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
 w=H.BU(x,10,new L.qL())
-y.push(w!=null?w:new H.GD(H.le(x)))}z=this.BK
+y.push(w!=null?w:new H.GD(H.u1(x)))}z=this.BK
 this.kN=H.VM(Array(z.length+1),[P.a])
 if(z.length===0&&c!=null)a=c.call$1(a)
 y=this.kN
@@ -20745,27 +20148,27 @@
 y[0]=a
 this.cs=H.VM(Array(z.length),[P.MO])},
 $isWR:true,
-static:{ao:function(a,b,c){var z=new L.WR(b,L.rd(b),H.VM([],[P.a]),null,null,c,null,null)
+static:{ao:function(a,b,c){var z=new L.WR(b,L.cB(b),H.VM([],[P.a]),null,null,c,null,null)
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:107;",
-call$1:[function(a){return},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:573;a,b,c",
+"^":"Tp:547;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,256,[],"call"],
+return}},"call$1",null,2,0,null,252,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:574;d,e,f",
+"^":"Tp:548;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,256,[],"call"],
+return}},"call$1",null,2,0,null,252,[],"call"],
 $isEH:true},
-YJ:{
-"^":"Tp:113;",
+Md:{
+"^":"Tp:115;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -20774,18 +20177,18 @@
 if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
 if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)){z=z.ez(a,R.np())
+return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,107,23,[]],
+return x}return a},"call$1","np",2,0,112,28,[]],
 km:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,402,[],277,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
 z=document.createElement("style",null)
-z.textContent=".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n"
+J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
 y=document.querySelector("head")
 y.insertBefore(z,y.firstChild)
 A.B2()
@@ -20797,28 +20200,28 @@
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
 oF:[function(a,b){var z,y,x,w,v,u
-if(J.de(a,$.Tf()))return b
+if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.x(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!y.gV5()))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.RE(y)
+if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
 u=J.x(v)
 if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,258,[],259,[]],
+b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
-a=a.gAY()}while(!J.de(a,$.Tf()))
-return},"call$2","il",4,0,null,258,[],66,[]],
+a=a.gAY()}while(!J.de(a,$.H8()))
+return},"call$2","il",4,0,null,254,[],71,[]],
 bc:[function(a,b){var z,y
-z=H.le(H.d(b.gIf().fN)+"=")
+z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
 z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,258,[],260,[]],
+return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20827,7 +20230,7 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,261,[],12,[],262,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
 Hl:[function(a){var z,y,x,w,v,u,t
 if(a==null)return""
 w=J.RE(a)
@@ -20847,28 +20250,28 @@
 if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,263,[]],
+return""}else throw u}},"call$1","NI",2,0,null,259,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,77,12,[],11,[]],
-zM:[function(a){A.Vx(a,new A.Mq())},"call$1","jU",2,0,null,264,[]],
-Vx:[function(a,b){var z
+if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
+xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
+om:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.Vx(z,b)},"call$2","Dv",4,0,null,264,[],156,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,265,[],12,[],264,[],266,[]],
-Hr:[function(a){var z
+return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","Fd",2,0,null,264,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,41,[],267,[],268,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
 Rk:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
@@ -20877,10 +20280,10 @@
 ZI:[function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
-z.textContent=a.textContent
+J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
@@ -20889,7 +20292,7 @@
 y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,23,[],66,[]],
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
 h5:[function(a){var z
 if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
@@ -20898,7 +20301,7 @@
 if(typeof a==="string")return C.Db
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,23,[]],
+return},"call$1","v9",2,0,null,28,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20907,7 +20310,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.Bl())},"call$0","PB",0,0,112],
+$.ax().ml(new A.rD())},"call$0","PB",0,0,114],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -20919,7 +20322,7 @@
 t=y
 if(t==null)H.vh(new P.AT("Error must not be null"))
 if(u.Gv!==0)H.vh(new P.lj("Future already completed"))
-u.CG(t,x)}}},"call$0","xm",0,0,null],
+u.CG(t,x)}}},"call$0","vH",0,0,null],
 GA:[function(a,b,c,d){var z,y,x,w,v,u
 if(c==null)c=P.Ls(null,null,null,W.QF)
 if(d==null){d=[]
@@ -20937,67 +20340,66 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,77,77,271,[],272,[],273,[],274,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
-y=$.qG()
-x=P.r6(y.ej(a))
-w=x.Fi
-if(!J.de(w,"")){v=x.ku
-u=x.gJf(x)
-t=x.gtp(x)
-s=z.SK(x.r0)
-r=x.tP}else{if(!J.de(x.gJf(x),"")){v=x.ku
-u=x.gJf(x)
-t=x.gtp(x)
-s=z.SK(x.r0)
-r=x.tP}else{if(J.de(x.r0,"")){s=z.r0
-r=x.tP
-r=!J.de(r,"")?r:z.tP}else{q=J.co(x.r0,"/")
-p=x.r0
-s=q?z.SK(p):z.SK(z.Ky(z.r0,p))
-r=x.tP}v=z.ku
-u=z.gJf(z)
-t=z.gtp(z)}w=z.Fi}o=P.R6(x.Ka,u,s,null,t,r,null,w,v)
-x=$.UG().nb
-n=x.t(0,o)
-m=o.r0
-if(J.de(o.Fi,z.Fi))if(o.gWu()===z.gWu()){z=J.rY(m)
-if(z.Tc(m,".dart"))z=z.tg(m,"/packages/")===!0||z.nC(m,"packages/")
-else z=!1}else z=!1
+y=P.hK(a)
+x=y.Fi
+if(x!==""){w=y.ku
+v=y.gJf(y)
+u=y.gtp(y)
+t=z.SK(y.r0)
+s=y.tP}else{if(y.gJf(y)!==""){w=y.ku
+v=y.gJf(y)
+u=y.gtp(y)
+t=z.SK(y.r0)
+s=y.tP}else{r=y.r0
+if(r===""){t=z.r0
+s=y.tP
+s=s!==""?s:z.tP}else{r=J.co(r,"/")
+q=y.r0
+t=r?z.SK(q):z.SK(z.Ky(z.r0,q))
+s=y.tP}w=z.ku
+v=z.gJf(z)
+u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
+y=$.UG().nb
+o=y.t(0,p)
+n=p.r0
+if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
 else z=!1
-if(z){z=o.r0
-q=J.U6(z)
-l=x.t(0,P.r6(y.ej("package:"+q.yn(z,J.WB(q.cn(z,"packages/"),9)))))
-if(l!=null)n=l}if(n==null){$.M7().To(H.d(o)+" library not found")
-return}z=n.gYK().nb
+else z=!1
+else z=!1
+if(z){z=p.r0
+m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
+if(m!=null)o=m}if(o==null){$.M7().To(H.d(p)+" library not found")
+return}z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.Fn()
-x=new H.U5(z,y)
-x.$builtinTypeInfo=[H.ip(z,"mW",0)]
+r=new H.U5(z,y)
+r.$builtinTypeInfo=[H.ip(z,"mW",0)]
 z=z.gA(z)
 y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(x,0)]
-for(;y.G();)A.ZB(n,z.gl())
-z=n.gYK().nb
+y.$builtinTypeInfo=[H.Kp(r,0)]
+for(;y.G();)A.ZB(o,z.gl())
+z=o.gYK().nb
 z=z.gUQ(z)
 y=new A.e3()
-x=new H.U5(z,y)
-x.$builtinTypeInfo=[H.ip(z,"mW",0)]
+r=new H.U5(z,y)
+r.$builtinTypeInfo=[H.ip(z,"mW",0)]
 z=z.gA(z)
 y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(x,0)]
-for(;y.G();){k=z.gl()
-for(x=J.GP(k.gc9());x.G();){j=x.lo.gAx()
-q=J.x(j)
-if(typeof j==="object"&&j!==null&&!!q.$isV3){q=j.ns
-p=k.gYj()
-$.Ej().u(0,q,p)
+y.$builtinTypeInfo=[H.Kp(r,0)]
+for(;y.G();){l=z.gl()
+for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
+q=J.x(k)
+if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+j=l.gYj()
+$.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
 ZB:[function(a,b){var z,y,x
-for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.za){y=!0
+for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
 if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+H.d(b.gIf())+" is not."
 z=$.oK
@@ -21009,20 +20411,20 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","K0n",4,0,null,93,[],224,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,98,[],220,[]],
 Zj:{
-"^":"Tp:107;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 XP:{
-"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ei",
+"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,Ve",
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
 gZf:function(a){var z,y,x
 z=a.querySelector("template")
 if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z))
+x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
 y=x}else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
@@ -21058,9 +20460,9 @@
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gLD",2,0,null,12,[]],
+return!0},"call$1","gXX",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,262,[]],
+return!0}return!1},"call$1","gmL",2,0,null,258,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -21079,23 +20481,23 @@
 if(w!==""){y=a.Q7
 y=y!=null&&y.x4(w)}else y=!1
 if(y)continue
-v=new H.GD(H.le(w))
+v=new H.GD(H.u1(w))
 u=A.Oy(b,v)
 if(u==null){window
 y=$.pl()
-t="property for attribute "+w+" of polymer-element name="+a.RT+" not found."
+t="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
 y.toString
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,258,[],575,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,576,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -21113,15 +20515,15 @@
 t=w.vM+u
 w.vM=t
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
-z.textContent=H.d(w)
+J.c9(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gq6(x))}}},"call$0","gysu",0,0,null],
+v.mK(x,z,v.gq6(x))}}},"call$0","gnt",0,0,null],
 oP:[function(a,b,c){var z,y,x
 z=W.vD(a.querySelectorAll(b),null)
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,77,510,[],577,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -21132,16 +20534,15 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,578,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
-z.textContent=b
-z.toString
-z.setAttribute("element",a.RT+"-"+c)
-return z},"call$2","gNG",4,0,null,579,[],578,[]],
+J.c9(z,b)
+z.setAttribute("element",H.d(a.RT)+"-"+c)
+return z},"call$2","gNG",4,0,null,553,[],552,[]],
 q1:[function(a,b){var z,y,x,w
-if(J.de(b,$.Tf()))return
+if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 x=J.x(y)
@@ -21150,10 +20551,10 @@
 x=J.rY(w)
 if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.le(w)),y.gIf())}}},"call$1","gHv",2,0,null,258,[]],
+a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,580,[]],
+return z},"call$1","gir",2,0,null,554,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -21162,48 +20563,48 @@
 C.xk.du(a)
 return a}}},
 q6:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:346;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],23,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,86,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],23,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
-w10:{
-"^":"Tp:113;",
+w12:{
+"^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:346;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,581,[],582,[],"call"],
+"^":"Tp:348;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
 $isEH:true},
 yL:{
 "^":"nd;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-412",function(){return[C.nJ]}],
+"^":["a;KM:X0=-375",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -21216,12 +20617,12 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
+$.Bh=$.Bh-1},"call$0","gLi",0,0,null],
 i4:[function(a){if(a.dZ==null)this.Ec(a)
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,583,[]],
+this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
 d0:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=z.Ja(b,"template")
@@ -21232,32 +20633,32 @@
 if(typeof x!=="object"||x===null||!w.$isI0)return
 v=z.gQg(b).MW.getAttribute("name")
 if(v==null)return
-a.B7.u(0,v,x)},"call$1","gcY",2,0,null,584,[]],
+a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
 z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$ishs?b:M.Ky(b)
+z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,261,[]],
+return y},"call$1","gAt",2,0,null,257,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
-this.gKE(a)
+this.gIW(a)
 z=this.er(a)
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
 y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$ishs?b:M.Ky(b)
+y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,261,[]],
+return z},"call$1","gQb",2,0,null,257,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,585,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
-if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],233,[],234,[]],
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
 fk:[function(a){if(J.ak(a.dZ)==null)return
 this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
@@ -21268,14 +20669,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,586,12,[],23,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,23,[]],
+return},"call$1","gt4",2,0,null,28,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -21288,7 +20689,7 @@
 else{J.MV(M.Ky(a),b)
 y=z.gIf()
 x=$.ZH()
-if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+this.gqn(a)+"].["+H.d(y)+"]")
+if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+H.d(this.gqn(a))+"].["+H.d(y)+"]")
 w=L.ao(c,d,null)
 if(w.gP(w)==null)w.sP(0,H.vn(a).rN(y).gAx())
 x=H.vn(a)
@@ -21299,12 +20700,12 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
 if(a.Uk===!0)return
-$.P5().J4("["+this.gqn(a)+"] asyncUnbindAll")
+$.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.oq
 y=this.gJg(a)
 if(z!=null)z.TP(0)
@@ -21318,16 +20719,16 @@
 if(z!=null){z.ed()
 a.Wz=null}this.C0(a)
 J.AA(M.Ky(a))
-y=this.gKE(a)
-for(;y!=null;){A.zM(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,112],
+y=this.gIW(a)
+for(;y!=null;){A.xv(y)
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,114],
 BT:[function(a,b){var z
-if(a.Uk===!0){$.P5().j2("["+this.gqn(a)+"] already unbound, cannot cancel unbindAll")
-return}$.P5().J4("["+this.gqn(a)+"] cancelUnbindAll")
+if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.Vx(this.gKE(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,77,587,[]],
+A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
@@ -21341,7 +20742,7 @@
 for(w=J.GP(b);w.G();){v=w.gl()
 u=J.x(v)
 if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,588,589,[]],
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
@@ -21349,10 +20750,10 @@
 if(y==null)return
 x=J.x(d)
 if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+this.gqn(a)+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
 if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+this.gqn(a)+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
 w.dB=x.cR(new A.xf(a,d,y))
@@ -21361,7 +20762,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],23,[],248,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -21372,11 +20773,11 @@
 a.Sa.V1(0)
 a.Sa=null},"call$0","gNX",0,0,null],
 Uc:[function(a){var z,y
-z=J.wX(a.dZ)
+z=J.yxg(a.dZ)
 if(z.gl0(z))return
 y=$.SS()
-if(y.Im(C.R5))y.J4("["+this.gqn(a)+"] addHostListeners: "+H.d(z))
-this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","ghu",0,0,null],
+if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+H.d(z))
+this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","gxD",0,0,null],
 UH:[function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
@@ -21385,61 +20786,61 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,264,[],590,[],297,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.SS()
 x=y.Im(C.R5)
-if(x)y.J4(">>> ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")
-w=J.wX(a.dZ)
+if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+w=J.yxg(a.dZ)
 v=z.gt5(b)
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.J4("["+this.gqn(a)+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+this.gqn(a)+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,591,384,[]],
+if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
+this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
 ea:[function(a,b,c,d){var z,y,x
 z=$.SS()
 y=z.Im(C.R5)
-if(y)z.J4(">>> ["+this.gqn(a)+"]: dispatch "+H.d(c))
+if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 x=J.x(c)
 if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
-else if(typeof c==="string")A.HR(b,new H.GD(H.le(c)),d)
+else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+this.gqn(a)+"]: dispatch "+H.d(c))},"call$3","gtW",6,0,null,6,[],592,[],268,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
 $iszs:true,
-$ishs:true,
+$isTU:true,
 $isd3:true,
 $iscv:true,
 $isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],23,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:113;b",
+"^":"Tp:115;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,292,[],"call"],
+if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a))},"call$1",null,2,0,null,264,[],"call"],
+return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:346;b,c,d,e",
+"^":"Tp:348;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -21449,29 +20850,29 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],593,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:346;a,b",
+"^":"Tp:348;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
-y=J.D8(this.b,3)
+y=J.ZZ(this.b,3)
 x=C.FS.t(0,y)
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],264,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:107;c,d,e",
+"^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
-y=A.Hr(z)
+y=A.z9(z)
 x=J.RE(y)
 if(typeof y!=="object"||y===null||!x.$iszs)return
 w=this.c
@@ -21480,25 +20881,25 @@
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,384,[],"call"],
+x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:107;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,108,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,108,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
@@ -21506,17 +20907,17 @@
 this.Jq.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
-this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,234,[]],
-ho:[function(a){var z,y,x,w,v
+this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
+aL4:[function(a){var z,y,x,w,v
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,595,256,[]],
+return}}},"call$1","giz",2,0,569,252,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -21530,17 +20931,17 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-jpR:{
-"^":["qE+zs;KM:X0=-412",function(){return[C.nJ]}],
+Sa:{
+"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
 $iszs:true,
-$ishs:true,
+$isTU:true,
 $isd3:true,
 $iscv:true,
 $isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"jpR+Pi;",
+"^":"Sa+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -21554,30 +20955,30 @@
 if(z!=null){z.ed()
 this.ih=null}},"call$0","gol",0,0,null],
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,112]},
+this.Ws()}},"call$0","gv6",0,0,114]},
 V3:{
 "^":"a;ns",
 $isV3:true},
-Bl:{
-"^":"Tp:107;",
+rD:{
+"^":"Tp:112;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,108,[],"call"],
+return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,596,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:107;",
+"^":"Tp:112;",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,596,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:107;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,594,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
 $isEH:true},
 jh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
@@ -21587,72 +20988,72 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,23,[],276,[],11,[]],
+return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
 W6:{
-"^":"Tp:113;",
+"^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
 z.u(0,C.N4,new Z.pp())
-z.u(0,C.Ts,new Z.nl())
+z.u(0,C.Kc,new Z.nl())
 z.u(0,C.PC,new Z.ik())
 z.u(0,C.md,new Z.LfS())
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,21,[],597,[],"call"],
+return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:346;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,21,[],108,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:346;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:107;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:346;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,21,[],597,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a," "):a
-return z},"call$1","qP",2,0,195,277,[]],
+else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,272,[]],
 PX:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$iscX)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,195,277,[]],
+else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,272,[]],
 o8:{
-"^":"Tp:107;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,402,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:107;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,402,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 e9:{
-"^":"T4;",
+"^":"ve;",
 cl:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
@@ -21667,41 +21068,41 @@
 if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
 z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,598,265,[],12,[],264,[]],
-CE:[function(a){return new T.G0(this)},"call$1","gb4",2,0,null,261,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
 Xy:{
-"^":"Tp:346;a,b,c",
+"^":"Tp:348;a,b,c",
 call$2:[function(a,b){var z=J.x(a)
 if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
 z=typeof b==="object"&&b!==null&&!!z.$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],264,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
 $isEH:true},
-G0:{
-"^":"Tp:107;a",
+uK:{
+"^":"Tp:112;a",
 call$1:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,285,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
 $isEH:true},
 mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,fn",
+"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
 y=J.x(a)
 if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,107,277,[]],
-gP:[function(a){return this.Y7},null,null,1,0,113,"value",355],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 w=J.x(x)
 if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,107,277,[],"value",355],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
 yB:function(a,b,c){var z,y,x,w,v
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -21715,18 +21116,18 @@
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:107;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:107;a,b",
+"^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,441,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
-"^":"xh;vq,L1,AP,fn",
+"^":"xh;vq,L1,AP,Lk",
 vb:function(a,b){this.vq.yI(new B.bX(b,this))},
 $asxh:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
@@ -21735,13 +21136,13 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,441,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
+return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -21771,83 +21172,83 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.le(u)),b)},"call$3","wA",6,0,null,278,[],23,[],270,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
 ci:[function(a){var z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,277,[]],
-Uf:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
-$isEH:true},
+return a},"call$1","Af",2,0,null,272,[]],
 Ra:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.p0(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:346;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return J.Hb(a,b)},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:346;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,128,[],188,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:346;",
-call$2:[function(a,b){var z=H.uK(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,128,[],115,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:107;",
-call$1:[function(a){return a},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){var z=H.Og(P.a)
+z=H.KT(z,[z]).BD(b)
+if(z)return b.call$1(a)
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,131,[],117,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:107;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
-w9:{
-"^":"Tp:107;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,128,[],"call"],
+w10:{
+"^":"Tp:112;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,131,[],"call"],
+$isEH:true},
+w11:{
+"^":"Tp:112;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:113;a",
+"^":"Tp:115;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
-"^":"a;eT>,k8,bq,G9",
+"^":"a;eT>,k8<,bq,G9",
 gCH:function(){var z=this.G9
 if(z!=null)return z
 z=H.vn(this.k8)
@@ -21857,7 +21258,7 @@
 if(J.de(b,"this"))return this.k8
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
-else if(this.k8!=null){y=new H.GD(H.le(b))
+else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
 if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
@@ -21870,26 +21271,27 @@
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
-else{z=H.le(a)
+else{z=H.u1(a)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
 if(z!=null)return z.tI(a)},"call$1","gXe",2,0,null,12,[]],
 tg:[function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
-else{z=H.le(b)
+else{z=H.u1(b)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
 return!1},"call$1","gdj",2,0,null,12,[]],
 $isz6:true},
-Ay0:{
+Ay:{
 "^":"a;bO?,Lv<",
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-Qh:[function(a){},"call$1","gVj",2,0,null,270,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,270,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21898,30 +21300,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,270,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
-"^":"cfS;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,18,[]],
+"^":"d2;Jd",
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,283,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
 G1:{
 "^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,18,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,18,[]],
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,351,[]],
+return y},"call$1","gEW",2,0,null,354,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,441,[]],
+return x},"call$1","gA2",2,0,null,409,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21931,115 +21333,115 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,441,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gXj",2,0,null,279,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gX7",2,0,null,279,[]],
+return y},"call$1","gmd",2,0,null,274,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,18,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,441,[]],
+return x},"call$1","ghH",2,0,null,19,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
-x=new K.mG(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","glf",2,0,null,91,[]],
+return x},"call$1","glf",2,0,null,96,[]],
 Hx:[function(a){var z,y
 z=J.UK(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","ghe",2,0,null,91,[]],
+return y},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gXf",2,0,null,441,[]]},
+return x},"call$1","gU6",2,0,null,409,[]]},
 Os:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,128,[],"call"],
+return z},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,18,[],"call"],
+return z},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 Wh:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.k8},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.EZ]},
+"^":"Ay;KL,bO,tj,Lv,k6",
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
 x5:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
+"^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.no]},
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
-"^":"Ay0;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.kB]},
+"^":"Ay;Pu>,KL,bO,tj,Lv,k6",
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:346;",
+"^":"Tp:348;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,191,[],18,[],"call"],
+return a},"call$2",null,4,0,null,190,[],19,[],"call"],
 $isEH:true},
 qR:{
-"^":"Ay0;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.ae]},
+"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
 ek:{
-"^":"Ay0;KL,bO,tj,Lv,k6",
+"^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z,y,x
 z=this.KL
-this.Lv=a.t(0,z.gP(z))
+this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
 x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.le(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.w6]},
+if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,bO,tj,Lv,k6",
+"^":"Ay;wz<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:[function(a){var z,y
@@ -22047,13 +21449,13 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.jK]},
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
-mG:{
-"^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
+iv:{
+"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:[function(a){var z,y,x,w
@@ -22070,64 +21472,64 @@
 w=typeof z==="object"&&z!==null&&!!w.$iswn
 z=w}else z=!1
 if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.uk]},
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 vl:{
-"^":"Ay0;hP<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:[function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.KL
-x=new H.GD(H.le(y.goc(y)))
+x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.x9]},
+if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 iT:{
-"^":"Ay0;hP<,Jn<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
 Qh:[function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.zX]},
+if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 ja:{
-"^":"Tp:107;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.zw(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:112;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
-zw:{
-"^":"Tp:107;d",
+ey:{
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 fa:{
-"^":"Ay0;hP<,re<,KL,bO,tj,Lv,k6",
+"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
 gbP:function(a){var z=this.KL
 return z.gbP(z)},
 Qh:[function(a){var z,y,x,w
@@ -22138,52 +21540,52 @@
 if(x==null){this.Lv=null
 return}z=this.KL
 if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.le(z.gbP(z)))
+this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
 z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.Jy]},
+if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:107;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,128,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:574;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,589,[],"call"],
+"^":"Tp:548;a,b,c",
+call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:107;d",
+"^":"Tp:112;d",
 call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,283,[],"call"],
+return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
 $isEH:true},
 VA:{
-"^":"Ay0;Bb<,T8<,KL,bO,tj,Lv,k6",
+"^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 Qh:[function(a){var z,y,x,w
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$iscX)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
 if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,270,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
-$asAy0:function(){return[U.K9]},
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+$asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:107;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;kF,bm",
 $isfk:true},
 wL:{
-"^":"a:107;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gQl",2,0,null,599,[]],
+"^":"a:112;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -22192,70 +21594,65 @@
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y,x
-z=J.x(a)
-if(z.n(a,b))return!0
+Pu:[function(a,b){var z,y
+if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
-if(!J.de(z.gB(a),b.length))return!1
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.de(x,b[y]))return!1;++y}return!0},"call$2","OE",4,0,null,128,[],188,[]],
+if(a.length!==b.length)return!1
+for(z=0;z<a.length;++z){y=a[z]
+if(z>=b.length)return H.e(b,z)
+if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,280,[],23,[]],
+return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,280,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,600,18,[],128,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,18,[],191,[],128,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,91,[]],
+return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -22263,33 +21660,33 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -22297,12 +21694,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -22311,12 +21708,12 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -22325,12 +21722,12 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -22338,12 +21735,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -22351,12 +21748,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gaH6",2,0,null,277,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,91,[]],
+return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -22364,8 +21761,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:346;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,601,[],602,[],"call"],
+"^":"Tp:348;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -22373,8 +21770,8 @@
 XJ:[function(a,b){var z
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
-if(z)throw H.b(Y.RV("Expected "+b+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gXO",0,4,null,77,77,603,[],23,[]],
+if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
 return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
@@ -22392,7 +21789,7 @@
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gHr",4,0,null,131,[],604,[]],
+return a},"call$2","gTv",4,0,null,134,[],578,[]],
 qL:[function(a,b){var z,y
 if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
 this.Sk.toString
@@ -22403,7 +21800,7 @@
 if(z){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,131,[],132,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -22414,7 +21811,7 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,131,[]],
+return new U.uk(x,a,y)},"call$1","gvB",2,0,null,134,[]],
 Dl:[function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -22504,34 +21901,34 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gJ1",0,0,null],
-pT0:[function(a){var z,y
+return y},"call$0","gJA",0,0,null],
+pT:[function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT0("")},"Ud","call$1",null,"gwo",0,2,null,333,605,[]],
-Fj:[function(a){var z,y
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.Fj("")},"tw","call$1",null,"gSE",0,2,null,333,605,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,281,114,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
 Ae:{
-"^":"a;vH>-386,P>-606",
+"^":"a;vH>-369,P>-580",
 r6:function(a,b){return this.P.call$1(b)},
 n:[function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,107,91,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,371,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
+return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
 $isAe:true,
-"@":function(){return[C.nJ]},
+"@":function(){return[C.Nw]},
 "<>":[3],
-static:{iz:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},47,[],23,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -22548,9 +21945,9 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,47,[]],
+return z},"call$1","goY",2,0,null,52,[]],
 $asmW:function(a){return[[K.Ae,a]]},
-$ascX:function(a){return[[K.Ae,a]]}},
+$asQV:function(a){return[[K.Ae,a]]}},
 vR:{
 "^":"AC;WS,wX,CD",
 gl:function(){return this.CD},
@@ -22568,14 +21965,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","tm",4,0,null,282,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-aK:[function(a){switch(a){case 102:return 12
+wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","aN",2,0,null,283,[]],
+default:return a}},"call$1","uO",2,0,null,278,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22620,14 +22017,14 @@
 if(x===92){x=y.G()?y.Wn:null
 this.VQ=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-v=P.O8(1,Y.aK(x),J.im)
+v=P.O8(1,Y.wX(x),J.im)
 x=H.eT(v)
 w.vM=w.vM+x}else{v=P.O8(1,x,J.im)
 x=H.eT(v)
 w.vM=w.vM+x}x=y.G()?y.Wn:null
 this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},"call$0","gxs",0,0,null],
+this.VQ=y.G()?y.Wn:null},"call$0","gPJ",0,0,null],
 zI:[function(){var z,y,x,w,v,u
 z=this.jI
 y=this.zy
@@ -22681,43 +22078,43 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,607,86,[]]},
-cfS:{
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,18,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,18,[]],
+this.xn(a)},"call$1","gff",2,0,null,19,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,441,[]],
+this.xn(a)},"call$1","gEW",2,0,null,409,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,441,[]],
+this.xn(a)},"call$1","gA2",2,0,null,409,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,441,[]],
-ti:[function(a){return this.xn(a)},"call$1","gXj",2,0,null,279,[]],
+this.xn(a)},"call$1","gES",2,0,null,409,[]],
+ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gX7",2,0,null,279,[]],
+this.xn(a)},"call$1","gmd",2,0,null,274,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,18,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,441,[]],
+this.xn(a)},"call$1","ghH",2,0,null,19,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","glf",2,0,null,91,[]],
+this.xn(a)},"call$1","glf",2,0,null,96,[]],
 Hx:[function(a){J.UK(a.gwz(),this)
-this.xn(a)},"call$1","ghe",2,0,null,91,[]],
+this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gXf",2,0,null,283,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V0;kW%-550,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-guw:[function(a){return a.kW},null,null,1,0,408,"app",355,397],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,551,23,[],"app",355],
+"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22730,33 +22127,29 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.G6(a)
-return a},null,null,0,0,113,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[608],
-V0:{
+return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[582],
+V20:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-386,AP,fn,tY-410,Pe-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gRd:[function(a){return a.zw},null,null,1,0,371,"line",355,397],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,372,23,[],"line",355],
-grp:[function(a){if(J.u6(a.zw,0))return Q.xI.prototype.grp.call(this,a)
-return H.d(Q.xI.prototype.grp.call(this,a))+"?line="+H.d(a.zw)},null,null,1,0,370,"objectId"],
-gJp:[function(a){var z,y
-if(a.tY==null)return""
+"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+gD5:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
-if(z)return J.UQ(y,"user_name")
-else return H.d(J.UQ(y,"user_name"))+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
-goc:[function(a){var z,y,x
-z=a.tY
-if(z==null)return""
-y=J.UQ(z,"user_name")
-z=J.U6(y)
-x=z.yn(y,J.WB(z.cn(y,"/"),1))
-if(J.u6(a.zw,0))return x
-else return x+":"+H.d(a.zw)},null,null,1,0,370,"name"],
-"@":function(){return[C.h9]},
+if(z)return y.gzz()
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+goc:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
+z=J.u6(a.zw,0)
+y=a.tY
+if(z)return J.O6(y)
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+"@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22770,22 +22163,820 @@
 a.X0=w
 C.c0.ZL(a)
 C.c0.G6(a)
-return a},null,null,0,0,113,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[609],
+return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[583],
 T5:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["oaa;Uz%-610,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gNl:[function(a){return a.Uz},null,null,1,0,611,"script",355,397],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,612,23,[],"script",355],
-PQ:[function(a,b){if(J.de(b.gu9(),-1))return"min-width:32px;"
-else if(J.de(b.gu9(),0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,613,181,[],"hitsStyle"],
-wH:[function(a,b,c,d){a.pC.oX("coverage").ml(new U.qq(a)).OA(new U.FC())},"call$3","gWp",6,0,425,18,[],306,[],74,[],"refreshCoverage"],
+"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
+gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+i4:[function(a){var z
+Z.uL.prototype.i4.call(this,a)
+z=a.Uz
+if(z==null)return
+J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
+da:[function(a){this.ct(a,C.YH,0,1)},"call$0","gze",0,0,114,"_triggerHitRefresh"],
+ib:[function(a,b){this.ct(a,C.YH,0,1)},"call$1","gKg",2,0,112,229,[],"showCoverageChanged"],
+PQ:[function(a,b){var z,y
+z=a.Uz
+if(z==null||a.HJ!==!0)return"min-width:32px;"
+y=J.UQ(z.gu9(),J.f2(b))
+if(y==null)return"min-width:32px;"
+if(J.de(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
+yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
-static:{Ry:[function(a){var z,y,x,w
+static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.HJ=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.cJ.ZL(a)
+C.cJ.G6(a)
+return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[588],
+V21:{
+"^":"uL+Pi;",
+$isd3:true},
+qq:{
+"^":"Tp:112;a-82,b-82",
+call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
+$isEH:true},
+"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"^":"",
+Er:[function(a){var z
+if(a!=null){z=J.U6(a)
+z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
+return z},"call$1","XI",2,0,null,190,[]],
+Io:[function(a){var z=J.rY(a)
+if(!z.nC(a,"@"))return a
+return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+Ch:[function(a,b,c){var z=J.x(a)
+if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
+else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+f3:[function(a,b,c){var z,y,x,w,v
+for(z=a.h3,y=0;y<z.length;++y){x=z[y]
+w=J.U6(x)
+v=typeof x==="object"&&x!==null&&!!w.$isqC
+if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
+else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+Lr:[function(a,b,c){var z
+if(c!=null){z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
+switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
+z.H4(b,c)
+return z
+case"IsolateList":a.tl.eC(c)
+return a.tl
+case"Script":return b.fq.Jb(c)
+case"Code":return b.ne.Jb(c)
+case"Isolate":return a.tl.Ze(c)
+case"Class":return b.PH.Jb(c)
+case"Function":return b.pw.Jb(c)
+default:}z=new V.qC(P.Py(null,null,null,null,null),null,null)
+z.$builtinTypeInfo=[null,null]
+z=new D.SI(z,b,null,null,null,null,null,null,null)
+z.H4(b,c)
+return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+G8:{
+"^":"a;F1>",
+tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
+t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
+u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
+ox:[function(a){var z=this.A4.Zp.t(0,a)
+if(z!=null)return P.Ab(z,null)
+return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+Jb:[function(a){var z,y
+z=J.U6(a)
+y=z.t(a,"id")
+z.t(a,"type")
+if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
+if(this.tg(0,y))return this.A4.Zp.t(0,y)
+z=this.tR(a)
+this.A4.u(0,z.gjO(z),z)
+return z},"call$1","gMs",2,0,null,98,[]],
+LJ:[function(a){this.A4.u(0,J.F8(a),a)
+return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+fJ:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.cI().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y,x
+z=this.F1
+y=J.im
+x=J.im
+x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
+x.H4(z,a)
+return x},"call$1","gUU",2,0,null,98,[]],
+Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+$asG8:function(){return[D.rj]},
+static:{"^":"RI"}},
+q1:{
+"^":"Tp:112;a",
+call$1:[function(a){var z=J.U6(a)
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+$isEH:true},
+jx:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.xN().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y,x
+z=this.F1
+y=J.im
+x=D.N8
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x.H4(z,a)
+return x},"call$1","gUU",2,0,null,98,[]],
+T0:[function(a){var z,y
+z=this.A4.Zp
+z=z.gUQ(z)
+y=P.F(z,!0,H.ip(z,"mW",0))
+H.rd(y,new D.yT())
+z=y.length
+if(typeof a!=="number")return H.s(a)
+if(z<a)return y
+C.Nm.sB(y,a)
+return y},"call$1","gy8",2,0,null,130,[]],
+c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+pl:[function(a,b){var z,y,x,w
+z=J.U6(a)
+y=z.t(a,"codes")
+x=z.t(a,"samples")
+for(z=J.GP(y);z.G();){w=z.gl()
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+$asG8:function(){return[D.kx]},
+static:{"^":"PA"}},
+yT:{
+"^":"Tp:595;",
+call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
+$isEH:true},
+Cn:{
+"^":"Tp:596;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+$isEH:true},
+du:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.Yk().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y
+z=this.F1
+y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
+y.H4(z,a)
+return y},"call$1","gUU",2,0,null,98,[]],
+$asG8:function(){return[D.SI]},
+static:{"^":"Oi"}},
+xc:{
+"^":"G8;F1,A4",
+pJ:[function(a){var z=$.uG().Ej
+if(typeof a!=="string")H.vh(new P.AT(a))
+return z.test(a)},"call$1","guT",2,0,null,279,[]],
+tR:[function(a){var z,y
+z=this.F1
+y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
+y.H4(z,a)
+return y},"call$1","gUU",2,0,null,98,[]],
+$asG8:function(){return[D.SI]},
+static:{"^":"TO"}},
+bv:{
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gPj:function(a){return this.KG},
+gHP:function(){return"#/"+H.d(this.KG)},
+gZ0:function(){return this.ne},
+gDD:function(a){return this.PH},
+pC:[function(){var z,y
+this.Fm=this
+z=D.rj
+y=J.O
+this.fq=new D.fJ(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.kx
+y=J.O
+this.ne=new D.jx(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.SI
+y=J.O
+this.PH=new D.du(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))
+z=D.SI
+y=J.O
+this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
+lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y
+z=H.VM([],[D.kx])
+for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+this.ne.c2()
+this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+ox:[function(a){var z,y
+this.fq.toString
+z=$.cI().Ej
+y=typeof a!=="string"
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.fq.ox(a)
+this.ne.toString
+z=$.xN().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.ne.ox(a)
+this.PH.toString
+z=$.Yk().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.PH.ox(a)
+this.pw.toString
+z=$.uG().Ej
+if(y)H.vh(new P.AT(a))
+if(z.test(a))return this.pw.ox(a)
+return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
+gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
+sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
+gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
+sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
+goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
+gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
+gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
+gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
+guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
+suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
+gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
+bj:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+tM:[function(a,b){var z,y,x,w
+D.Ch(b,this.zf,this)
+this.nr=!1
+z=J.U6(b)
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
+return}y=z.t(b,"rootLib")
+this.v9=F.Wi(this,C.iF,this.v9,y)
+y=z.t(b,"name")
+this.f5=F.Wi(this,C.KS,this.f5,y)
+if(z.t(b,"entry")!=null){y=z.t(b,"entry")
+y=F.Wi(this,C.tP,this.cL,y)
+this.cL=y
+y=J.UQ(y,"name")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+x=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(b,"timers"),new D.Qq(x))
+y=this.LE
+w=J.w1(y)
+w.u(y,"total",x.t(0,"time_total_runtime"))
+w.u(y,"compile",x.t(0,"time_compilation"))
+w.u(y,"gc",0)
+w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
+w.u(y,"dart",x.t(0,"time_dart_execution"))
+y=J.UQ(z.t(b,"heap"),"usedNew")
+this.Cf=F.Wi(this,C.IO,this.Cf,y)
+z=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+$isbv:true},
+D3:{
+"^":"af+Pi;",
+$isd3:true},
+KQ:{
+"^":"Tp:601;a",
+call$1:[function(a){var z=this.a
+return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
+$isEH:true},
+Qq:{
+"^":"Tp:112;a",
+call$1:[function(a){var z=J.U6(a)
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+$isEH:true},
+Qd:{
+"^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
+gzf:function(){return this.Gt},
+VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+l9:[function(a){var z=[]
+J.kH(this.i2,new D.i6(a,z))
+H.bQ(z,new D.r2(this))
+J.kH(a,new D.JB(this))
+this.Mm()},"call$1","geV",2,0,null,280,[]],
+Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+AQ:[function(a){var z,y,x,w
+z=this.i2
+y=J.U6(z)
+x=y.t(z,a)
+if(x!=null)return x
+w=P.L5(null,null,null,J.O,J.GW)
+w=R.Jk(w)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x.nr=C.xB.nC("@Isolate","@")
+x.mQ=D.Io("@Isolate")
+x.DC(0)
+x.pC()
+y.u(z,a,x)
+x.xW(0)
+return x},"call$1","grE",2,0,null,279,[]],
+Ze:[function(a){var z,y,x,w,v
+z=J.UQ(a,"id")
+y=this.i2
+x=J.U6(y)
+w=x.t(y,z)
+if(w!=null){w.eC(a)
+return w}v=P.L5(null,null,null,J.O,J.GW)
+v=R.Jk(v)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w.H4(null,a)
+w.pC()
+x.u(y,z,w)
+w.xW(0)
+return w},"call$1","gwB",2,0,null,190,[]],
+static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+i6:{
+"^":"Tp:348;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+$isEH:true},
+r2:{
+"^":"Tp:112;c",
+call$1:[function(a){J.V1(this.c.i2,a)
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+$isEH:true},
+JB:{
+"^":"Tp:112;d",
+call$1:[function(a){var z,y,x,w,v,u
+z=J.UQ(a,"id")
+y=this.d
+x=y.i2
+w=J.U6(x)
+if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
+v=R.Jk(v)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u.H4(null,a)
+u.pC()
+N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
+w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
+$isEH:true},
+qj:{
+"^":"Tp:605;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+$isEH:true},
+BH:{
+"^":"Tp:112;a",
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+$isEH:true},
+SI:{
+"^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
+bu:[function(a){return P.vW(this.RF)},"call$0","gXo",0,0,null],
+tM:[function(a,b){var z,y,x
+z=this.RF
+z.V1(0)
+z.FV(0,b)
+y=z.Zp
+x=y.t(0,"user_name")
+this.bN=this.ct(0,C.YS,this.bN,x)
+y=y.t(0,"name")
+this.GR=this.ct(this,C.KS,this.GR,y)
+y=this.Fm
+D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
+V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+u:[function(a,b,c){this.RF.u(0,b,c)
+return c},"call$2","gj3",4,0,null,442,[],272,[]],
+gl0:function(a){var z=this.RF.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.RF.Zp
+return z.gB(z)!==0},
+gvc:function(a){var z=this.RF.Zp
+return z.gvc(z)},
+gUQ:function(a){var z=this.RF.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.RF.Zp
+return z.gB(z)},
+BN:[function(a){var z=this.RF
+return z.BN(z)},"call$0","gDx",0,0,390],
+nq:[function(a,b){var z=this.RF
+return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+k0:[function(a){return},"call$0","gqw",0,0,114],
+ni:[function(a){this.RF.AP=null
+return},"call$0","gl1",0,0,114],
+gUj:function(a){var z=this.RF
+return z.gUj(z)},
+gnz:function(a){var z,y
+z=this.RF.AP
+if(z!=null){y=z.iE
+z=y==null?z!=null:y!==z}else z=!1
+return z},
+$isSI:true,
+$isqC:true,
+$asqC:function(){return[null,null]},
+$isZ0:true,
+$asZ0:function(){return[null,null]},
+$isd3:true},
+pt:{
+"^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
+gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
+sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+tM:[function(a,b){var z,y
+z=J.U6(b)
+y=z.t(b,"kind")
+this.J6=F.Wi(this,C.fy,this.J6,y)
+z=z.t(b,"message")
+this.LD=F.Wi(this,C.h2,this.LD,z)
+z="ServiceError "+H.d(this.J6)
+z=this.ct(this,C.YS,this.bN,z)
+this.bN=z
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+wVq:{
+"^":"af+Pi;",
+$isd3:true},
+c2:{
+"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+$isc2:true},
+rj:{
+"^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
+gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+tM:[function(a,b){var z,y,x
+z=J.U6(b)
+if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
+return}y=z.t(b,"name")
+this.wA=y
+x=J.U6(y)
+y=x.yn(y,J.WB(x.cn(y,"/"),1))
+this.Ge=y
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=this.wA
+this.GR=this.ct(this,C.KS,this.GR,y)
+y=z.t(b,"kind")
+this.J6=F.Wi(this,C.fy,this.J6,y)
+this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+aq:[function(a){var z,y,x,w,v
+if(this.nr)this.xW(0)
+z=J.U6(a)
+y=this.u9
+x=J.w1(y)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+x.u(y,z.t(a,w),z.t(a,w+1))
+w+=2}},"call$1","gHS",2,0,null,607,[]],
+W8:[function(a){var z,y,x,w,v
+this.nr=!0
+if(a==null)return
+z=J.uH(a,"\n")
+if(z.length===0)return
+this.nr=!1
+y=this.Sw
+x=J.w1(y)
+x.V1(y)
+N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
+for(w=0;w<z.length;w=v){v=w+1
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+$isrj:true},
+dZL:{
+"^":"af+Pi;",
+$isd3:true},
+N8:{
+"^":"a;Yu<,Du<,fF<",
+$isN8:true},
+Q4:{
+"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+xt:[function(){var z,y
+z=this.Yu
+y=J.x(z)
+if(y.n(z,0))return""
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+Io:[function(a){var z
+if(a==null)return""
+z=J.UQ(a.gyP(),this.Yu)
+if(z==null)return""
+if(J.de(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+HU:[function(a){var z
+if(a==null)return""
+z=J.UQ(a.gyP(),this.Yu)
+if(z==null)return""
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+$isQ4:true,
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+WAE:{
+"^":"a;uX",
+bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
+static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+if(z.n(a,"Native"))return C.nj
+else if(z.n(a,"Dart"))return C.l8
+else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Reused"))return C.yP
+N.Jx("").j2("Unknown code kind "+H.d(a))
+throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+Vi:{
+"^":"a;tT>,Av<",
+$isVi:true},
+kx:{
+"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
+glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
+gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
+ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
+gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
+this.Du=0
+this.fF=0
+this.mM=F.Wi(this,C.EF,this.mM,"")
+this.qH=F.Wi(this,C.uU,this.qH,"")
+J.U2(this.VS)
+J.U2(this.hw)
+J.U2(this.yP)},"call$0","gEQ",0,0,null],
+VD:[function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.Ab(this,null)},"call$0","gQU",0,0,null],
+fp:[function(a,b,c){var z,y,x,w,v,u
+z=J.U6(b)
+y=J.w1(a)
+x=0
+while(!0){w=z.gB(b)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=H.BU(z.t(b,x),null,null)
+u=H.BU(z.t(b,x+1),null,null)
+if(v>>>0!==v||v>=c.length)return H.e(c,v)
+y.h(a,new D.Vi(c[v],u))
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+eL:[function(a,b,c){var z,y
+this.jv=F.Wi(this,C.QK,this.jv,c)
+z=J.U6(a)
+this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
+this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
+this.fp(this.VS,z.t(a,"callers"),b)
+this.fp(this.hw,z.t(a,"callees"),b)
+y=z.t(a,"ticks")
+if(y!=null)this.pd(y)
+z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
+this.mM=F.Wi(this,C.EF,this.mM,z)
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+tM:[function(a,b){var z,y,x
+z=J.U6(b)
+this.oc=z.t(b,"user_name")
+this.zz=z.t(b,"name")
+y=D.CQ(z.t(b,"kind"))
+this.J6=F.Wi(this,C.fy,this.J6,y)
+this.vg=H.BU(z.t(b,"start"),16,null)
+this.Mb=H.BU(z.t(b,"end"),16,null)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"function"))
+this.MO=F.Wi(this,C.nf,this.MO,y)
+x=z.t(b,"disassembly")
+if(x!=null)this.xs(x)
+z=this.va
+y=J.U6(z)
+this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+xs:[function(a){var z,y,x,w,v,u,t,s
+z=this.va
+y=J.w1(z)
+y.V1(z)
+x=J.U6(a)
+w=0
+while(!0){v=x.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=x.t(a,w+1)
+t=x.t(a,w+2)
+s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
+y.h(z,new D.Q4(s,u,t,null,null))
+w+=3}},"call$1","gxk",2,0,null,615,[]],
+pd:[function(a){var z,y,x,w,v,u
+z=J.U6(a)
+y=this.yP
+x=J.w1(y)
+w=0
+while(!0){v=z.gB(a)
+if(typeof v!=="number")return H.s(v)
+if(!(w<v))break
+u=H.BU(z.t(a,w),16,null)
+x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
+w+=3}},"call$1","gfi",2,0,null,616,[]],
+tg:[function(a,b){J.J5(b,this.vg)
+return!1},"call$1","gdj",2,0,null,617,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
+F3:[function(a){var z,y,x
+for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
+if(typeof x!=="number")return H.s(x)
+y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+Ov:[function(a,b){var z,y
+for(z=J.GP(a);z.G();){y=z.gl()
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+$iskx:true,
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+w8F:{
+"^":"af+Pi;",
+$isd3:true},
+fx:{
+"^":"Tp:348;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
+$isEH:true},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
+gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
+gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
+gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
+goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
+gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,619,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+UZ:{
+"^":"Tp:348;a,b,c",
+call$2:[function(a,b){var z,y
+z=J.x(b)
+y=typeof b==="object"&&b!==null&&!!z.$isqC
+if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
+else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
+$isEH:true},
+No:{
+"^":["d3;tl@-504",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,497,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
+"^":"",
+XK:{
+"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+z6:[function(a,b){var z=this.Yu
+N.Jx("").To("Fetching "+H.d(b)+" from "+z)
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+dT:{
+"^":"Tp:112;",
+call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
+return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
+ho:{
+"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+bI:[function(a){var z,y,x,w,v
+z=J.RE(a)
+y=J.UQ(z.gRn(a),"id")
+x=J.UQ(z.gRn(a),"name")
+w=J.UQ(z.gRn(a),"data")
+if(!J.de(x,"observatoryData"))return
+z=this.ja
+v=z.t(0,y)
+z.Rz(0,y)
+J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+z6:[function(a,b){var z,y,x
+z=""+this.yb
+y=H.B7([],P.L5(null,null,null,null,null))
+y.u(0,"id",z)
+y.u(0,"method","observatoryQuery")
+y.u(0,"query","/"+H.d(b))
+this.yb=this.yb+1
+x=H.VM(new P.Zf(P.Dt(null)),[null])
+this.ja.u(0,z,x)
+J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+return x.MM},"call$1","gpV",2,0,null,261,[]],
+PI:function(){var z=C.Ns.aM(window)
+H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
+N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+"^":"",
+ob:{
+"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+hu:[function(a){var z
+switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.mC)
+return z
+case"BreakpointList":z=W.r3("breakpoint-list",null)
+J.X8(z,a.mC)
+return z
+case"Class":z=W.r3("class-view",null)
+J.QQ(z,a.mC)
+return z
+case"Code":z=W.r3("code-view",null)
+J.fH(z,a.mC)
+return z
+case"Error":z=W.r3("error-view",null)
+J.Qr(z,a.mC)
+return z
+case"Field":z=W.r3("field-view",null)
+J.JZ(z,a.mC)
+return z
+case"Function":z=W.r3("function-view",null)
+J.dk(z,a.mC)
+return z
+case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
+J.ti(z,a.mC)
+return z
+case"IsolateList":z=W.r3("isolate-list",null)
+J.oq(z,a.mC)
+return z
+case"Library":z=W.r3("library-view",null)
+J.F6(z,a.mC)
+return z
+case"Profile":z=W.r3("isolate-profile",null)
+J.CJ(z,a.mC)
+return z
+case"Script":z=W.r3("script-view",null)
+J.Tt(z,a.mC)
+return z
+case"StackTrace":z=W.r3("stack-trace",null)
+J.yO(z,a.mC)
+return z
+default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+fa:[function(a,b){var z,y,x
+a.textContent=""
+z=a.mC
+if(z==null){N.Jx("").To("Viewing null object.")
+return}y=z.gzS()
+x=this.hu(a)
+if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
+return}a.appendChild(x)
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,112,229,[],"objectChanged"],
+"@":function(){return[C.hpj]},
+static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -22794,56 +22985,36 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.cJ.ZL(a)
-C.cJ.G6(a)
-return a},null,null,0,0,113,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[614],
-oaa:{
-"^":"PO+Pi;",
-$isd3:true},
-qq:{
-"^":"Tp:357;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.gpC(z).oe(J.UQ(a,"coverage"))
-y.ct(z,C.YH,"",y.gXa(z))},"call$1",null,2,0,357,615,[],"call"],
-$isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[415],
-FC:{
-"^":"Tp:346;",
-call$2:[function(a,b){P.JS("refreshCoverage "+H.d(a)+" "+H.d(b))},"call$2",null,4,0,346,18,[],377,[],"call"],
-$isEH:true},
-"+ScriptViewElement_refreshCoverage_closure":[415]}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+C.ZO.ZL(a)
+C.ZO.G6(a)
+return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[621],
+V22:{
+"^":"uL+Pi;",
+$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Sq;tY%-410,Pe%-417,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gnv:[function(a){return a.tY},null,null,1,0,354,"ref",355,397],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,357,23,[],"ref",355],
-gjT:[function(a){return a.Pe},null,null,1,0,380,"internal",355,397],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,381,23,[],"internal",355],
+"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
+gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gJp(a))},"call$1","gma",2,0,158,233,[],"refChanged"],
-gO3:[function(a){var z=a.pC
-if(z==null||a.tY==null)return""
-return z.rn(this.grp(a))},null,null,1,0,370,"url"],
-grp:[function(a){var z=a.tY
-return z==null?"":J.UQ(z,"id")},null,null,1,0,370,"objectId"],
-gJp:[function(a){var z,y
-z=a.tY
-if(z==null)return""
-y=J.UQ(z,"name")
-return y!=null?y:""},null,null,1,0,370,"hoverText"],
-goc:[function(a){var z,y
-z=a.tY
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-y=a.Pe===!0?"name":"user_name"
-if(J.UQ(z,y)!=null)return J.UQ(a.tY,y)
-else if(J.UQ(a.tY,"name")!=null)return J.UQ(a.tY,"name")
-else if(J.UQ(a.tY,"user_name")!=null)return J.UQ(a.tY,"user_name")
-return""},null,null,1,0,370,"name"],
-"@":function(){return[C.Ldf]},
+return z.gHP()},null,null,1,0,365,"url"],
+gOL:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return J.F8(z)},null,null,1,0,365,"serviceId"],
+gD5:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return z.gzz()},null,null,1,0,365,"hoverText"],
+goc:[function(a){var z=a.tY
+if(z==null)return"NULL REF"
+return J.O6(z)},null,null,1,0,365,"name"],
+"@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -22856,85 +23027,66 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.G6(a)
-return a},null,null,0,0,113,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[616],
-Sq:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[622],
+Ds:{
+"^":"uL+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["q2;Va%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gz1:[function(a){return a.Va},null,null,1,0,354,"frame",355,397],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,357,23,[],"frame",355],
+"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
 "@":function(){return[C.pE]},
-static:{an:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Va=z
-a.SO=y
-a.B7=x
-a.X0=v
+static:{an:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.dX.ZL(a)
 C.dX.G6(a)
-return a},null,null,0,0,113,"new StackFrameElement$created"]}},
-"+StackFrameElement":[617],
-q2:{
-"^":"PO+Pi;",
+return a},null,null,0,0,115,"new StackFrameElement$created"]}},
+"+StackFrameElement":[624],
+V23:{
+"^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-uwf:{
-"^":["q3;Up%-410,AP,fn,pC-411,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gtN:[function(a){return a.Up},null,null,1,0,354,"trace",355,397],
-stN:[function(a,b){a.Up=this.ct(a,C.kw,a.Up,b)},null,null,3,0,357,23,[],"trace",355],
-RF:[function(a,b){a.pC.oX("stacktrace").ml(new X.At(a)).OA(new X.Sb()).YM(b)},"call$1","gvC",2,0,158,413,[],"refresh"],
-"@":function(){return[C.Yi]},
-static:{bV:[function(a){var z,y,x,w,v
-z=H.B7([],P.L5(null,null,null,null,null))
-z=R.Jk(z)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Up=z
-a.SO=y
-a.B7=x
-a.X0=v
+Vu:{
+"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
+yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"@":function(){return[C.js]},
+static:{bV:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
 C.bg.ZL(a)
 C.bg.G6(a)
-return a},null,null,0,0,113,"new StackTraceElement$created"]}},
-"+StackTraceElement":[618],
-q3:{
-"^":"PO+Pi;",
-$isd3:true},
-At:{
-"^":"Tp:107;a-77",
-call$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sUp(z,y.ct(z,C.kw,y.gUp(z),a))},"call$1",null,2,0,107,149,[],"call"],
-$isEH:true},
-"+StackTraceElement_refresh_closure":[415],
-Sb:{
-"^":"Tp:346;",
-call$2:[function(a,b){N.Jx("").hh("Error while reloading stack trace: "+H.d(a)+"\n"+H.d(b))},"call$2",null,4,0,346,18,[],416,[],"call"],
-$isEH:true},
-"+StackTraceElement_refresh_closure":[415]}],["template_binding","package:template_binding/template_binding.dart",,M,{
+return a},null,null,0,0,115,"new StackTraceElement$created"]}},
+"+StackTraceElement":[625],
+V24:{
+"^":"uL+Pi;",
+$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
 IP:[function(a){var z=J.RE(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"call$1","nc",2,0,null,129,[]],
+default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(y.gqn(a)!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -22942,7 +23094,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.XI(z,u,w,t)},"call$2","Nc",4,0,null,264,[],284,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -22952,16 +23104,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,264,[],149,[],285,[],284,[],286,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,264,[]],
+return},"call$1","ay",2,0,null,260,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
 if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
 if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,264,[],284,[]],
+if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -22972,9 +23124,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,129,[],284,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$ishs,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23002,7 +23154,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,77,291,[],264,[],285,[],286,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23020,13 +23172,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,86,[],12,[],264,[],284,[]],
+return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -23037,18 +23189,18 @@
 if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
 else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(w.gqn(a)!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.hs(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,264,[]],
+return x},"call$1","La",2,0,null,260,[]],
 wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(z.gqn(a)!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"call$1","xS",2,0,null,292,[]],
+return z},"call$1","xS",2,0,null,198,[]],
 V2:{
-"^":"hs;N1,mD,Ck",
+"^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
 z=this.gN1()
@@ -23060,17 +23212,17 @@
 new W.i7(y).Rz(0,b)
 z=this.gN1()
 y=d!=null?d:""
-x=new M.jY(null,z,c,null,null,"value",y)
+x=new M.zP(null,z,c,null,null,"value",y)
 x.Og(z,"value",c,d)
 x.Ca=M.IP(z).yI(x.gqf())}else{z=J.rY(b)
 w=z.Tc(b,"?")
 if(w){J.Vs(y).Rz(0,b)
 v=z.Nj(b,0,J.xH(z.gB(b),1))}else v=b
 z=d!=null?d:""
-x=new M.BT(w,y,c,null,null,v,z)
+x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
-BT:{
+return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
@@ -23078,8 +23230,8 @@
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,23,[]]},
-jY:{
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
 EC:[function(a){var z,y,x,w,v,u
@@ -23091,14 +23243,14 @@
 u=x}else{v=null
 u=null}}else{v=null
 u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,234,[]]},
+if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
 this.Ca.ed()
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
-DO:{
-"^":"Tp:113;",
+lP:{
+"^":"Tp:115;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -23115,25 +23267,25 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:107;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;a",
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:107;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,18,[],"call"],
+"^":"Tp:112;b",
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]],
+J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,158,18,[]]},
+O.Y3()},"call$1","gqf",2,0,157,19,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,234,[]],
+J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z,y,x,w
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
@@ -23141,8 +23293,8 @@
 y=J.x(z)
 if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
 y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$ishs?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,158,18,[]],
+w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
+if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23151,9 +23303,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,129,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,132,[]]}},
 r0:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -23162,12 +23314,12 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,288,[],"call"],
+return z},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:107;b",
+"^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
@@ -23176,7 +23328,7 @@
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,234,[]],
+this.Dh=z},"call$1","gH0",2,0,null,230,[]],
 Gh:[function(a){var z,y,x
 z=this.eS
 y=J.x(z)
@@ -23185,28 +23337,28 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,234,[]],
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,230,[]],
 C7:[function(){var z=this.Dh
 if(z!=null){z.disconnect()
-this.Dh=null}},"call$0","gln",0,0,null],
+this.Dh=null}},"call$0","glnT",0,0,null],
 FC:[function(a){var z,y
 this.C7()
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,158,18,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,23,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
 hB:{
-"^":"Tp:346;a",
+"^":"Tp:348;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,21,[],619,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:107;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,108,[],"call"],
+"^":"Tp:112;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
@@ -23216,7 +23368,7 @@
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
 x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$ishs?y:this,b)
+J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23230,17 +23382,17 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
-XI:{
+return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
-hs:{
+TU:{
 "^":"a;N1<,mD,Ck?",
 Z1:[function(a,b,c,d){var z,y
 window
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23255,10 +23407,10 @@
 glN:function(){var z,y
 z=this.gN1()
 y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$ishs?z:this},
-$ishs:true},
+return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+$isTU:true},
 yp:{
-"^":"a;KO,qW,k8"},
+"^":"a;KO,qW,k8<"},
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23268,7 +23420,7 @@
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?z:this,b)
+J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 x=this.N1
@@ -23277,9 +23429,9 @@
 y.Og(x,b,c,d)
 y.Ca=M.IP(x).yI(y.gqf())
 z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
 DT:{
-"^":"V2;lr,xT?,kr<,Dsl,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
+"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){var z,y
 z=this.N1
@@ -23310,7 +23462,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23336,7 +23488,7 @@
 this.jq()
 this.gCd(this).Rz(0,b)
 return
-default:M.hs.prototype.Ih.call(this,this,b)
+default:M.TU.prototype.Ih.call(this,this,b)
 return}},"call$1","gC8",2,0,null,12,[]],
 jq:[function(){var z=this.kr
 if(!z.t9){z.t9=!0
@@ -23344,7 +23496,7 @@
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
 y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$ishs?z:M.Ky(z)
+z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
 x=J.nX(z)
 w=z.gdv()
 if(w==null){w=M.iX(x,b)
@@ -23357,7 +23509,8 @@
 y=u}t=M.Fz(x,y)
 M.HP(t,w,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,77,77,77,285,[],284,[],286,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+gk8:function(){return this.lr},
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w,v
 this.Sy()
@@ -23366,7 +23519,7 @@
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
 if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$ishs?x:M.Ky(x))
+v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
 return v!=null?v:x},
 gjb:function(a){var z
 this.Sy()
@@ -23384,9 +23537,9 @@
 y=J.RE(z)
 z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
 if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.N1)
+v=M.eX(this.N1)
 z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$ishs?v:M.Ky(v)
+v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
 v.smj(!0)
 z=v.gN1()
 y=J.x(z)
@@ -23396,23 +23549,23 @@
 if(a!=null)v.sQO(a)
 else if(w)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,77,620,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
 y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(y.gqn(z)!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","Tkw",4,0,null,264,[],287,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,261,[]],pZ:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23427,30 +23580,31 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","fo",2,0,null,288,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,261,[],288,[],289,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
-z.textContent=$.cz()+" { display: none; }"
+J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:158;",
+"^":"Tp:157;",
 call$1:[function(a){var z
 if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$ishs?a:M.Ky(a)))}},"call$1",null,2,0,null,261,[],"call"],
+M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
-lP:{
-"^":"Tp:107;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,402,[],"call"],
+Uf:{
+"^":"Tp:112;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
@@ -23466,7 +23620,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:346;a,b,c,d",
+"^":"Tp:348;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23478,7 +23632,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],23,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23497,7 +23651,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,621,23,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
 DJ:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -23508,7 +23662,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,622,623,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23521,28 +23675,28 @@
 if(!z&&!this.js){this.Az(null)
 return}y=z?this.JM:this.d6
 x=z?this.yO:this.XV
-if(!this.Q3)w=L.ao(y,x,z?null:new M.ts())
+if(!this.Q3)w=L.ao(y,x,z?null:new M.VU())
 else{v=[]
 w=new Y.J3(v,[],null,new M.Kj(z),!1,!1,null,null)
 v.push(L.ao(y,x,null))
 z=this.rV
 u=this.eD
 v.push(L.ao(z,u,null))
-w.wE(0)}this.FS=w.gUj(w).yI(new M.VU(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,113],
+w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
+this.Az(w.gP(w))},"call$0","gjM",0,0,115],
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.w1(a)
 if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$iscX)){x=y.br(a)
+x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
 this.xG=x}else{this.xG=null
 x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","gbe",2,0,null,234,[]],
+if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,230,[]],
 wx:[function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
@@ -23555,7 +23709,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzm",2,0,null,47,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23568,7 +23722,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,47,[],209,[],624,[],286,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23585,7 +23739,7 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gLu",2,0,null,47,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
@@ -23611,9 +23765,9 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,625,255,[]],
+l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,286,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23627,30 +23781,30 @@
 if(z!=null){z.ed()
 this.FS=null}this.e9.kr=null
 this.pq=!0},"call$0","gJK",0,0,null]},
-ts:{
-"^":"Tp:107;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,21,[],"call"],
+VU:{
+"^":"Tp:112;",
+call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:536;a",
+"^":"Tp:633;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,623,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
 $isEH:true},
-VU:{
-"^":"Tp:107;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,424,[],"call"],
+R7:{
+"^":"Tp:112;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
 $isYa:true},
 XT:{
-"^":"hs;N1,mD,Ck",
+"^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x
-if(!J.de(b,"text"))return M.hs.prototype.Z1.call(this,this,b,c,d)
+if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
 this.Ih(0,b)
 z=this.gCd(this)
 y=this.N1
@@ -23658,11 +23812,11 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,234,[]]},
+J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]]},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
@@ -23670,7 +23824,7 @@
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$ishs?z:this,b)
+J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
 x=this.N1
@@ -23679,14 +23833,15 @@
 y.Og(x,"value",c,d)
 y.Ca=M.IP(x).yI(y.gqf())
 z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,77,12,[],285,[],265,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-T4:{
+ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
 "^":"a;qP<",
 gH:function(){return this.qP},
+gk8:function(){return this.ZY},
 gP:function(a){return J.Vm(this.xS)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.xS,b)},
@@ -23709,70 +23864,50 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:107;a",
+"^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,424,[],"call"],
-$isEH:true}}],["vm_element","package:observatory/src/elements/vm_element.dart",,R,{
-"^":"",
-Zt:{
-"^":["Dsd;Jh%-353,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-412",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.nJ]}],
-gzf:[function(a){return a.Jh},null,null,1,0,626,"vm",355,397],
-szf:[function(a,b){a.Jh=this.ct(a,C.DD,a.Jh,b)},null,null,3,0,627,23,[],"vm",355],
-"@":function(){return[C.rm]},
-static:{xip:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Qh.ZL(a)
-C.Qh.G6(a)
-return a},null,null,0,0,113,"new VMElement$created"]}},
-"+VMElement":[628],
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true}}],])
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+$isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 J.O.$isString=true
-J.O.$isRz=true
-J.O.$asRz=[J.O]
+J.O.$isTx=true
+J.O.$asTx=[J.O]
 J.O.$isa=true
-J.P.$isRz=true
-J.P.$asRz=[J.P]
+J.P.$isTx=true
+J.P.$asTx=[J.P]
 J.P.$isa=true
 J.im.$isint=true
-J.im.$isRz=true
-J.im.$asRz=[J.P]
-J.im.$isRz=true
-J.im.$asRz=[J.P]
-J.im.$isRz=true
-J.im.$asRz=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
+J.im.$isTx=true
+J.im.$asTx=[J.P]
 J.im.$isa=true
 J.GW.$isdouble=true
-J.GW.$isRz=true
-J.GW.$asRz=[J.P]
-J.GW.$isRz=true
-J.GW.$asRz=[J.P]
+J.GW.$isTx=true
+J.GW.$asTx=[J.P]
+J.GW.$isTx=true
+J.GW.$asTx=[J.P]
 J.GW.$isa=true
 W.KV.$isKV=true
 W.KV.$isD0=true
 W.KV.$isa=true
 W.M5.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
+W.yg.$isa=true
+W.uj.$isa=true
+N.qV.$isTx=true
+N.qV.$asTx=[N.qV]
 N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
+P.a6.$isTx=true
+P.a6.$asTx=[P.a6]
 P.a6.$isa=true
-P.Od.$isa=true
 J.Q.$isList=true
-J.Q.$iscX=true
+J.Q.$isQV=true
 J.Q.$isa=true
+P.Od.$isa=true
 P.a.$isa=true
 W.cv.$iscv=true
 W.cv.$isKV=true
@@ -23806,11 +23941,25 @@
 U.kB.$isa=true
 K.Ae.$isAe=true
 K.Ae.$isa=true
+D.rj.$isaf=true
+D.rj.$isa=true
+D.kx.$iskx=true
+D.kx.$isaf=true
+D.kx.$isa=true
+D.SI.$isSI=true
+D.SI.$isaf=true
+D.SI.$isqC=true
+D.SI.$asqC=[null,null]
+D.SI.$isZ0=true
+D.SI.$asZ0=[null,null]
+D.SI.$isa=true
 N.TJ.$isa=true
 P.wv.$iswv=true
 P.wv.$isa=true
 J.kn.$isbool=true
 J.kn.$isa=true
+T.z2.$isz2=true
+T.z2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -23838,9 +23987,9 @@
 P.ej.$isa=true
 P.RY.$isej=true
 P.RY.$isa=true
-P.ac.$isX9=true
-P.ac.$isej=true
-P.ac.$isa=true
+P.Fw.$isX9=true
+P.Fw.$isej=true
+P.Fw.$isa=true
 P.X9.$isX9=true
 P.X9.$isej=true
 P.X9.$isa=true
@@ -23853,16 +24002,14 @@
 P.Ys.$isa=true
 X.TR.$isa=true
 F.d3.$isa=true
-T.z2.$isz2=true
-T.z2.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
 P.qh.$isa=true
-W.CX.$isea=true
-W.CX.$isa=true
+W.Wp.$isea=true
+W.Wp.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 M.Ya.$isa=true
@@ -23890,17 +24037,20 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
-W.Hy.$isea=true
-W.Hy.$isa=true
+W.cx.$isea=true
+W.cx.$isa=true
+D.bv.$isbv=true
+D.bv.$isaf=true
+D.bv.$isa=true
+D.c2.$isa=true
+D.Vi.$isVi=true
+D.Vi.$isa=true
+D.Q4.$isa=true
+D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
-G.kx.$iskx=true
-G.kx.$isa=true
-G.rj.$isa=true
-G.c2.$isc2=true
-G.c2.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -23927,39 +24077,41 @@
 H.Uz.$isa=true
 P.e4.$ise4=true
 P.e4.$isa=true
-P.JB.$isJB=true
-P.JB.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-G.Vi.$isVi=true
-G.Vi.$isa=true
+P.dl.$isdl=true
+P.dl.$isa=true
+V.qC.$isqC=true
+V.qC.$isZ0=true
+V.qC.$isa=true
 P.jp.$isjp=true
 P.jp.$isa=true
+P.Tx.$isTx=true
+P.Tx.$isa=true
 W.D0.$isD0=true
 W.D0.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
 P.aY.$isaY=true
 P.aY.$isa=true
-P.lO.$islO=true
-P.lO.$isa=true
-P.cX.$iscX=true
-P.cX.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$isa=true
+P.tU.$istU=true
+P.tU.$isa=true
+P.QV.$isQV=true
+P.QV.$isa=true
 P.nP.$isnP=true
 P.nP.$isa=true
 P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
+P.iP.$isTx=true
+P.iP.$asTx=[null]
 P.iP.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
+P.fIm.$isfIm=true
+P.fIm.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
+D.af.$isaf=true
+D.af.$isa=true
+K.z6.$isz6=true
+K.z6.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-$.$signature_bh={func:"bh",args:[null,null]}
-$.$signature_HB={func:"HB",ret:P.a,args:[P.a]}
-$.$signature_Dv={func:"Dv",args:[null]}
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -23999,15 +24151,18 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
+return J.Wx(a).E(a,b)}
 J.C0=function(a,b){return J.w1(a).ez(a,b)}
 J.CC=function(a){return J.RE(a).gmH(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.Co=function(a){return J.RE(a).gcC(a)}
-J.D8=function(a,b){return J.rY(a).yn(a,b)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
+J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FW=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
@@ -24015,24 +24170,19 @@
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.Hb=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
-J.I8=function(a,b,c){return J.rY(a).wL(a,b,c)}
-J.IJ=function(a,b){return J.Wx(a).Z(a,b)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JD=function(a,b){return J.RE(a).R3(a,b)}
+J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K3=function(a,b){return J.RE(a).Kb(a,b)}
-J.KM=function(a){return J.RE(a).zr(a)}
 J.Kv=function(a,b){return J.RE(a).jx(a,b)}
+J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
@@ -24045,22 +24195,26 @@
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
-J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.Nv=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
-J.QQ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.QP=function(a){return J.RE(a).gF1(a)}
+J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.SK=function(a){return J.RE(a).xW(a)}
+J.Sq=function(a,b){return J.RE(a).zY(a,b)}
 J.TD=function(a){return J.RE(a).i4(a)}
 J.TZ=function(a){return J.RE(a).gKV(a)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
-J.Tv=function(a){return J.RE(a).gB1(a)}
+J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
+J.Tt=function(a,b){return J.RE(a).sNl(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
 J.UK=function(a,b){return J.RE(a).RR(a,b)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
@@ -24078,7 +24232,9 @@
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a){return J.RE(a).gG3(a)}
+J.WO=function(a){return J.RE(a).gV5(a)}
 J.We=function(a,b){return J.RE(a).scC(a,b)}
+J.X8=function(a,b){return J.RE(a).srs(a,b)}
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
@@ -24087,7 +24243,10 @@
 J.Z7=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
 J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
+J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
+J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.ak=function(a){return J.RE(a).gNF(a)}
+J.am=function(a){return J.RE(a).VD(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bY=function(a,b){return J.Wx(a).Y(a,b)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
@@ -24102,13 +24261,17 @@
 J.de=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
 return J.x(a).n(a,b)}
+J.dk=function(a,b){return J.RE(a).sMj(a,b)}
+J.dm=function(a){return J.RE(a).gi2(a)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.eJ=function(a,b){return J.U6(a).cn(a,b)}
+J.f2=function(a){return J.RE(a).gRd(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
-J.hf=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.fH=function(a,b){return J.RE(a).stT(a,b)}
+J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
+J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
@@ -24119,15 +24282,12 @@
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
-J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
-return J.Wx(a).i(a,b)}
+J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
-J.p0=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Wx(a).U(a,b)}
-J.pB=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
 J.pb=function(a,b){return J.w1(a).Vr(a,b)}
@@ -24141,8 +24301,8 @@
 J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
+J.ti=function(a,b){return J.RE(a).sQr(a,b)}
 J.tx=function(a){return J.RE(a).guD(a)}
-J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u3=function(a){return J.RE(a).geT(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
@@ -24150,17 +24310,23 @@
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
+return J.Qc(a).U(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
-J.wX=function(a){return J.RE(a).gGd(a)}
 J.wc=function(a){return J.RE(a).gbG(a)}
 J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
+J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
+J.y9=function(a){return J.RE(a).lh(a)}
+J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
+J.yn=function(a,b){return J.RE(a).vV(a,b)}
+J.yxg=function(a){return J.RE(a).gGd(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.zH=function(a){return J.RE(a).gt5(a)}
@@ -24177,23 +24343,24 @@
 C.oD=new J.P()
 C.Kn=new J.O()
 C.mI=new K.nd()
+C.IU=new P.kF()
 C.Us=new A.yL()
-C.nJ=new K.vly()
+C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.za=new A.jh()
+C.xd=new A.jh()
 C.NU=new P.R8()
-C.v8=new P.nU()
-C.xE=A.wM.prototype
+C.v8=new P.W5()
+C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
-C.kk=Z.Ps.prototype
-C.WA=new G.WAE("Collected")
-C.l8=new G.WAE("Dart")
-C.nj=new G.WAE("Native")
+C.kk=Z.Jc.prototype
+C.WA=new D.WAE("Collected")
+C.l8=new D.WAE("Dart")
+C.nj=new D.WAE("Native")
+C.yP=new D.WAE("Reused")
 C.IK=O.CN.prototype
-C.YD=F.HT.prototype
+C.YD=F.Be.prototype
 C.j8=R.E0.prototype
 C.O0=R.lw.prototype
-C.Vy=new A.V3("disassembly-entry")
 C.Br=new A.V3("observatory-element")
 C.dA=new A.V3("heap-profile")
 C.I3=new A.V3("script-view")
@@ -24201,58 +24368,56 @@
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
-C.qT=new A.V3("nav-menu-item")
+C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
+C.hpj=new A.V3("service-view")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xW=new A.V3("code-view")
-C.aQx=new A.V3("class-view")
+C.xz=new A.V3("code-view")
+C.oY=new A.V3("class-view")
 C.Gg=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
-C.rc=new A.V3("message-viewer")
-C.rm=new A.V3("vm-element")
 C.NT=new A.V3("top-nav-menu")
-C.Yi=new A.V3("stack-trace")
-C.h9=new A.V3("script-ref")
+C.js=new A.V3("stack-trace")
+C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
 C.jF=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
 C.pE=new A.V3("stack-frame")
-C.kR=new A.V3("observatory-application")
+C.bd=new A.V3("observatory-application")
+C.Qz=new A.V3("eval-box")
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
 C.pc=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.YQ=new A.V3("function-ref")
-C.QU=new A.V3("library-ref")
-C.EA=new A.V3("isolate-element")
-C.vc=new A.V3("field-view")
-C.Ldf=new A.V3("service-ref")
-C.nW=new A.V3("nav-bar")
+C.R0=new A.V3("function-ref")
+C.uy=new A.V3("library-ref")
+C.My=new A.V3("field-view")
+C.JD=new A.V3("service-ref")
+C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
 C.be=new A.V3("instance-view")
-C.er=E.Fv.prototype
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
+C.Gh=L.rm.prototype
 C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.CX])
+C.pi=H.VM(new W.e0("click"),[W.Wp])
 C.MD=H.VM(new W.e0("error"),[W.ew])
 C.PP=H.VM(new W.e0("hashchange"),[W.ea])
 C.i3=H.VM(new W.e0("input"),[W.ea])
 C.fK=H.VM(new W.e0("load"),[W.ew])
-C.ph=H.VM(new W.e0("message"),[W.Hy])
+C.Ns=H.VM(new W.e0("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.AX.prototype
-C.h4=N.yb.prototype
-C.RJ=K.NM.prototype
+C.Xo=U.qW.prototype
+C.Yu=N.mk.prototype
+C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
 C.cp=B.pR.prototype
 C.yK=Z.hx.prototype
-C.wx=S.PO.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
 C.XH=X.E7.prototype
@@ -24396,15 +24561,15 @@
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
 C.Ap=new P.pD(null)
-C.GB=Z.vj.prototype
+C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.cV=new N.qV("SEVERE",1000)
 C.UP=new N.qV("WARNING",900)
-C.S3=A.oM.prototype
+C.ct=A.Zt.prototype
 C.Z3=R.LU.prototype
-C.MG=M.T2.prototype
+C.MG=M.KL.prototype
 I.makeConstantList = function(list) {
   list.immutable$list = init;
   list.fixed$length = init;
@@ -24412,33 +24577,34 @@
 };
 C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
 C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
 C.PQ=I.makeConstantList(["active","success","warning","danger","info"])
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.ac])
+C.dn=H.VM(I.makeConstantList([]),[P.Fw])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
 C.iH=H.VM(I.makeConstantList([]),[J.im])
 C.xD=I.makeConstantList([])
 C.Qy=I.makeConstantList(["in","this"])
 C.kg=I.makeConstantList([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.makeConstantList([0,0,32754,11263,65534,34815,65534,18431])
 C.Wd=I.makeConstantList([0,0,32722,12287,65535,34815,65534,18431])
 C.iq=I.makeConstantList([40,41,91,93,123,125])
-C.zJ=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zJ)
+C.jH=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
 C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
-C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
+C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
-C.Wp=L.PF.prototype
 C.S2=W.H9.prototype
 C.kD=A.F1.prototype
 C.SU=A.aQ.prototype
-C.nn=A.Ya5.prototype
+C.nn=A.Qa.prototype
 C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
@@ -24448,25 +24614,23 @@
 C.Cc=Q.JG.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
+C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
 C.dX=K.nm.prototype
-C.bg=X.uwf.prototype
+C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
 C.N4=new H.GD("dart.core.DateTime")
-C.Ts=new H.GD("dart.core.bool")
+C.Kc=new H.GD("dart.core.bool")
 C.fz=new H.GD("[]")
 C.aP=new H.GD("active")
-C.Es=new H.GD("anchor")
+C.cg=new H.GD("anchor")
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
 C.AV=new H.GD("callback")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
-C.EX=new H.GD("codeRef")
-C.C2=new H.GD("coveredPercentageFormatted")
 C.h1=new H.GD("currentHash")
-C.tv=new H.GD("currentHashUri")
 C.Na=new H.GD("devtools")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
@@ -24474,153 +24638,148 @@
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
 C.WQ=new H.GD("field")
-C.SK=new H.GD("fileAndLine")
+C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
-C.yg=new H.GD("functionRef")
-C.D2=new H.GD("hasCurrentIsolate")
-C.K7=new H.GD("hits")
+C.zS=new H.GD("hasDisassembly")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
 C.fn=new H.GD("instance")
-C.i6=new H.GD("instruction")
 C.zD=new H.GD("internal")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
+C.za=new H.GD("isolates")
 C.Gd=new H.GD("json")
 C.fy=new H.GD("kind")
+C.hf=new H.GD("label")
 C.QL=new H.GD("last")
 C.Wn=new H.GD("length")
 C.EV=new H.GD("library")
-C.cg=new H.GD("libraryRef")
 C.Cv=new H.GD("line")
+C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.US=new H.GD("messageType")
+C.h2=new H.GD("message")
 C.fQ=new H.GD("methodCountSelected")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
+C.VJ=new H.GD("object")
 C.ap=new H.GD("oldHeapUsed")
-C.tI=new H.GD("percent")
 C.vb=new H.GD("profile")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
 C.mE=new H.GD("response")
+C.Aa=new H.GD("results")
 C.iF=new H.GD("rootLib")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
 C.fX=new H.GD("script")
-C.Be=new H.GD("scriptRef")
 C.eC=new H.GD("[]=")
-C.Kt=new H.GD("shortName")
-C.MB=new H.GD("text")
-C.p1=new H.GD("ticks")
-C.jI=new H.GD("topExclusiveCodes")
+C.V0=new H.GD("showCoverage")
+C.mi=new H.GD("text")
 C.ch=new H.GD("topFrame")
+C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
 C.Fh=new H.GD("url")
-C.ct=new H.GD("userName")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
-C.DD=new H.GD("vm")
 C.KS=new H.GD("vmName")
-C.z9=new H.GD("void")
+C.v6=new H.GD("void")
 C.lx=A.tz.prototype
 C.SX=H.mm('qC')
 C.WP=new H.Lm(C.SX,"K",0)
 C.SL=H.mm('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.QJ=H.mm('xh')
-C.wW=new H.Lm(C.QJ,"T",0)
+C.Yn=H.mm('xh')
+C.wW=new H.Lm(C.Yn,"T",0)
 C.Gsc=H.mm('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
 C.RP=H.mm('hx')
 C.Ln=H.mm('Dg')
 C.z6Y=H.mm('Tg')
+C.IZ=H.mm('rm')
 C.eY=H.mm('n6')
 C.Vh=H.mm('Pz')
-C.I5=H.mm('JG')
+C.zq=H.mm('Qa')
+C.tf=H.mm('Zt')
+C.RJ=H.mm('JG')
+C.Ye=H.mm('qW')
 C.z7=H.mm('G6')
 C.Ma=H.mm('F1')
 C.nY=H.mm('a')
 C.Yc=H.mm('iP')
+C.jRs=H.mm('Be')
 C.kA=H.mm('u7')
 C.PT=H.mm('I2')
 C.Wup=H.mm('LZ')
 C.P0k=H.mm('lI')
-C.Lz=H.mm('PO')
 C.T1=H.mm('Wy')
 C.hG=H.mm('ir')
 C.aj=H.mm('fI')
-C.Qw=H.mm('Fv')
 C.la=H.mm('ZX')
 C.G4=H.mm('CN')
 C.O4=H.mm('double')
 C.yw=H.mm('int')
-C.Mh=H.mm('Zt')
-C.Lf0=H.mm('uwf')
 C.RcY=H.mm('aQ')
-C.ld=H.mm('AX')
+C.KJ=H.mm('mk')
 C.yiu=H.mm('knI')
-C.oW=H.mm('Ya5')
 C.iN=H.mm('yc')
 C.HI=H.mm('Pg')
 C.ila=H.mm('xI')
 C.lk=H.mm('mJ')
 C.lpG=H.mm('LU')
+C.Yte=H.mm('KL')
 C.mR=H.mm('fl')
 C.jV=H.mm('rF')
-C.JZ=H.mm('E7')
-C.wd=H.mm('vj')
+C.SB=H.mm('E7')
+C.Tq=H.mm('vj')
 C.JW=H.mm('Ww')
-C.Rg=H.mm('yb')
-C.wHJ=H.mm('Kz')
+C.qo=H.mm('jY')
+C.wH=H.mm('Kz')
 C.cx5=H.mm('m8')
 C.l49=H.mm('uL')
 C.yQ=H.mm('EH')
 C.Im=H.mm('X6')
-C.GG=H.mm('PF')
 C.FU=H.mm('lw')
-C.p5=H.mm('oM')
-C.yD=H.mm('E0')
+C.rd6=H.mm('E0')
 C.nG=H.mm('zt')
 C.yG=H.mm('nm')
-C.vA=H.mm('tz')
-C.ow=H.mm('E9')
-C.PV=H.mm('wM')
+C.px=H.mm('tz')
+C.epC=H.mm('Jc')
+C.Fd=H.mm('E9')
 C.Db=H.mm('String')
-C.EP=H.mm('NM')
 C.Bm=H.mm('XP')
-C.Tn=H.mm('T2')
 C.hg=H.mm('hd')
-C.dd=H.mm('pR')
-C.Ud8=H.mm('Ps')
-C.Io=H.mm('HT')
+C.Fv=H.mm('ob')
+C.Wza=H.mm('pR')
 C.HL=H.mm('bool')
 C.Qf=H.mm('Null')
 C.HH=H.mm('dynamic')
+C.l6=H.mm('iL')
 C.Gp=H.mm('cw')
 C.ri=H.mm('yy')
 C.CS=H.mm('vm')
 C.Hk=H.mm('Gk')
 C.hN=H.mm('oI')
+C.r6=H.mm('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
-C.Qh=R.Zt.prototype
 C.ol=W.u9.prototype
-C.hi=H.VM(new W.hP(W.pq()),[W.OJ])
+C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
 $.libraries_to_load = {}
 $.te="$cachedFunction"
 $.eb="$cachedInvocation"
@@ -24652,8 +24811,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["AZ","B2","BN","BT","BX","Ba","Bf","Bk","C","C0","C4","CL","Ch","D","D3","D6","Dd","De","E","Ec","F","FL","FV","Fr","G6","GB","GG","GT","HG","Hn","Hs","IW","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LV","Md","Mi","Mu","NZ","Nj","O","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qq","Qx","R3","R4","RB","RF","RP","RR","Rg","Rz","SF","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VR","Vk","Vr","W","W3","W4","WL","WO","WZ","Wj","Wt","X6","XG","XL","XU","Xl","Y","Y9","YF","YU","YW","Yh","Z","Z1","Z2","ZB","ZL","ZZ","Ze","Zv","aC","aN","aZ","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","f9","fk","fm","fz","g","gA","gAp","gAq","gAu","gAy","gB","gB1","gBW","gCO","gCY","gCd","gCj","gDD","gDt","gEh","gF0","gFR","gG0","gG1","gG3","gGQ","gGV","gGd","gGj","gHX","gHm","gHu","gI","gIF","gIt","gJ0","gJS","gJf","gJh","gJo","gJp","gKE","gKM","gKV","gLA","gLW","gLY","gLm","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOc","gOl","gP","gP1","gPe","gPj","gPu","gPy","gQ7","gQW","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gSS","gTB","gTq","gUQ","gUV","gUj","gUo","gUp","gUy","gUz","gVa","gVl","gW0","gWT","gX3","gXc","gXh","gXt","gZ8","gZC","gZf","ga4","gaK","gah","gai","gbG","gbP","gbV","gbx","gcC","gcL","gdU","geH","geJ","geT","geb","gey","gfN","gfY","gfb","gfc","ghU","ghf","gi9","giC","giO","gig","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkX","gkc","gkf","gkg","gkp","gl0","gl7","gm0","gm2","gmH","gmW","gmm","gn9","gng","gnv","gnx","goE","goc","gor","gpC","gpD","gpQ","gpo","gq3","gq6","gqO","gqY","gqn","grK","grU","grZ","grp","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","guD","guw","guy","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxH","gxX","gxj","gxr","gxw","gyH","gyT","gys","gz1","gzP","gzZ","gzf","gzh","gzj","gzw","h","h8","hZ","hc","hr","i","i4","iF","iM","ii","iw","j","jh","jp","jx","k","k0","kO","ka","l5","lj","m","mK","n","nB","nC","nH","ni","np","nq","nt","oB","oC","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qH","qZ","r6","rJ","sAp","sAq","sAu","sAy","sB","sB1","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sFR","sG1","sG3","sGQ","sGV","sGd","sGj","sHX","sHm","sHu","sIF","sIt","sJ0","sJS","sJh","sJo","sKM","sKV","sLA","sLW","sLY","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPe","sPj","sPu","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sSS","sTB","sTq","sUQ","sUo","sUp","sUy","sUz","sVa","sWT","sX3","sXc","sXh","sXt","sZ8","sZC","sa4","saK","sah","sai","sbG","sbP","sbV","scC","scL","sdU","seH","seJ","seT","seb","sfN","sfY","sfb","sfc","shU","shf","siC","sig","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skX","skc","skf","skg","skp","sl7","sm0","sm2","smH","sn9","sng","snv","snx","soE","soc","spC","spD","spQ","spo","sq3","sq6","sqO","sqY","srU","srZ","srs","st0","st5","stD","stN","stT","stY","suD","suw","suy","svH","svL","svk","svt","swd","sxH","sxX","sxj","sxr","sxw","syH","syT","sys","sz1","szZ","szf","szh","szj","szw","t","tZ","tg","tt","u","u8","uB","uW","w","wE","wH","wL","wR","wW","wY","wg","x3","xc","xe","xo","y0","yC","yF","yM","yN","yc","yn","yq","yu","yx","yy","z2","zV","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.I5,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.Lz,S.PO,{created:S.O5},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.Qw,E.Fv,{created:E.AH},C.G4,O.CN,{created:O.On},C.Mh,R.Zt,{created:R.xip},C.Lf0,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.wH},C.yiu,A.knI,{created:A.Th},C.oW,A.Ya5,{created:A.EL},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.mR,A.fl,{created:A.Yt},C.JZ,X.E7,{created:X.jD},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.Rg,N.yb,{created:N.N0},C.wHJ,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.Tt},C.l49,Z.uL,{created:Z.Hx},C.GG,L.PF,{created:L.A5},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.yD,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.vA,A.tz,{created:A.J8},C.ow,F.E9,{created:F.TW},C.PV,A.wM,{created:A.lT},C.EP,K.NM,{created:K.op},C.Bm,A.XP,{created:A.XL},C.Tn,M.T2,{created:M.SP},C.hg,W.hd,{},C.dd,B.pR,{created:B.b4},C.Ud8,Z.Ps,{created:Z.zg},C.Io,F.HT,{created:F.Fe},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.cY}]
+$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24696,14 +24855,13 @@
     return e.message;
   }
 }())})
-I.$lazy($,"_codeMatcher","rC","Ks",function(){return new H.VR(H.v4("/code/",!1,!0,!1),null,null)})
-I.$lazy($,"_scriptMatcher","lF","hK",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
-I.$lazy($,"currentIsolateMatcher","qY","oy",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"validationPattern","zP","R0",function(){return new H.VR(H.v4("^(?:[a-zA-Z$][a-zA-Z$0-9_]*\\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|-|unary-|\\[\\]=|~|==|\\[\\]|\\*|/|%|~/|\\+|<<|>>|>=|>|<=|<|&|\\^|\\|)$",!1,!0,!1),null,null)})
+I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
 I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
-I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.z9)})
+I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
 I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
 I.$lazy($,"currentJsMirrorSystem","GR","Cm",function(){return new H.Sn(null,new H.Lj(init.globalState.N0))})
 I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
@@ -24711,25 +24869,25 @@
 I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
-I.$lazy($,"_splitRe","Um","qG",function(){return new H.VR(H.v4("^(?:([^:/?#]+):)?(?://(?:([^/?#]*)@)?(?:([\\w\\d\\-\\u0100-\\uffff.%]*)|\\[([A-Fa-f0-9:.]*)\\])(?::([0-9]+))?)?([^?#[]+)?(?:\\?([^#]*))?(?:#(.*))?$",!1,!0,!1),null,null)})
 I.$lazy($,"_safeConsole","wk","pl",function(){return new W.QZ()})
 I.$lazy($,"webkitEvents","fD","Vp",function(){return H.B7(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],P.L5(null,null,null,null,null))})
 I.$lazy($,"context","eo","cM",function(){return P.ND(function() { return this; }())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
+I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.YJ().call$0()})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().call$0()})
 I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
 I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
 I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
 I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
 I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_objectType","Cy","Tf",function(){return P.re(C.nY)})
+I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
 I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w10().call$0()})
+I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().call$0()})
 I.$lazy($,"bindPattern","ZA","VC",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
 z.FV(0,C.va)
@@ -24743,20 +24901,24 @@
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
 I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
-I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().Aq.gcZ().gFP()})
+I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
 I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().call$0()})
 I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Uf(),"-",new K.Ra(),"*",new K.wJY(),"/",new K.zOQ(),"==",new K.W6o(),"!=",new K.MdQ(),">",new K.YJG(),">=",new K.DOe(),"<",new K.lPa(),"<=",new K.Ufa(),"||",new K.Raa(),"&&",new K.w0(),"|",new K.w4()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w5(),"-",new K.w7(),"!",new K.w9()],P.L5(null,null,null,null,null))})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().call$0()})
+I.$lazy($,"_BINARY_OPERATORS","AM","e6",function(){return H.B7(["+",new K.Ra(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return H.B7(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],P.L5(null,null,null,null,null))})
+I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.lP()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.C0(C.uE.gvc(C.uE),new M.Uf()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","sender","e","msg","message","x","record","value","memberName",{func:"pd",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_","objectId","id","members",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","compare","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone",!1,"futures","eagerError","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Vx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.e4,P.JB,null,P.MN]},"self","parent",{func:"aD",args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.e4,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.e4,P.JB,{func:"NT"}]},{func:"xN",ret:P.lO,args:[P.JB,P.e4,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.e4,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.e4,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"Re",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","sb","lead","tail",{func:"P2",ret:J.im,args:[P.Rz,P.Rz]},"formattedString",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"host","scheme","query","queryParameters","fragment","component","val","val1","val2",C.xM,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","onProgress","withCredentials","method","mimeType","requestHeaders","responseType","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","args","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.cX,K.Ae],args:[P.cX]},"classMirror","c","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","n","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","password","user","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","attributeFilter","attributeOldValue","attributes","characterData","characterDataOldValue","childList","subtree","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","collection","","separator",0,!0,"growable","fractionDigits","str","authentification","resume","portId","port","dataEvent","info",{func:"bh",args:[null,null]},"parameter","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,G.No,{func:"qo",ret:P.Z0},C.nJ,C.mI,{func:"Hw",args:[P.Z0]},{func:"Wy",ret:G.bv},{func:"Gt",args:[G.bv]},"ResponseError","errorType","label","row",[P.Z0,J.O,G.rj],[J.Q,G.kx],[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},{func:"NA",ret:G.CM},{func:"Ve",args:[G.CM]},{func:"I0",ret:J.O},{func:"cH",ret:J.im},{func:"Z5",args:[J.im]},"address","coverages","modelName",{func:"Tz",void:true,args:[null,null]},"st","timer","response",{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},{func:"EU",ret:P.iD},{func:"Y4",args:[P.iD]},"event","so",J.im,J.O,{func:"fP",ret:J.GW},{func:"Ku",args:[J.GW]},[J.Q,G.Q4],"calls","codes","instructionList","profileCode",{func:"VL",args:[G.kx,G.kx]},[J.Q,G.c2],C.Us,{func:"dt",ret:P.cX},"lineNumber","hits",{func:"cM",void:true,args:[P.Z0]},"k",[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",V.qC,{func:"ru",ret:G.mL},"E",P.Z0,G.bv,[P.Z0,J.O,W.cv],"done",B.Ur,H.Tp,"trace",J.kn,Q.xI,Z.KU,G.kx,{func:"bR",ret:G.kx},{func:"VI",args:[G.kx]},F.qbd,"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Ds,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"rm",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","elements","offset","comp","key1","key2",{func:"Q5",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"hs",ret:J.kn,args:[J.im]},"digit",{func:"an",ret:J.im,args:[J.im]},"part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",G.Q4,{func:"JA",ret:G.Q4},{func:"Qs",args:[G.Q4]},E.pv,F.Vfx,A.Urj,N.oub,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.c4r,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.Squ,S.Vf,R.Zt,"codeCaller",{func:"SR",args:[G.Vi]},J.Q,G.XN,{func:"r5",ret:J.Q},{func:"mR",args:[J.Q]},{func:"ub",void:true,args:[G.bv,J.im,P.Z0]},"totalSamples",{func:"F9",void:true,args:[G.bv]},{func:"bN",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.KUl,"profile",S.PO,Z.tuj,M.mHk,"logLevel","rec",{func:"IM",args:[N.HV]},G.mL,{func:"pu",args:[G.mL]},L.Vct,Z.uL,A.D13,A.WZq,A.pva,A.cda,A.qFb,A.rna,A.Vba,V.waa,{func:"wA",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"pT",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.JB]},{func:"Zg",args:[P.JB,P.e4,P.JB,{func:"Dv",args:[null]}]},{func:"S5",ret:J.kn,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"D8",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rj",void:true,args:[J.O,J.O]},"preventCascade",{func:"KT",void:true,args:[[P.cX,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"mM",args:[U.hw]},Q.V0,A.T5,G.rj,{func:"ls",ret:G.rj},{func:"PF",args:[G.rj]},{func:"Yg",ret:J.O,args:[G.c2]},U.oaa,"coverage",Q.Sq,K.q2,X.q3,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"Lr",ret:G.No},{func:"AfY",args:[G.No]},R.Dsd,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -24825,9 +24987,9 @@
   init.currentScript = currentScript;
 
   if (typeof dartMainRunner === "function") {
-    dartMainRunner(function() { H.oT(E.nE()); });
+    dartMainRunner((function(a){H.oT(E.nE(),a)}), []);
   } else {
-    H.oT(E.nE());
+    (function(a){H.oT(E.nE(),a)})([]);
   }
 })
 function init(){I.p={}
@@ -24955,41 +25117,41 @@
 $desc=$collectedClasses.qE
 if($desc instanceof Array)$desc=$desc[1]
 qE.prototype=$desc
-function pa(){}pa.builtin$cls="pa"
-if(!"name" in pa)pa.name="pa"
-$desc=$collectedClasses.pa
+function zw(){}zw.builtin$cls="zw"
+if(!"name" in zw)zw.name="zw"
+$desc=$collectedClasses.zw
 if($desc instanceof Array)$desc=$desc[1]
-pa.prototype=$desc
-function Gh(){}Gh.builtin$cls="Gh"
-if(!"name" in Gh)Gh.name="Gh"
-$desc=$collectedClasses.Gh
+zw.prototype=$desc
+function Ps(){}Ps.builtin$cls="Ps"
+if(!"name" in Ps)Ps.name="Ps"
+$desc=$collectedClasses.Ps
 if($desc instanceof Array)$desc=$desc[1]
-Gh.prototype=$desc
-Gh.prototype.gN=function(receiver){return receiver.target}
-Gh.prototype.gt5=function(receiver){return receiver.type}
-Gh.prototype.st5=function(receiver,v){return receiver.type=v}
-Gh.prototype.gcC=function(receiver){return receiver.hash}
-Gh.prototype.scC=function(receiver,v){return receiver.hash=v}
-Gh.prototype.gmH=function(receiver){return receiver.href}
+Ps.prototype=$desc
+Ps.prototype.gN=function(receiver){return receiver.target}
+Ps.prototype.gt5=function(receiver){return receiver.type}
+Ps.prototype.st5=function(receiver,v){return receiver.type=v}
+Ps.prototype.gcC=function(receiver){return receiver.hash}
+Ps.prototype.scC=function(receiver,v){return receiver.hash=v}
+Ps.prototype.gmH=function(receiver){return receiver.href}
 function A0(){}A0.builtin$cls="A0"
 if(!"name" in A0)A0.name="A0"
 $desc=$collectedClasses.A0
 if($desc instanceof Array)$desc=$desc[1]
 A0.prototype=$desc
-function na(){}na.builtin$cls="na"
-if(!"name" in na)na.name="na"
-$desc=$collectedClasses.na
+function Sb(){}Sb.builtin$cls="Sb"
+if(!"name" in Sb)Sb.name="Sb"
+$desc=$collectedClasses.Sb
 if($desc instanceof Array)$desc=$desc[1]
-na.prototype=$desc
-na.prototype.gN=function(receiver){return receiver.target}
-na.prototype.gcC=function(receiver){return receiver.hash}
-na.prototype.scC=function(receiver,v){return receiver.hash=v}
-na.prototype.gmH=function(receiver){return receiver.href}
-function Mr(){}Mr.builtin$cls="Mr"
-if(!"name" in Mr)Mr.name="Mr"
-$desc=$collectedClasses.Mr
+Sb.prototype=$desc
+Sb.prototype.gN=function(receiver){return receiver.target}
+Sb.prototype.gcC=function(receiver){return receiver.hash}
+Sb.prototype.scC=function(receiver,v){return receiver.hash=v}
+Sb.prototype.gmH=function(receiver){return receiver.href}
+function vp(){}vp.builtin$cls="vp"
+if(!"name" in vp)vp.name="vp"
+$desc=$collectedClasses.vp
 if($desc instanceof Array)$desc=$desc[1]
-Mr.prototype=$desc
+vp.prototype=$desc
 function zx(){}zx.builtin$cls="zx"
 if(!"name" in zx)zx.name="zx"
 $desc=$collectedClasses.zx
@@ -25013,22 +25175,22 @@
 if($desc instanceof Array)$desc=$desc[1]
 W2.prototype=$desc
 W2.prototype.gO3=function(receiver){return receiver.url}
-function it(){}it.builtin$cls="it"
-if(!"name" in it)it.name="it"
-$desc=$collectedClasses.it
+function zJ(){}zJ.builtin$cls="zJ"
+if(!"name" in zJ)zJ.name="zJ"
+$desc=$collectedClasses.zJ
 if($desc instanceof Array)$desc=$desc[1]
-it.prototype=$desc
+zJ.prototype=$desc
 function Az(){}Az.builtin$cls="Az"
 if(!"name" in Az)Az.name="Az"
 $desc=$collectedClasses.Az
 if($desc instanceof Array)$desc=$desc[1]
 Az.prototype=$desc
 Az.prototype.gt5=function(receiver){return receiver.type}
-function QP(){}QP.builtin$cls="QP"
-if(!"name" in QP)QP.name="QP"
-$desc=$collectedClasses.QP
+function Fy(){}Fy.builtin$cls="Fy"
+if(!"name" in Fy)Fy.name="Fy"
+$desc=$collectedClasses.Fy
 if($desc instanceof Array)$desc=$desc[1]
-QP.prototype=$desc
+Fy.prototype=$desc
 function QW(){}QW.builtin$cls="QW"
 if(!"name" in QW)QW.name="QW"
 $desc=$collectedClasses.QW
@@ -25041,11 +25203,11 @@
 QW.prototype.st5=function(receiver,v){return receiver.type=v}
 QW.prototype.gP=function(receiver){return receiver.value}
 QW.prototype.sP=function(receiver,v){return receiver.value=v}
-function jr(){}jr.builtin$cls="jr"
-if(!"name" in jr)jr.name="jr"
-$desc=$collectedClasses.jr
+function ca(){}ca.builtin$cls="ca"
+if(!"name" in ca)ca.name="ca"
+$desc=$collectedClasses.ca
 if($desc instanceof Array)$desc=$desc[1]
-jr.prototype=$desc
+ca.prototype=$desc
 function Ny(){}Ny.builtin$cls="Ny"
 if(!"name" in Ny)Ny.name="Ny"
 $desc=$collectedClasses.Ny
@@ -25069,12 +25231,12 @@
 $desc=$collectedClasses.BR
 if($desc instanceof Array)$desc=$desc[1]
 BR.prototype=$desc
-function di(){}di.builtin$cls="di"
-if(!"name" in di)di.name="di"
-$desc=$collectedClasses.di
+function wT(){}wT.builtin$cls="wT"
+if(!"name" in wT)wT.name="wT"
+$desc=$collectedClasses.wT
 if($desc instanceof Array)$desc=$desc[1]
-di.prototype=$desc
-di.prototype.gRn=function(receiver){return receiver.data}
+wT.prototype=$desc
+wT.prototype.gRn=function(receiver){return receiver.data}
 function d7(){}d7.builtin$cls="d7"
 if(!"name" in d7)d7.name="d7"
 $desc=$collectedClasses.d7
@@ -25101,21 +25263,21 @@
 if($desc instanceof Array)$desc=$desc[1]
 vHT.prototype=$desc
 vHT.prototype.gbG=function(receiver){return receiver.options}
-function n0(){}n0.builtin$cls="n0"
-if(!"name" in n0)n0.name="n0"
-$desc=$collectedClasses.n0
+function hh(){}hh.builtin$cls="hh"
+if(!"name" in hh)hh.name="hh"
+$desc=$collectedClasses.hh
 if($desc instanceof Array)$desc=$desc[1]
-n0.prototype=$desc
+hh.prototype=$desc
 function Em(){}Em.builtin$cls="Em"
 if(!"name" in Em)Em.name="Em"
 $desc=$collectedClasses.Em
 if($desc instanceof Array)$desc=$desc[1]
 Em.prototype=$desc
-function pt(){}pt.builtin$cls="pt"
-if(!"name" in pt)pt.name="pt"
-$desc=$collectedClasses.pt
+function NWk(){}NWk.builtin$cls="NWk"
+if(!"name" in NWk)NWk.name="NWk"
+$desc=$collectedClasses.NWk
 if($desc instanceof Array)$desc=$desc[1]
-pt.prototype=$desc
+NWk.prototype=$desc
 function rV(){}rV.builtin$cls="rV"
 if(!"name" in rV)rV.name="rV"
 $desc=$collectedClasses.rV
@@ -25207,27 +25369,27 @@
 if($desc instanceof Array)$desc=$desc[1]
 hH.prototype=$desc
 hH.prototype.goc=function(receiver){return receiver.name}
-function Aa(){}Aa.builtin$cls="Aa"
-if(!"name" in Aa)Aa.name="Aa"
-$desc=$collectedClasses.Aa
+function QU(){}QU.builtin$cls="QU"
+if(!"name" in QU)QU.name="QU"
+$desc=$collectedClasses.QU
 if($desc instanceof Array)$desc=$desc[1]
-Aa.prototype=$desc
-Aa.prototype.gtT=function(receiver){return receiver.code}
+QU.prototype=$desc
+QU.prototype.gtT=function(receiver){return receiver.code}
 function u5(){}u5.builtin$cls="u5"
 if(!"name" in u5)u5.name="u5"
 $desc=$collectedClasses.u5
 if($desc instanceof Array)$desc=$desc[1]
 u5.prototype=$desc
-function Tq(){}Tq.builtin$cls="Tq"
-if(!"name" in Tq)Tq.name="Tq"
-$desc=$collectedClasses.Tq
+function h4(){}h4.builtin$cls="h4"
+if(!"name" in h4)h4.name="h4"
+$desc=$collectedClasses.h4
 if($desc instanceof Array)$desc=$desc[1]
-Tq.prototype=$desc
-Tq.prototype.gB=function(receiver){return receiver.length}
-Tq.prototype.gbP=function(receiver){return receiver.method}
-Tq.prototype.goc=function(receiver){return receiver.name}
-Tq.prototype.soc=function(receiver,v){return receiver.name=v}
-Tq.prototype.gN=function(receiver){return receiver.target}
+h4.prototype=$desc
+h4.prototype.gB=function(receiver){return receiver.length}
+h4.prototype.gbP=function(receiver){return receiver.method}
+h4.prototype.goc=function(receiver){return receiver.name}
+h4.prototype.soc=function(receiver,v){return receiver.name=v}
+h4.prototype.gN=function(receiver){return receiver.target}
 function W4(){}W4.builtin$cls="W4"
 if(!"name" in W4)W4.name="W4"
 $desc=$collectedClasses.W4
@@ -25248,11 +25410,11 @@
 $desc=$collectedClasses.tA
 if($desc instanceof Array)$desc=$desc[1]
 tA.prototype=$desc
-function wa(){}wa.builtin$cls="wa"
-if(!"name" in wa)wa.name="wa"
-$desc=$collectedClasses.wa
+function xn(){}xn.builtin$cls="xn"
+if(!"name" in xn)xn.name="xn"
+$desc=$collectedClasses.xn
 if($desc instanceof Array)$desc=$desc[1]
-wa.prototype=$desc
+xn.prototype=$desc
 function Uq(){}Uq.builtin$cls="Uq"
 if(!"name" in Uq)Uq.name="Uq"
 $desc=$collectedClasses.Uq
@@ -25279,13 +25441,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
-zU.prototype.gys=function(receiver){return receiver.status}
-zU.prototype.gpo=function(receiver){return receiver.statusText}
-function rk(){}rk.builtin$cls="rk"
-if(!"name" in rk)rk.name="rk"
-$desc=$collectedClasses.rk
+function wa(){}wa.builtin$cls="wa"
+if(!"name" in wa)wa.name="wa"
+$desc=$collectedClasses.wa
 if($desc instanceof Array)$desc=$desc[1]
-rk.prototype=$desc
+wa.prototype=$desc
 function tX(){}tX.builtin$cls="tX"
 if(!"name" in tX)tX.name="tX"
 $desc=$collectedClasses.tX
@@ -25314,7 +25474,7 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
-Mi.prototype.gaK=function(receiver){return receiver.list}
+Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
 Mi.prototype.gLA=function(receiver){return receiver.src}
@@ -25403,12 +25563,12 @@
 if($desc instanceof Array)$desc=$desc[1]
 aB.prototype=$desc
 aB.prototype.gG1=function(receiver){return receiver.message}
-function fJ(){}fJ.builtin$cls="fJ"
-if(!"name" in fJ)fJ.name="fJ"
-$desc=$collectedClasses.fJ
+function W7(){}W7.builtin$cls="W7"
+if(!"name" in W7)W7.name="W7"
+$desc=$collectedClasses.W7
 if($desc instanceof Array)$desc=$desc[1]
-fJ.prototype=$desc
-fJ.prototype.gG1=function(receiver){return receiver.message}
+W7.prototype=$desc
+W7.prototype.gG1=function(receiver){return receiver.message}
 function BK(){}BK.builtin$cls="BK"
 if(!"name" in BK)BK.name="BK"
 $desc=$collectedClasses.BK
@@ -25420,6 +25580,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 Rv.prototype=$desc
 Rv.prototype.gjO=function(receiver){return receiver.id}
+Rv.prototype.gph=function(receiver){return receiver.label}
 function HO(){}HO.builtin$cls="HO"
 if(!"name" in HO)HO.name="HO"
 $desc=$collectedClasses.HO
@@ -25435,11 +25596,11 @@
 $desc=$collectedClasses.ZY
 if($desc instanceof Array)$desc=$desc[1]
 ZY.prototype=$desc
-function Hy(){}Hy.builtin$cls="Hy"
-if(!"name" in Hy)Hy.name="Hy"
-$desc=$collectedClasses.Hy
+function cx(){}cx.builtin$cls="cx"
+if(!"name" in cx)cx.name="cx"
+$desc=$collectedClasses.cx
 if($desc instanceof Array)$desc=$desc[1]
-Hy.prototype=$desc
+cx.prototype=$desc
 function EeC(){}EeC.builtin$cls="EeC"
 if(!"name" in EeC)EeC.name="EeC"
 $desc=$collectedClasses.EeC
@@ -25455,11 +25616,11 @@
 Qb.prototype=$desc
 Qb.prototype.gP=function(receiver){return receiver.value}
 Qb.prototype.sP=function(receiver,v){return receiver.value=v}
-function Vu(){}Vu.builtin$cls="Vu"
-if(!"name" in Vu)Vu.name="Vu"
-$desc=$collectedClasses.Vu
+function PG(){}PG.builtin$cls="PG"
+if(!"name" in PG)PG.name="PG"
+$desc=$collectedClasses.PG
 if($desc instanceof Array)$desc=$desc[1]
-Vu.prototype=$desc
+PG.prototype=$desc
 function xe(){}xe.builtin$cls="xe"
 if(!"name" in xe)xe.name="xe"
 $desc=$collectedClasses.xe
@@ -25476,42 +25637,42 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function Imr(){}Imr.builtin$cls="Imr"
-if(!"name" in Imr)Imr.name="Imr"
-$desc=$collectedClasses.Imr
+function ab(){}ab.builtin$cls="ab"
+if(!"name" in ab)ab.name="ab"
+$desc=$collectedClasses.ab
 if($desc instanceof Array)$desc=$desc[1]
-Imr.prototype=$desc
-Imr.prototype.gjO=function(receiver){return receiver.id}
-Imr.prototype.goc=function(receiver){return receiver.name}
-Imr.prototype.gt5=function(receiver){return receiver.type}
+ab.prototype=$desc
+ab.prototype.gjO=function(receiver){return receiver.id}
+ab.prototype.goc=function(receiver){return receiver.name}
+ab.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
 if($desc instanceof Array)$desc=$desc[1]
 Ve.prototype=$desc
-function CX(){}CX.builtin$cls="CX"
-if(!"name" in CX)CX.name="CX"
-$desc=$collectedClasses.CX
+function Wp(){}Wp.builtin$cls="Wp"
+if(!"name" in Wp)Wp.name="Wp"
+$desc=$collectedClasses.Wp
 if($desc instanceof Array)$desc=$desc[1]
-CX.prototype=$desc
+Wp.prototype=$desc
 function H9(){}H9.builtin$cls="H9"
 if(!"name" in H9)H9.name="H9"
 $desc=$collectedClasses.H9
 if($desc instanceof Array)$desc=$desc[1]
 H9.prototype=$desc
-function FI(){}FI.builtin$cls="FI"
-if(!"name" in FI)FI.name="FI"
-$desc=$collectedClasses.FI
+function o4(){}o4.builtin$cls="o4"
+if(!"name" in o4)o4.name="o4"
+$desc=$collectedClasses.o4
 if($desc instanceof Array)$desc=$desc[1]
-FI.prototype=$desc
-FI.prototype.gjL=function(receiver){return receiver.oldValue}
-FI.prototype.gN=function(receiver){return receiver.target}
-FI.prototype.gt5=function(receiver){return receiver.type}
-function oU(){}oU.builtin$cls="oU"
-if(!"name" in oU)oU.name="oU"
-$desc=$collectedClasses.oU
+o4.prototype=$desc
+o4.prototype.gjL=function(receiver){return receiver.oldValue}
+o4.prototype.gN=function(receiver){return receiver.target}
+o4.prototype.gt5=function(receiver){return receiver.type}
+function Q0(){}Q0.builtin$cls="Q0"
+if(!"name" in Q0)Q0.name="Q0"
+$desc=$collectedClasses.Q0
 if($desc instanceof Array)$desc=$desc[1]
-oU.prototype=$desc
+Q0.prototype=$desc
 function ih(){}ih.builtin$cls="ih"
 if(!"name" in ih)ih.name="ih"
 $desc=$collectedClasses.ih
@@ -25559,6 +25720,8 @@
 $desc=$collectedClasses.l9
 if($desc instanceof Array)$desc=$desc[1]
 l9.prototype=$desc
+l9.prototype.gph=function(receiver){return receiver.label}
+l9.prototype.sph=function(receiver,v){return receiver.label=v}
 function Ql(){}Ql.builtin$cls="Ql"
 if(!"name" in Ql)Ql.name="Ql"
 $desc=$collectedClasses.Ql
@@ -25566,6 +25729,8 @@
 Ql.prototype=$desc
 Ql.prototype.gMB=function(receiver){return receiver.form}
 Ql.prototype.gvH=function(receiver){return receiver.index}
+Ql.prototype.gph=function(receiver){return receiver.label}
+Ql.prototype.sph=function(receiver,v){return receiver.label=v}
 Ql.prototype.gP=function(receiver){return receiver.value}
 Ql.prototype.sP=function(receiver,v){return receiver.value=v}
 function Xp(){}Xp.builtin$cls="Xp"
@@ -25584,11 +25749,11 @@
 $desc=$collectedClasses.bP
 if($desc instanceof Array)$desc=$desc[1]
 bP.prototype=$desc
-function FH(){}FH.builtin$cls="FH"
-if(!"name" in FH)FH.name="FH"
-$desc=$collectedClasses.FH
+function mX(){}mX.builtin$cls="mX"
+if(!"name" in mX)mX.name="mX"
+$desc=$collectedClasses.mX
 if($desc instanceof Array)$desc=$desc[1]
-FH.prototype=$desc
+mX.prototype=$desc
 function SN(){}SN.builtin$cls="SN"
 if(!"name" in SN)SN.name="SN"
 $desc=$collectedClasses.SN
@@ -25615,11 +25780,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function GT(){}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+GT.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25703,36 +25868,50 @@
 if($desc instanceof Array)$desc=$desc[1]
 I0.prototype=$desc
 I0.prototype.gpQ=function(receiver){return receiver.applyAuthorStyles}
-function CY(){}CY.builtin$cls="CY"
-if(!"name" in CY)CY.name="CY"
-$desc=$collectedClasses.CY
+function QR(){}QR.builtin$cls="QR"
+if(!"name" in QR)QR.name="QR"
+$desc=$collectedClasses.QR
 if($desc instanceof Array)$desc=$desc[1]
-CY.prototype=$desc
-CY.prototype.gLA=function(receiver){return receiver.src}
-CY.prototype.gt5=function(receiver){return receiver.type}
-CY.prototype.st5=function(receiver,v){return receiver.type=v}
-function Wt(){}Wt.builtin$cls="Wt"
-if(!"name" in Wt)Wt.name="Wt"
-$desc=$collectedClasses.Wt
+QR.prototype=$desc
+QR.prototype.gLA=function(receiver){return receiver.src}
+QR.prototype.gt5=function(receiver){return receiver.type}
+QR.prototype.st5=function(receiver,v){return receiver.type=v}
+function Sc(){}Sc.builtin$cls="Sc"
+if(!"name" in Sc)Sc.name="Sc"
+$desc=$collectedClasses.Sc
 if($desc instanceof Array)$desc=$desc[1]
-Wt.prototype=$desc
+Sc.prototype=$desc
 function uaa(){}uaa.builtin$cls="uaa"
 if(!"name" in uaa)uaa.name="uaa"
 $desc=$collectedClasses.uaa
 if($desc instanceof Array)$desc=$desc[1]
 uaa.prototype=$desc
-function Hd(){}Hd.builtin$cls="Hd"
-if(!"name" in Hd)Hd.name="Hd"
-$desc=$collectedClasses.Hd
+uaa.prototype.gPK=function(receiver){return receiver.results}
+function yg(){}yg.builtin$cls="yg"
+if(!"name" in yg)yg.name="yg"
+$desc=$collectedClasses.yg
 if($desc instanceof Array)$desc=$desc[1]
-Hd.prototype=$desc
-Hd.prototype.gkc=function(receiver){return receiver.error}
-Hd.prototype.gG1=function(receiver){return receiver.message}
+yg.prototype=$desc
+function mG(){}mG.builtin$cls="mG"
+if(!"name" in mG)mG.name="mG"
+$desc=$collectedClasses.mG
+if($desc instanceof Array)$desc=$desc[1]
+mG.prototype=$desc
+mG.prototype.gkc=function(receiver){return receiver.error}
+mG.prototype.gG1=function(receiver){return receiver.message}
 function Ul(){}Ul.builtin$cls="Ul"
 if(!"name" in Ul)Ul.name="Ul"
 $desc=$collectedClasses.Ul
 if($desc instanceof Array)$desc=$desc[1]
 Ul.prototype=$desc
+Ul.prototype.gPK=function(receiver){return receiver.results}
+function uj(){}uj.builtin$cls="uj"
+if(!"name" in uj)uj.name="uj"
+$desc=$collectedClasses.uj
+if($desc instanceof Array)$desc=$desc[1]
+uj.prototype=$desc
+uj.prototype.gV5=function(receiver){return receiver.isFinal}
+uj.prototype.gB=function(receiver){return receiver.length}
 function G5(){}G5.builtin$cls="G5"
 if(!"name" in G5)G5.name="G5"
 $desc=$collectedClasses.G5
@@ -25755,11 +25934,11 @@
 Lx.prototype=$desc
 Lx.prototype.gt5=function(receiver){return receiver.type}
 Lx.prototype.st5=function(receiver,v){return receiver.type=v}
-function Er(){}Er.builtin$cls="Er"
-if(!"name" in Er)Er.name="Er"
-$desc=$collectedClasses.Er
+function fh(){}fh.builtin$cls="fh"
+if(!"name" in fh)fh.name="fh"
+$desc=$collectedClasses.fh
 if($desc instanceof Array)$desc=$desc[1]
-Er.prototype=$desc
+fh.prototype=$desc
 function qk(){}qk.builtin$cls="qk"
 if(!"name" in qk)qk.name="qk"
 $desc=$collectedClasses.qk
@@ -25780,11 +25959,11 @@
 $desc=$collectedClasses.tV
 if($desc instanceof Array)$desc=$desc[1]
 tV.prototype=$desc
-function KP(){}KP.builtin$cls="KP"
-if(!"name" in KP)KP.name="KP"
-$desc=$collectedClasses.KP
+function BT(){}BT.builtin$cls="BT"
+if(!"name" in BT)BT.name="BT"
+$desc=$collectedClasses.BT
 if($desc instanceof Array)$desc=$desc[1]
-KP.prototype=$desc
+BT.prototype=$desc
 function yY(){}yY.builtin$cls="yY"
 if(!"name" in yY)yY.name="yY"
 $desc=$collectedClasses.yY
@@ -25815,11 +25994,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 xV.prototype=$desc
 xV.prototype.gRn=function(receiver){return receiver.data}
-function Dn(){}Dn.builtin$cls="Dn"
-if(!"name" in Dn)Dn.name="Dn"
-$desc=$collectedClasses.Dn
+function FH(){}FH.builtin$cls="FH"
+if(!"name" in FH)FH.name="FH"
+$desc=$collectedClasses.FH
 if($desc instanceof Array)$desc=$desc[1]
-Dn.prototype=$desc
+FH.prototype=$desc
 function y6(){}y6.builtin$cls="y6"
 if(!"name" in y6)y6.name="y6"
 $desc=$collectedClasses.y6
@@ -25832,6 +26011,8 @@
 RH.prototype=$desc
 RH.prototype.gfY=function(receiver){return receiver.kind}
 RH.prototype.sfY=function(receiver,v){return receiver.kind=v}
+RH.prototype.gph=function(receiver){return receiver.label}
+RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
 function pU(){}pU.builtin$cls="pU"
 if(!"name" in pU)pU.name="pU"
@@ -25843,11 +26024,11 @@
 $desc=$collectedClasses.OJ
 if($desc instanceof Array)$desc=$desc[1]
 OJ.prototype=$desc
-function Qa(){}Qa.builtin$cls="Qa"
-if(!"name" in Qa)Qa.name="Qa"
-$desc=$collectedClasses.Qa
+function Mf(){}Mf.builtin$cls="Mf"
+if(!"name" in Mf)Mf.name="Mf"
+$desc=$collectedClasses.Mf
 if($desc instanceof Array)$desc=$desc[1]
-Qa.prototype=$desc
+Mf.prototype=$desc
 function dp(){}dp.builtin$cls="dp"
 if(!"name" in dp)dp.name="dp"
 $desc=$collectedClasses.dp
@@ -25863,11 +26044,11 @@
 $desc=$collectedClasses.aG
 if($desc instanceof Array)$desc=$desc[1]
 aG.prototype=$desc
-function J6(){}J6.builtin$cls="J6"
-if(!"name" in J6)J6.name="J6"
-$desc=$collectedClasses.J6
+function fA(){}fA.builtin$cls="fA"
+if(!"name" in fA)fA.name="fA"
+$desc=$collectedClasses.fA
 if($desc instanceof Array)$desc=$desc[1]
-J6.prototype=$desc
+fA.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -25875,7 +26056,6 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
-u9.prototype.gys=function(receiver){return receiver.status}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -25884,11 +26064,11 @@
 Bn.prototype.goc=function(receiver){return receiver.name}
 Bn.prototype.gP=function(receiver){return receiver.value}
 Bn.prototype.sP=function(receiver,v){return receiver.value=v}
-function hq(){}hq.builtin$cls="hq"
-if(!"name" in hq)hq.name="hq"
-$desc=$collectedClasses.hq
+function Eb(){}Eb.builtin$cls="Eb"
+if(!"name" in Eb)Eb.name="Eb"
+$desc=$collectedClasses.Eb
 if($desc instanceof Array)$desc=$desc[1]
-hq.prototype=$desc
+Eb.prototype=$desc
 function UL(){}UL.builtin$cls="UL"
 if(!"name" in UL)UL.name="UL"
 $desc=$collectedClasses.UL
@@ -25924,21 +26104,31 @@
 $desc=$collectedClasses.F2
 if($desc instanceof Array)$desc=$desc[1]
 F2.prototype=$desc
-function nL(){}nL.builtin$cls="nL"
-if(!"name" in nL)nL.name="nL"
-$desc=$collectedClasses.nL
+function VB(){}VB.builtin$cls="VB"
+if(!"name" in VB)VB.name="VB"
+$desc=$collectedClasses.VB
 if($desc instanceof Array)$desc=$desc[1]
-nL.prototype=$desc
-function QV(){}QV.builtin$cls="QV"
-if(!"name" in QV)QV.name="QV"
-$desc=$collectedClasses.QV
+VB.prototype=$desc
+function Cy(){}Cy.builtin$cls="Cy"
+if(!"name" in Cy)Cy.name="Cy"
+$desc=$collectedClasses.Cy
 if($desc instanceof Array)$desc=$desc[1]
-QV.prototype=$desc
+Cy.prototype=$desc
 function q0(){}q0.builtin$cls="q0"
 if(!"name" in q0)q0.name="q0"
 $desc=$collectedClasses.q0
 if($desc instanceof Array)$desc=$desc[1]
 q0.prototype=$desc
+function c5(){}c5.builtin$cls="c5"
+if(!"name" in c5)c5.name="c5"
+$desc=$collectedClasses.c5
+if($desc instanceof Array)$desc=$desc[1]
+c5.prototype=$desc
+function LO(){}LO.builtin$cls="LO"
+if(!"name" in LO)LO.name="LO"
+$desc=$collectedClasses.LO
+if($desc instanceof Array)$desc=$desc[1]
+LO.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -25977,11 +26167,11 @@
 $desc=$collectedClasses.NE
 if($desc instanceof Array)$desc=$desc[1]
 NE.prototype=$desc
-function lC(){}lC.builtin$cls="lC"
-if(!"name" in lC)lC.name="lC"
-$desc=$collectedClasses.lC
+function Ak(){}Ak.builtin$cls="Ak"
+if(!"name" in Ak)Ak.name="Ak"
+$desc=$collectedClasses.Ak
 if($desc instanceof Array)$desc=$desc[1]
-lC.prototype=$desc
+Ak.prototype=$desc
 function y5(){}y5.builtin$cls="y5"
 if(!"name" in y5)y5.name="y5"
 $desc=$collectedClasses.y5
@@ -26002,11 +26192,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function mk(){}mk.builtin$cls="mk"
-if(!"name" in mk)mk.name="mk"
-$desc=$collectedClasses.mk
+function vO(){}vO.builtin$cls="vO"
+if(!"name" in vO)vO.name="vO"
+$desc=$collectedClasses.vO
 if($desc instanceof Array)$desc=$desc[1]
-mk.prototype=$desc
+vO.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26032,13 +26222,13 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
-function bd(){}bd.builtin$cls="bd"
-if(!"name" in bd)bd.name="bd"
-$desc=$collectedClasses.bd
+function lv(){}lv.builtin$cls="lv"
+if(!"name" in lv)lv.name="lv"
+$desc=$collectedClasses.lv
 if($desc instanceof Array)$desc=$desc[1]
-bd.prototype=$desc
-bd.prototype.gt5=function(receiver){return receiver.type}
-bd.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype=$desc
+lv.prototype.gt5=function(receiver){return receiver.type}
+lv.prototype.gUQ=function(receiver){return receiver.values}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
@@ -26060,11 +26250,11 @@
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
-function wf(){}wf.builtin$cls="wf"
-if(!"name" in wf)wf.name="wf"
-$desc=$collectedClasses.wf
+function kK(){}kK.builtin$cls="kK"
+if(!"name" in kK)kK.name="kK"
+$desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
-wf.prototype=$desc
+kK.prototype=$desc
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26075,11 +26265,11 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
-function Ic(){}Ic.builtin$cls="Ic"
-if(!"name" in Ic)Ic.name="Ic"
-$desc=$collectedClasses.Ic
+function NdT(){}NdT.builtin$cls="NdT"
+if(!"name" in NdT)NdT.name="NdT"
+$desc=$collectedClasses.NdT
 if($desc instanceof Array)$desc=$desc[1]
-Ic.prototype=$desc
+NdT.prototype=$desc
 function lc(){}lc.builtin$cls="lc"
 if(!"name" in lc)lc.name="lc"
 $desc=$collectedClasses.lc
@@ -26095,11 +26285,11 @@
 $desc=$collectedClasses.qM
 if($desc instanceof Array)$desc=$desc[1]
 qM.prototype=$desc
-function tk(){}tk.builtin$cls="tk"
-if(!"name" in tk)tk.name="tk"
-$desc=$collectedClasses.tk
+function Ob(){}Ob.builtin$cls="Ob"
+if(!"name" in Ob)Ob.name="Ob"
+$desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
-tk.prototype=$desc
+Ob.prototype=$desc
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
@@ -26111,11 +26301,11 @@
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
-function nh(){}nh.builtin$cls="nh"
-if(!"name" in nh)nh.name="nh"
-$desc=$collectedClasses.nh
+function NY(){}NY.builtin$cls="NY"
+if(!"name" in NY)NY.name="NY"
+$desc=$collectedClasses.NY
 if($desc instanceof Array)$desc=$desc[1]
-nh.prototype=$desc
+NY.prototype=$desc
 function EI(){}EI.builtin$cls="EI"
 if(!"name" in EI)EI.name="EI"
 $desc=$collectedClasses.EI
@@ -26127,26 +26317,26 @@
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
-function Ub(){}Ub.builtin$cls="Ub"
-if(!"name" in Ub)Ub.name="Ub"
-$desc=$collectedClasses.Ub
+function rg(){}rg.builtin$cls="rg"
+if(!"name" in rg)rg.name="rg"
+$desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
-Ub.prototype=$desc
-function kK(){}kK.builtin$cls="kK"
-if(!"name" in kK)kK.name="kK"
-$desc=$collectedClasses.kK
-if($desc instanceof Array)$desc=$desc[1]
-kK.prototype=$desc
-function eW(){}eW.builtin$cls="eW"
-if(!"name" in eW)eW.name="eW"
-$desc=$collectedClasses.eW
-if($desc instanceof Array)$desc=$desc[1]
-eW.prototype=$desc
+rg.prototype=$desc
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+function eW(){}eW.builtin$cls="eW"
+if(!"name" in eW)eW.name="eW"
+$desc=$collectedClasses.eW
+if($desc instanceof Array)$desc=$desc[1]
+eW.prototype=$desc
+function kL(){}kL.builtin$cls="kL"
+if(!"name" in kL)kL.name="kL"
+$desc=$collectedClasses.kL
+if($desc instanceof Array)$desc=$desc[1]
+kL.prototype=$desc
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
@@ -26195,11 +26385,11 @@
 $desc=$collectedClasses.vd
 if($desc instanceof Array)$desc=$desc[1]
 vd.prototype=$desc
-function uzr(){}uzr.builtin$cls="uzr"
-if(!"name" in uzr)uzr.name="uzr"
-$desc=$collectedClasses.uzr
+function Jq(){}Jq.builtin$cls="Jq"
+if(!"name" in Jq)Jq.name="Jq"
+$desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
-uzr.prototype=$desc
+Jq.prototype=$desc
 function Yd(){}Yd.builtin$cls="Yd"
 if(!"name" in Yd)Yd.name="Yd"
 $desc=$collectedClasses.Yd
@@ -26210,11 +26400,11 @@
 $desc=$collectedClasses.kN
 if($desc instanceof Array)$desc=$desc[1]
 kN.prototype=$desc
-function lZ(){}lZ.builtin$cls="lZ"
-if(!"name" in lZ)lZ.name="lZ"
-$desc=$collectedClasses.lZ
+function AW(){}AW.builtin$cls="AW"
+if(!"name" in AW)AW.name="AW"
+$desc=$collectedClasses.AW
 if($desc instanceof Array)$desc=$desc[1]
-lZ.prototype=$desc
+AW.prototype=$desc
 function Gr(){}Gr.builtin$cls="Gr"
 if(!"name" in Gr)Gr.name="Gr"
 $desc=$collectedClasses.Gr
@@ -26226,11 +26416,11 @@
 $desc=$collectedClasses.XE
 if($desc instanceof Array)$desc=$desc[1]
 XE.prototype=$desc
-function mO(){}mO.builtin$cls="mO"
-if(!"name" in mO)mO.name="mO"
-$desc=$collectedClasses.mO
+function GH(){}GH.builtin$cls="GH"
+if(!"name" in GH)GH.name="GH"
+$desc=$collectedClasses.GH
 if($desc instanceof Array)$desc=$desc[1]
-mO.prototype=$desc
+GH.prototype=$desc
 function lo(){}lo.builtin$cls="lo"
 if(!"name" in lo)lo.name="lo"
 $desc=$collectedClasses.lo
@@ -26318,11 +26508,11 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
-function tL(){}tL.builtin$cls="tL"
-if(!"name" in tL)tL.name="tL"
-$desc=$collectedClasses.tL
+function Dn(){}Dn.builtin$cls="Dn"
+if(!"name" in Dn)Dn.name="Dn"
+$desc=$collectedClasses.Dn
 if($desc instanceof Array)$desc=$desc[1]
-tL.prototype=$desc
+Dn.prototype=$desc
 function pyk(){}pyk.builtin$cls="pyk"
 if(!"name" in pyk)pyk.name="pyk"
 $desc=$collectedClasses.pyk
@@ -26334,11 +26524,11 @@
 $desc=$collectedClasses.ZD
 if($desc instanceof Array)$desc=$desc[1]
 ZD.prototype=$desc
-function rD(){}rD.builtin$cls="rD"
-if(!"name" in rD)rD.name="rD"
-$desc=$collectedClasses.rD
+function Rlr(){}Rlr.builtin$cls="Rlr"
+if(!"name" in Rlr)Rlr.name="Rlr"
+$desc=$collectedClasses.Rlr
 if($desc instanceof Array)$desc=$desc[1]
-rD.prototype=$desc
+Rlr.prototype=$desc
 function wD(){}wD.builtin$cls="wD"
 if(!"name" in wD)wD.name="wD"
 $desc=$collectedClasses.wD
@@ -26370,11 +26560,11 @@
 $desc=$collectedClasses.mj
 if($desc instanceof Array)$desc=$desc[1]
 mj.prototype=$desc
-function cB(){}cB.builtin$cls="cB"
-if(!"name" in cB)cB.name="cB"
-$desc=$collectedClasses.cB
+function hW(){}hW.builtin$cls="hW"
+if(!"name" in hW)hW.name="hW"
+$desc=$collectedClasses.hW
 if($desc instanceof Array)$desc=$desc[1]
-cB.prototype=$desc
+hW.prototype=$desc
 function uY(){}uY.builtin$cls="uY"
 if(!"name" in uY)uY.name="uY"
 $desc=$collectedClasses.uY
@@ -26385,11 +26575,11 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function GK(){}GK.builtin$cls="GK"
-if(!"name" in GK)GK.name="GK"
-$desc=$collectedClasses.GK
+function AX(){}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-GK.prototype=$desc
+AX.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
@@ -26425,21 +26615,21 @@
 $desc=$collectedClasses.xt
 if($desc instanceof Array)$desc=$desc[1]
 xt.prototype=$desc
-function VJ(){}VJ.builtin$cls="VJ"
-if(!"name" in VJ)VJ.name="VJ"
-$desc=$collectedClasses.VJ
+function tG(){}tG.builtin$cls="tG"
+if(!"name" in tG)tG.name="tG"
+$desc=$collectedClasses.tG
 if($desc instanceof Array)$desc=$desc[1]
-VJ.prototype=$desc
+tG.prototype=$desc
 function P0(){}P0.builtin$cls="P0"
 if(!"name" in P0)P0.name="P0"
 $desc=$collectedClasses.P0
 if($desc instanceof Array)$desc=$desc[1]
 P0.prototype=$desc
-function xlX(){}xlX.builtin$cls="xlX"
-if(!"name" in xlX)xlX.name="xlX"
-$desc=$collectedClasses.xlX
+function kh(){}kh.builtin$cls="kh"
+if(!"name" in kh)kh.name="kh"
+$desc=$collectedClasses.kh
 if($desc instanceof Array)$desc=$desc[1]
-xlX.prototype=$desc
+kh.prototype=$desc
 function SQ(){}SQ.builtin$cls="SQ"
 if(!"name" in SQ)SQ.name="SQ"
 $desc=$collectedClasses.SQ
@@ -26492,16 +26682,16 @@
 $desc=$collectedClasses.dE
 if($desc instanceof Array)$desc=$desc[1]
 dE.prototype=$desc
-function Eb(){}Eb.builtin$cls="Eb"
-if(!"name" in Eb)Eb.name="Eb"
-$desc=$collectedClasses.Eb
+function IJ(){}IJ.builtin$cls="IJ"
+if(!"name" in IJ)IJ.name="IJ"
+$desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
-Eb.prototype=$desc
-function dT(){}dT.builtin$cls="dT"
-if(!"name" in dT)dT.name="dT"
-$desc=$collectedClasses.dT
+IJ.prototype=$desc
+function aH(){}aH.builtin$cls="aH"
+if(!"name" in aH)aH.name="aH"
+$desc=$collectedClasses.aH
 if($desc instanceof Array)$desc=$desc[1]
-dT.prototype=$desc
+aH.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26593,11 +26783,11 @@
 $desc=$collectedClasses.vT
 if($desc instanceof Array)$desc=$desc[1]
 vT.prototype=$desc
-function qa(){}qa.builtin$cls="qa"
-if(!"name" in qa)qa.name="qa"
-$desc=$collectedClasses.qa
+function VP(){}VP.builtin$cls="VP"
+if(!"name" in VP)VP.name="VP"
+$desc=$collectedClasses.VP
 if($desc instanceof Array)$desc=$desc[1]
-qa.prototype=$desc
+VP.prototype=$desc
 function BQ(){}BQ.builtin$cls="BQ"
 if(!"name" in BQ)BQ.name="BQ"
 $desc=$collectedClasses.BQ
@@ -26608,12 +26798,14 @@
 $desc=$collectedClasses.O
 if($desc instanceof Array)$desc=$desc[1]
 O.prototype=$desc
-function PK(a){this.a=a}PK.builtin$cls="PK"
+function PK(a,b){this.a=a
+this.b=b}PK.builtin$cls="PK"
 if(!"name" in PK)PK.name="PK"
 $desc=$collectedClasses.PK
 if($desc instanceof Array)$desc=$desc[1]
 PK.prototype=$desc
-function JO(b){this.b=b}JO.builtin$cls="JO"
+function JO(a,c){this.a=a
+this.c=c}JO.builtin$cls="JO"
 if(!"name" in JO)JO.name="JO"
 $desc=$collectedClasses.JO
 if($desc instanceof Array)$desc=$desc[1]
@@ -26635,18 +26827,21 @@
 $desc=$collectedClasses.f0
 if($desc instanceof Array)$desc=$desc[1]
 f0.prototype=$desc
-f0.prototype.gi2=function(){return this.i2}
-f0.prototype.si2=function(v){return this.i2=v}
+f0.prototype.gi2=function(receiver){return this.i2}
+f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,RW,C9,lJ){this.jO=jO
+function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
 this.Qy=Qy
+this.PX=PX
 this.RW=RW
 this.C9=C9
-this.lJ=lJ}aX.builtin$cls="aX"
+this.lJ=lJ
+this.Jp=Jp
+this.pa=pa}aX.builtin$cls="aX"
 if(!"name" in aX)aX.name="aX"
 $desc=$collectedClasses.aX
 if($desc instanceof Array)$desc=$desc[1]
@@ -26656,8 +26851,13 @@
 aX.prototype.gEE=function(){return this.EE}
 aX.prototype.gRW=function(){return this.RW}
 aX.prototype.gC9=function(){return this.C9}
-function cC(Rk,bZ){this.Rk=Rk
-this.bZ=bZ}cC.builtin$cls="cC"
+function oU(a){this.a=a}oU.builtin$cls="oU"
+if(!"name" in oU)oU.name="oU"
+$desc=$collectedClasses.oU
+if($desc instanceof Array)$desc=$desc[1]
+oU.prototype=$desc
+function cC(Rk,GL){this.Rk=Rk
+this.GL=GL}cC.builtin$cls="cC"
 if(!"name" in cC)cC.name="cC"
 $desc=$collectedClasses.cC
 if($desc instanceof Array)$desc=$desc[1]
@@ -26667,15 +26867,15 @@
 $desc=$collectedClasses.RA
 if($desc instanceof Array)$desc=$desc[1]
 RA.prototype=$desc
-function IY(Aq,i3,G1){this.Aq=Aq
+function IY(F1,i3,G1){this.F1=F1
 this.i3=i3
 this.G1=G1}IY.builtin$cls="IY"
 if(!"name" in IY)IY.name="IY"
 $desc=$collectedClasses.IY
 if($desc instanceof Array)$desc=$desc[1]
 IY.prototype=$desc
-IY.prototype.gAq=function(receiver){return this.Aq}
-IY.prototype.sAq=function(receiver,v){return this.Aq=v}
+IY.prototype.gF1=function(receiver){return this.F1}
+IY.prototype.sF1=function(receiver,v){return this.F1=v}
 IY.prototype.gG1=function(receiver){return this.G1}
 IY.prototype.sG1=function(receiver,v){return this.G1=v}
 function JH(){}JH.builtin$cls="JH"
@@ -26683,15 +26883,24 @@
 $desc=$collectedClasses.JH
 if($desc instanceof Array)$desc=$desc[1]
 JH.prototype=$desc
-function jl(a,b,c,d,e){this.a=a
+function jl(a,b,c,d,e,f){this.a=a
 this.b=b
 this.c=c
 this.d=d
-this.e=e}jl.builtin$cls="jl"
+this.e=e
+this.f=f}jl.builtin$cls="jl"
 if(!"name" in jl)jl.name="jl"
 $desc=$collectedClasses.jl
 if($desc instanceof Array)$desc=$desc[1]
 jl.prototype=$desc
+function Vg(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}Vg.builtin$cls="Vg"
+if(!"name" in Vg)Vg.name="Vg"
+$desc=$collectedClasses.Vg
+if($desc instanceof Array)$desc=$desc[1]
+Vg.prototype=$desc
 function Iy(){}Iy.builtin$cls="Iy"
 if(!"name" in Iy)Iy.name="Iy"
 $desc=$collectedClasses.Iy
@@ -26757,22 +26966,22 @@
 $desc=$collectedClasses.HU
 if($desc instanceof Array)$desc=$desc[1]
 HU.prototype=$desc
-function oo(){}oo.builtin$cls="oo"
-if(!"name" in oo)oo.name="oo"
-$desc=$collectedClasses.oo
+function Nt(){}Nt.builtin$cls="Nt"
+if(!"name" in Nt)Nt.name="Nt"
+$desc=$collectedClasses.Nt
 if($desc instanceof Array)$desc=$desc[1]
-oo.prototype=$desc
+Nt.prototype=$desc
 function OW(a,b){this.a=a
 this.b=b}OW.builtin$cls="OW"
 if(!"name" in OW)OW.name="OW"
 $desc=$collectedClasses.OW
 if($desc instanceof Array)$desc=$desc[1]
 OW.prototype=$desc
-function Dd(){}Dd.builtin$cls="Dd"
-if(!"name" in Dd)Dd.name="Dd"
-$desc=$collectedClasses.Dd
+function Tf(){}Tf.builtin$cls="Tf"
+if(!"name" in Tf)Tf.name="Tf"
+$desc=$collectedClasses.Tf
 if($desc instanceof Array)$desc=$desc[1]
-Dd.prototype=$desc
+Tf.prototype=$desc
 function AP(){}AP.builtin$cls="AP"
 if(!"name" in AP)AP.name="AP"
 $desc=$collectedClasses.AP
@@ -26831,18 +27040,12 @@
 if($desc instanceof Array)$desc=$desc[1]
 LPe.prototype=$desc
 LPe.prototype.gB=function(receiver){return this.B}
-function bw(a,b){this.a=a
-this.b=b}bw.builtin$cls="bw"
-if(!"name" in bw)bw.name="bw"
-$desc=$collectedClasses.bw
+function LD(a,b){this.a=a
+this.b=b}LD.builtin$cls="LD"
+if(!"name" in LD)LD.name="LD"
+$desc=$collectedClasses.LD
 if($desc instanceof Array)$desc=$desc[1]
-bw.prototype=$desc
-function WT(a,b){this.a=a
-this.b=b}WT.builtin$cls="WT"
-if(!"name" in WT)WT.name="WT"
-$desc=$collectedClasses.WT
-if($desc instanceof Array)$desc=$desc[1]
-WT.prototype=$desc
+LD.prototype=$desc
 function jJ(a){this.a=a}jJ.builtin$cls="jJ"
 if(!"name" in jJ)jJ.name="jJ"
 $desc=$collectedClasses.jJ
@@ -26887,18 +27090,26 @@
 $desc=$collectedClasses.F3
 if($desc instanceof Array)$desc=$desc[1]
 F3.prototype=$desc
-function FD(mr,Rn,XZ,Rv,hG,Mo,AM){this.mr=mr
+function FD(mr,Rn,XZ,Rv,hG,Mo,AM,NE){this.mr=mr
 this.Rn=Rn
 this.XZ=XZ
 this.Rv=Rv
 this.hG=hG
 this.Mo=Mo
-this.AM=AM}FD.builtin$cls="FD"
+this.AM=AM
+this.NE=NE}FD.builtin$cls="FD"
 if(!"name" in FD)FD.name="FD"
 $desc=$collectedClasses.FD
 if($desc instanceof Array)$desc=$desc[1]
 FD.prototype=$desc
 FD.prototype.gRn=function(receiver){return this.Rn}
+function Nv(a,b,c){this.a=a
+this.b=b
+this.c=c}Nv.builtin$cls="Nv"
+if(!"name" in Nv)Nv.name="Nv"
+$desc=$collectedClasses.Nv
+if($desc instanceof Array)$desc=$desc[1]
+Nv.prototype=$desc
 function Cj(a,b,c){this.a=a
 this.b=b
 this.c=c}Cj.builtin$cls="Cj"
@@ -27007,22 +27218,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(Jy){this.Jy=Jy}Ll.builtin$cls="Ll"
+function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
 if(!"name" in Ll)Ll.name="Ll"
 $desc=$collectedClasses.Ll
 if($desc instanceof Array)$desc=$desc[1]
 Ll.prototype=$desc
-function dN(Jy){this.Jy=Jy}dN.builtin$cls="dN"
-if(!"name" in dN)dN.name="dN"
-$desc=$collectedClasses.dN
+function D2(QW){this.QW=QW}D2.builtin$cls="D2"
+if(!"name" in D2)D2.name="D2"
+$desc=$collectedClasses.D2
 if($desc instanceof Array)$desc=$desc[1]
-dN.prototype=$desc
-function GT(oc){this.oc=oc}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+D2.prototype=$desc
+function my(oc){this.oc=oc}my.builtin$cls="my"
+if(!"name" in my)my.name="my"
+$desc=$collectedClasses.my
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
-GT.prototype.goc=function(receiver){return this.oc}
+my.prototype=$desc
+my.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27118,7 +27329,6 @@
 $desc=$collectedClasses.EK
 if($desc instanceof Array)$desc=$desc[1]
 EK.prototype=$desc
-EK.prototype.gQK=function(){return this.QK}
 function KW(Gf,rv){this.Gf=Gf
 this.rv=rv}KW.builtin$cls="KW"
 if(!"name" in KW)KW.name="KW"
@@ -27139,19 +27349,19 @@
 $desc=$collectedClasses.tQ
 if($desc instanceof Array)$desc=$desc[1]
 tQ.prototype=$desc
-function mL(Z6,zf,AJ,Eb,AP,fn){this.Z6=Z6
+function mL(Z6,zf,Eb,AJ,AP,Lk){this.Z6=Z6
 this.zf=zf
-this.AJ=AJ
 this.Eb=Eb
+this.AJ=AJ
 this.AP=AP
-this.fn=fn}mL.builtin$cls="mL"
+this.Lk=Lk}mL.builtin$cls="mL"
 if(!"name" in mL)mL.name="mL"
 $desc=$collectedClasses.mL
 if($desc instanceof Array)$desc=$desc[1]
 mL.prototype=$desc
 mL.prototype.gZ6=function(){return this.Z6}
 mL.prototype.gZ6.$reflectable=1
-mL.prototype.gzf=function(receiver){return this.zf}
+mL.prototype.gzf=function(){return this.zf}
 mL.prototype.gzf.$reflectable=1
 function Kf(Yb){this.Yb=Yb}Kf.builtin$cls="Kf"
 if(!"name" in Kf)Kf.name="Kf"
@@ -27166,79 +27376,10 @@
 if($desc instanceof Array)$desc=$desc[1]
 qu.prototype=$desc
 qu.prototype.gbG=function(receiver){return this.bG}
-function bv(zf,rI,we,jF,XR,Z0,hI,am,y6,c8,LE,qU,yg,YG,jy,AP,fn){this.zf=zf
-this.rI=rI
-this.we=we
-this.jF=jF
-this.XR=XR
-this.Z0=Z0
-this.hI=hI
-this.am=am
-this.y6=y6
-this.c8=c8
-this.LE=LE
-this.qU=qU
-this.yg=yg
-this.YG=YG
-this.jy=jy
-this.AP=AP
-this.fn=fn}bv.builtin$cls="bv"
-if(!"name" in bv)bv.name="bv"
-$desc=$collectedClasses.bv
-if($desc instanceof Array)$desc=$desc[1]
-bv.prototype=$desc
-bv.prototype.gzf=function(receiver){return this.zf}
-bv.prototype.gXR=function(){return this.XR}
-bv.prototype.gXR.$reflectable=1
-bv.prototype.gZ0=function(){return this.Z0}
-bv.prototype.gZ0.$reflectable=1
-bv.prototype.gLE=function(){return this.LE}
-bv.prototype.gLE.$reflectable=1
-function eS(a){this.a=a}eS.builtin$cls="eS"
-if(!"name" in eS)eS.name="eS"
-$desc=$collectedClasses.eS
-if($desc instanceof Array)$desc=$desc[1]
-eS.prototype=$desc
-function IQ(b){this.b=b}IQ.builtin$cls="IQ"
-if(!"name" in IQ)IQ.name="IQ"
-$desc=$collectedClasses.IQ
-if($desc instanceof Array)$desc=$desc[1]
-IQ.prototype=$desc
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function at(a,b){this.a=a
-this.b=b}at.builtin$cls="at"
-if(!"name" in at)at.name="at"
-$desc=$collectedClasses.at
-if($desc instanceof Array)$desc=$desc[1]
-at.prototype=$desc
-function wu(a,b){this.a=a
-this.b=b}wu.builtin$cls="wu"
-if(!"name" in wu)wu.name="wu"
-$desc=$collectedClasses.wu
-if($desc instanceof Array)$desc=$desc[1]
-wu.prototype=$desc
-function Vc(c,d){this.c=c
-this.d=d}Vc.builtin$cls="Vc"
-if(!"name" in Vc)Vc.name="Vc"
-$desc=$collectedClasses.Vc
-if($desc instanceof Array)$desc=$desc[1]
-Vc.prototype=$desc
-function KQ(a,b){this.a=a
-this.b=b}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
-if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
-function dZ(ec,jF,JL,MU,AP,fn){this.ec=ec
-this.jF=jF
+function dZ(ec,JL,AP,Lk){this.ec=ec
 this.JL=JL
-this.MU=MU
 this.AP=AP
-this.fn=fn}dZ.builtin$cls="dZ"
+this.Lk=Lk}dZ.builtin$cls="dZ"
 if(!"name" in dZ)dZ.name="dZ"
 $desc=$collectedClasses.dZ
 if($desc instanceof Array)$desc=$desc[1]
@@ -27249,142 +27390,6 @@
 $desc=$collectedClasses.Qe
 if($desc instanceof Array)$desc=$desc[1]
 Qe.prototype=$desc
-function GH(a){this.a=a}GH.builtin$cls="GH"
-if(!"name" in GH)GH.name="GH"
-$desc=$collectedClasses.GH
-if($desc instanceof Array)$desc=$desc[1]
-GH.prototype=$desc
-function Q4(Yu,m7,L4,NC,xb,AP,fn){this.Yu=Yu
-this.m7=m7
-this.L4=L4
-this.NC=NC
-this.xb=xb
-this.AP=AP
-this.fn=fn}Q4.builtin$cls="Q4"
-if(!"name" in Q4)Q4.name="Q4"
-$desc=$collectedClasses.Q4
-if($desc instanceof Array)$desc=$desc[1]
-Q4.prototype=$desc
-Q4.prototype.gYu=function(){return this.Yu}
-Q4.prototype.gYu.$reflectable=1
-Q4.prototype.gm7=function(){return this.m7}
-Q4.prototype.gm7.$reflectable=1
-Q4.prototype.gL4=function(){return this.L4}
-Q4.prototype.gL4.$reflectable=1
-function WAE(Zd){this.Zd=Zd}WAE.builtin$cls="WAE"
-if(!"name" in WAE)WAE.name="WAE"
-$desc=$collectedClasses.WAE
-if($desc instanceof Array)$desc=$desc[1]
-WAE.prototype=$desc
-function N8(Yu,pO,Iw){this.Yu=Yu
-this.pO=pO
-this.Iw=Iw}N8.builtin$cls="N8"
-if(!"name" in N8)N8.name="N8"
-$desc=$collectedClasses.N8
-if($desc instanceof Array)$desc=$desc[1]
-N8.prototype=$desc
-N8.prototype.gYu=function(){return this.Yu}
-function Vi(tT,Av){this.tT=tT
-this.Av=Av}Vi.builtin$cls="Vi"
-if(!"name" in Vi)Vi.name="Vi"
-$desc=$collectedClasses.Vi
-if($desc instanceof Array)$desc=$desc[1]
-Vi.prototype=$desc
-Vi.prototype.gtT=function(receiver){return this.tT}
-Vi.prototype.gAv=function(){return this.Av}
-function kx(fY,vg,Mb,a0,VS,hw,fF,Du,va,tQ,Ge,hI,HJ,AP,fn){this.fY=fY
-this.vg=vg
-this.Mb=Mb
-this.a0=a0
-this.VS=VS
-this.hw=hw
-this.fF=fF
-this.Du=Du
-this.va=va
-this.tQ=tQ
-this.Ge=Ge
-this.hI=hI
-this.HJ=HJ
-this.AP=AP
-this.fn=fn}kx.builtin$cls="kx"
-if(!"name" in kx)kx.name="kx"
-$desc=$collectedClasses.kx
-if($desc instanceof Array)$desc=$desc[1]
-kx.prototype=$desc
-kx.prototype.gfY=function(receiver){return this.fY}
-kx.prototype.ga0=function(){return this.a0}
-kx.prototype.gVS=function(){return this.VS}
-kx.prototype.gfF=function(){return this.fF}
-kx.prototype.gDu=function(){return this.Du}
-kx.prototype.gva=function(){return this.va}
-kx.prototype.gva.$reflectable=1
-function fx(){}fx.builtin$cls="fx"
-if(!"name" in fx)fx.name="fx"
-$desc=$collectedClasses.fx
-if($desc instanceof Array)$desc=$desc[1]
-fx.prototype=$desc
-function CM(Aq,tm,hV){this.Aq=Aq
-this.tm=tm
-this.hV=hV}CM.builtin$cls="CM"
-if(!"name" in CM)CM.name="CM"
-$desc=$collectedClasses.CM
-if($desc instanceof Array)$desc=$desc[1]
-CM.prototype=$desc
-CM.prototype.gAq=function(receiver){return this.Aq}
-CM.prototype.ghV=function(){return this.hV}
-function xn(a){this.a=a}xn.builtin$cls="xn"
-if(!"name" in xn)xn.name="xn"
-$desc=$collectedClasses.xn
-if($desc instanceof Array)$desc=$desc[1]
-xn.prototype=$desc
-function vu(){}vu.builtin$cls="vu"
-if(!"name" in vu)vu.name="vu"
-$desc=$collectedClasses.vu
-if($desc instanceof Array)$desc=$desc[1]
-vu.prototype=$desc
-function c2(Rd,ye,i0,AP,fn){this.Rd=Rd
-this.ye=ye
-this.i0=i0
-this.AP=AP
-this.fn=fn}c2.builtin$cls="c2"
-if(!"name" in c2)c2.name="c2"
-$desc=$collectedClasses.c2
-if($desc instanceof Array)$desc=$desc[1]
-c2.prototype=$desc
-c2.prototype.gRd=function(receiver){return this.Rd}
-c2.prototype.gRd.$reflectable=1
-function rj(I2,VG,pw,tq,Sw,iA,AP,fn){this.I2=I2
-this.VG=VG
-this.pw=pw
-this.tq=tq
-this.Sw=Sw
-this.iA=iA
-this.AP=AP
-this.fn=fn}rj.builtin$cls="rj"
-if(!"name" in rj)rj.name="rj"
-$desc=$collectedClasses.rj
-if($desc instanceof Array)$desc=$desc[1]
-rj.prototype=$desc
-rj.prototype.gSw=function(){return this.Sw}
-rj.prototype.gSw.$reflectable=1
-function af(Aq){this.Aq=Aq}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gAq=function(receiver){return this.Aq}
-function SI(YY,Aq,rI,we,R9,wv,V2,me){this.YY=YY
-this.Aq=Aq
-this.rI=rI
-this.we=we
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}SI.builtin$cls="SI"
-if(!"name" in SI)SI.name="SI"
-$desc=$collectedClasses.SI
-if($desc instanceof Array)$desc=$desc[1]
-SI.prototype=$desc
 function Y2(eT,yt,wd,oH){this.eT=eT
 this.yt=yt
 this.wd=wd
@@ -27400,89 +27405,21 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rO,WT,AP,fn){this.rO=rO
+function XN(rI,WT,AP,Lk){this.rI=rI
 this.WT=WT
 this.AP=AP
-this.fn=fn}XN.builtin$cls="XN"
+this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
 $desc=$collectedClasses.XN
 if($desc instanceof Array)$desc=$desc[1]
 XN.prototype=$desc
 XN.prototype.gWT=function(receiver){return this.WT}
 XN.prototype.gWT.$reflectable=1
-function No(ec,i2){this.ec=ec
-this.i2=i2}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.sec=function(v){return this.ec=v}
-No.prototype.gi2=function(){return this.i2}
-No.prototype.gi2.$reflectable=1
-function PG(){}PG.builtin$cls="PG"
-if(!"name" in PG)PG.name="PG"
-$desc=$collectedClasses.PG
-if($desc instanceof Array)$desc=$desc[1]
-PG.prototype=$desc
-function YW(){}YW.builtin$cls="YW"
-if(!"name" in YW)YW.name="YW"
-$desc=$collectedClasses.YW
-if($desc instanceof Array)$desc=$desc[1]
-YW.prototype=$desc
-function BO(a){this.a=a}BO.builtin$cls="BO"
-if(!"name" in BO)BO.name="BO"
-$desc=$collectedClasses.BO
-if($desc instanceof Array)$desc=$desc[1]
-BO.prototype=$desc
-function Yu(a,b){this.a=a
-this.b=b}Yu.builtin$cls="Yu"
-if(!"name" in Yu)Yu.name="Yu"
-$desc=$collectedClasses.Yu
-if($desc instanceof Array)$desc=$desc[1]
-Yu.prototype=$desc
-function y2(c){this.c=c}y2.builtin$cls="y2"
-if(!"name" in y2)y2.name="y2"
-$desc=$collectedClasses.y2
-if($desc instanceof Array)$desc=$desc[1]
-y2.prototype=$desc
-function Hq(d){this.d=d}Hq.builtin$cls="Hq"
-if(!"name" in Hq)Hq.name="Hq"
-$desc=$collectedClasses.Hq
-if($desc instanceof Array)$desc=$desc[1]
-Hq.prototype=$desc
-function Pl(a){this.a=a}Pl.builtin$cls="Pl"
-if(!"name" in Pl)Pl.name="Pl"
-$desc=$collectedClasses.Pl
-if($desc instanceof Array)$desc=$desc[1]
-Pl.prototype=$desc
-function XK(Yu,ec,i2,AP,fn){this.Yu=Yu
-this.ec=ec
-this.i2=i2
+function G6(BW,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
 this.AP=AP
-this.fn=fn}XK.builtin$cls="XK"
-if(!"name" in XK)XK.name="XK"
-$desc=$collectedClasses.XK
-if($desc instanceof Array)$desc=$desc[1]
-XK.prototype=$desc
-XK.prototype.gYu=function(){return this.Yu}
-function ho(Ct,pL,ec,i2,AP,fn){this.Ct=Ct
-this.pL=pL
-this.ec=ec
-this.i2=i2
+this.Lk=Lk
 this.AP=AP
-this.fn=fn}ho.builtin$cls="ho"
-if(!"name" in ho)ho.name="ho"
-$desc=$collectedClasses.ho
-if($desc instanceof Array)$desc=$desc[1]
-ho.prototype=$desc
-function G6(BW,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.BW=BW
-this.AP=AP
-this.fn=fn
-this.pC=pC
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27499,30 +27436,17 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Ur(){}Ur.builtin$cls="Ur"
-if(!"name" in Ur)Ur.name="Ur"
-$desc=$collectedClasses.Ur
+function Vf(){}Vf.builtin$cls="Vf"
+if(!"name" in Vf)Vf.name="Vf"
+$desc=$collectedClasses.Vf
 if($desc instanceof Array)$desc=$desc[1]
-Ur.prototype=$desc
-function j3(a){this.a=a}j3.builtin$cls="j3"
-if(!"name" in j3)j3.name="j3"
-$desc=$collectedClasses.j3
-if($desc instanceof Array)$desc=$desc[1]
-j3.prototype=$desc
-function i0(){}i0.builtin$cls="i0"
-if(!"name" in i0)i0.name="i0"
-$desc=$collectedClasses.i0
-if($desc instanceof Array)$desc=$desc[1]
-i0.prototype=$desc
-function Tg(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+Vf.prototype=$desc
+function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27535,14 +27459,11 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Ps(F0,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27550,39 +27471,26 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Ps.builtin$cls="Ps"
-if(!"name" in Ps)Ps.name="Ps"
-$desc=$collectedClasses.Ps
+this.X0=X0}Jc.builtin$cls="Jc"
+if(!"name" in Jc)Jc.name="Jc"
+$desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
-Ps.prototype=$desc
-Ps.prototype.gF0=function(receiver){return receiver.F0}
-Ps.prototype.gF0.$reflectable=1
-Ps.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Ps.prototype.sF0.$reflectable=1
-function KU(){}KU.builtin$cls="KU"
-if(!"name" in KU)KU.name="KU"
-$desc=$collectedClasses.KU
+Jc.prototype=$desc
+Jc.prototype.gF0=function(receiver){return receiver.F0}
+Jc.prototype.gF0.$reflectable=1
+Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
+Jc.prototype.sF0.$reflectable=1
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-KU.prototype=$desc
-function RI(a){this.a=a}RI.builtin$cls="RI"
-if(!"name" in RI)RI.name="RI"
-$desc=$collectedClasses.RI
-if($desc instanceof Array)$desc=$desc[1]
-RI.prototype=$desc
-function Ye(){}Ye.builtin$cls="Ye"
-if(!"name" in Ye)Ye.name="Ye"
-$desc=$collectedClasses.Ye
-if($desc instanceof Array)$desc=$desc[1]
-Ye.prototype=$desc
-function CN(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+pv.prototype=$desc
+function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27595,14 +27503,11 @@
 $desc=$collectedClasses.CN
 if($desc instanceof Array)$desc=$desc[1]
 CN.prototype=$desc
-function HT(eJ,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eJ=eJ
+function Be(Xx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xx=Xx
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27610,27 +27515,27 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}HT.builtin$cls="HT"
-if(!"name" in HT)HT.name="HT"
-$desc=$collectedClasses.HT
+this.X0=X0}Be.builtin$cls="Be"
+if(!"name" in Be)Be.name="Be"
+$desc=$collectedClasses.Be
 if($desc instanceof Array)$desc=$desc[1]
-HT.prototype=$desc
-HT.prototype.geJ=function(receiver){return receiver.eJ}
-HT.prototype.geJ.$reflectable=1
-HT.prototype.seJ=function(receiver,v){return receiver.eJ=v}
-HT.prototype.seJ.$reflectable=1
-function qbd(){}qbd.builtin$cls="qbd"
-if(!"name" in qbd)qbd.name="qbd"
-$desc=$collectedClasses.qbd
+Be.prototype=$desc
+Be.prototype.gXx=function(receiver){return receiver.Xx}
+Be.prototype.gXx.$reflectable=1
+Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
+Be.prototype.sXx.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-qbd.prototype=$desc
-function E0(zh,HX,Uy,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
+Vfx.prototype=$desc
+function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27655,18 +27560,18 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
-function lw(GV,Hu,nx,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
+Dsd.prototype=$desc
+function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -27764,32 +27669,14 @@
 $desc=$collectedClasses.kV
 if($desc instanceof Array)$desc=$desc[1]
 kV.prototype=$desc
-function rR(OI,T6,TQ,lo){this.OI=OI
+function rR(OI,T6,C2,lo){this.OI=OI
 this.T6=T6
-this.TQ=TQ
+this.C2=C2
 this.lo=lo}rR.builtin$cls="rR"
 if(!"name" in rR)rR.name="rR"
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function H6(l6,FT){this.l6=l6
-this.FT=FT}H6.builtin$cls="H6"
-if(!"name" in H6)H6.name="H6"
-$desc=$collectedClasses.H6
-if($desc instanceof Array)$desc=$desc[1]
-H6.prototype=$desc
-function wB(l6,FT){this.l6=l6
-this.FT=FT}wB.builtin$cls="wB"
-if(!"name" in wB)wB.name="wB"
-$desc=$collectedClasses.wB
-if($desc instanceof Array)$desc=$desc[1]
-wB.prototype=$desc
-function U1(OI,FT){this.OI=OI
-this.FT=FT}U1.builtin$cls="U1"
-if(!"name" in U1)U1.name="U1"
-$desc=$collectedClasses.U1
-if($desc instanceof Array)$desc=$desc[1]
-U1.prototype=$desc
 function SJ(){}SJ.builtin$cls="SJ"
 if(!"name" in SJ)SJ.name="SJ"
 $desc=$collectedClasses.SJ
@@ -27800,11 +27687,11 @@
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Qr(){}Qr.builtin$cls="Qr"
-if(!"name" in Qr)Qr.name="Qr"
-$desc=$collectedClasses.Qr
+function Tv(){}Tv.builtin$cls="Tv"
+if(!"name" in Tv)Tv.name="Tv"
+$desc=$collectedClasses.Tv
 if($desc instanceof Array)$desc=$desc[1]
-Qr.prototype=$desc
+Tv.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27821,23 +27708,23 @@
 if($desc instanceof Array)$desc=$desc[1]
 GD.prototype=$desc
 GD.prototype.gfN=function(receiver){return this.fN}
-function Sn(L5,Aq){this.L5=L5
-this.Aq=Aq}Sn.builtin$cls="Sn"
+function Sn(L5,F1){this.L5=L5
+this.F1=F1}Sn.builtin$cls="Sn"
 if(!"name" in Sn)Sn.name="Sn"
 $desc=$collectedClasses.Sn
 if($desc instanceof Array)$desc=$desc[1]
 Sn.prototype=$desc
-Sn.prototype.gAq=function(receiver){return this.Aq}
+Sn.prototype.gF1=function(receiver){return this.F1}
 function nI(){}nI.builtin$cls="nI"
 if(!"name" in nI)nI.name="nI"
 $desc=$collectedClasses.nI
 if($desc instanceof Array)$desc=$desc[1]
 nI.prototype=$desc
-function TY(){}TY.builtin$cls="TY"
-if(!"name" in TY)TY.name="TY"
-$desc=$collectedClasses.TY
+function jU(){}jU.builtin$cls="jU"
+if(!"name" in jU)jU.name="jU"
+$desc=$collectedClasses.jU
 if($desc instanceof Array)$desc=$desc[1]
-TY.prototype=$desc
+jU.prototype=$desc
 function Lj(MA){this.MA=MA}Lj.builtin$cls="Lj"
 if(!"name" in Lj)Lj.name="Lj"
 $desc=$collectedClasses.Lj
@@ -27848,14 +27735,14 @@
 $desc=$collectedClasses.mb
 if($desc instanceof Array)$desc=$desc[1]
 mb.prototype=$desc
-function am(If){this.If=If}am.builtin$cls="am"
-if(!"name" in am)am.name="am"
-$desc=$collectedClasses.am
+function cb(If){this.If=If}cb.builtin$cls="cb"
+if(!"name" in cb)cb.name="cb"
+$desc=$collectedClasses.cb
 if($desc instanceof Array)$desc=$desc[1]
-am.prototype=$desc
-am.prototype.gIf=function(){return this.If}
-function cw(XP,xW,Nz,LQ,If){this.XP=XP
-this.xW=xW
+cb.prototype=$desc
+cb.prototype.gIf=function(){return this.If}
+function cw(XP,yG,Nz,LQ,If){this.XP=XP
+this.yG=yG
 this.Nz=Nz
 this.LQ=LQ
 this.If=If}cw.builtin$cls="cw"
@@ -27914,10 +27801,10 @@
 $desc=$collectedClasses.YX
 if($desc instanceof Array)$desc=$desc[1]
 YX.prototype=$desc
-function BI(AY,XW,BB,Ra,If){this.AY=AY
+function BI(AY,XW,BB,i1,If){this.AY=AY
 this.XW=XW
 this.BB=BB
-this.Ra=Ra
+this.i1=i1
 this.If=If}BI.builtin$cls="BI"
 if(!"name" in BI)BI.name="BI"
 $desc=$collectedClasses.BI
@@ -27946,7 +27833,7 @@
 $desc=$collectedClasses.mg
 if($desc instanceof Array)$desc=$desc[1]
 mg.prototype=$desc
-function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,Ra,RH,If){this.NK=NK
+function bl(NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If){this.NK=NK
 this.EZ=EZ
 this.ut=ut
 this.Db=Db
@@ -27959,7 +27846,7 @@
 this.qu=qu
 this.qN=qN
 this.qm=qm
-this.Ra=Ra
+this.i1=i1
 this.RH=RH
 this.If=If}bl.builtin$cls="bl"
 if(!"name" in bl)bl.name="bl"
@@ -27986,7 +27873,7 @@
 $desc=$collectedClasses.Ax
 if($desc instanceof Array)$desc=$desc[1]
 Ax.prototype=$desc
-function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,Ra,RH,nz,If){this.Cr=Cr
+function Wf(Cr,Tx,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If){this.Cr=Cr
 this.Tx=Tx
 this.H8=H8
 this.Ht=Ht
@@ -28005,9 +27892,9 @@
 this.xO=xO
 this.qm=qm
 this.UF=UF
-this.Ra=Ra
+this.i1=i1
 this.RH=RH
-this.nz=nz
+this.jE=jE
 this.If=If}Wf.builtin$cls="Wf"
 if(!"name" in Wf)Wf.name="Wf"
 $desc=$collectedClasses.Wf
@@ -28025,21 +27912,21 @@
 $desc=$collectedClasses.Ei
 if($desc instanceof Array)$desc=$desc[1]
 Ei.prototype=$desc
-function U7(b){this.b=b}U7.builtin$cls="U7"
-if(!"name" in U7)U7.name="U7"
-$desc=$collectedClasses.U7
+function Ci(b){this.b=b}Ci.builtin$cls="Ci"
+if(!"name" in Ci)Ci.name="Ci"
+$desc=$collectedClasses.Ci
 if($desc instanceof Array)$desc=$desc[1]
-U7.prototype=$desc
+Ci.prototype=$desc
 function t0(a){this.a=a}t0.builtin$cls="t0"
 if(!"name" in t0)t0.name="t0"
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,nz,Ay,le,If){this.ao=ao
+function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
-this.nz=nz
+this.jE=jE
 this.Ay=Ay
 this.le=le
 this.If=If}Ld.builtin$cls="Ld"
@@ -28048,7 +27935,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 Ld.prototype=$desc
 Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(){return this.V5}
+Ld.prototype.gV5=function(receiver){return this.V5}
 Ld.prototype.gFo=function(){return this.Fo}
 Ld.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
@@ -28057,14 +27944,14 @@
 $desc=$collectedClasses.Sz
 if($desc instanceof Array)$desc=$desc[1]
 Sz.prototype=$desc
-function Zk(dl,Yq,lT,hB,Fo,xV,qx,nz,le,wM,H3,If){this.dl=dl
+function Zk(dl,Yq,lT,hB,Fo,xV,qx,jE,le,wM,H3,If){this.dl=dl
 this.Yq=Yq
 this.lT=lT
 this.hB=hB
 this.Fo=Fo
 this.xV=xV
 this.qx=qx
-this.nz=nz
+this.jE=jE
 this.le=le
 this.wM=wM
 this.H3=H3
@@ -28183,16 +28070,16 @@
 JI.prototype.siE=function(v){return this.iE=v}
 JI.prototype.gSJ=function(){return this.SJ}
 JI.prototype.sSJ=function(v){return this.SJ=v}
-function LO(iE,SJ){this.iE=iE
-this.SJ=SJ}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function WVu(iE,SJ){this.iE=iE
+this.SJ=SJ}WVu.builtin$cls="WVu"
+if(!"name" in WVu)WVu.name="WVu"
+$desc=$collectedClasses.WVu
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
-LO.prototype.giE=function(){return this.iE}
-LO.prototype.siE=function(v){return this.iE=v}
-LO.prototype.gSJ=function(){return this.SJ}
-LO.prototype.sSJ=function(v){return this.SJ=v}
+WVu.prototype=$desc
+WVu.prototype.giE=function(){return this.iE}
+WVu.prototype.siE=function(v){return this.iE=v}
+WVu.prototype.gSJ=function(){return this.SJ}
+WVu.prototype.sSJ=function(v){return this.SJ=v}
 function dz(nL,QC,Gv,iE,SJ,WX,Ip){this.nL=nL
 this.QC=QC
 this.Gv=Gv
@@ -28238,19 +28125,6 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
-function j7(a,b){this.a=a
-this.b=b}j7.builtin$cls="j7"
-if(!"name" in j7)j7.name="j7"
-$desc=$collectedClasses.j7
-if($desc instanceof Array)$desc=$desc[1]
-j7.prototype=$desc
-function ff(a,c,d){this.a=a
-this.c=c
-this.d=d}ff.builtin$cls="ff"
-if(!"name" in ff)ff.name="ff"
-$desc=$collectedClasses.ff
-if($desc instanceof Array)$desc=$desc[1]
-ff.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28282,22 +28156,28 @@
 $desc=$collectedClasses.da
 if($desc instanceof Array)$desc=$desc[1]
 da.prototype=$desc
-function xw(a){this.a=a}xw.builtin$cls="xw"
-if(!"name" in xw)xw.name="xw"
-$desc=$collectedClasses.xw
+function pV(a){this.a=a}pV.builtin$cls="pV"
+if(!"name" in pV)pV.name="pV"
+$desc=$collectedClasses.pV
 if($desc instanceof Array)$desc=$desc[1]
-xw.prototype=$desc
-function dm(b){this.b=b}dm.builtin$cls="dm"
-if(!"name" in dm)dm.name="dm"
-$desc=$collectedClasses.dm
+pV.prototype=$desc
+function U7(b){this.b=b}U7.builtin$cls="U7"
+if(!"name" in U7)U7.name="U7"
+$desc=$collectedClasses.U7
 if($desc instanceof Array)$desc=$desc[1]
-dm.prototype=$desc
+U7.prototype=$desc
 function rH(a,b){this.a=a
 this.b=b}rH.builtin$cls="rH"
 if(!"name" in rH)rH.name="rH"
 $desc=$collectedClasses.rH
 if($desc instanceof Array)$desc=$desc[1]
 rH.prototype=$desc
+function cX(c,d){this.c=c
+this.d=d}cX.builtin$cls="cX"
+if(!"name" in cX)cX.name="cX"
+$desc=$collectedClasses.cX
+if($desc instanceof Array)$desc=$desc[1]
+cX.prototype=$desc
 function ZL(a,b,c){this.a=a
 this.b=b
 this.c=c}ZL.builtin$cls="ZL"
@@ -28305,39 +28185,39 @@
 $desc=$collectedClasses.ZL
 if($desc instanceof Array)$desc=$desc[1]
 ZL.prototype=$desc
-function rq(b,c,d,e){this.b=b
-this.c=c
+function rq(b,d,e,f){this.b=b
 this.d=d
-this.e=e}rq.builtin$cls="rq"
+this.e=e
+this.f=f}rq.builtin$cls="rq"
 if(!"name" in rq)rq.name="rq"
 $desc=$collectedClasses.rq
 if($desc instanceof Array)$desc=$desc[1]
 rq.prototype=$desc
-function RW(c,b,f,UI){this.c=c
+function RW(c,b,UI,bK){this.c=c
 this.b=b
-this.f=f
-this.UI=UI}RW.builtin$cls="RW"
+this.UI=UI
+this.bK=bK}RW.builtin$cls="RW"
 if(!"name" in RW)RW.name="RW"
 $desc=$collectedClasses.RW
 if($desc instanceof Array)$desc=$desc[1]
 RW.prototype=$desc
-function RT(c,b,bK,Gq,Rm){this.c=c
+function RT(c,b,Gq,Rm,w3){this.c=c
 this.b=b
-this.bK=bK
 this.Gq=Gq
-this.Rm=Rm}RT.builtin$cls="RT"
+this.Rm=Rm
+this.w3=w3}RT.builtin$cls="RT"
 if(!"name" in RT)RT.name="RT"
 $desc=$collectedClasses.RT
 if($desc instanceof Array)$desc=$desc[1]
 RT.prototype=$desc
-function jZ(c,w3){this.c=c
-this.w3=w3}jZ.builtin$cls="jZ"
+function jZ(c,HZ){this.c=c
+this.HZ=HZ}jZ.builtin$cls="jZ"
 if(!"name" in jZ)jZ.name="jZ"
 $desc=$collectedClasses.jZ
 if($desc instanceof Array)$desc=$desc[1]
 jZ.prototype=$desc
-function FZ(a,HZ){this.a=a
-this.HZ=HZ}FZ.builtin$cls="FZ"
+function FZ(a,mG){this.a=a
+this.mG=mG}FZ.builtin$cls="FZ"
 if(!"name" in FZ)FZ.name="FZ"
 $desc=$collectedClasses.FZ
 if($desc instanceof Array)$desc=$desc[1]
@@ -28356,14 +28236,14 @@
 $desc=$collectedClasses.qh
 if($desc instanceof Array)$desc=$desc[1]
 qh.prototype=$desc
-function tG(a,b,c,d){this.a=a
+function YJ(a,b,c,d){this.a=a
 this.b=b
 this.c=c
-this.d=d}tG.builtin$cls="tG"
-if(!"name" in tG)tG.name="tG"
-$desc=$collectedClasses.tG
+this.d=d}YJ.builtin$cls="YJ"
+if(!"name" in YJ)YJ.name="YJ"
+$desc=$collectedClasses.YJ
 if($desc instanceof Array)$desc=$desc[1]
-tG.prototype=$desc
+YJ.prototype=$desc
 function jv(e,f){this.e=e
 this.f=f}jv.builtin$cls="jv"
 if(!"name" in jv)jv.name="jv"
@@ -28376,11 +28256,11 @@
 $desc=$collectedClasses.LB
 if($desc instanceof Array)$desc=$desc[1]
 LB.prototype=$desc
-function zn(bK){this.bK=bK}zn.builtin$cls="zn"
-if(!"name" in zn)zn.name="zn"
-$desc=$collectedClasses.zn
+function DO(bK){this.bK=bK}DO.builtin$cls="DO"
+if(!"name" in DO)DO.name="DO"
+$desc=$collectedClasses.DO
 if($desc instanceof Array)$desc=$desc[1]
-zn.prototype=$desc
+DO.prototype=$desc
 function lz(a,b,c,d){this.a=a
 this.b=b
 this.c=c
@@ -28430,17 +28310,17 @@
 $desc=$collectedClasses.eN
 if($desc instanceof Array)$desc=$desc[1]
 eN.prototype=$desc
-function PI(a){this.a=a}PI.builtin$cls="PI"
+function B5(a){this.a=a}B5.builtin$cls="B5"
+if(!"name" in B5)B5.name="B5"
+$desc=$collectedClasses.B5
+if($desc instanceof Array)$desc=$desc[1]
+B5.prototype=$desc
+function PI(a,b){this.a=a
+this.b=b}PI.builtin$cls="PI"
 if(!"name" in PI)PI.name="PI"
 $desc=$collectedClasses.PI
 if($desc instanceof Array)$desc=$desc[1]
 PI.prototype=$desc
-function uO(a,b){this.a=a
-this.b=b}uO.builtin$cls="uO"
-if(!"name" in uO)uO.name="uO"
-$desc=$collectedClasses.uO
-if($desc instanceof Array)$desc=$desc[1]
-uO.prototype=$desc
 function j4(a,b){this.a=a
 this.b=b}j4.builtin$cls="j4"
 if(!"name" in j4)j4.name="j4"
@@ -28488,19 +28368,19 @@
 $desc=$collectedClasses.Z5
 if($desc instanceof Array)$desc=$desc[1]
 Z5.prototype=$desc
-function ii(a,b,c){this.a=a
+function j5(a,b,c){this.a=a
 this.b=b
-this.c=c}ii.builtin$cls="ii"
+this.c=c}j5.builtin$cls="j5"
+if(!"name" in j5)j5.name="j5"
+$desc=$collectedClasses.j5
+if($desc instanceof Array)$desc=$desc[1]
+j5.prototype=$desc
+function ii(a,d){this.a=a
+this.d=d}ii.builtin$cls="ii"
 if(!"name" in ii)ii.name="ii"
 $desc=$collectedClasses.ii
 if($desc instanceof Array)$desc=$desc[1]
 ii.prototype=$desc
-function ib(a,d){this.a=a
-this.d=d}ib.builtin$cls="ib"
-if(!"name" in ib)ib.name="ib"
-$desc=$collectedClasses.ib
-if($desc instanceof Array)$desc=$desc[1]
-ib.prototype=$desc
 function MO(){}MO.builtin$cls="MO"
 if(!"name" in MO)MO.name="MO"
 $desc=$collectedClasses.MO
@@ -28552,13 +28432,13 @@
 $desc=$collectedClasses.ez
 if($desc instanceof Array)$desc=$desc[1]
 ez.prototype=$desc
-function ti(aw){this.aw=aw}ti.builtin$cls="ti"
-if(!"name" in ti)ti.name="ti"
-$desc=$collectedClasses.ti
+function fIm(aw){this.aw=aw}fIm.builtin$cls="fIm"
+if(!"name" in fIm)fIm.name="fIm"
+$desc=$collectedClasses.fIm
 if($desc instanceof Array)$desc=$desc[1]
-ti.prototype=$desc
-ti.prototype.gaw=function(){return this.aw}
-ti.prototype.saw=function(v){return this.aw=v}
+fIm.prototype=$desc
+fIm.prototype.gaw=function(){return this.aw}
+fIm.prototype.saw=function(v){return this.aw=v}
 function LV(P,aw){this.P=P
 this.aw=aw}LV.builtin$cls="LV"
 if(!"name" in LV)LV.name="LV"
@@ -28611,12 +28491,12 @@
 $desc=$collectedClasses.uR
 if($desc instanceof Array)$desc=$desc[1]
 uR.prototype=$desc
-function Q0(a,b){this.a=a
-this.b=b}Q0.builtin$cls="Q0"
-if(!"name" in Q0)Q0.name="Q0"
-$desc=$collectedClasses.Q0
+function GU(a,b){this.a=a
+this.b=b}GU.builtin$cls="GU"
+if(!"name" in GU)GU.name="GU"
+$desc=$collectedClasses.GU
 if($desc instanceof Array)$desc=$desc[1]
-Q0.prototype=$desc
+GU.prototype=$desc
 function YR(){}YR.builtin$cls="YR"
 if(!"name" in YR)YR.name="YR"
 $desc=$collectedClasses.YR
@@ -28647,17 +28527,11 @@
 $desc=$collectedClasses.t3
 if($desc instanceof Array)$desc=$desc[1]
 t3.prototype=$desc
-function dq(Em,Sb){this.Em=Em
-this.Sb=Sb}dq.builtin$cls="dq"
-if(!"name" in dq)dq.name="dq"
-$desc=$collectedClasses.dq
+function tU(){}tU.builtin$cls="tU"
+if(!"name" in tU)tU.name="tU"
+$desc=$collectedClasses.tU
 if($desc instanceof Array)$desc=$desc[1]
-dq.prototype=$desc
-function lO(){}lO.builtin$cls="lO"
-if(!"name" in lO)lO.name="lO"
-$desc=$collectedClasses.lO
-if($desc instanceof Array)$desc=$desc[1]
-lO.prototype=$desc
+tU.prototype=$desc
 function aY(){}aY.builtin$cls="aY"
 if(!"name" in aY)aY.name="aY"
 $desc=$collectedClasses.aY
@@ -28695,11 +28569,11 @@
 $desc=$collectedClasses.e4
 if($desc instanceof Array)$desc=$desc[1]
 e4.prototype=$desc
-function JB(){}JB.builtin$cls="JB"
-if(!"name" in JB)JB.name="JB"
-$desc=$collectedClasses.JB
+function dl(){}dl.builtin$cls="dl"
+if(!"name" in dl)dl.name="dl"
+$desc=$collectedClasses.dl
 if($desc instanceof Array)$desc=$desc[1]
-JB.prototype=$desc
+dl.prototype=$desc
 function Id(oh){this.oh=oh}Id.builtin$cls="Id"
 if(!"name" in Id)Id.name="Id"
 $desc=$collectedClasses.Id
@@ -28740,12 +28614,12 @@
 $desc=$collectedClasses.dv
 if($desc instanceof Array)$desc=$desc[1]
 dv.prototype=$desc
-function pV(c,d){this.c=c
-this.d=d}pV.builtin$cls="pV"
-if(!"name" in pV)pV.name="pV"
-$desc=$collectedClasses.pV
+function ph(c,d){this.c=c
+this.d=d}ph.builtin$cls="ph"
+if(!"name" in ph)ph.name="ph"
+$desc=$collectedClasses.ph
 if($desc instanceof Array)$desc=$desc[1]
-pV.prototype=$desc
+ph.prototype=$desc
 function uo(eT,zU,R1){this.eT=eT
 this.zU=zU
 this.R1=R1}uo.builtin$cls="uo"
@@ -28772,11 +28646,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function nU(){}nU.builtin$cls="nU"
-if(!"name" in nU)nU.name="nU"
-$desc=$collectedClasses.nU
+function W5(){}W5.builtin$cls="W5"
+if(!"name" in W5)W5.name="W5"
+$desc=$collectedClasses.W5
 if($desc instanceof Array)$desc=$desc[1]
-nU.prototype=$desc
+W5.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -28873,36 +28747,6 @@
 $desc=$collectedClasses.S9
 if($desc instanceof Array)$desc=$desc[1]
 S9.prototype=$desc
-function ey(X5,vv,OX,OB,H9,lX,zN){this.X5=X5
-this.vv=vv
-this.OX=OX
-this.OB=OB
-this.H9=H9
-this.lX=lX
-this.zN=zN}ey.builtin$cls="ey"
-if(!"name" in ey)ey.name="ey"
-$desc=$collectedClasses.ey
-if($desc instanceof Array)$desc=$desc[1]
-ey.prototype=$desc
-function xd(m6,Q6,ac,X5,vv,OX,OB,H9,lX,zN){this.m6=m6
-this.Q6=Q6
-this.ac=ac
-this.X5=X5
-this.vv=vv
-this.OX=OX
-this.OB=OB
-this.H9=H9
-this.lX=lX
-this.zN=zN}xd.builtin$cls="xd"
-if(!"name" in xd)xd.name="xd"
-$desc=$collectedClasses.xd
-if($desc instanceof Array)$desc=$desc[1]
-xd.prototype=$desc
-function v6(a){this.a=a}v6.builtin$cls="v6"
-if(!"name" in v6)v6.name="v6"
-$desc=$collectedClasses.v6
-if($desc instanceof Array)$desc=$desc[1]
-v6.prototype=$desc
 function db(kh,S4,DG,zQ){this.kh=kh
 this.S4=S4
 this.DG=DG
@@ -28931,11 +28775,11 @@
 $desc=$collectedClasses.N6
 if($desc instanceof Array)$desc=$desc[1]
 N6.prototype=$desc
-function Rr(){}Rr.builtin$cls="Rr"
-if(!"name" in Rr)Rr.name="Rr"
-$desc=$collectedClasses.Rr
+function UB(){}UB.builtin$cls="UB"
+if(!"name" in UB)UB.name="UB"
+$desc=$collectedClasses.UB
 if($desc instanceof Array)$desc=$desc[1]
-Rr.prototype=$desc
+UB.prototype=$desc
 function YO(X5,vv,OX,OB,DM){this.X5=X5
 this.vv=vv
 this.OX=OX
@@ -29052,11 +28896,11 @@
 jp.prototype=$desc
 jp.prototype.gP=function(receiver){return this.P}
 jp.prototype.sP=function(receiver,v){return this.P=v}
-function vX(){}vX.builtin$cls="vX"
-if(!"name" in vX)vX.name="vX"
-$desc=$collectedClasses.vX
+function GZ(){}GZ.builtin$cls="GZ"
+if(!"name" in GZ)GZ.name="GZ"
+$desc=$collectedClasses.GZ
 if($desc instanceof Array)$desc=$desc[1]
-vX.prototype=$desc
+GZ.prototype=$desc
 function Ba(Cw,ac,aY,iW,P6,qT,bb){this.Cw=Cw
 this.ac=ac
 this.aY=aY
@@ -29078,13 +28922,13 @@
 $desc=$collectedClasses.bF
 if($desc instanceof Array)$desc=$desc[1]
 bF.prototype=$desc
-function LD(a,b,c){this.a=a
+function BW(a,b,c){this.a=a
 this.b=b
-this.c=c}LD.builtin$cls="LD"
-if(!"name" in LD)LD.name="LD"
-$desc=$collectedClasses.LD
+this.c=c}BW.builtin$cls="BW"
+if(!"name" in BW)BW.name="BW"
+$desc=$collectedClasses.BW
 if($desc instanceof Array)$desc=$desc[1]
-LD.prototype=$desc
+BW.prototype=$desc
 function S6B(){}S6B.builtin$cls="S6B"
 if(!"name" in S6B)S6B.name="S6B"
 $desc=$collectedClasses.S6B
@@ -29100,8 +28944,8 @@
 $desc=$collectedClasses.uM
 if($desc instanceof Array)$desc=$desc[1]
 uM.prototype=$desc
-function DN(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function DN(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}DN.builtin$cls="DN"
@@ -29109,8 +28953,8 @@
 $desc=$collectedClasses.DN
 if($desc instanceof Array)$desc=$desc[1]
 DN.prototype=$desc
-function ZM(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function ZM(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}ZM.builtin$cls="ZM"
@@ -29118,8 +28962,8 @@
 $desc=$collectedClasses.ZM
 if($desc instanceof Array)$desc=$desc[1]
 ZM.prototype=$desc
-function HW(Dn,Ln,qT,bb,ya){this.Dn=Dn
-this.Ln=Ln
+function HW(Dn,Jt,qT,bb,ya){this.Dn=Dn
+this.Jt=Jt
 this.qT=qT
 this.bb=bb
 this.ya=ya}HW.builtin$cls="HW"
@@ -29142,23 +28986,23 @@
 $desc=$collectedClasses.Uk
 if($desc instanceof Array)$desc=$desc[1]
 Uk.prototype=$desc
-function wI(){}wI.builtin$cls="wI"
-if(!"name" in wI)wI.name="wI"
-$desc=$collectedClasses.wI
+function zF(){}zF.builtin$cls="zF"
+if(!"name" in zF)zF.name="zF"
+$desc=$collectedClasses.zF
 if($desc instanceof Array)$desc=$desc[1]
-wI.prototype=$desc
+zF.prototype=$desc
 function Zi(){}Zi.builtin$cls="Zi"
 if(!"name" in Zi)Zi.name="Zi"
 $desc=$collectedClasses.Zi
 if($desc instanceof Array)$desc=$desc[1]
 Zi.prototype=$desc
-function Ud(Pc,FN){this.Pc=Pc
+function Ud(Ct,FN){this.Ct=Ct
 this.FN=FN}Ud.builtin$cls="Ud"
 if(!"name" in Ud)Ud.name="Ud"
 $desc=$collectedClasses.Ud
 if($desc instanceof Array)$desc=$desc[1]
 Ud.prototype=$desc
-function K8(Pc,FN){this.Pc=Pc
+function K8(Ct,FN){this.Ct=Ct
 this.FN=FN}K8.builtin$cls="K8"
 if(!"name" in K8)K8.name="K8"
 $desc=$collectedClasses.K8
@@ -29180,9 +29024,9 @@
 $desc=$collectedClasses.Cf
 if($desc instanceof Array)$desc=$desc[1]
 Cf.prototype=$desc
-function Sh(WE,Mw,JN){this.WE=WE
-this.Mw=Mw
-this.JN=JN}Sh.builtin$cls="Sh"
+function Sh(iY,Vy,qi){this.iY=iY
+this.Vy=Vy
+this.qi=qi}Sh.builtin$cls="Sh"
 if(!"name" in Sh)Sh.name="Sh"
 $desc=$collectedClasses.Sh
 if($desc instanceof Array)$desc=$desc[1]
@@ -29203,7 +29047,7 @@
 $desc=$collectedClasses.E3
 if($desc instanceof Array)$desc=$desc[1]
 E3.prototype=$desc
-function Rw(vn,ZP,EN){this.vn=vn
+function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
 if(!"name" in Rw)Rw.name="Rw"
@@ -29230,11 +29074,11 @@
 $desc=$collectedClasses.a2
 if($desc instanceof Array)$desc=$desc[1]
 a2.prototype=$desc
-function Rz(){}Rz.builtin$cls="Rz"
-if(!"name" in Rz)Rz.name="Rz"
-$desc=$collectedClasses.Rz
+function Tx(){}Tx.builtin$cls="Tx"
+if(!"name" in Tx)Tx.name="Tx"
+$desc=$collectedClasses.Tx
 if($desc instanceof Array)$desc=$desc[1]
-Rz.prototype=$desc
+Tx.prototype=$desc
 function iP(y3,aL){this.y3=y3
 this.aL=aL}iP.builtin$cls="iP"
 if(!"name" in iP)iP.name="iP"
@@ -29252,21 +29096,6 @@
 $desc=$collectedClasses.Rq
 if($desc instanceof Array)$desc=$desc[1]
 Rq.prototype=$desc
-function Hn(){}Hn.builtin$cls="Hn"
-if(!"name" in Hn)Hn.name="Hn"
-$desc=$collectedClasses.Hn
-if($desc instanceof Array)$desc=$desc[1]
-Hn.prototype=$desc
-function Zl(){}Zl.builtin$cls="Zl"
-if(!"name" in Zl)Zl.name="Zl"
-$desc=$collectedClasses.Zl
-if($desc instanceof Array)$desc=$desc[1]
-Zl.prototype=$desc
-function B5(){}B5.builtin$cls="B5"
-if(!"name" in B5)B5.name="B5"
-$desc=$collectedClasses.B5
-if($desc instanceof Array)$desc=$desc[1]
-B5.prototype=$desc
 function a6(Fq){this.Fq=Fq}a6.builtin$cls="a6"
 if(!"name" in a6)a6.name="a6"
 $desc=$collectedClasses.a6
@@ -29304,16 +29133,16 @@
 $desc=$collectedClasses.bJ
 if($desc instanceof Array)$desc=$desc[1]
 bJ.prototype=$desc
-function Np(){}Np.builtin$cls="Np"
-if(!"name" in Np)Np.name="Np"
-$desc=$collectedClasses.Np
+function yd(){}yd.builtin$cls="yd"
+if(!"name" in yd)yd.name="yd"
+$desc=$collectedClasses.yd
 if($desc instanceof Array)$desc=$desc[1]
-Np.prototype=$desc
-function mp(uF,UP,mP,SA,FZ){this.uF=uF
+yd.prototype=$desc
+function mp(uF,UP,mP,SA,mZ){this.uF=uF
 this.UP=UP
 this.mP=mP
 this.SA=SA
-this.FZ=FZ}mp.builtin$cls="mp"
+this.mZ=mZ}mp.builtin$cls="mp"
 if(!"name" in mp)mp.name="mp"
 $desc=$collectedClasses.mp
 if($desc instanceof Array)$desc=$desc[1]
@@ -29341,6 +29170,11 @@
 $desc=$collectedClasses.UV
 if($desc instanceof Array)$desc=$desc[1]
 UV.prototype=$desc
+function kF(){}kF.builtin$cls="kF"
+if(!"name" in kF)kF.name="kF"
+$desc=$collectedClasses.kF
+if($desc instanceof Array)$desc=$desc[1]
+kF.prototype=$desc
 function VS(){}VS.builtin$cls="VS"
 if(!"name" in VS)VS.name="VS"
 $desc=$collectedClasses.VS
@@ -29379,11 +29213,11 @@
 $desc=$collectedClasses.EH
 if($desc instanceof Array)$desc=$desc[1]
 EH.prototype=$desc
-function cX(){}cX.builtin$cls="cX"
-if(!"name" in cX)cX.name="cX"
-$desc=$collectedClasses.cX
+function QV(){}QV.builtin$cls="QV"
+if(!"name" in QV)QV.name="QV"
+$desc=$collectedClasses.QV
 if($desc instanceof Array)$desc=$desc[1]
-cX.prototype=$desc
+QV.prototype=$desc
 function AC(){}AC.builtin$cls="AC"
 if(!"name" in AC)AC.name="AC"
 $desc=$collectedClasses.AC
@@ -29438,29 +29272,34 @@
 $desc=$collectedClasses.uq
 if($desc instanceof Array)$desc=$desc[1]
 uq.prototype=$desc
-function iD(NN,HC,r0,Fi,ku,tP,Ka,hO,yW){this.NN=NN
+function iD(NN,HC,r0,Fi,ku,tP,Ka,YG,yW){this.NN=NN
 this.HC=HC
 this.r0=r0
 this.Fi=Fi
 this.ku=ku
 this.tP=tP
 this.Ka=Ka
-this.hO=hO
+this.YG=YG
 this.yW=yW}iD.builtin$cls="iD"
 if(!"name" in iD)iD.name="iD"
 $desc=$collectedClasses.iD
 if($desc instanceof Array)$desc=$desc[1]
 iD.prototype=$desc
+function hP(){}hP.builtin$cls="hP"
+if(!"name" in hP)hP.name="hP"
+$desc=$collectedClasses.hP
+if($desc instanceof Array)$desc=$desc[1]
+hP.prototype=$desc
+function Uo(a){this.a=a}Uo.builtin$cls="Uo"
+if(!"name" in Uo)Uo.name="Uo"
+$desc=$collectedClasses.Uo
+if($desc instanceof Array)$desc=$desc[1]
+Uo.prototype=$desc
 function hb(){}hb.builtin$cls="hb"
 if(!"name" in hb)hb.name="hb"
 $desc=$collectedClasses.hb
 if($desc instanceof Array)$desc=$desc[1]
 hb.prototype=$desc
-function XX(){}XX.builtin$cls="XX"
-if(!"name" in XX)XX.name="XX"
-$desc=$collectedClasses.XX
-if($desc instanceof Array)$desc=$desc[1]
-XX.prototype=$desc
 function Kd(){}Kd.builtin$cls="Kd"
 if(!"name" in Kd)Kd.name="Kd"
 $desc=$collectedClasses.Kd
@@ -29622,26 +29461,46 @@
 $desc=$collectedClasses.nNL
 if($desc instanceof Array)$desc=$desc[1]
 nNL.prototype=$desc
-function ecX(){}ecX.builtin$cls="ecX"
-if(!"name" in ecX)ecX.name="ecX"
-$desc=$collectedClasses.ecX
+function ma(){}ma.builtin$cls="ma"
+if(!"name" in ma)ma.name="ma"
+$desc=$collectedClasses.ma
 if($desc instanceof Array)$desc=$desc[1]
-ecX.prototype=$desc
-function kI(){}kI.builtin$cls="kI"
-if(!"name" in kI)kI.name="kI"
-$desc=$collectedClasses.kI
+ma.prototype=$desc
+function Ou(){}Ou.builtin$cls="Ou"
+if(!"name" in Ou)Ou.name="Ou"
+$desc=$collectedClasses.Ou
 if($desc instanceof Array)$desc=$desc[1]
-kI.prototype=$desc
+Ou.prototype=$desc
 function yoo(){}yoo.builtin$cls="yoo"
 if(!"name" in yoo)yoo.name="yoo"
 $desc=$collectedClasses.yoo
 if($desc instanceof Array)$desc=$desc[1]
 yoo.prototype=$desc
+function ecX(){}ecX.builtin$cls="ecX"
+if(!"name" in ecX)ecX.name="ecX"
+$desc=$collectedClasses.ecX
+if($desc instanceof Array)$desc=$desc[1]
+ecX.prototype=$desc
+function zLC(){}zLC.builtin$cls="zLC"
+if(!"name" in zLC)zLC.name="zLC"
+$desc=$collectedClasses.zLC
+if($desc instanceof Array)$desc=$desc[1]
+zLC.prototype=$desc
 function w1p(){}w1p.builtin$cls="w1p"
 if(!"name" in w1p)w1p.name="w1p"
 $desc=$collectedClasses.w1p
 if($desc instanceof Array)$desc=$desc[1]
 w1p.prototype=$desc
+function dxW(){}dxW.builtin$cls="dxW"
+if(!"name" in dxW)dxW.name="dxW"
+$desc=$collectedClasses.dxW
+if($desc instanceof Array)$desc=$desc[1]
+dxW.prototype=$desc
+function kEI(){}kEI.builtin$cls="kEI"
+if(!"name" in kEI)kEI.name="kEI"
+$desc=$collectedClasses.kEI
+if($desc instanceof Array)$desc=$desc[1]
+kEI.prototype=$desc
 function tJ(){}tJ.builtin$cls="tJ"
 if(!"name" in tJ)tJ.name="tJ"
 $desc=$collectedClasses.tJ
@@ -29766,11 +29625,11 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function hP(vm){this.vm=vm}hP.builtin$cls="hP"
-if(!"name" in hP)hP.name="hP"
-$desc=$collectedClasses.hP
+function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+if(!"name" in bO)bO.name="bO"
+$desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
-hP.prototype=$desc
+bO.prototype=$desc
 function Gm(){}Gm.builtin$cls="Gm"
 if(!"name" in Gm)Gm.name="Gm"
 $desc=$collectedClasses.Gm
@@ -29815,11 +29674,11 @@
 $desc=$collectedClasses.O7
 if($desc instanceof Array)$desc=$desc[1]
 O7.prototype=$desc
-function IU(){}IU.builtin$cls="IU"
-if(!"name" in IU)IU.name="IU"
-$desc=$collectedClasses.IU
+function hq(){}hq.builtin$cls="hq"
+if(!"name" in hq)hq.name="hq"
+$desc=$collectedClasses.hq
 if($desc instanceof Array)$desc=$desc[1]
-IU.prototype=$desc
+hq.prototype=$desc
 function E4(eh){this.eh=eh}E4.builtin$cls="E4"
 if(!"name" in E4)E4.name="E4"
 $desc=$collectedClasses.E4
@@ -29850,7 +29709,7 @@
 $desc=$collectedClasses.DV
 if($desc instanceof Array)$desc=$desc[1]
 DV.prototype=$desc
-function Hp(){}Hp.builtin$cls="Hp"
+function Hp(a){this.a=a}Hp.builtin$cls="Hp"
 if(!"name" in Hp)Hp.name="Hp"
 $desc=$collectedClasses.Hp
 if($desc instanceof Array)$desc=$desc[1]
@@ -29900,11 +29759,11 @@
 $desc=$collectedClasses.Ms
 if($desc instanceof Array)$desc=$desc[1]
 Ms.prototype=$desc
-function ac(){}ac.builtin$cls="ac"
-if(!"name" in ac)ac.name="ac"
-$desc=$collectedClasses.ac
+function Fw(){}Fw.builtin$cls="Fw"
+if(!"name" in Fw)Fw.name="Fw"
+$desc=$collectedClasses.Fw
 if($desc instanceof Array)$desc=$desc[1]
-ac.prototype=$desc
+Fw.prototype=$desc
 function RS(){}RS.builtin$cls="RS"
 if(!"name" in RS)RS.name="RS"
 $desc=$collectedClasses.RS
@@ -29920,10 +29779,10 @@
 $desc=$collectedClasses.Ys
 if($desc instanceof Array)$desc=$desc[1]
 Ys.prototype=$desc
-function Lw(ew,yz,nV,Li){this.ew=ew
+function Lw(ew,yz,nV,f9){this.ew=ew
 this.yz=yz
 this.nV=nV
-this.Li=Li}Lw.builtin$cls="Lw"
+this.f9=f9}Lw.builtin$cls="Lw"
 if(!"name" in Lw)Lw.name="Lw"
 $desc=$collectedClasses.Lw
 if($desc instanceof Array)$desc=$desc[1]
@@ -29958,11 +29817,11 @@
 $desc=$collectedClasses.Dg
 if($desc instanceof Array)$desc=$desc[1]
 Dg.prototype=$desc
-function Ob(){}Ob.builtin$cls="Ob"
-if(!"name" in Ob)Ob.name="Ob"
-$desc=$collectedClasses.Ob
+function Ui(){}Ui.builtin$cls="Ui"
+if(!"name" in Ui)Ui.name="Ui"
+$desc=$collectedClasses.Ui
 if($desc instanceof Array)$desc=$desc[1]
-Ob.prototype=$desc
+Ui.prototype=$desc
 function Ip(){}Ip.builtin$cls="Ip"
 if(!"name" in Ip)Ip.name="Ip"
 $desc=$collectedClasses.Ip
@@ -29973,47 +29832,21 @@
 $desc=$collectedClasses.Pg
 if($desc instanceof Array)$desc=$desc[1]
 Pg.prototype=$desc
-function Nb(){}Nb.builtin$cls="Nb"
-if(!"name" in Nb)Nb.name="Nb"
-$desc=$collectedClasses.Nb
+function ObS(){}ObS.builtin$cls="ObS"
+if(!"name" in ObS)ObS.name="ObS"
+$desc=$collectedClasses.ObS
 if($desc instanceof Array)$desc=$desc[1]
-Nb.prototype=$desc
+ObS.prototype=$desc
 function nA(){}nA.builtin$cls="nA"
 if(!"name" in nA)nA.name="nA"
 $desc=$collectedClasses.nA
 if($desc instanceof Array)$desc=$desc[1]
 nA.prototype=$desc
-function Fv(m0,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.m0=m0
+function E9(Py,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}Fv.builtin$cls="Fv"
-if(!"name" in Fv)Fv.name="Fv"
-$desc=$collectedClasses.Fv
-if($desc instanceof Array)$desc=$desc[1]
-Fv.prototype=$desc
-Fv.prototype.gm0=function(receiver){return receiver.m0}
-Fv.prototype.gm0.$reflectable=1
-Fv.prototype.sm0=function(receiver,v){return receiver.m0=v}
-Fv.prototype.sm0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
-if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
-function E9(Py,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Py=Py
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30030,20 +29863,63 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
-function m8(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+tuj.prototype=$desc
+function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
+this.Ab=Ab
+this.Ln=Ln
+this.y4=y4
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}rm.builtin$cls="rm"
+if(!"name" in rm)rm.name="rm"
+$desc=$collectedClasses.rm
+if($desc instanceof Array)$desc=$desc[1]
+rm.prototype=$desc
+rm.prototype.gfn=function(receiver){return receiver.fn}
+rm.prototype.gfn.$reflectable=1
+rm.prototype.sfn=function(receiver,v){return receiver.fn=v}
+rm.prototype.sfn.$reflectable=1
+rm.prototype.gAb=function(receiver){return receiver.Ab}
+rm.prototype.gAb.$reflectable=1
+rm.prototype.sAb=function(receiver,v){return receiver.Ab=v}
+rm.prototype.sAb.$reflectable=1
+rm.prototype.gLn=function(receiver){return receiver.Ln}
+rm.prototype.gLn.$reflectable=1
+rm.prototype.sLn=function(receiver,v){return receiver.Ln=v}
+rm.prototype.sLn.$reflectable=1
+rm.prototype.gy4=function(receiver){return receiver.y4}
+rm.prototype.gy4.$reflectable=1
+rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
+rm.prototype.sy4.$reflectable=1
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
+if($desc instanceof Array)$desc=$desc[1]
+Vct.prototype=$desc
+function YW(a){this.a=a}YW.builtin$cls="YW"
+if(!"name" in YW)YW.name="YW"
+$desc=$collectedClasses.YW
+if($desc instanceof Array)$desc=$desc[1]
+YW.prototype=$desc
+function m8(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30056,14 +29932,11 @@
 $desc=$collectedClasses.m8
 if($desc instanceof Array)$desc=$desc[1]
 m8.prototype=$desc
-function Gk(vt,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
+function Gk(vt,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.vt=vt
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30080,30 +29953,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function Urj(){}Urj.builtin$cls="Urj"
-if(!"name" in Urj)Urj.name="Urj"
-$desc=$collectedClasses.Urj
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Urj.prototype=$desc
-function e5(a){this.a=a}e5.builtin$cls="e5"
-if(!"name" in e5)e5.name="e5"
-$desc=$collectedClasses.e5
-if($desc instanceof Array)$desc=$desc[1]
-e5.prototype=$desc
-function Ni(){}Ni.builtin$cls="Ni"
-if(!"name" in Ni)Ni.name="Ni"
-$desc=$collectedClasses.Ni
-if($desc instanceof Array)$desc=$desc[1]
-Ni.prototype=$desc
-function AX(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+D13.prototype=$desc
+function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30111,19 +29971,16 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+this.X0=X0}qW.builtin$cls="qW"
+if(!"name" in qW)qW.name="qW"
+$desc=$collectedClasses.qW
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
-function yb(Z8,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
+qW.prototype=$desc
+function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30131,31 +29988,21 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}yb.builtin$cls="yb"
-if(!"name" in yb)yb.name="yb"
-$desc=$collectedClasses.yb
+this.X0=X0}mk.builtin$cls="mk"
+if(!"name" in mk)mk.name="mk"
+$desc=$collectedClasses.mk
 if($desc instanceof Array)$desc=$desc[1]
-yb.prototype=$desc
-yb.prototype.gZ8=function(receiver){return receiver.Z8}
-yb.prototype.gZ8.$reflectable=1
-yb.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
-yb.prototype.sZ8.$reflectable=1
-function oub(){}oub.builtin$cls="oub"
-if(!"name" in oub)oub.name="oub"
-$desc=$collectedClasses.oub
+mk.prototype=$desc
+mk.prototype.gZ8=function(receiver){return receiver.Z8}
+mk.prototype.gZ8.$reflectable=1
+mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
+mk.prototype.sZ8.$reflectable=1
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-oub.prototype=$desc
-function QR(a){this.a=a}QR.builtin$cls="QR"
-if(!"name" in QR)QR.name="QR"
-$desc=$collectedClasses.QR
-if($desc instanceof Array)$desc=$desc[1]
-QR.prototype=$desc
-function Yx(){}Yx.builtin$cls="Yx"
-if(!"name" in Yx)Yx.name="Yx"
-$desc=$collectedClasses.Yx
-if($desc instanceof Array)$desc=$desc[1]
-Yx.prototype=$desc
-function NM(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
+WZq.prototype=$desc
+function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
 this.CO=CO
@@ -30166,12 +30013,9 @@
 this.Ol=Ol
 this.X3=X3
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30179,56 +30023,56 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}NM.builtin$cls="NM"
-if(!"name" in NM)NM.name="NM"
-$desc=$collectedClasses.NM
+this.X0=X0}jY.builtin$cls="jY"
+if(!"name" in jY)jY.name="jY"
+$desc=$collectedClasses.jY
 if($desc instanceof Array)$desc=$desc[1]
-NM.prototype=$desc
-NM.prototype.gGQ=function(receiver){return receiver.GQ}
-NM.prototype.gGQ.$reflectable=1
-NM.prototype.sGQ=function(receiver,v){return receiver.GQ=v}
-NM.prototype.sGQ.$reflectable=1
-NM.prototype.gJ0=function(receiver){return receiver.J0}
-NM.prototype.gJ0.$reflectable=1
-NM.prototype.sJ0=function(receiver,v){return receiver.J0=v}
-NM.prototype.sJ0.$reflectable=1
-NM.prototype.gOc=function(receiver){return receiver.Oc}
-NM.prototype.gOc.$reflectable=1
-NM.prototype.sOc=function(receiver,v){return receiver.Oc=v}
-NM.prototype.sOc.$reflectable=1
-NM.prototype.gCO=function(receiver){return receiver.CO}
-NM.prototype.gCO.$reflectable=1
-NM.prototype.sCO=function(receiver,v){return receiver.CO=v}
-NM.prototype.sCO.$reflectable=1
-NM.prototype.gbV=function(receiver){return receiver.bV}
-NM.prototype.gbV.$reflectable=1
-NM.prototype.sbV=function(receiver,v){return receiver.bV=v}
-NM.prototype.sbV.$reflectable=1
-NM.prototype.gkg=function(receiver){return receiver.kg}
-NM.prototype.gkg.$reflectable=1
-NM.prototype.skg=function(receiver,v){return receiver.kg=v}
-NM.prototype.skg.$reflectable=1
-NM.prototype.gLY=function(receiver){return receiver.LY}
-NM.prototype.gLY.$reflectable=1
-NM.prototype.sLY=function(receiver,v){return receiver.LY=v}
-NM.prototype.sLY.$reflectable=1
-NM.prototype.gq3=function(receiver){return receiver.q3}
-NM.prototype.gq3.$reflectable=1
-NM.prototype.sq3=function(receiver,v){return receiver.q3=v}
-NM.prototype.sq3.$reflectable=1
-NM.prototype.gOl=function(receiver){return receiver.Ol}
-NM.prototype.gOl.$reflectable=1
-NM.prototype.sOl=function(receiver,v){return receiver.Ol=v}
-NM.prototype.sOl.$reflectable=1
-NM.prototype.gX3=function(receiver){return receiver.X3}
-NM.prototype.gX3.$reflectable=1
-NM.prototype.sX3=function(receiver,v){return receiver.X3=v}
-NM.prototype.sX3.$reflectable=1
-function c4r(){}c4r.builtin$cls="c4r"
-if(!"name" in c4r)c4r.name="c4r"
-$desc=$collectedClasses.c4r
+jY.prototype=$desc
+jY.prototype.gGQ=function(receiver){return receiver.GQ}
+jY.prototype.gGQ.$reflectable=1
+jY.prototype.sGQ=function(receiver,v){return receiver.GQ=v}
+jY.prototype.sGQ.$reflectable=1
+jY.prototype.gJ0=function(receiver){return receiver.J0}
+jY.prototype.gJ0.$reflectable=1
+jY.prototype.sJ0=function(receiver,v){return receiver.J0=v}
+jY.prototype.sJ0.$reflectable=1
+jY.prototype.gOc=function(receiver){return receiver.Oc}
+jY.prototype.gOc.$reflectable=1
+jY.prototype.sOc=function(receiver,v){return receiver.Oc=v}
+jY.prototype.sOc.$reflectable=1
+jY.prototype.gCO=function(receiver){return receiver.CO}
+jY.prototype.gCO.$reflectable=1
+jY.prototype.sCO=function(receiver,v){return receiver.CO=v}
+jY.prototype.sCO.$reflectable=1
+jY.prototype.gbV=function(receiver){return receiver.bV}
+jY.prototype.gbV.$reflectable=1
+jY.prototype.sbV=function(receiver,v){return receiver.bV=v}
+jY.prototype.sbV.$reflectable=1
+jY.prototype.gkg=function(receiver){return receiver.kg}
+jY.prototype.gkg.$reflectable=1
+jY.prototype.skg=function(receiver,v){return receiver.kg=v}
+jY.prototype.skg.$reflectable=1
+jY.prototype.gLY=function(receiver){return receiver.LY}
+jY.prototype.gLY.$reflectable=1
+jY.prototype.sLY=function(receiver,v){return receiver.LY=v}
+jY.prototype.sLY.$reflectable=1
+jY.prototype.gq3=function(receiver){return receiver.q3}
+jY.prototype.gq3.$reflectable=1
+jY.prototype.sq3=function(receiver,v){return receiver.q3=v}
+jY.prototype.sq3.$reflectable=1
+jY.prototype.gOl=function(receiver){return receiver.Ol}
+jY.prototype.gOl.$reflectable=1
+jY.prototype.sOl=function(receiver,v){return receiver.Ol=v}
+jY.prototype.sOl.$reflectable=1
+jY.prototype.gX3=function(receiver){return receiver.X3}
+jY.prototype.gX3.$reflectable=1
+jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
+jY.prototype.sX3.$reflectable=1
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-c4r.prototype=$desc
+pva.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30239,16 +30083,16 @@
 $desc=$collectedClasses.jm
 if($desc instanceof Array)$desc=$desc[1]
 jm.prototype=$desc
-function xj(a){this.a=a}xj.builtin$cls="xj"
+function ke(a){this.a=a}ke.builtin$cls="ke"
+if(!"name" in ke)ke.name="ke"
+$desc=$collectedClasses.ke
+if($desc instanceof Array)$desc=$desc[1]
+ke.prototype=$desc
+function xj(){}xj.builtin$cls="xj"
 if(!"name" in xj)xj.name="xj"
 $desc=$collectedClasses.xj
 if($desc instanceof Array)$desc=$desc[1]
 xj.prototype=$desc
-function VB(){}VB.builtin$cls="VB"
-if(!"name" in VB)VB.name="VB"
-$desc=$collectedClasses.VB
-if($desc instanceof Array)$desc=$desc[1]
-VB.prototype=$desc
 function aI(b,c){this.b=b
 this.c=c}aI.builtin$cls="aI"
 if(!"name" in aI)aI.name="aI"
@@ -30277,12 +30121,12 @@
 $desc=$collectedClasses.Tm
 if($desc instanceof Array)$desc=$desc[1]
 Tm.prototype=$desc
-function q1(a,Gq){this.a=a
-this.Gq=Gq}q1.builtin$cls="q1"
-if(!"name" in q1)q1.name="q1"
-$desc=$collectedClasses.q1
+function ib(a,Gq){this.a=a
+this.Gq=Gq}ib.builtin$cls="ib"
+if(!"name" in ib)ib.name="ib"
+$desc=$collectedClasses.ib
 if($desc instanceof Array)$desc=$desc[1]
-q1.prototype=$desc
+ib.prototype=$desc
 function CA(a,b){this.a=a
 this.b=b}CA.builtin$cls="CA"
 if(!"name" in CA)CA.name="CA"
@@ -30327,7 +30171,7 @@
 $desc=$collectedClasses.uQ
 if($desc instanceof Array)$desc=$desc[1]
 uQ.prototype=$desc
-function D7(F1,h2){this.F1=F1
+function D7(qt,h2){this.qt=qt
 this.h2=h2}D7.builtin$cls="D7"
 if(!"name" in D7)D7.name="D7"
 $desc=$collectedClasses.D7
@@ -30343,15 +30187,12 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30369,19 +30210,11 @@
 $desc=$collectedClasses.Js
 if($desc instanceof Array)$desc=$desc[1]
 Js.prototype=$desc
-function fM(){}fM.builtin$cls="fM"
-if(!"name" in fM)fM.name="fM"
-$desc=$collectedClasses.fM
-if($desc instanceof Array)$desc=$desc[1]
-fM.prototype=$desc
-function hx(Xh,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
+function hx(Xh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Xh=Xh
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30398,42 +30231,16 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function Squ(){}Squ.builtin$cls="Squ"
-if(!"name" in Squ)Squ.name="Squ"
-$desc=$collectedClasses.Squ
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
 if($desc instanceof Array)$desc=$desc[1]
-Squ.prototype=$desc
-function PO(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+cda.prototype=$desc
+function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
-if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
-PO.prototype.gpC=function(receiver){return receiver.pC}
-PO.prototype.gpC.$reflectable=1
-PO.prototype.spC=function(receiver,v){return receiver.pC=v}
-PO.prototype.spC.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
-if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
-function u7(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30446,17 +30253,16 @@
 $desc=$collectedClasses.u7
 if($desc instanceof Array)$desc=$desc[1]
 u7.prototype=$desc
-function fW(a){this.a=a}fW.builtin$cls="fW"
-if(!"name" in fW)fW.name="fW"
-$desc=$collectedClasses.fW
+u7.prototype.gtf=function(receiver){return receiver.tf}
+u7.prototype.gtf.$reflectable=1
+u7.prototype.stf=function(receiver,v){return receiver.tf=v}
+u7.prototype.stf.$reflectable=1
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-fW.prototype=$desc
-function Ey(b){this.b=b}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function qm(Aq,tT,eT,yt,wd,oH,z3,AP,fn){this.Aq=Aq
+waa.prototype=$desc
+function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
 this.yt=yt
@@ -30464,34 +30270,31 @@
 this.oH=oH
 this.z3=z3
 this.AP=AP
-this.fn=fn}qm.builtin$cls="qm"
+this.Lk=Lk}qm.builtin$cls="qm"
 if(!"name" in qm)qm.name="qm"
 $desc=$collectedClasses.qm
 if($desc instanceof Array)$desc=$desc[1]
 qm.prototype=$desc
-qm.prototype.gAq=function(receiver){return this.Aq}
+qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function vO(a){this.a=a}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(a){this.a=a}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
-function E7(SS,fb,qY,qO,Hm,pD,eH,vk,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.SS=SS
+TI.prototype=$desc
+function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Dt=Dt
+this.BA=BA
+this.FT=FT
+this.vk=vk
 this.fb=fb
-this.qY=qY
 this.qO=qO
 this.Hm=Hm
-this.pD=pD
-this.eH=eH
-this.vk=vk
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30504,54 +30307,47 @@
 $desc=$collectedClasses.E7
 if($desc instanceof Array)$desc=$desc[1]
 E7.prototype=$desc
-E7.prototype.gSS=function(receiver){return receiver.SS}
-E7.prototype.gSS.$reflectable=1
-E7.prototype.sSS=function(receiver,v){return receiver.SS=v}
-E7.prototype.sSS.$reflectable=1
+E7.prototype.gpD=function(receiver){return receiver.pD}
+E7.prototype.gpD.$reflectable=1
+E7.prototype.spD=function(receiver,v){return receiver.pD=v}
+E7.prototype.spD.$reflectable=1
+E7.prototype.gDt=function(receiver){return receiver.Dt}
+E7.prototype.gDt.$reflectable=1
+E7.prototype.gBA=function(receiver){return receiver.BA}
+E7.prototype.gBA.$reflectable=1
+E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
+E7.prototype.sBA.$reflectable=1
+E7.prototype.gFT=function(receiver){return receiver.FT}
+E7.prototype.gFT.$reflectable=1
+E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
+E7.prototype.sFT.$reflectable=1
+E7.prototype.gvk=function(receiver){return receiver.vk}
+E7.prototype.gvk.$reflectable=1
+E7.prototype.svk=function(receiver,v){return receiver.vk=v}
+E7.prototype.svk.$reflectable=1
 E7.prototype.gfb=function(receiver){return receiver.fb}
 E7.prototype.gfb.$reflectable=1
-E7.prototype.gqY=function(receiver){return receiver.qY}
-E7.prototype.gqY.$reflectable=1
-E7.prototype.sqY=function(receiver,v){return receiver.qY=v}
-E7.prototype.sqY.$reflectable=1
 E7.prototype.gqO=function(receiver){return receiver.qO}
 E7.prototype.gqO.$reflectable=1
 E7.prototype.gHm=function(receiver){return receiver.Hm}
 E7.prototype.gHm.$reflectable=1
 E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
 E7.prototype.sHm.$reflectable=1
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.geH=function(receiver){return receiver.eH}
-E7.prototype.geH.$reflectable=1
-E7.prototype.seH=function(receiver,v){return receiver.eH=v}
-E7.prototype.seH.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-function KUl(){}KUl.builtin$cls="KUl"
-if(!"name" in KUl)KUl.name="KUl"
-$desc=$collectedClasses.KUl
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-KUl.prototype=$desc
+V4.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Mf(){}Mf.builtin$cls="Mf"
-if(!"name" in Mf)Mf.name="Mf"
-$desc=$collectedClasses.Mf
-if($desc instanceof Array)$desc=$desc[1]
-Mf.prototype=$desc
-function Kz(pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pC=pC
+function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30564,12 +30360,21 @@
 $desc=$collectedClasses.Kz
 if($desc instanceof Array)$desc=$desc[1]
 Kz.prototype=$desc
-function vj(eb,kf,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
+Kz.prototype.gPw=function(receiver){return receiver.Pw}
+Kz.prototype.gPw.$reflectable=1
+Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+Kz.prototype.sPw.$reflectable=1
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
+if($desc instanceof Array)$desc=$desc[1]
+V9.prototype=$desc
+function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30590,20 +30395,17 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
-function LU(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+V10.prototype=$desc
+function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30616,14 +30418,11 @@
 $desc=$collectedClasses.LU
 if($desc instanceof Array)$desc=$desc[1]
 LU.prototype=$desc
-function T2(N7,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
+function KL(N7,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.N7=N7
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30631,30 +30430,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}T2.builtin$cls="T2"
-if(!"name" in T2)T2.name="T2"
-$desc=$collectedClasses.T2
+this.X0=X0}KL.builtin$cls="KL"
+if(!"name" in KL)KL.name="KL"
+$desc=$collectedClasses.KL
 if($desc instanceof Array)$desc=$desc[1]
-T2.prototype=$desc
-T2.prototype.gN7=function(receiver){return receiver.N7}
-T2.prototype.gN7.$reflectable=1
-T2.prototype.sN7=function(receiver,v){return receiver.N7=v}
-T2.prototype.sN7.$reflectable=1
-function mHk(){}mHk.builtin$cls="mHk"
-if(!"name" in mHk)mHk.name="mHk"
-$desc=$collectedClasses.mHk
+KL.prototype=$desc
+KL.prototype.gN7=function(receiver){return receiver.N7}
+KL.prototype.gN7.$reflectable=1
+KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
+KL.prototype.sN7.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
 if($desc instanceof Array)$desc=$desc[1]
-mHk.prototype=$desc
-function Jq(a){this.a=a}Jq.builtin$cls="Jq"
-if(!"name" in Jq)Jq.name="Jq"
-$desc=$collectedClasses.Jq
-if($desc instanceof Array)$desc=$desc[1]
-Jq.prototype=$desc
-function Yn(){}Yn.builtin$cls="Yn"
-if(!"name" in Yn)Yn.name="Yn"
-$desc=$collectedClasses.Yn
-if($desc instanceof Array)$desc=$desc[1]
-Yn.prototype=$desc
+V11.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30708,66 +30497,35 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function PF(Gj,ah,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Gj=Gj
-this.ah=ah
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}PF.builtin$cls="PF"
-if(!"name" in PF)PF.name="PF"
-$desc=$collectedClasses.PF
+function T4(T9,Bu){this.T9=T9
+this.Bu=Bu}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-PF.prototype=$desc
-PF.prototype.gGj=function(receiver){return receiver.Gj}
-PF.prototype.gGj.$reflectable=1
-PF.prototype.sGj=function(receiver,v){return receiver.Gj=v}
-PF.prototype.sGj.$reflectable=1
-PF.prototype.gah=function(receiver){return receiver.ah}
-PF.prototype.gah.$reflectable=1
-PF.prototype.sah=function(receiver,v){return receiver.ah=v}
-PF.prototype.sah.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+T4.prototype=$desc
+function tzK(){}tzK.builtin$cls="tzK"
+if(!"name" in tzK)tzK.name="tzK"
+$desc=$collectedClasses.tzK
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
-function fA(T9,Bu){this.T9=T9
-this.Bu=Bu}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
-if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
-function Qz(){}Qz.builtin$cls="Qz"
-if(!"name" in Qz)Qz.name="Qz"
-$desc=$collectedClasses.Qz
-if($desc instanceof Array)$desc=$desc[1]
-Qz.prototype=$desc
+tzK.prototype=$desc
 function jA(oc){this.oc=oc}jA.builtin$cls="jA"
 if(!"name" in jA)jA.name="jA"
 $desc=$collectedClasses.jA
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function Jo(){}Jo.builtin$cls="Jo"
-if(!"name" in Jo)Jo.name="Jo"
-$desc=$collectedClasses.Jo
+function PO(){}PO.builtin$cls="PO"
+if(!"name" in PO)PO.name="PO"
+$desc=$collectedClasses.PO
 if($desc instanceof Array)$desc=$desc[1]
-Jo.prototype=$desc
-function c5(){}c5.builtin$cls="c5"
-if(!"name" in c5)c5.name="c5"
-$desc=$collectedClasses.c5
+PO.prototype=$desc
+function oBi(){}oBi.builtin$cls="oBi"
+if(!"name" in oBi)oBi.name="oBi"
+$desc=$collectedClasses.oBi
 if($desc instanceof Array)$desc=$desc[1]
-c5.prototype=$desc
-function F1(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+oBi.prototype=$desc
+function F1(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30780,13 +30538,13 @@
 $desc=$collectedClasses.F1
 if($desc instanceof Array)$desc=$desc[1]
 F1.prototype=$desc
-function aQ(uy,ZC,Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
-this.ZC=ZC
+function aQ(KU,V4,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+this.V4=V4
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30799,29 +30557,29 @@
 $desc=$collectedClasses.aQ
 if($desc instanceof Array)$desc=$desc[1]
 aQ.prototype=$desc
-aQ.prototype.guy=function(receiver){return receiver.uy}
-aQ.prototype.guy.$reflectable=1
-aQ.prototype.suy=function(receiver,v){return receiver.uy=v}
-aQ.prototype.suy.$reflectable=1
-aQ.prototype.gZC=function(receiver){return receiver.ZC}
-aQ.prototype.gZC.$reflectable=1
-aQ.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-aQ.prototype.sZC.$reflectable=1
+aQ.prototype.gKU=function(receiver){return receiver.KU}
+aQ.prototype.gKU.$reflectable=1
+aQ.prototype.sKU=function(receiver,v){return receiver.KU=v}
+aQ.prototype.sKU.$reflectable=1
+aQ.prototype.gV4=function(receiver){return receiver.V4}
+aQ.prototype.gV4.$reflectable=1
+aQ.prototype.sV4=function(receiver,v){return receiver.V4=v}
+aQ.prototype.sV4.$reflectable=1
 aQ.prototype.gJo=function(receiver){return receiver.Jo}
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function Ya5(uy,ZC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.uy=uy
-this.ZC=ZC
+V12.prototype=$desc
+function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
+this.V4=V4
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30829,30 +30587,31 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Ya5.builtin$cls="Ya5"
-if(!"name" in Ya5)Ya5.name="Ya5"
-$desc=$collectedClasses.Ya5
+this.X0=X0}Qa.builtin$cls="Qa"
+if(!"name" in Qa)Qa.name="Qa"
+$desc=$collectedClasses.Qa
 if($desc instanceof Array)$desc=$desc[1]
-Ya5.prototype=$desc
-Ya5.prototype.guy=function(receiver){return receiver.uy}
-Ya5.prototype.guy.$reflectable=1
-Ya5.prototype.suy=function(receiver,v){return receiver.uy=v}
-Ya5.prototype.suy.$reflectable=1
-Ya5.prototype.gZC=function(receiver){return receiver.ZC}
-Ya5.prototype.gZC.$reflectable=1
-Ya5.prototype.sZC=function(receiver,v){return receiver.ZC=v}
-Ya5.prototype.sZC.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+Qa.prototype=$desc
+Qa.prototype.gKU=function(receiver){return receiver.KU}
+Qa.prototype.gKU.$reflectable=1
+Qa.prototype.sKU=function(receiver,v){return receiver.KU=v}
+Qa.prototype.sKU.$reflectable=1
+Qa.prototype.gV4=function(receiver){return receiver.V4}
+Qa.prototype.gV4.$reflectable=1
+Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
+Qa.prototype.sV4.$reflectable=1
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
-function Ww(rU,SB,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
+V13.prototype=$desc
+function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
+this.Hq=Hq
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30873,16 +30632,20 @@
 Ww.prototype.gSB.$reflectable=1
 Ww.prototype.sSB=function(receiver,v){return receiver.SB=v}
 Ww.prototype.sSB.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+Ww.prototype.gHq=function(receiver){return receiver.Hq}
+Ww.prototype.gHq.$reflectable=1
+Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
+Ww.prototype.sHq.$reflectable=1
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
-function tz(Jo,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+V14.prototype=$desc
+function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30899,19 +30662,17 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
-function fl(Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+V15.prototype=$desc
+function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
+this.iy=iy
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30928,20 +30689,21 @@
 fl.prototype.gJo.$reflectable=1
 fl.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 fl.prototype.sJo.$reflectable=1
-function qFb(){}qFb.builtin$cls="qFb"
-if(!"name" in qFb)qFb.name="qFb"
-$desc=$collectedClasses.qFb
+fl.prototype.giy=function(receiver){return receiver.iy}
+fl.prototype.giy.$reflectable=1
+fl.prototype.siy=function(receiver,v){return receiver.iy=v}
+fl.prototype.siy.$reflectable=1
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-qFb.prototype=$desc
-function oM(Ap,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
+V16.prototype=$desc
+function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30949,33 +30711,30 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}oM.builtin$cls="oM"
-if(!"name" in oM)oM.name="oM"
-$desc=$collectedClasses.oM
+this.X0=X0}Zt.builtin$cls="Zt"
+if(!"name" in Zt)Zt.name="Zt"
+$desc=$collectedClasses.Zt
 if($desc instanceof Array)$desc=$desc[1]
-oM.prototype=$desc
-oM.prototype.gAp=function(receiver){return receiver.Ap}
-oM.prototype.gAp.$reflectable=1
-oM.prototype.sAp=function(receiver,v){return receiver.Ap=v}
-oM.prototype.sAp.$reflectable=1
-oM.prototype.gJo=function(receiver){return receiver.Jo}
-oM.prototype.gJo.$reflectable=1
-oM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-oM.prototype.sJo.$reflectable=1
-function rna(){}rna.builtin$cls="rna"
-if(!"name" in rna)rna.name="rna"
-$desc=$collectedClasses.rna
+Zt.prototype=$desc
+Zt.prototype.gAp=function(receiver){return receiver.Ap}
+Zt.prototype.gAp.$reflectable=1
+Zt.prototype.sAp=function(receiver,v){return receiver.Ap=v}
+Zt.prototype.sAp.$reflectable=1
+Zt.prototype.gJo=function(receiver){return receiver.Jo}
+Zt.prototype.gJo.$reflectable=1
+Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+Zt.prototype.sJo.$reflectable=1
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-rna.prototype=$desc
-function wM(Au,Jo,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
+V17.prototype=$desc
+function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -30983,30 +30742,30 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}wM.builtin$cls="wM"
-if(!"name" in wM)wM.name="wM"
-$desc=$collectedClasses.wM
+this.X0=X0}iL.builtin$cls="iL"
+if(!"name" in iL)iL.name="iL"
+$desc=$collectedClasses.iL
 if($desc instanceof Array)$desc=$desc[1]
-wM.prototype=$desc
-wM.prototype.gAu=function(receiver){return receiver.Au}
-wM.prototype.gAu.$reflectable=1
-wM.prototype.sAu=function(receiver,v){return receiver.Au=v}
-wM.prototype.sAu.$reflectable=1
-wM.prototype.gJo=function(receiver){return receiver.Jo}
-wM.prototype.gJo.$reflectable=1
-wM.prototype.sJo=function(receiver,v){return receiver.Jo=v}
-wM.prototype.sJo.$reflectable=1
-function Vba(){}Vba.builtin$cls="Vba"
-if(!"name" in Vba)Vba.name="Vba"
-$desc=$collectedClasses.Vba
+iL.prototype=$desc
+iL.prototype.gAu=function(receiver){return receiver.Au}
+iL.prototype.gAu.$reflectable=1
+iL.prototype.sAu=function(receiver,v){return receiver.Au=v}
+iL.prototype.sAu.$reflectable=1
+iL.prototype.gJo=function(receiver){return receiver.Jo}
+iL.prototype.gJo.$reflectable=1
+iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
+iL.prototype.sJo.$reflectable=1
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-Vba.prototype=$desc
-function lI(k5,xH,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+V18.prototype=$desc
+function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
 this.xH=xH
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31027,13 +30786,13 @@
 lI.prototype.gxH.$reflectable=1
 lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
 lI.prototype.sxH.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
-function uL(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+V19.prototype=$desc
+function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31064,18 +30823,18 @@
 $desc=$collectedClasses.qI
 if($desc instanceof Array)$desc=$desc[1]
 qI.prototype=$desc
-qI.prototype.gWA=function(){return this.WA}
+qI.prototype.gWA=function(receiver){return this.WA}
 qI.prototype.goc=function(receiver){return this.oc}
 qI.prototype.gjL=function(receiver){return this.jL}
 qI.prototype.gzZ=function(receiver){return this.zZ}
-function J3(b9,kK,Sv,rk,YX,B6,AP,fn){this.b9=b9
+function J3(b9,kK,Sv,rk,YX,B6,AP,Lk){this.b9=b9
 this.kK=kK
 this.Sv=Sv
 this.rk=rk
 this.YX=YX
 this.B6=B6
 this.AP=AP
-this.fn=fn}J3.builtin$cls="J3"
+this.Lk=Lk}J3.builtin$cls="J3"
 if(!"name" in J3)J3.name="J3"
 $desc=$collectedClasses.J3
 if($desc instanceof Array)$desc=$desc[1]
@@ -31130,7 +30889,7 @@
 $desc=$collectedClasses.DA
 if($desc instanceof Array)$desc=$desc[1]
 DA.prototype=$desc
-DA.prototype.gWA=function(){return this.WA}
+DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
 function nd(){}nd.builtin$cls="nd"
 if(!"name" in nd)nd.name="nd"
@@ -31153,27 +30912,27 @@
 $desc=$collectedClasses.lS
 if($desc instanceof Array)$desc=$desc[1]
 lS.prototype=$desc
-function xh(L1,AP,fn){this.L1=L1
+function xh(L1,AP,Lk){this.L1=L1
 this.AP=AP
-this.fn=fn}xh.builtin$cls="xh"
+this.Lk=Lk}xh.builtin$cls="xh"
 if(!"name" in xh)xh.name="xh"
 $desc=$collectedClasses.xh
 if($desc instanceof Array)$desc=$desc[1]
 xh.prototype=$desc
-function wn(b3,xg,h3,AP,fn){this.b3=b3
+function wn(b3,xg,h3,AP,Lk){this.b3=b3
 this.xg=xg
 this.h3=h3
 this.AP=AP
-this.fn=fn}wn.builtin$cls="wn"
+this.Lk=Lk}wn.builtin$cls="wn"
 if(!"name" in wn)wn.name="wn"
 $desc=$collectedClasses.wn
 if($desc instanceof Array)$desc=$desc[1]
 wn.prototype=$desc
-function Ay(){}Ay.builtin$cls="Ay"
-if(!"name" in Ay)Ay.name="Ay"
-$desc=$collectedClasses.Ay
+function er(){}er.builtin$cls="er"
+if(!"name" in er)er.name="er"
+$desc=$collectedClasses.er
 if($desc instanceof Array)$desc=$desc[1]
-Ay.prototype=$desc
+er.prototype=$desc
 function Bj(a){this.a=a}Bj.builtin$cls="Bj"
 if(!"name" in Bj)Bj.name="Bj"
 $desc=$collectedClasses.Bj
@@ -31191,9 +30950,9 @@
 HA.prototype.gG3=function(receiver){return this.G3}
 HA.prototype.gjL=function(receiver){return this.jL}
 HA.prototype.gzZ=function(receiver){return this.zZ}
-function qC(Zp,AP,fn){this.Zp=Zp
+function qC(Zp,AP,Lk){this.Zp=Zp
 this.AP=AP
-this.fn=fn}qC.builtin$cls="qC"
+this.Lk=Lk}qC.builtin$cls="qC"
 if(!"name" in qC)qC.name="qC"
 $desc=$collectedClasses.qC
 if($desc instanceof Array)$desc=$desc[1]
@@ -31208,14 +30967,14 @@
 $desc=$collectedClasses.Lo
 if($desc instanceof Array)$desc=$desc[1]
 Lo.prototype=$desc
-function WR(ay,YB,BK,kN,cs,cT,AP,fn){this.ay=ay
+function WR(ay,YB,BK,kN,cs,cT,AP,Lk){this.ay=ay
 this.YB=YB
 this.BK=BK
 this.kN=kN
 this.cs=cs
 this.cT=cT
 this.AP=AP
-this.fn=fn}WR.builtin$cls="WR"
+this.Lk=Lk}WR.builtin$cls="WR"
 if(!"name" in WR)WR.name="WR"
 $desc=$collectedClasses.WR
 if($desc instanceof Array)$desc=$desc[1]
@@ -31239,11 +30998,11 @@
 $desc=$collectedClasses.C4
 if($desc instanceof Array)$desc=$desc[1]
 C4.prototype=$desc
-function YJ(){}YJ.builtin$cls="YJ"
-if(!"name" in YJ)YJ.name="YJ"
-$desc=$collectedClasses.YJ
+function Md(){}Md.builtin$cls="Md"
+if(!"name" in Md)Md.name="Md"
+$desc=$collectedClasses.Md
 if($desc instanceof Array)$desc=$desc[1]
-YJ.prototype=$desc
+Md.prototype=$desc
 function km(a){this.a=a}km.builtin$cls="km"
 if(!"name" in km)km.name="km"
 $desc=$collectedClasses.km
@@ -31254,7 +31013,7 @@
 $desc=$collectedClasses.Zj
 if($desc instanceof Array)$desc=$desc[1]
 Zj.prototype=$desc
-function XP(zx,kw,aa,RT,Q7,NF,hf,xX,cI,lD,Gd,Ei){this.zx=zx
+function XP(zx,kw,aa,RT,Q7,NF,hf,xX,cI,lD,Gd,Ve){this.zx=zx
 this.kw=kw
 this.aa=aa
 this.RT=RT
@@ -31265,7 +31024,7 @@
 this.cI=cI
 this.lD=lD
 this.Gd=Gd
-this.Ei=Ei}XP.builtin$cls="XP"
+this.Ve=Ve}XP.builtin$cls="XP"
 if(!"name" in XP)XP.name="XP"
 $desc=$collectedClasses.XP
 if($desc instanceof Array)$desc=$desc[1]
@@ -31305,11 +31064,11 @@
 $desc=$collectedClasses.MX
 if($desc instanceof Array)$desc=$desc[1]
 MX.prototype=$desc
-function w10(){}w10.builtin$cls="w10"
-if(!"name" in w10)w10.name="w10"
-$desc=$collectedClasses.w10
+function w12(){}w12.builtin$cls="w12"
+if(!"name" in w12)w12.name="w12"
+$desc=$collectedClasses.w12
 if($desc instanceof Array)$desc=$desc[1]
-w10.prototype=$desc
+w12.prototype=$desc
 function r3y(a){this.a=a}r3y.builtin$cls="r3y"
 if(!"name" in r3y)r3y.name="r3y"
 $desc=$collectedClasses.r3y
@@ -31409,8 +31168,8 @@
 $desc=$collectedClasses.Bf
 if($desc instanceof Array)$desc=$desc[1]
 Bf.prototype=$desc
-function ir(AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
-this.fn=fn
+function ir(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -31423,11 +31182,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
-if(!"name" in jpR)jpR.name="jpR"
-$desc=$collectedClasses.jpR
+function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
+if(!"name" in Sa)Sa.name="Sa"
+$desc=$collectedClasses.Sa
 if($desc instanceof Array)$desc=$desc[1]
-jpR.prototype=$desc
+Sa.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31460,11 +31219,11 @@
 $desc=$collectedClasses.V3
 if($desc instanceof Array)$desc=$desc[1]
 V3.prototype=$desc
-function Bl(){}Bl.builtin$cls="Bl"
-if(!"name" in Bl)Bl.name="Bl"
-$desc=$collectedClasses.Bl
+function rD(){}rD.builtin$cls="rD"
+if(!"name" in rD)rD.name="rD"
+$desc=$collectedClasses.rD
 if($desc instanceof Array)$desc=$desc[1]
-Bl.prototype=$desc
+rD.prototype=$desc
 function Fn(){}Fn.builtin$cls="Fn"
 if(!"name" in Fn)Fn.name="Fn"
 $desc=$collectedClasses.Fn
@@ -31552,17 +31311,17 @@
 $desc=$collectedClasses.Xy
 if($desc instanceof Array)$desc=$desc[1]
 Xy.prototype=$desc
-function G0(a){this.a=a}G0.builtin$cls="G0"
-if(!"name" in G0)G0.name="G0"
-$desc=$collectedClasses.G0
+function uK(a){this.a=a}uK.builtin$cls="uK"
+if(!"name" in uK)uK.name="uK"
+$desc=$collectedClasses.uK
 if($desc instanceof Array)$desc=$desc[1]
-G0.prototype=$desc
-function mY(a9,Cu,uI,Y7,AP,fn){this.a9=a9
+uK.prototype=$desc
+function mY(a9,Cu,uI,Y7,AP,Lk){this.a9=a9
 this.Cu=Cu
 this.uI=uI
 this.Y7=Y7
 this.AP=AP
-this.fn=fn}mY.builtin$cls="mY"
+this.Lk=Lk}mY.builtin$cls="mY"
 if(!"name" in mY)mY.name="mY"
 $desc=$collectedClasses.mY
 if($desc instanceof Array)$desc=$desc[1]
@@ -31578,10 +31337,10 @@
 $desc=$collectedClasses.mB
 if($desc instanceof Array)$desc=$desc[1]
 mB.prototype=$desc
-function XF(vq,L1,AP,fn){this.vq=vq
+function XF(vq,L1,AP,Lk){this.vq=vq
 this.L1=L1
 this.AP=AP
-this.fn=fn}XF.builtin$cls="XF"
+this.Lk=Lk}XF.builtin$cls="XF"
 if(!"name" in XF)XF.name="XF"
 $desc=$collectedClasses.XF
 if($desc instanceof Array)$desc=$desc[1]
@@ -31592,11 +31351,6 @@
 $desc=$collectedClasses.bX
 if($desc instanceof Array)$desc=$desc[1]
 bX.prototype=$desc
-function Uf(){}Uf.builtin$cls="Uf"
-if(!"name" in Uf)Uf.name="Uf"
-$desc=$collectedClasses.Uf
-if($desc instanceof Array)$desc=$desc[1]
-Uf.prototype=$desc
 function Ra(){}Ra.builtin$cls="Ra"
 if(!"name" in Ra)Ra.name="Ra"
 $desc=$collectedClasses.Ra
@@ -31667,11 +31421,16 @@
 $desc=$collectedClasses.w7
 if($desc instanceof Array)$desc=$desc[1]
 w7.prototype=$desc
-function w9(){}w9.builtin$cls="w9"
-if(!"name" in w9)w9.name="w9"
-$desc=$collectedClasses.w9
+function w10(){}w10.builtin$cls="w10"
+if(!"name" in w10)w10.name="w10"
+$desc=$collectedClasses.w10
 if($desc instanceof Array)$desc=$desc[1]
-w9.prototype=$desc
+w10.prototype=$desc
+function w11(){}w11.builtin$cls="w11"
+if(!"name" in w11)w11.name="w11"
+$desc=$collectedClasses.w11
+if($desc instanceof Array)$desc=$desc[1]
+w11.prototype=$desc
 function c4(a){this.a=a}c4.builtin$cls="c4"
 if(!"name" in c4)c4.name="c4"
 $desc=$collectedClasses.c4
@@ -31686,14 +31445,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 z6.prototype=$desc
 z6.prototype.geT=function(receiver){return this.eT}
-function Ay0(bO,Lv){this.bO=bO
-this.Lv=Lv}Ay0.builtin$cls="Ay0"
-if(!"name" in Ay0)Ay0.name="Ay0"
-$desc=$collectedClasses.Ay0
+z6.prototype.gk8=function(){return this.k8}
+function Ay(bO,Lv){this.bO=bO
+this.Lv=Lv}Ay.builtin$cls="Ay"
+if(!"name" in Ay)Ay.name="Ay"
+$desc=$collectedClasses.Ay
 if($desc instanceof Array)$desc=$desc[1]
-Ay0.prototype=$desc
-Ay0.prototype.sbO=function(v){return this.bO=v}
-Ay0.prototype.gLv=function(){return this.Lv}
+Ay.prototype=$desc
+Ay.prototype.sbO=function(v){return this.bO=v}
+Ay.prototype.gLv=function(){return this.Lv}
 function Ed(Jd){this.Jd=Jd}Ed.builtin$cls="Ed"
 if(!"name" in Ed)Ed.name="Ed"
 $desc=$collectedClasses.Ed
@@ -31794,19 +31554,19 @@
 if($desc instanceof Array)$desc=$desc[1]
 mv.prototype=$desc
 mv.prototype.gwz=function(){return this.wz}
-function mG(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
+function iv(Bb,T8,KL,bO,tj,Lv,k6){this.Bb=Bb
 this.T8=T8
 this.KL=KL
 this.bO=bO
 this.tj=tj
 this.Lv=Lv
-this.k6=k6}mG.builtin$cls="mG"
-if(!"name" in mG)mG.name="mG"
-$desc=$collectedClasses.mG
+this.k6=k6}iv.builtin$cls="iv"
+if(!"name" in iv)iv.name="iv"
+$desc=$collectedClasses.iv
 if($desc instanceof Array)$desc=$desc[1]
-mG.prototype=$desc
-mG.prototype.gBb=function(){return this.Bb}
-mG.prototype.gT8=function(){return this.T8}
+iv.prototype=$desc
+iv.prototype.gBb=function(){return this.Bb}
+iv.prototype.gT8=function(){return this.T8}
 function uA(a,b){this.a=a
 this.b=b}uA.builtin$cls="uA"
 if(!"name" in uA)uA.name="uA"
@@ -31856,11 +31616,11 @@
 $desc=$collectedClasses.ja
 if($desc instanceof Array)$desc=$desc[1]
 ja.prototype=$desc
-function zw(d){this.d=d}zw.builtin$cls="zw"
-if(!"name" in zw)zw.name="zw"
-$desc=$collectedClasses.zw
+function ey(d){this.d=d}ey.builtin$cls="ey"
+if(!"name" in ey)ey.name="ey"
+$desc=$collectedClasses.ey
 if($desc instanceof Array)$desc=$desc[1]
-zw.prototype=$desc
+ey.prototype=$desc
 function fa(hP,re,KL,bO,tj,Lv,k6){this.hP=hP
 this.re=re
 this.KL=KL
@@ -32090,16 +31850,16 @@
 $desc=$collectedClasses.fr
 if($desc instanceof Array)$desc=$desc[1]
 fr.prototype=$desc
-function cfS(){}cfS.builtin$cls="cfS"
-if(!"name" in cfS)cfS.name="cfS"
-$desc=$collectedClasses.cfS
+function d2(){}d2.builtin$cls="d2"
+if(!"name" in d2)d2.name="d2"
+$desc=$collectedClasses.d2
 if($desc instanceof Array)$desc=$desc[1]
-cfS.prototype=$desc
-function JG(kW,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
+d2.prototype=$desc
+function JG(kW,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kW=kW
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32116,23 +31876,20 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V0(){}V0.builtin$cls="V0"
-if(!"name" in V0)V0.name="V0"
-$desc=$collectedClasses.V0
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V0.prototype=$desc
-function knI(zw,AP,fn,tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
+V20.prototype=$desc
+function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32154,14 +31911,12 @@
 $desc=$collectedClasses.T5
 if($desc instanceof Array)$desc=$desc[1]
 T5.prototype=$desc
-function fI(Uz,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
+this.HJ=HJ
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32178,30 +31933,432 @@
 fI.prototype.gUz.$reflectable=1
 fI.prototype.sUz=function(receiver,v){return receiver.Uz=v}
 fI.prototype.sUz.$reflectable=1
-function oaa(){}oaa.builtin$cls="oaa"
-if(!"name" in oaa)oaa.name="oaa"
-$desc=$collectedClasses.oaa
+fI.prototype.gHJ=function(receiver){return receiver.HJ}
+fI.prototype.gHJ.$reflectable=1
+fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
+fI.prototype.sHJ.$reflectable=1
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-oaa.prototype=$desc
-function qq(a){this.a=a}qq.builtin$cls="qq"
+V21.prototype=$desc
+function qq(a,b){this.a=a
+this.b=b}qq.builtin$cls="qq"
 if(!"name" in qq)qq.name="qq"
 $desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
 qq.prototype=$desc
-function FC(){}FC.builtin$cls="FC"
-if(!"name" in FC)FC.name="FC"
-$desc=$collectedClasses.FC
+function G8(F1){this.F1=F1}G8.builtin$cls="G8"
+if(!"name" in G8)G8.name="G8"
+$desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
-FC.prototype=$desc
-function xI(tY,Pe,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+G8.prototype=$desc
+G8.prototype.gF1=function(receiver){return this.F1}
+function fJ(F1,A4){this.F1=F1
+this.A4=A4}fJ.builtin$cls="fJ"
+if(!"name" in fJ)fJ.name="fJ"
+$desc=$collectedClasses.fJ
+if($desc instanceof Array)$desc=$desc[1]
+fJ.prototype=$desc
+function q1(a){this.a=a}q1.builtin$cls="q1"
+if(!"name" in q1)q1.name="q1"
+$desc=$collectedClasses.q1
+if($desc instanceof Array)$desc=$desc[1]
+q1.prototype=$desc
+function jx(F1,A4){this.F1=F1
+this.A4=A4}jx.builtin$cls="jx"
+if(!"name" in jx)jx.name="jx"
+$desc=$collectedClasses.jx
+if($desc instanceof Array)$desc=$desc[1]
+jx.prototype=$desc
+function yT(){}yT.builtin$cls="yT"
+if(!"name" in yT)yT.name="yT"
+$desc=$collectedClasses.yT
+if($desc instanceof Array)$desc=$desc[1]
+yT.prototype=$desc
+function Cn(){}Cn.builtin$cls="Cn"
+if(!"name" in Cn)Cn.name="Cn"
+$desc=$collectedClasses.Cn
+if($desc instanceof Array)$desc=$desc[1]
+Cn.prototype=$desc
+function du(F1,A4){this.F1=F1
+this.A4=A4}du.builtin$cls="du"
+if(!"name" in du)du.name="du"
+$desc=$collectedClasses.du
+if($desc instanceof Array)$desc=$desc[1]
+du.prototype=$desc
+function xc(F1,A4){this.F1=F1
+this.A4=A4}xc.builtin$cls="xc"
+if(!"name" in xc)xc.name="xc"
+$desc=$collectedClasses.xc
+if($desc instanceof Array)$desc=$desc[1]
+xc.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+this.fq=fq
+this.ne=ne
+this.PH=PH
+this.pw=pw
+this.v9=v9
+this.zb=zb
+this.KT=KT
+this.f5=f5
+this.cL=cL
+this.LE=LE
+this.Cf=Cf
+this.W1=W1
+this.S9=S9
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}bv.builtin$cls="bv"
+if(!"name" in bv)bv.name="bv"
+$desc=$collectedClasses.bv
+if($desc instanceof Array)$desc=$desc[1]
+bv.prototype=$desc
+bv.prototype.gzf=function(){return this.zf}
+bv.prototype.gbN=function(){return this.KT}
+bv.prototype.sbN=function(v){return this.KT=v}
+bv.prototype.gGR=function(){return this.f5}
+bv.prototype.sGR=function(v){return this.f5=v}
+bv.prototype.gLE=function(){return this.LE}
+bv.prototype.gLE.$reflectable=1
+function D3(){}D3.builtin$cls="D3"
+if(!"name" in D3)D3.name="D3"
+$desc=$collectedClasses.D3
+if($desc instanceof Array)$desc=$desc[1]
+D3.prototype=$desc
+function KQ(a){this.a=a}KQ.builtin$cls="KQ"
+if(!"name" in KQ)KQ.name="KQ"
+$desc=$collectedClasses.KQ
+if($desc instanceof Array)$desc=$desc[1]
+KQ.prototype=$desc
+function Qq(a){this.a=a}Qq.builtin$cls="Qq"
+if(!"name" in Qq)Qq.name="Qq"
+$desc=$collectedClasses.Qq
+if($desc instanceof Array)$desc=$desc[1]
+Qq.prototype=$desc
+function Qd(Gt,i2,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.Gt=Gt
+this.i2=i2
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}Qd.builtin$cls="Qd"
+if(!"name" in Qd)Qd.name="Qd"
+$desc=$collectedClasses.Qd
+if($desc instanceof Array)$desc=$desc[1]
+Qd.prototype=$desc
+Qd.prototype.gi2=function(receiver){return this.i2}
+Qd.prototype.gi2.$reflectable=1
+function i6(a,b){this.a=a
+this.b=b}i6.builtin$cls="i6"
+if(!"name" in i6)i6.name="i6"
+$desc=$collectedClasses.i6
+if($desc instanceof Array)$desc=$desc[1]
+i6.prototype=$desc
+function r2(c){this.c=c}r2.builtin$cls="r2"
+if(!"name" in r2)r2.name="r2"
+$desc=$collectedClasses.r2
+if($desc instanceof Array)$desc=$desc[1]
+r2.prototype=$desc
+function JB(d){this.d=d}JB.builtin$cls="JB"
+if(!"name" in JB)JB.name="JB"
+$desc=$collectedClasses.JB
+if($desc instanceof Array)$desc=$desc[1]
+JB.prototype=$desc
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
+if($desc instanceof Array)$desc=$desc[1]
+qj.prototype=$desc
+function BH(a){this.a=a}BH.builtin$cls="BH"
+if(!"name" in BH)BH.name="BH"
+$desc=$collectedClasses.BH
+if($desc instanceof Array)$desc=$desc[1]
+BH.prototype=$desc
+function SI(RF,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.RF=RF
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}SI.builtin$cls="SI"
+if(!"name" in SI)SI.name="SI"
+$desc=$collectedClasses.SI
+if($desc instanceof Array)$desc=$desc[1]
+SI.prototype=$desc
+function pt(J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+this.LD=LD
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}pt.builtin$cls="pt"
+if(!"name" in pt)pt.name="pt"
+$desc=$collectedClasses.pt
+if($desc instanceof Array)$desc=$desc[1]
+pt.prototype=$desc
+function wVq(){}wVq.builtin$cls="wVq"
+if(!"name" in wVq)wVq.name="wVq"
+$desc=$collectedClasses.wVq
+if($desc instanceof Array)$desc=$desc[1]
+wVq.prototype=$desc
+function c2(Rd,a4){this.Rd=Rd
+this.a4=a4}c2.builtin$cls="c2"
+if(!"name" in c2)c2.name="c2"
+$desc=$collectedClasses.c2
+if($desc instanceof Array)$desc=$desc[1]
+c2.prototype=$desc
+c2.prototype.gRd=function(receiver){return this.Rd}
+c2.prototype.gRd.$reflectable=1
+c2.prototype.ga4=function(receiver){return this.a4}
+c2.prototype.ga4.$reflectable=1
+function rj(Sw,u9,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.Sw=Sw
+this.u9=u9
+this.Gz=Gz
+this.J6=J6
+this.Ge=Ge
+this.wA=wA
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}rj.builtin$cls="rj"
+if(!"name" in rj)rj.name="rj"
+$desc=$collectedClasses.rj
+if($desc instanceof Array)$desc=$desc[1]
+rj.prototype=$desc
+rj.prototype.gSw=function(){return this.Sw}
+rj.prototype.gSw.$reflectable=1
+rj.prototype.gu9=function(){return this.u9}
+rj.prototype.gu9.$reflectable=1
+function dZL(){}dZL.builtin$cls="dZL"
+if(!"name" in dZL)dZL.name="dZL"
+$desc=$collectedClasses.dZL
+if($desc instanceof Array)$desc=$desc[1]
+dZL.prototype=$desc
+function N8(Yu,Du,fF){this.Yu=Yu
+this.Du=Du
+this.fF=fF}N8.builtin$cls="N8"
+if(!"name" in N8)N8.name="N8"
+$desc=$collectedClasses.N8
+if($desc instanceof Array)$desc=$desc[1]
+N8.prototype=$desc
+N8.prototype.gYu=function(){return this.Yu}
+N8.prototype.gDu=function(){return this.Du}
+N8.prototype.gfF=function(){return this.fF}
+function Q4(Yu,m7,L4,AP,Lk){this.Yu=Yu
+this.m7=m7
+this.L4=L4
+this.AP=AP
+this.Lk=Lk}Q4.builtin$cls="Q4"
+if(!"name" in Q4)Q4.name="Q4"
+$desc=$collectedClasses.Q4
+if($desc instanceof Array)$desc=$desc[1]
+Q4.prototype=$desc
+Q4.prototype.gYu=function(){return this.Yu}
+Q4.prototype.gYu.$reflectable=1
+Q4.prototype.gm7=function(){return this.m7}
+Q4.prototype.gm7.$reflectable=1
+Q4.prototype.gL4=function(){return this.L4}
+Q4.prototype.gL4.$reflectable=1
+function WAE(uX){this.uX=uX}WAE.builtin$cls="WAE"
+if(!"name" in WAE)WAE.name="WAE"
+$desc=$collectedClasses.WAE
+if($desc instanceof Array)$desc=$desc[1]
+WAE.prototype=$desc
+function Vi(tT,Av){this.tT=tT
+this.Av=Av}Vi.builtin$cls="Vi"
+if(!"name" in Vi)Vi.name="Vi"
+$desc=$collectedClasses.Vi
+if($desc instanceof Array)$desc=$desc[1]
+Vi.prototype=$desc
+Vi.prototype.gtT=function(receiver){return this.tT}
+Vi.prototype.gAv=function(){return this.Av}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+this.jv=jv
+this.Du=Du
+this.fF=fF
+this.vg=vg
+this.Mb=Mb
+this.VS=VS
+this.hw=hw
+this.va=va
+this.yP=yP
+this.mM=mM
+this.qH=qH
+this.MO=MO
+this.oc=oc
+this.zz=zz
+this.TD=TD
+this.AP=AP
+this.Lk=Lk
+this.Fm=Fm
+this.KG=KG
+this.mQ=mQ
+this.nr=nr
+this.bN=bN
+this.GR=GR
+this.AP=AP
+this.Lk=Lk}kx.builtin$cls="kx"
+if(!"name" in kx)kx.name="kx"
+$desc=$collectedClasses.kx
+if($desc instanceof Array)$desc=$desc[1]
+kx.prototype=$desc
+kx.prototype.gDu=function(){return this.Du}
+kx.prototype.gDu.$reflectable=1
+kx.prototype.sDu=function(v){return this.Du=v}
+kx.prototype.sDu.$reflectable=1
+kx.prototype.gfF=function(){return this.fF}
+kx.prototype.gfF.$reflectable=1
+kx.prototype.sfF=function(v){return this.fF=v}
+kx.prototype.sfF.$reflectable=1
+kx.prototype.gvg=function(){return this.vg}
+kx.prototype.gvg.$reflectable=1
+kx.prototype.svg=function(v){return this.vg=v}
+kx.prototype.svg.$reflectable=1
+kx.prototype.gMb=function(){return this.Mb}
+kx.prototype.gMb.$reflectable=1
+kx.prototype.sMb=function(v){return this.Mb=v}
+kx.prototype.sMb.$reflectable=1
+kx.prototype.gVS=function(){return this.VS}
+kx.prototype.gVS.$reflectable=1
+kx.prototype.ghw=function(){return this.hw}
+kx.prototype.ghw.$reflectable=1
+kx.prototype.gva=function(){return this.va}
+kx.prototype.gva.$reflectable=1
+kx.prototype.gyP=function(){return this.yP}
+kx.prototype.gyP.$reflectable=1
+kx.prototype.goc=function(receiver){return this.oc}
+kx.prototype.soc=function(receiver,v){return this.oc=v}
+kx.prototype.gzz=function(){return this.zz}
+kx.prototype.szz=function(v){return this.zz=v}
+function w8F(){}w8F.builtin$cls="w8F"
+if(!"name" in w8F)w8F.name="w8F"
+$desc=$collectedClasses.w8F
+if($desc instanceof Array)$desc=$desc[1]
+w8F.prototype=$desc
+function fx(){}fx.builtin$cls="fx"
+if(!"name" in fx)fx.name="fx"
+$desc=$collectedClasses.fx
+if($desc instanceof Array)$desc=$desc[1]
+fx.prototype=$desc
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function UZ(a,b,c){this.a=a
+this.b=b
+this.c=c}UZ.builtin$cls="UZ"
+if(!"name" in UZ)UZ.name="UZ"
+$desc=$collectedClasses.UZ
+if($desc instanceof Array)$desc=$desc[1]
+UZ.prototype=$desc
+function No(tl){this.tl=tl}No.builtin$cls="No"
+if(!"name" in No)No.name="No"
+$desc=$collectedClasses.No
+if($desc instanceof Array)$desc=$desc[1]
+No.prototype=$desc
+No.prototype.gtl=function(){return this.tl}
+No.prototype.gtl.$reflectable=1
+No.prototype.stl=function(v){return this.tl=v}
+No.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+this.tl=tl
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}XK.builtin$cls="XK"
+if(!"name" in XK)XK.name="XK"
+$desc=$collectedClasses.XK
+if($desc instanceof Array)$desc=$desc[1]
+XK.prototype=$desc
+XK.prototype.gYu=function(){return this.Yu}
+function dT(){}dT.builtin$cls="dT"
+if(!"name" in dT)dT.name="dT"
+$desc=$collectedClasses.dT
+if($desc instanceof Array)$desc=$desc[1]
+dT.prototype=$desc
+function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+this.yb=yb
+this.tl=tl
+this.R9=R9
+this.wv=wv
+this.V2=V2
+this.me=me}ho.builtin$cls="ho"
+if(!"name" in ho)ho.name="ho"
+$desc=$collectedClasses.ho
+if($desc instanceof Array)$desc=$desc[1]
+ho.prototype=$desc
+function ob(mC,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.mC=mC
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}ob.builtin$cls="ob"
+if(!"name" in ob)ob.name="ob"
+$desc=$collectedClasses.ob
+if($desc instanceof Array)$desc=$desc[1]
+ob.prototype=$desc
+ob.prototype.gmC=function(receiver){return receiver.mC}
+ob.prototype.gmC.$reflectable=1
+ob.prototype.smC=function(receiver,v){return receiver.mC=v}
+ob.prototype.smC.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
+if($desc instanceof Array)$desc=$desc[1]
+V22.prototype=$desc
+function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32222,19 +32379,16 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Sq(){}Sq.builtin$cls="Sq"
-if(!"name" in Sq)Sq.name="Sq"
-$desc=$collectedClasses.Sq
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Sq.prototype=$desc
-function nm(Va,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
+Ds.prototype=$desc
+function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32251,19 +32405,16 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function q2(){}q2.builtin$cls="q2"
-if(!"name" in q2)q2.name="q2"
-$desc=$collectedClasses.q2
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-q2.prototype=$desc
-function uwf(Up,AP,fn,pC,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Up=Up
+V23.prototype=$desc
+function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
-this.fn=fn
-this.pC=pC
+this.Lk=Lk
 this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
+this.Lk=Lk
 this.dZ=dZ
 this.Sa=Sa
 this.Uk=Uk
@@ -32271,30 +32422,20 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}uwf.builtin$cls="uwf"
-if(!"name" in uwf)uwf.name="uwf"
-$desc=$collectedClasses.uwf
+this.X0=X0}Vu.builtin$cls="Vu"
+if(!"name" in Vu)Vu.name="Vu"
+$desc=$collectedClasses.Vu
 if($desc instanceof Array)$desc=$desc[1]
-uwf.prototype=$desc
-uwf.prototype.gUp=function(receiver){return receiver.Up}
-uwf.prototype.gUp.$reflectable=1
-uwf.prototype.sUp=function(receiver,v){return receiver.Up=v}
-uwf.prototype.sUp.$reflectable=1
-function q3(){}q3.builtin$cls="q3"
-if(!"name" in q3)q3.name="q3"
-$desc=$collectedClasses.q3
+Vu.prototype=$desc
+Vu.prototype.gB3=function(receiver){return receiver.B3}
+Vu.prototype.gB3.$reflectable=1
+Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
+Vu.prototype.sB3.$reflectable=1
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-q3.prototype=$desc
-function At(a){this.a=a}At.builtin$cls="At"
-if(!"name" in At)At.name="At"
-$desc=$collectedClasses.At
-if($desc instanceof Array)$desc=$desc[1]
-At.prototype=$desc
-function Sb(){}Sb.builtin$cls="Sb"
-if(!"name" in Sb)Sb.name="Sb"
-$desc=$collectedClasses.Sb
-if($desc instanceof Array)$desc=$desc[1]
-Sb.prototype=$desc
+V24.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32302,38 +32443,38 @@
 $desc=$collectedClasses.V2
 if($desc instanceof Array)$desc=$desc[1]
 V2.prototype=$desc
-function BT(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
+function D8(Y0,qP,ZY,xS,PB,eS,ay){this.Y0=Y0
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}BT.builtin$cls="BT"
-if(!"name" in BT)BT.name="BT"
-$desc=$collectedClasses.BT
+this.ay=ay}D8.builtin$cls="D8"
+if(!"name" in D8)D8.name="D8"
+$desc=$collectedClasses.D8
 if($desc instanceof Array)$desc=$desc[1]
-BT.prototype=$desc
-function jY(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
+D8.prototype=$desc
+function zP(Ca,qP,ZY,xS,PB,eS,ay){this.Ca=Ca
 this.qP=qP
 this.ZY=ZY
 this.xS=xS
 this.PB=PB
 this.eS=eS
-this.ay=ay}jY.builtin$cls="jY"
-if(!"name" in jY)jY.name="jY"
-$desc=$collectedClasses.jY
+this.ay=ay}zP.builtin$cls="zP"
+if(!"name" in zP)zP.name="zP"
+$desc=$collectedClasses.zP
 if($desc instanceof Array)$desc=$desc[1]
-jY.prototype=$desc
+zP.prototype=$desc
 function H2(){}H2.builtin$cls="H2"
 if(!"name" in H2)H2.name="H2"
 $desc=$collectedClasses.H2
 if($desc instanceof Array)$desc=$desc[1]
 H2.prototype=$desc
-function DO(){}DO.builtin$cls="DO"
-if(!"name" in DO)DO.name="DO"
-$desc=$collectedClasses.DO
+function lP(){}lP.builtin$cls="lP"
+if(!"name" in lP)lP.name="lP"
+$desc=$collectedClasses.lP
 if($desc instanceof Array)$desc=$desc[1]
-DO.prototype=$desc
+lP.prototype=$desc
 function fTP(a){this.a=a}fTP.builtin$cls="fTP"
 if(!"name" in fTP)fTP.name="fTP"
 $desc=$collectedClasses.fTP
@@ -32405,27 +32546,27 @@
 $desc=$collectedClasses.ee
 if($desc instanceof Array)$desc=$desc[1]
 ee.prototype=$desc
-function XI(Cd,wd,N2,Te){this.Cd=Cd
+function K6(Cd,wd,N2,Te){this.Cd=Cd
 this.wd=wd
 this.N2=N2
-this.Te=Te}XI.builtin$cls="XI"
-if(!"name" in XI)XI.name="XI"
-$desc=$collectedClasses.XI
+this.Te=Te}K6.builtin$cls="K6"
+if(!"name" in K6)K6.name="K6"
+$desc=$collectedClasses.K6
 if($desc instanceof Array)$desc=$desc[1]
-XI.prototype=$desc
-XI.prototype.gCd=function(receiver){return this.Cd}
-XI.prototype.gwd=function(receiver){return this.wd}
-XI.prototype.gN2=function(){return this.N2}
-XI.prototype.gTe=function(){return this.Te}
-function hs(N1,mD,Ck){this.N1=N1
+K6.prototype=$desc
+K6.prototype.gCd=function(receiver){return this.Cd}
+K6.prototype.gwd=function(receiver){return this.wd}
+K6.prototype.gN2=function(){return this.N2}
+K6.prototype.gTe=function(){return this.Te}
+function TU(N1,mD,Ck){this.N1=N1
 this.mD=mD
-this.Ck=Ck}hs.builtin$cls="hs"
-if(!"name" in hs)hs.name="hs"
-$desc=$collectedClasses.hs
+this.Ck=Ck}TU.builtin$cls="TU"
+if(!"name" in TU)TU.name="TU"
+$desc=$collectedClasses.TU
 if($desc instanceof Array)$desc=$desc[1]
-hs.prototype=$desc
-hs.prototype.gN1=function(){return this.N1}
-hs.prototype.sCk=function(v){return this.Ck=v}
+TU.prototype=$desc
+TU.prototype.gN1=function(){return this.N1}
+TU.prototype.sCk=function(v){return this.Ck=v}
 function yp(KO,qW,k8){this.KO=KO
 this.qW=qW
 this.k8=k8}yp.builtin$cls="yp"
@@ -32433,6 +32574,7 @@
 $desc=$collectedClasses.yp
 if($desc instanceof Array)$desc=$desc[1]
 yp.prototype=$desc
+yp.prototype.gk8=function(){return this.k8}
 function ug(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}ug.builtin$cls="ug"
@@ -32440,10 +32582,10 @@
 $desc=$collectedClasses.ug
 if($desc instanceof Array)$desc=$desc[1]
 ug.prototype=$desc
-function DT(lr,xT,kr,Dsl,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
+function DT(lr,xT,kr,Mf,QO,jH,mj,IT,dv,N1,mD,Ck){this.lr=lr
 this.xT=xT
 this.kr=kr
-this.Dsl=Dsl
+this.Mf=Mf
 this.QO=QO
 this.jH=jH
 this.mj=mj
@@ -32468,11 +32610,11 @@
 $desc=$collectedClasses.OB
 if($desc instanceof Array)$desc=$desc[1]
 OB.prototype=$desc
-function lP(){}lP.builtin$cls="lP"
-if(!"name" in lP)lP.name="lP"
-$desc=$collectedClasses.lP
+function Uf(){}Uf.builtin$cls="Uf"
+if(!"name" in Uf)Uf.name="Uf"
+$desc=$collectedClasses.Uf
 if($desc instanceof Array)$desc=$desc[1]
-lP.prototype=$desc
+Uf.prototype=$desc
 function p8(ud,lr,eS,ay){this.ud=ud
 this.lr=lr
 this.eS=eS
@@ -32519,21 +32661,21 @@
 $desc=$collectedClasses.TG
 if($desc instanceof Array)$desc=$desc[1]
 TG.prototype=$desc
-function ts(){}ts.builtin$cls="ts"
-if(!"name" in ts)ts.name="ts"
-$desc=$collectedClasses.ts
+function VU(){}VU.builtin$cls="VU"
+if(!"name" in VU)VU.name="VU"
+$desc=$collectedClasses.VU
 if($desc instanceof Array)$desc=$desc[1]
-ts.prototype=$desc
+VU.prototype=$desc
 function Kj(a){this.a=a}Kj.builtin$cls="Kj"
 if(!"name" in Kj)Kj.name="Kj"
 $desc=$collectedClasses.Kj
 if($desc instanceof Array)$desc=$desc[1]
 Kj.prototype=$desc
-function VU(b){this.b=b}VU.builtin$cls="VU"
-if(!"name" in VU)VU.name="VU"
-$desc=$collectedClasses.VU
+function R7(b){this.b=b}R7.builtin$cls="R7"
+if(!"name" in R7)R7.name="R7"
+$desc=$collectedClasses.R7
 if($desc instanceof Array)$desc=$desc[1]
-VU.prototype=$desc
+R7.prototype=$desc
 function Ya(yT,kU){this.yT=yT
 this.kU=kU}Ya.builtin$cls="Ya"
 if(!"name" in Ya)Ya.name="Ya"
@@ -32566,11 +32708,11 @@
 $desc=$collectedClasses.wl
 if($desc instanceof Array)$desc=$desc[1]
 wl.prototype=$desc
-function T4(){}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function ve(){}ve.builtin$cls="ve"
+if(!"name" in ve)ve.name="ve"
+$desc=$collectedClasses.ve
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+ve.prototype=$desc
 function TR(qP){this.qP=qP}TR.builtin$cls="TR"
 if(!"name" in TR)TR.name="TR"
 $desc=$collectedClasses.TR
@@ -32582,30 +32724,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-function Zt(Jh,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jh=Jh
-this.AP=AP
-this.fn=fn
-this.AP=AP
-this.fn=fn
-this.dZ=dZ
-this.Sa=Sa
-this.Uk=Uk
-this.oq=oq
-this.Wz=Wz
-this.SO=SO
-this.B7=B7
-this.X0=X0}Zt.builtin$cls="Zt"
-if(!"name" in Zt)Zt.name="Zt"
-$desc=$collectedClasses.Zt
-if($desc instanceof Array)$desc=$desc[1]
-Zt.prototype=$desc
-Zt.prototype.gJh=function(receiver){return receiver.Jh}
-Zt.prototype.gJh.$reflectable=1
-Zt.prototype.sJh=function(receiver,v){return receiver.Jh=v}
-Zt.prototype.sJh.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
-if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
-return[qE,pa,Gh,A0,na,Mr,zx,P2,Xk,W2,it,Az,QP,QW,jr,Ny,Zv,Yr,BR,di,d7,yJ,He,vz,vHT,n0,Em,pt,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,Aa,u5,Tq,W4,jP,Cz,tA,wa,Uq,QH,Rt,X2,zU,rk,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,fJ,BK,Rv,HO,Kk,ZY,Hy,EeC,Qb,Vu,xe,Hw,bn,Imr,Ve,CX,H9,FI,oU,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,FH,SN,HD,ni,jg,qj,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,CY,Wt,uaa,Hd,Ul,G5,bk,Lx,Er,qk,GI,Tb,tV,KP,yY,kJ,AE,xV,Dn,y6,RH,pU,OJ,Qa,dp,vw,aG,J6,u9,Bn,hq,UL,tZ,kc,AK,ty,Nf,F2,nL,QV,q0,Q7,hF,OF,Dh,Ue,mU,NE,lC,y5,jQ,mT,ui,mk,DQ,Sm,LM,es,eG,bd,pf,NV,W1,mCz,wf,n5,bb,Ic,lc,Xu,qM,tk,me,oB,nh,EI,MI,Ub,kK,eW,um,Fu,QN,N9,BA,d0,zp,br,PIw,vd,uzr,Yd,kN,lZ,Gr,XE,mO,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,tL,pyk,ZD,rD,wD,Wv,yz,Fi,Ja,mj,cB,uY,yR,GK,xJ,Nn,Et,NC,nb,Zn,xt,VJ,P0,xlX,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,Eb,dT,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,qa,BQ,O,PK,JO,f0,aX,cC,RA,IY,JH,jl,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,oo,OW,Dd,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,bw,WT,jJ,XR,LI,A2,IW,F3,FD,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,dN,GT,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,bv,eS,IQ,TI,at,wu,Vc,KQ,dZ,Qe,GH,Q4,WAE,N8,Vi,kx,fx,CM,xn,vu,c2,rj,af,SI,Y2,XN,No,PG,YW,BO,Yu,y2,Hq,Pl,XK,ho,G6,Ur,j3,i0,Tg,Ps,KU,RI,Ye,CN,HT,qbd,E0,Ds,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,H6,wB,U1,SJ,SU7,Qr,w2Y,iK,GD,Sn,nI,TY,Lj,mb,am,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,U7,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,LO,dz,tK,OR,Bg,DL,b8,j7,ff,Ia,Zf,vs,da,xw,dm,rH,ZL,rq,RW,RT,jZ,FZ,OM,qh,tG,jv,LB,zn,lz,Rl,Jb,M4,Jp,h7,pr,eN,PI,uO,j4,i9,VV,Dy,lU,OC,UH,Z5,ii,ib,MO,O9,yU,nP,KA,Vo,qB,ez,ti,LV,DS,JF,ht,CR,Qk,v1y,uR,Q0,YR,fB,nO,t3,dq,lO,aY,zG,e4,JB,Id,WH,TF,K5,Cg,Hs,dv,pV,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,ey,xd,v6,db,i5,N6,Rr,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,vX,Ba,An,bF,LD,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,wI,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Rz,iP,MF,Rq,Hn,Zl,B5,a6,P7,DW,Ge,LK,AT,bJ,Np,mp,ub,ds,lj,UV,VS,t7,HG,aE,eV,kM,EH,cX,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hb,XX,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ecX,kI,yoo,w1p,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,hP,Gm,Of,Qg,W9,vZ,dW,Dk,O7,IU,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,ac,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ob,Ip,Pg,Nb,nA,Fv,pv,E9,Vfx,m8,Gk,Urj,e5,Ni,AX,yb,oub,QR,Yx,NM,c4r,nx,jm,xj,VB,aI,rG,yh,wO,Tm,q1,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,fM,hx,Squ,PO,Vf,u7,fW,Ey,qm,vO,E7,KUl,SV,Mf,Kz,vj,tuj,LU,T2,mHk,Jq,Yn,TJ,dG,qV,HV,em,Lb,PF,Vct,fA,Qz,jA,Jo,c5,F1,aQ,D13,Ya5,WZq,Ww,pva,tz,cda,fl,qFb,oM,rna,wM,Vba,lI,waa,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,Ay,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,YJ,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w10,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,Bl,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,G0,mY,GX,mB,XF,bX,Uf,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w9,c4,z6,Ay0,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,mG,uA,vl,Li,WK,iT,ja,zw,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,cfS,JG,V0,knI,T5,fI,oaa,qq,FC,xI,Sq,nm,q2,uwf,q3,At,Sb,V2,BT,jY,H2,DO,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,XI,hs,yp,ug,DT,OB,lP,p8,NW,HS,TG,ts,Kj,VU,Ya,XT,ic,wl,T4,TR,VD,Zt,Dsd]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/app.dart b/runtime/bin/vmservice/client/lib/app.dart
index 912e60c..210b048 100644
--- a/runtime/bin/vmservice/client/lib/app.dart
+++ b/runtime/bin/vmservice/client/lib/app.dart
@@ -1,18 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 library app;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:html';
 import 'dart:js';
 
 import 'package:logging/logging.dart';
+import 'package:observatory/service_html.dart';
 import 'package:polymer/polymer.dart';
 
 part 'src/app/application.dart';
 part 'src/app/chart.dart';
-part 'src/app/isolate.dart';
 part 'src/app/location_manager.dart';
-part 'src/app/model.dart';
-part 'src/app/service.dart';
 part 'src/app/view_model.dart';
-part 'src/app/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 1607de3..0b59620 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -9,6 +9,7 @@
 export 'package:observatory/src/elements/collapsible_content.dart';
 export 'package:observatory/src/elements/curly_block.dart';
 export 'package:observatory/src/elements/error_view.dart';
+export 'package:observatory/src/elements/eval_box.dart';
 export 'package:observatory/src/elements/field_ref.dart';
 export 'package:observatory/src/elements/field_view.dart';
 export 'package:observatory/src/elements/function_ref.dart';
@@ -17,10 +18,12 @@
 export 'package:observatory/src/elements/instance_view.dart';
 export 'package:observatory/src/elements/isolate_list.dart';
 export 'package:observatory/src/elements/isolate_summary.dart';
+export 'package:observatory/src/elements/isolate_profile.dart';
+export 'package:observatory/src/elements/heap_profile.dart';
 export 'package:observatory/src/elements/json_view.dart';
 export 'package:observatory/src/elements/library_ref.dart';
 export 'package:observatory/src/elements/library_view.dart';
-export 'package:observatory/src/elements/message_viewer.dart';
+export 'package:observatory/src/elements/service_view.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/response_viewer.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index a19a572..4746eac 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -8,8 +8,8 @@
   <link rel="import" href="src/elements/code_view.html">
   <link rel="import" href="src/elements/curly_block.html">
   <link rel="import" href="src/elements/collapsible_content.html">
-  <link rel="import" href="src/elements/disassembly_entry.html">
   <link rel="import" href="src/elements/error_view.html">
+  <link rel="import" href="src/elements/eval_box.html">
   <link rel="import" href="src/elements/field_ref.html">
   <link rel="import" href="src/elements/field_view.html">
   <link rel="import" href="src/elements/function_ref.html">
@@ -21,14 +21,14 @@
   <link rel="import" href="src/elements/json_view.html">
   <link rel="import" href="src/elements/library_ref.html">
   <link rel="import" href="src/elements/library_view.html">
-  <link rel="import" href="src/elements/message_viewer.html">
   <link rel="import" href="src/elements/nav_bar.html">
   <link rel="import" href="src/elements/observatory_application.html">
   <link rel="import" href="src/elements/observatory_element.html">
   <link rel="import" href="src/elements/response_viewer.html">
-  <link rel="import" href="src/elements/service_ref.html">
   <link rel="import" href="src/elements/script_ref.html">
   <link rel="import" href="src/elements/script_view.html">
+  <link rel="import" href="src/elements/service_ref.html">
+  <link rel="import" href="src/elements/service_view.html">
   <link rel="import" href="src/elements/stack_frame.html">
   <link rel="import" href="src/elements/stack_trace.html">
 </head>
diff --git a/runtime/bin/vmservice/client/lib/service.dart b/runtime/bin/vmservice/client/lib/service.dart
new file mode 100644
index 0000000..e513701
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/service.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:logging/logging.dart';
+import 'package:observe/observe.dart';
+
+part 'src/service/cache.dart';
+part 'src/service/object.dart';
+part 'src/service/service.dart';
+part 'src/service/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/service_html.dart b/runtime/bin/vmservice/client/lib/service_html.dart
new file mode 100644
index 0000000..83df4d2
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/service_html.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service_html;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+
+import 'package:logging/logging.dart';
+import 'package:observatory/service.dart';
+
+// Export the service library.
+export 'package:observatory/service.dart';
+
+class HttpVM extends VM {
+  final String address;
+
+  HttpVM(this.address) : super();
+
+  Future<String> getString(String id) {
+    Logger.root.info('Fetching $id from $address');
+    return HttpRequest.getString(address + id).catchError((error) {
+      // If we get an error here, the network request has failed.
+      Logger.root.severe('HttpRequest.getString failed.');
+      return JSON.encode({
+          'type': 'Error',
+          'id': '',
+          'kind': 'NetworkError',
+          'message': 'Could not connect to service. Check that you started the'
+                     ' VM with the following flags:\n --enable-vm-service'
+                    ' --pin-isolates'
+        });
+    });
+  }
+}
+
+class DartiumVM extends VM {
+  final Map _outstandingRequests = new Map();
+  int _requestSerial = 0;
+
+  DartiumVM() : super() {
+    window.onMessage.listen(_messageHandler);
+    Logger.root.info('Connected to DartiumVM');
+  }
+
+  void _messageHandler(msg) {
+    var id = msg.data['id'];
+    var name = msg.data['name'];
+    var data = msg.data['data'];
+    if (name != 'observatoryData') {
+      return;
+    }
+    var completer = _outstandingRequests[id];
+    assert(completer != null);
+    _outstandingRequests.remove(id);
+    completer.complete(data);
+  }
+
+  Future<String> getString(String path) {
+    var idString = '$_requestSerial';
+    Map message = {};
+    message['id'] = idString;
+    message['method'] = 'observatoryQuery';
+    message['query'] = '/$path';
+    _requestSerial++;
+    var completer = new Completer();
+    _outstandingRequests[idString] = completer;
+    window.parent.postMessage(JSON.encode(message), '*');
+    return completer.future;
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
index 0c2c050..1efd625 100644
--- a/runtime/bin/vmservice/client/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -12,24 +12,16 @@
 class ObservatoryApplication extends Observable {
   @observable final LocationManager locationManager;
   @observable final VM vm;
-  @observable Map response;
   @observable Isolate isolate;
+  @observable ServiceObject response;
 
-  void setResponse(Map response) {
-    this.response = toObservable(response);
+  void setResponse(ServiceObject response) {
+    this.response = response;
   }
 
-  void setResponseError(String message, [String errorType = 'ResponseError']) {
-    this.response = toObservable({
-      'type': 'Error',
-      'errorType': errorType,
-      'text': message
-    });
-    Logger.root.severe(message);
-  }
-
-  void _setup() {
-    vm._app = this;
+  void _initOnce() {
+    // Only called once.
+    assert(locationManager._app == null);
     locationManager._app = this;
     locationManager.init();
   }
@@ -37,30 +29,12 @@
   ObservatoryApplication.devtools() :
       locationManager = new LocationManager(),
       vm = new DartiumVM() {
-    _setup();
+    _initOnce();
   }
 
   ObservatoryApplication() :
       locationManager = new LocationManager(),
       vm = new HttpVM('http://127.0.0.1:8181/') {
-    _setup();
-  }
-
-  static const int KB = 1024;
-  static const int MB = KB * 1024;
-  static String scaledSizeUnits(int x) {
-    if (x > 2 * MB) {
-      var y = x / MB;
-      return '${y.toStringAsFixed(1)} MB';
-    } else if (x > 2 * KB) {
-      var y = x / KB;
-      return '${y.toStringAsFixed(1)} KB';
-    }
-    var y = x.toDouble();
-    return '${y.toStringAsFixed(1)} B';
-  }
-
-  static String timeUnits(double x) {
-    return x.toStringAsFixed(2);
+    _initOnce();
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/app/isolate.dart b/runtime/bin/vmservice/client/lib/src/app/isolate.dart
deleted file mode 100644
index 34b649f..0000000
--- a/runtime/bin/vmservice/client/lib/src/app/isolate.dart
+++ /dev/null
@@ -1,253 +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 app;
-
-/// State for a running isolate.
-class Isolate extends Observable implements ServiceObject {
-  final VM vm;
-  String _id;
-  String _serviceType = 'Isolate';
-  Isolate get isolate => this;
-  String get link => _id;
-  String get id => _id;
-  String get serviceType => _serviceType;
-
-  Isolate(this.vm, this._id);
-
-  /// Refresh [this]. Returns a future which completes to [this].
-  Future refresh() {
-    return vm.fetchMap(_id).then((m) => update(m)).then((_) => this);
-  }
-
-  /// Creates a link to [objectId] relative to [this].
-  @reflectable String relativeLink(String objectId) => '$id/$objectId';
-  /// Creates a relative link to [objectId] with a '#/' prefix.
-  @reflectable String hashLink(String objectId) => '#/${relativeLink(objectId)}';
-
-  @observable Profile profile;
-  @observable final Map<String, Script> scripts =
-      toObservable(new Map<String, Script>());
-  @observable final List<Code> codes = new List<Code>();
-  @observable String name;
-  @observable String vmName;
-  @observable Map entry;
-  @observable String rootLib;
-  @observable final Map<String, double> timers =
-      toObservable(new Map<String, double>());
-
-  @observable int newHeapUsed = 0;
-  @observable int oldHeapUsed = 0;
-
-  @observable Map topFrame = null;
-  @observable String fileAndLine = null;
-
-  Isolate.fromId(this.vm, this._id) : name = 'isolate' {}
-
-  Isolate.fromMap(this.vm, Map map)
-      : _id = map['id'], name = map['name'] {
-  }
-
-  void update(Map map) {
-    if (map['type'] != 'Isolate') {
-      Logger.root.severe('Unexpected message type in Isolate.update: ${map["type"]}');
-      return;
-    }
-    if (map['rootLib'] == null ||
-        map['timers'] == null ||
-        map['heap'] == null) {
-      Logger.root.severe("Malformed 'Isolate' response: $map");
-      return;
-    }
-    rootLib = map['rootLib']['id'];
-    vmName = map['name'];
-    if (map['entry'] != null) {
-      entry = map['entry'];
-      name = entry['name'];
-    } else {
-      // fred
-      name = 'root isolate';
-    }
-    if (map['topFrame'] != null) {
-      topFrame = map['topFrame'];
-    }
-
-    var timerMap = {};
-    map['timers'].forEach((timer) {
-        timerMap[timer['name']] = timer['time'];
-      });
-    timers['total'] = timerMap['time_total_runtime'];
-    timers['compile'] = timerMap['time_compilation'];
-    timers['gc'] = 0.0;  // TODO(turnidge): Export this from VM.
-    timers['init'] = (timerMap['time_script_loading'] +
-                      timerMap['time_creating_snapshot'] +
-                      timerMap['time_isolate_initialization'] +
-                      timerMap['time_bootstrap']);
-    timers['dart'] = timerMap['time_dart_execution'];
-
-    newHeapUsed = map['heap']['usedNew'];
-    oldHeapUsed = map['heap']['usedOld'];
-  }
-
-  String toString() => '$id';
-
-  Code findCodeByAddress(int address) {
-    for (var i = 0; i < codes.length; i++) {
-      if (codes[i].contains(address)) {
-        return codes[i];
-      }
-    }
-    return null;
-  }
-
-  Code findCodeByName(String name) {
-    for (var i = 0; i < codes.length; i++) {
-      if (codes[i].name == name) {
-        return codes[i];
-      }
-    }
-    return null;
-  }
-
-  void resetCodeTicks() {
-    Logger.root.info('Reset all code ticks.');
-    for (var i = 0; i < codes.length; i++) {
-      codes[i].resetTicks();
-    }
-  }
-
-  void updateCoverage(List coverages) {
-    for (var coverage in coverages) {
-      var id = coverage['script']['id'];
-      var script = scripts[id];
-      if (script == null) {
-        script = new Script.fromMap(coverage['script']);
-        scripts[id] = script;
-      }
-      assert(script != null);
-      script._processCoverageHits(coverage['hits']);
-    }
-  }
-
-  // TODO(johnmccutchan): Remove this once everything is a ServiceObject.
-  void _setModelResponse(String type, String modelName, dynamic model) {
-    var response = {
-      'type': type,
-      modelName: model
-    };
-    vm.app.setResponse(response);
-  }
-
-  void _setResponseRequestError(HttpRequest request) {
-     String error = '${request.status} ${request.statusText}';
-     if (request.status == 0) {
-       error = 'No service found. Did you run with --enable-vm-service ?';
-     }
-     vm.app.setResponseError(error, 'RequestError');
-   }
-
-  void _requestCatchError(e, st) {
-     if (e is ProgressEvent) {
-       _setResponseRequestError(e.target);
-     } else {
-       vm.app.setResponseError('$e $st');
-     }
-   }
-
-  static final RegExp _codeMatcher = new RegExp(r'/code/');
-  static bool isCodeId(objectId) => _codeMatcher.hasMatch(objectId);
-  static int codeAddressFromRequest(String objectId) {
-    Match m = _codeMatcher.matchAsPrefix(objectId);
-    if (m == null) {
-      return 0;
-    }
-    try {
-      var a = int.parse(m.input.substring(m.end), radix: 16);
-      return a;
-    } catch (e) {
-      return 0;
-    }
-  }
-
-  /// Handle 'Code' requests
-  void _getCode(String objectId) {
-    var address = codeAddressFromRequest(objectId);
-    if (address == 0) {
-      vm.app.setResponseError('$objectId is not a valid code request.');
-      return;
-    }
-    var code = isolate.findCodeByAddress(address);
-    if (code != null) {
-      Logger.root.info(
-          'Found code with 0x${address.toRadixString(16)} in isolate.');
-      _setModelResponse('Code', 'code', code);
-      return;
-    }
-    getMap(objectId).then((map) {
-      assert(map['type'] == 'Code');
-      var code = new Code.fromMap(map);
-      Logger.root.info(
-          'Added code with 0x${address.toRadixString(16)} to isolate.');
-      isolate.codes.add(code);
-      _setModelResponse('Code', 'code', code);
-    }).catchError(_requestCatchError);
-  }
-
-  static final RegExp _scriptMatcher = new RegExp(r'scripts/.+');
-  static bool isScriptId(objectId) => _scriptMatcher.hasMatch(objectId);
-  void _getScript(String objectId) {
-    var script = scripts[objectId];
-    if ((script != null) && !script.needsSource) {
-      Logger.root.info('Found script ${script.scriptRef['name']} in isolate');
-      _setModelResponse('Script', 'script', script);
-      return;
-    }
-    if (script != null) {
-      // The isolate has the script but no script source code.
-      getMap(objectId).then((response) {
-        assert(response['type'] == 'Script');
-        script._processSource(response['source']);
-        Logger.root.info(
-            'Grabbed script ${script.scriptRef['name']} source.');
-        _setModelResponse('Script', 'script', script);
-      });
-      return;
-    }
-    // New script.
-    getMap(objectId).then((response) {
-      assert(response['type'] == 'Script');
-      var script = new Script.fromMap(response);
-      Logger.root.info(
-          'Added script ${script.scriptRef['name']} to isolate.');
-      _setModelResponse('Script', 'script', script);
-      scripts[objectId] = script;
-    });
-  }
-
-  /// Requests [objectId] from [this]. Completes to a [ServiceObject].
-  Future<ServiceObject> get(String objectId) {
-    if (isCodeId(objectId)) {
-      _getCode(objectId);
-      // TODO(johnmccutchan): FIX.
-      return null;
-    }
-    if (isScriptId(objectId)) {
-      _getScript(objectId);
-      // TODO(johnmccutchan): FIX.
-      return null;
-    }
-    return vm.fetchMap(relativeLink(objectId)).then((m) =>
-        upgradeToServiceObject(objectId, m));
-  }
-
-  /// Requests [objectId] from [this]. Completes to a [Map].
-  Future<ObservableMap> getMap(String objectId) {
-    return vm.fetchMap(relativeLink(objectId));
-  }
-
-  /// Upgrades response ([m]) for [objectId] to a [ServiceObject].
-  ServiceObject upgradeToServiceObject(String objectId, Map m) {
-    return new ServiceMap.fromMap(this, m);
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index 29fc074..dba7f88 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -8,24 +8,18 @@
 /// URL in window.location. The text after the '#' is used as the request
 /// string for the VM service.
 class LocationManager extends Observable {
-  static const int InvalidIsolateId = 0;
   static const String defaultHash = '#/isolates/';
-  static final RegExp currentIsolateMatcher = new RegExp(r"#/isolates/\d+");
-
+  static final RegExp _currentIsolateMatcher = new RegExp(r'#/isolates/\d+');
+  static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+/');
   ObservatoryApplication _app;
-  ObservatoryApplication get app => _app;
-
-  @observable bool profile = false;
   @observable String currentHash = '';
-  @observable Uri currentHashUri;
+
   void init() {
     window.onHashChange.listen((event) {
       if (setDefaultHash()) {
         // We just triggered another onHashChange event.
         return;
       }
-      notifyPropertyChange(#hasCurrentIsolate, !hasCurrentIsolate,
-                           hasCurrentIsolate);
       // Request the current anchor.
       requestCurrentHash();
     });
@@ -36,40 +30,23 @@
     }
   }
 
-
-  /// Returns the current isolate prefix, i.e. '#/isolates/XX/' if one
-  /// is present and null otherwise.
-  String currentIsolateAnchorPrefix() {
-    Match m = currentIsolateMatcher.matchAsPrefix(currentHash);
-    if (m == null) {
-      return null;
-    }
-    return m.input.substring(m.start, m.end);
-  }
-
-  /// Returns the current object id.
-  String currentObjectId() {
-    Match m = currentIsolateMatcher.matchAsPrefix(currentHash);
+  /// Parses the location entry and extracts the id for the object
+  /// inside the current isolate.
+  String currentIsolateObjectId() {
+    Match m = _currentObjectMatcher.matchAsPrefix(currentHash);
     if (m == null) {
       return null;
     }
     return m.input.substring(m.end);
   }
 
-  /// Predicate, does the current URL have a current isolate ID in it?
-  @observable bool get hasCurrentIsolate {
-    return currentIsolateAnchorPrefix() != null;
-  }
-
-  /// Extract the current isolate id as an integer. Returns [InvalidIsolateId]
-  /// if none is present in window.location.
+  /// Parses the location entry and extracts the id for the current isolate.
   String currentIsolateId() {
-    var prefix = currentIsolateAnchorPrefix();
-    if (prefix == null) {
+    Match m = _currentIsolateMatcher.matchAsPrefix(currentHash);
+    if (m == null) {
       return '';
     }
-    // Chop off the '/#'.
-    return prefix.substring(2);
+    return m.input.substring(2, m.end);
   }
 
   /// Returns the current isolate.
@@ -78,7 +55,7 @@
     if (id == '') {
       return null;
     }
-    return app.vm.getIsolate(id);
+    return _app.vm.isolates.getIsolate(id);
   }
 
   /// If no anchor is set, set the default anchor and return true.
@@ -92,23 +69,21 @@
     return false;
   }
 
-  /// Take the current request string from window.location and submit the
-  /// request to the request manager.
+  void _setResponse(ServiceObject serviceObject) {
+    _app.response = serviceObject;
+  }
+
+  /// Refresh the service object reference in the location entry.
   void requestCurrentHash() {
     currentHash = window.location.hash;
-    // Chomp off the #
-    String requestUrl = currentHash.substring(1);
-    app.isolate = currentIsolate();
-    currentHashUri = Uri.parse(requestUrl);
-    if (app.isolate == null) {
-      Logger.root.warning('Refreshing isolates.');
-      app.vm.refreshIsolates();
+    _app.isolate = currentIsolate();
+    if (_app.isolate == null) {
+      // No current isolate, refresh the isolate list.
+      _app.vm.isolates.reload().then(_setResponse);
       return;
     }
-    var objectId = currentObjectId();
-    Logger.root.info('Asking ${app.isolate.id} for ${objectId}');
-    app.isolate.get(objectId).then((so) {
-      app.response = so;
-    });
+    // Have a current isolate, request object.
+    var objectId = currentIsolateObjectId();
+    _app.isolate.get(objectId).then(_setResponse);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/app/model.dart b/runtime/bin/vmservice/client/lib/src/app/model.dart
deleted file mode 100644
index ddca7c8..0000000
--- a/runtime/bin/vmservice/client/lib/src/app/model.dart
+++ /dev/null
@@ -1,392 +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.
-
-part of app;
-
-class CodeInstruction extends Observable {
-  @observable final int address;
-  @observable final String machine;
-  @observable final String human;
-  @observable int ticks = 0;
-  @observable double percent;
-  @observable String formattedTicks() {
-    if (percent == null || percent <= 0.0) {
-      return '';
-    }
-    return '${percent.toStringAsFixed(2)}% (${ticks})';
-  }
-  @observable String formattedAddress() {
-    return '0x${address.toRadixString(16)}';
-  }
-  CodeInstruction(this.address, this.machine, this.human);
-  void updateTickString(Code code) {
-    if ((code == null) || (code.inclusiveTicks == 0)) {
-      percent = null;
-      return;
-    }
-    percent = (ticks / code.inclusiveTicks) * 100.0;
-    if (percent <= 0.00) {
-      percent = null;
-      return;
-    }
-  }
-}
-
-class CodeKind {
-  final _value;
-  const CodeKind._internal(this._value);
-  String toString() => 'CodeKind.$_value';
-
-  static CodeKind fromString(String s) {
-    if (s == 'Native') {
-      return Native;
-    } else if (s == 'Dart') {
-      return Dart;
-    } else if (s == 'Collected') {
-      return Collected;
-    }
-    throw new FallThroughError();
-  }
-  static const Native = const CodeKind._internal('Native');
-  static const Dart = const CodeKind._internal('Dart');
-  static const Collected = const CodeKind._internal('Collected');
-}
-
-class CodeTick {
-  final int address;
-  final int exclusive_ticks;
-  final int inclusive_ticks;
-  CodeTick(this.address, this.exclusive_ticks, this.inclusive_ticks);
-}
-
-class CodeCallCount {
-  final Code code;
-  final int count;
-  CodeCallCount(this.code, this.count);
-}
-
-class Code extends Observable {
-  final CodeKind kind;
-  final int startAddress;
-  final int endAddress;
-  final List<CodeTick> ticks = [];
-  final List<CodeCallCount> callers = [];
-  final List<CodeCallCount> callees = [];
-  int inclusiveTicks = 0;
-  int exclusiveTicks = 0;
-  @observable final List<CodeInstruction> instructions = toObservable([]);
-  @observable Map functionRef = toObservable({});
-  @observable Map codeRef = toObservable({});
-  @observable String name;
-  @observable String userName;
-
-  Code(this.kind, this.name, this.startAddress, this.endAddress);
-
-  Code.fromMap(Map map) :
-    kind = CodeKind.Dart,
-    startAddress = int.parse(map['start'], radix: 16),
-    endAddress = int.parse(map['end'], radix: 16) {
-    functionRef = toObservable(map['function']);
-    codeRef = toObservable(map);
-    name = map['name'];
-    userName = map['user_name'];
-    if (map['disassembly'] != null) {
-      _loadInstructions(map['disassembly']);
-    }
-  }
-
-  factory Code.fromProfileMap(Map map) {
-    var kind = CodeKind.fromString(map['kind']);
-    var startAddress;
-    var endAddress;
-    var name;
-    var userName;
-    var codeRef = map['code'];
-    assert(codeRef != null);
-    startAddress = int.parse(codeRef['start'], radix:16);
-    endAddress = int.parse(codeRef['end'], radix:16);
-    name = codeRef['name'];
-    userName = codeRef['user_name'];
-    var code = new Code(kind, name, startAddress, endAddress);
-    code.codeRef = codeRef;
-    code.functionRef = toObservable(codeRef['function']);;
-    code.userName = userName;
-    if (codeRef['disassembly'] != null) {
-      code._loadInstructions(codeRef['disassembly']);
-      // Throw the JSON version away after loading the disassembly.
-      codeRef['disassembly'] = null;
-    }
-    return code;
-  }
-
-  // Refresh tick counts, etc for a code object.
-  void _refresh(Map map) {
-    inclusiveTicks = int.parse(map['inclusive_ticks']);
-    exclusiveTicks = int.parse(map['exclusive_ticks']);
-    // Load address ticks.
-    var ticksList = map['ticks'];
-    if ((ticksList != null) && (ticksList.length > 0)) {
-      assert((ticks.length % 3) == 0);
-      for (var i = 0; i < ticksList.length; i += 3) {
-        var address = int.parse(ticksList[i], radix:16);
-        var inclusive_ticks = int.parse(ticksList[i + 1]);
-        var exclusive_ticks = int.parse(ticksList[i + 2]);
-        var codeTick = new CodeTick(address, exclusive_ticks, inclusive_ticks);
-        ticks.add(codeTick);
-      }
-    }
-  }
-
-  /// Sum all caller counts.
-  int sumCallersCount() => _sumCallCount(callers);
-  /// Specific caller count.
-  int callersCount(Code code) => _callCount(callers, code);
-  /// Sum of callees count.
-  int sumCalleesCount() => _sumCallCount(callees);
-  /// Specific callee count.
-  int calleesCount(Code code) => _callCount(callees, code);
-
-  int _sumCallCount(List<CodeCallCount> calls) {
-    var sum = 0;
-    for (CodeCallCount caller in calls) {
-      sum += caller.count;
-    }
-    return sum;
-  }
-
-  int _callCount(List<CodeCallCount> calls, Code code) {
-    for (CodeCallCount caller in calls) {
-      if (caller.code == code) {
-        return caller.count;
-      }
-    }
-    return 0;
-  }
-
-  void resolveCalls(Map code, List<Code> codes) {
-    _resolveCalls(callers, code['callers'], codes);
-    _resolveCalls(callees, code['callees'], codes);
-  }
-
-  void _resolveCalls(List<CodeCallCount> calls, List data, List<Code> codes) {
-    // Clear.
-    calls.clear();
-    // Resolve.
-    for (var i = 0; i < data.length; i += 2) {
-      var index = int.parse(data[i]);
-      var count = int.parse(data[i + 1]);
-      assert(index >= 0);
-      assert(index < codes.length);
-      calls.add(new CodeCallCount(codes[index], count));
-    }
-    // Sort to descending count order.
-    calls.sort((a, b) => b.count - a.count);
-  }
-
-  /// Resets all tick counts to 0.
-  void resetTicks() {
-    inclusiveTicks = 0;
-    exclusiveTicks = 0;
-    ticks.clear();
-    for (var instruction in instructions) {
-      instruction.ticks = 0;
-    }
-  }
-
-  /// Adds [count] to the tick count for the instruction at [address].
-  void tick(int address, int count) {
-    for (var instruction in instructions) {
-      if (instruction.address == address) {
-        instruction.ticks += count;
-        return;
-      }
-    }
-  }
-
-  /// Clears [instructions] and then adds all instructions from
-  /// [instructionList].
-  void _loadInstructions(List instructionList) {
-    instructions.clear();
-    // Load disassembly into code object.
-    for (int i = 0; i < instructionList.length; i += 3) {
-      if (instructionList[i] == '') {
-        // Code comment.
-        // TODO(johnmccutchan): Insert code comments into instructions.
-        continue;
-      }
-      var address = int.parse(instructionList[i]);
-      var machine = instructionList[i + 1];
-      var human = instructionList[i + 2];
-      instructions.add(new CodeInstruction(address, machine, human));
-    }
-  }
-
-  /// returns true if [address] is inside the address range.
-  bool contains(int address) {
-    return (address >= startAddress) && (address < endAddress);
-  }
-}
-
-class Profile {
-  final Isolate isolate;
-  final List<Code> _codeObjectsInImportOrder = new List<Code>();
-  int totalSamples = 0;
-
-  Profile.fromMap(this.isolate, Map m) {
-    var codes = m['codes'];
-    totalSamples = m['samples'];
-    Logger.root.info('Creating profile from ${totalSamples} samples '
-                     'and ${codes.length} code objects.');
-    isolate.resetCodeTicks();
-    _codeObjectsInImportOrder.clear();
-    codes.forEach((code) {
-      try {
-        _processCode(code);
-      } catch (e, st) {
-        Logger.root.warning('Error processing code object. $e $st', e, st);
-      }
-    });
-    // Now that code objects have been loaded, post-process them
-    // and resolve callers and callees.
-    assert(_codeObjectsInImportOrder.length == codes.length);
-    for (var i = 0; i < codes.length; i++) {
-      Code code = _codeObjectsInImportOrder[i];
-      code.resolveCalls(codes[i], _codeObjectsInImportOrder);
-    }
-    _codeObjectsInImportOrder.clear();
-  }
-
-  int _extractCodeStartAddress(Map code) {
-    return int.parse(code['code']['start'], radix:16);
-  }
-
-  void _processCode(Map profileCode) {
-    if (profileCode['type'] != 'ProfileCode') {
-      return;
-    }
-    int address = _extractCodeStartAddress(profileCode);
-    var code = isolate.findCodeByAddress(address);
-    if (code == null) {
-      // Never seen a code object at this address before, create a new one.
-      code = new Code.fromProfileMap(profileCode);
-      isolate.codes.add(code);
-    }
-    code._refresh(profileCode);
-    _codeObjectsInImportOrder.add(code);
-  }
-
-  List<Code> topExclusive(int count) {
-    List<Code> exclusive = isolate.codes;
-    exclusive.sort((Code a, Code b) {
-      return b.exclusiveTicks - a.exclusiveTicks;
-    });
-    if ((exclusive.length < count) || (count == 0)) {
-      return exclusive;
-    }
-    return exclusive.sublist(0, count);
-  }
-}
-
-class ScriptLine extends Observable {
-  @observable final int line;
-  @observable int hits = -1;
-  @observable String text = '';
-  /// Is this a line of executable code?
-  bool get executable => hits >= 0;
-  /// Has this line executed before?
-  bool get covered => hits > 0;
-  ScriptLine(this.line);
-}
-
-class Script extends Observable {
-  @observable String kind = null;
-  @observable Map scriptRef = toObservable({});
-  @published String shortName;
-  @observable Map libraryRef = toObservable({});
-  @observable final List<ScriptLine> lines =
-      toObservable(new List<ScriptLine>());
-  bool _needsSource = true;
-  bool get needsSource => _needsSource;
-  Script.fromMap(Map map) {
-    scriptRef = toObservable({
-      'id': map['id'],
-      'name': map['name'],
-      'user_name': map['user_name']
-    });
-    shortName = map['name'].substring(map['name'].lastIndexOf('/') + 1);
-    libraryRef = toObservable(map['library']);
-    kind = map['kind'];
-    _processSource(map['source']);
-  }
-
-  // Iterable of lines for display. Skips line '0'.
-  @observable Iterable get linesForDisplay {
-    return lines.skip(1);
-  }
-
-  // Fetch (possibly create) the ScriptLine for [lineNumber].
-  ScriptLine _getLine(int lineNumber) {
-    assert(lineNumber != 0);
-    if (lineNumber >= lines.length) {
-      // Grow lines list.
-      lines.length = lineNumber + 1;
-    }
-    var line = lines[lineNumber];
-    if (line == null) {
-      // Create this line.
-      line = new ScriptLine(lineNumber);
-      lines[lineNumber] = line;
-    }
-    return line;
-  }
-
-  void _processSource(String source) {
-    if (source == null) {
-      return;
-    }
-    Logger.root.info('Loading source for ${scriptRef['name']}');
-    var sourceLines = source.split('\n');
-    _needsSource = sourceLines.length == 0;
-    for (var i = 0; i < sourceLines.length; i++) {
-      var line = _getLine(i + 1);
-      line.text = sourceLines[i];
-    }
-  }
-
-  void _processCoverageHits(List hits) {
-    for (var i = 0; i < hits.length; i += 2) {
-      var line = _getLine(hits[i]);
-      line.hits = hits[i + 1];
-    }
-    notifyPropertyChange(#coveredPercentageFormatted, '',
-                         coveredPercentageFormatted());
-  }
-
-  /// What percentage of lines in this script have been covered?
-  @observable double coveredPercentage() {
-    int coveredLines = 0;
-    int executableLines = 0;
-    for (var line in lines) {
-      if (line == null) {
-        continue;
-      }
-      if (!line.executable) {
-        continue;
-      }
-      executableLines++;
-      if (!line.covered) {
-        continue;
-      }
-      coveredLines++;
-    }
-    if (executableLines == 0) {
-      return 0.0;
-    }
-    return (coveredLines / executableLines) * 100.0;
-  }
-
-  @observable String coveredPercentageFormatted() {
-    return '(' + coveredPercentage().toStringAsFixed(1) + '% covered)';
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/app/service.dart b/runtime/bin/vmservice/client/lib/src/app/service.dart
deleted file mode 100644
index c82182e..0000000
--- a/runtime/bin/vmservice/client/lib/src/app/service.dart
+++ /dev/null
@@ -1,68 +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.
-
-part of app;
-
-/// A [ServiceObject] is an object known to the VM service and is tied
-/// to an owning [Isolate].
-abstract class ServiceObject extends Observable {
-  /// Owning isolate.
-  final Isolate isolate;
-  /// The complete service url of this object.
-  String get link => isolate.relativeLink(_id);
-  String _id;
-  /// The id of this object.
-  String get id => _id;
-  String _serviceType;
-  /// The service type of this object.
-  String get serviceType => _serviceType;
-
-  /// Refresh [this]. Returns a future which completes to [this].
-  Future refresh();
-
-  ServiceObject(this.isolate, this._id, this._serviceType);
-}
-
-
-/// A [ServiceObject] which implements [Map].
-class ServiceMap extends ServiceObject implements Map {
-  final Map _map = new ObservableMap();
-
-  ServiceMap(Isolate isolate, String id, String serviceType) :
-      super(isolate, id, serviceType) {
-  }
-
-  ServiceMap.fromMap(Isolate isolate, Map m) :
-      super(isolate, m['id'], m['type']) {
-    _fill(m);
-  }
-
-  Future refresh() {
-    isolate.getMap(_id).then(_fill);
-    return new Future.value(this);
-  }
-
-  void _fill(Map m) {
-    _map.clear();
-    _map.addAll(m);
-    // TODO(johnmccutchan): Recursively promote all contained Maps to
-    // ServiceMaps if they have a 'type' key.
-  }
-
-  // Implement Map by forwarding methods to _map.
-  void addAll(Map other) => _map.addAll(other);
-  void clear() => _map.clear();
-  bool containsValue(v) => _map.containsValue(v);
-  bool containsKey(k) => _map.containsKey(k);
-  void forEach(Function f) => _map.forEach(f);
-  putIfAbsent(key, Function ifAbsent) => _map.putIfAbsent(key, ifAbsent);
-  void remove(key) => _map.remove(key);
-  operator [](k) => _map[k];
-  operator []=(k, v) => _map[k] = v;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-  Iterable get keys => _map.keys;
-  Iterable get values => _map.values;
-  int get length => _map.length;
-}
diff --git a/runtime/bin/vmservice/client/lib/src/app/vm.dart b/runtime/bin/vmservice/client/lib/src/app/vm.dart
deleted file mode 100644
index 3002912..0000000
--- a/runtime/bin/vmservice/client/lib/src/app/vm.dart
+++ /dev/null
@@ -1,127 +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.
-
-part of app;
-
-abstract class VM extends Observable {
-  @observable ObservatoryApplication get app => _app;
-  ObservatoryApplication _app;
-
-  Future<String> fetchString(String path);
-
-  Future<ObservableMap> fetchMap(String path) {
-    return fetchString(path).then((response) {
-      try {
-        var map = JSON.decode(response);
-        return toObservable(map);
-      } catch (e, st) {
-        return toObservable({
-          'type': 'Error',
-          'errorType': 'DecodeError',
-          'text': '$e $st'
-        });
-      }
-    }).catchError((error) {
-      return toObservable({
-        'type': 'Error',
-        'errorType': 'FetchError',
-        'text': '$error'
-      });
-    });
-  }
-
-  @observable final ObservableMap isolates = new ObservableMap();
-  Isolate getIsolate(String id) {
-    var isolate = isolates[id];
-    if (isolate != null) {
-      return isolate;
-    }
-    isolate = new Isolate.fromId(this, id);
-    isolates[id] = isolate;
-    return isolate;
-  }
-
-  static bool _foundIsolateInMembers(String id, List<Map> members) {
-    return members.any((E) => E['id'] == id);
-  }
-
-  void _updateIsolates(List<Map> members) {
-    // Find dead isolates.
-    var deadIsolates = [];
-    isolates.forEach((k, v) {
-      if (!_foundIsolateInMembers(k, members)) {
-        deadIsolates.add(k);
-      }
-    });
-    // Remove them.
-    deadIsolates.forEach((id) {
-      isolates.remove(id);
-    });
-    // Add new isolates.
-    members.forEach((map) {
-      var id = map['id'];
-      var isolate = isolates[id];
-      if (isolate == null) {
-        isolate = new Isolate.fromMap(this, map);
-        isolates[id] = isolate;
-      }
-      isolate.refresh();
-    });
-  }
-
-  void refreshIsolates() {
-    fetchMap('isolates').then((map) {
-      assert(map['type'] == 'IsolateList');
-      _updateIsolates(map['members']);
-      app.setResponse(map);
-    });
-  }
-}
-
-
-class HttpVM extends VM {
-  final String address;
-  HttpVM(this.address);
-
-  Future<String> fetchString(String path) {
-    Logger.root.info('Fetching $path from $address');
-    return HttpRequest.getString(address + path);
-  }
-}
-
-class DartiumVM extends VM {
-  final Map _outstandingRequests = new Map();
-  int _requestSerial = 0;
-
-  DartiumVM() {
-    window.onMessage.listen(_messageHandler);
-    print('Connected to DartiumVM');
-  }
-
-  void _messageHandler(msg) {
-    var id = msg.data['id'];
-    var name = msg.data['name'];
-    var data = msg.data['data'];
-    if (name != 'observatoryData') {
-      return;
-    }
-    var completer = _outstandingRequests[id];
-    assert(completer != null);
-    _outstandingRequests.remove(id);
-    completer.complete(data);
-  }
-
-  Future<String> fetchString(String path) {
-    var idString = '$_requestSerial';
-    Map message = {};
-    message['id'] = idString;
-    message['method'] = 'observatoryQuery';
-    message['query'] = '/$path';
-    _requestSerial++;
-    var completer = new Completer();
-    _outstandingRequests[idString] = completer;
-    window.parent.postMessage(JSON.encode(message), '*');
-    return completer.future;
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
index 7a3f55b..157e6c5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.dart
@@ -4,22 +4,18 @@
 
 library breakpoint_list_element;
 
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 // TODO(turnidge): Is a breakpoint list associated with a VM or an isolate?
 @CustomTag('breakpoint-list')
-class BreakpointListElement extends IsolateElement {
-  @published Map msg = toObservable({});
+class BreakpointListElement extends ObservatoryElement {
+  @published ServiceMap msg;
 
   BreakpointListElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap('breakpoints').then((map) {
-      msg = map;
-    }).catchError((e, trace) {
-      Logger.root.severe('Error while refreshing breakpoint-list: $e\n$trace');
-    }).whenComplete(done);
+    msg.reload().whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 3785531..ae4439b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -1,12 +1,12 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="breakpoint-list" extends="isolate-element">
+<polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index bfdc050..fd53d20 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -4,20 +4,16 @@
 
 library class_view_element;
 
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('class-view')
-class ClassViewElement extends IsolateElement {
-  @published Map cls;
+class ClassViewElement extends ObservatoryElement {
+  @published ServiceMap cls;
   ClassViewElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap(cls['id']).then((map) {
-        cls = map;
-    }).catchError((e, trace) {
-        Logger.root.severe('Error while refreshing class-view: $e\n$trace');
-    }).whenComplete(done);
+    cls.reload().whenComplete(done);
   }
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index cc906b2..8bffd2c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -5,15 +5,15 @@
   <link rel="import" href="instance_ref.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="class-view" extends="isolate-element">
+<polymer-element name="class-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -21,12 +21,13 @@
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-warning">
         <div class="panel-heading">
-          class <strong>{{ cls['user_name'] }}</strong>
+          class <strong>{{ cls.name }}</strong>
           <template if="{{ cls['super']['type'] != 'Null' }}">
             extends
-            <class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
+            <class-ref ref="{{ cls['super'] }}"></class-ref>
           </template>
-          <library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
+          <p></p>
+          <library-ref ref="{{ cls['library'] }}"></library-ref>
         </div>
         <div class="panel-body">
           <table class="table table-hover">
@@ -56,8 +57,8 @@
             <table class="table table-hover">
              <tbody>
                 <tr template repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
+                  <td><field-ref ref="{{ field }}"></field-ref></td>
+                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
                 </tr>
               </tbody>
             </table>
@@ -71,8 +72,8 @@
               </thead>
               <tbody>
                 <tr template repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
-                  <td><function-ref app="{{ app }}" ref="{{ function }}" internal></function-ref></td>
+                  <td><function-ref ref="{{ function }}"></function-ref></td>
+                  <td><function-ref ref="{{ function }}" internal></function-ref></td>
                 </tr>
               </tbody>
             </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
index 884241b..dacbab8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -4,15 +4,27 @@
 
 library code_view_element;
 
-import 'isolate_element.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
-import 'package:observatory/app.dart';
 
 @CustomTag('code-view')
-class CodeViewElement extends IsolateElement {
+class CodeViewElement extends ObservatoryElement {
   @published Code code;
   CodeViewElement.created() : super.created();
 
+  void enteredView() {
+    super.enteredView();
+    if (code == null) {
+      return;
+    }
+    code.load();
+  }
+
+  void refresh(var done) {
+    code.reload().whenComplete(done);
+  }
+
   String get cssPanelClass {
     return 'panel panel-success';
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index c2fee73..cc6166c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,38 +1,77 @@
-<head>
-  <link rel="import" href="disassembly_entry.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
-<polymer-element name="code-view" extends="isolate-element">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+<polymer-element name="code-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.functionRef['user_name'] }}" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Implement code refresh -->
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="{{ cssPanelClass }}">
-        <div class="panel-heading">
-          <function-ref isolate="{{ isolate }}" ref="{{ code.functionRef }}"></function-ref>
-        </div>
-        <div class="panel-body">
-          <div class="row">
-              <div class="col-md-2"><strong>Samples</strong></div>
-              <div class="col-md-2"><strong>Address</strong></div>
-              <div><strong>Instruction</strong></div>
-          </div>
-          <template repeat="{{ instruction in code.instructions }}">
-            <disassembly-entry instruction="{{ instruction }}">
-            </disassembly-entry>
-          </template>
-        </div>
-      </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <table>
+        <tr>
+          <td class="memberHeader">kind</td>
+          <td class="member">{{code.kind}}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">function</td>
+          <td class="member">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Inclusive</td>
+          <td class="member">{{ code.formattedInclusiveTicks }}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Exclusive</td>
+          <td class="member">{{ code.formattedExclusiveTicks }}</td>
+        </tr>
+      </table>
     </div>
-  </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
   </template>
   <script type="application/dart" src="code_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
index 4b32108..9b76ef6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.dart
@@ -15,7 +15,6 @@
   @published var callback = null;
 
   void doneCallback() {
-    print("done callback");
     expanded = !expanded;
     busy = false;
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart b/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart
deleted file mode 100644
index 751dada..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.dart
+++ /dev/null
@@ -1,15 +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 disassembly_entry_element;
-
-import 'package:observatory/app.dart';
-import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
-
-@CustomTag('disassembly-entry')
-class DisassemblyEntryElement extends ObservatoryElement {
-  @published CodeInstruction instruction;
-  DisassemblyEntryElement.created() : super.created();
-}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.html b/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.html
deleted file mode 100644
index 79b7516..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/disassembly_entry.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="disassembly-entry" extends="observatory-element">
-  <template>
-  <div class="row">
-      <div class="col-md-2">{{ instruction.formattedTicks() }}</div>
-      <div class="col-md-2">{{ instruction.formattedAddress() }}</div>
-      <div class="col-md-4">
-        <code>{{ instruction.machine }} {{ instruction.human }}</code>
-      </div>
-  </div>
-  </template>
-  <script type="application/dart" src="disassembly_entry.dart"></script>
-</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.dart b/runtime/bin/vmservice/client/lib/src/elements/error_view.dart
index 7b99628..2061929 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.dart
@@ -4,13 +4,14 @@
 
 library error_view_element;
 
-import 'package:polymer/polymer.dart';
 import 'observatory_element.dart';
+import 'package:polymer/polymer.dart';
+import 'package:observatory/service.dart';
 
-/// Displays an Error response.
+/// Displays an Error ServiceObject.
 @CustomTag('error-view')
 class ErrorViewElement extends ObservatoryElement {
-  @published Map error;
+  @published ServiceObject error;
 
   ErrorViewElement.created() : super.created();
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 336cc0c..9229178 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -6,9 +6,9 @@
     <div class="row">
     <div class="col-md-8 col-md-offset-2">
       <div class="panel panel-danger">
-        <div class="panel-heading">{{ error['errorType'] }}</div>
+        <div class="panel-heading">{{ error.kind }}</div>
         <div class="panel-body">
-          <p>{{ error['text'] }}</p>
+          <p>{{ error.message }}</p>
         </div>
       </div>
     </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart b/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart
new file mode 100644
index 0000000..4322866
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library eval_box_element;
+
+import 'dart:async';
+import 'dart:html';
+import 'observatory_element.dart';
+import 'package:polymer/polymer.dart';
+
+
+typedef Future<ObservableMap> evalType(String text);
+
+
+@CustomTag('eval-box')
+class EvalBoxElement extends ObservatoryElement {
+  @observable String text;
+  @observable String lineMode = "1-line";
+
+  @published evalType callback;
+  @observable ObservableList results = toObservable([]);
+
+  void updateLineMode(Event e, var detail, Node target) {
+    lineMode = (e.target as InputElement).value;
+    if (lineMode == '1-line') {
+      text = text.replaceAll('\n', ' ');
+    }
+  }
+
+  void eval(Event e, var detail, Node target) {
+    // Prevent any form action.
+    e.preventDefault();
+
+    // Clear the text box.
+    var expr = text;
+    text = '';
+
+    // Use provided callback to eval the expression.
+    if (callback != null) {
+      var map = toObservable({});
+      map['expr'] = expr;
+      results.insert(0, map);
+      callback(expr).then((result) {
+          map['value'] = result;
+      });
+    }
+  }
+
+  void selectExpr(MouseEvent e) {
+    assert(e.target is Element);
+    Element targetElement = e.target;
+    text = targetElement.getAttribute('expr');
+  }
+
+  EvalBoxElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
new file mode 100644
index 0000000..6709dd7
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -0,0 +1,88 @@
+<head>
+  <link rel="import" href="instance_ref.html">
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="eval-box" extends="observatory-element">
+  <template>
+    <style>
+      .textbox {
+        width: 80ex;
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .bigtextbox {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .button {
+        font: 400 16px 'Montserrat', sans-serif;
+      }
+      .radios {
+        display: inline;
+      }
+      .radios label{
+        padding-left: 15px;
+      }
+      .historyExpr, .historyValue {
+        vertical-align: text-top;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .historyExpr a {
+        display: block;
+        color: black;
+        text-decoration: none;
+        padding: 6px 6px;
+        cursor: pointer;
+        white-space: pre-line;
+      }
+      .historyExpr a:hover {
+        background-color: #e1f5fe
+      }
+      .historyValue {
+        display: block;
+        padding: 6px 6px;
+      }
+    </style>
+    <form>
+      <template if="{{ lineMode == '1-line' }}">
+        <input class="textbox" type="text" value="{{ text }}">
+      </template>
+      <template if="{{ lineMode == 'N-line' }}">
+        <textarea class="bigtextbox" rows="5" cols="80"
+                  value="{{ text }}"></textarea>
+      </template>
+
+      <input class="button" type="submit" value="Evaluate" on-click="{{ eval }}">
+      <div class="radios" on-change="{{ updateLineMode }}">
+        <label for="1-line">1-line
+          <input type="radio" name="lineMode" value="1-line" checked>
+        </label>
+        <label for="N-line">N-line
+          <input type="radio" name="lineMode" value="N-line">
+        </label>
+      </div>
+    </form>
+
+    <br>
+    <template if="{{ results.isNotEmpty }}">
+      <table>
+        <tr template repeat="{{ result in results }}">
+          <td class="historyExpr">
+            <a class="expr" on-click="{{ selectExpr }}"
+               expr="{{ result['expr'] }}">{{ result['expr'] }}</a>
+          </td>
+          <td class="historyValue">
+            <template if="{{ result['value'] == null }}">
+              <div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
+            </template>
+            <template if="{{ result['value'] != null }}">
+              <instance-ref isolate="{{ isolate }}"
+                            ref="{{ result['value'] }}">
+              </instance-ref>
+            </template>
+          </td>
+        </tr>
+      </table>
+    </template>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="eval_box.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index 69a4754..179b4918 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -1,6 +1,5 @@
 <head>
 <link rel="import" href="class_ref.html">
-<link rel="import" href="isolate_element.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
 </head>
@@ -13,7 +12,7 @@
   var
   </template>
   <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
   </template>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.dart b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
index 6fa83e7..4f33992 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
@@ -4,20 +4,16 @@
 
 library field_view_element;
 
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('field-view')
-class FieldViewElement extends IsolateElement {
-  @published Map field;
+class FieldViewElement extends ObservatoryElement {
+  @published ServiceMap field;
   FieldViewElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap(field['id']).then((map) {
-        field = map;
-    }).catchError((e, trace) {
-        Logger.root.severe('Error while refreshing field-view: $e\n$trace');
-    }).whenComplete(done);
+    field.reload().whenComplete(done);
   }
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 1c591ca..8857d5e0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -3,17 +3,17 @@
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="field-view" extends="isolate-element">
+<polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <template if="{{ field['owner']['type'] == '@Class' }}">
+      <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ field['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ field['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ field['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ field['owner'] }}"></library-nav-menu>
+      <template if="{{ field['owner'].serviceType == 'Library' }}">
+        <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
@@ -27,7 +27,7 @@
           <template if="{{ field['final'] }}">final</template>
           <template if="{{ field['const'] }}">const</template>
           {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ field['class'] }}"></class-ref>
+          <class-ref ref="{{ field['owner'] }}"></class-ref>
         </div>
         <div class="panel-body">
         <template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -46,7 +46,7 @@
             </div>
           </template>
           <blockquote>
-            <class-ref isolate="{{ isolate }}" ref="{{ field['guard_class'] }}"></class-ref>
+            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
           </blockquote>
         </template>
         </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
index 5119a7e..1c3620c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
@@ -4,21 +4,17 @@
 
 library function_view_element;
 
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+
 import 'package:polymer/polymer.dart';
 
-
 @CustomTag('function-view')
-class FunctionViewElement extends IsolateElement {
-  @published Map function;
+class FunctionViewElement extends ObservatoryElement {
+  @published ServiceMap function;
   FunctionViewElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap(function['id']).then((map) {
-        function = map;
-    }).catchError((e, trace) {
-        Logger.root.severe('Error while refreshing field-view: $e\n$trace');
-    }).whenComplete(done);
+    function.reload().whenComplete(done);
   }
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 9a2af8b..1f474f6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -1,22 +1,22 @@
 <head>
   <link rel="import" href="class_ref.html">
   <link rel="import" href="code_ref.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
 </head>
-<polymer-element name="function-view" extends="isolate-element">
+<polymer-element name="function-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
       <template if="{{ function['owner']['type'] == '@Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
-        <class-nav-menu isolate="{{ isolate }}" cls="{{ function['owner'] }}"></class-nav-menu>
+        <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
       <template if="{{ function['owner']['type'] == '@Library' }}">
-        <library-nav-menu isolate="{{ isolate }}" library="{{ function['owner'] }}"></library-nav-menu>
+        <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="." anchor="{{ function['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -25,12 +25,12 @@
       <div class="panel panel-warning">
         <div class="panel-heading">
           {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref isolate="{{ isolate }}" ref="{{ function['class'] }}"></class-ref>
+          <class-ref ref="{{ function['class'] }}"></class-ref>
         </div>
         <div class="panel-body">
           <div>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['code'] }}"></code-ref>
-          <code-ref isolate="{{ isolate }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
+          <code-ref ref="{{ function['code'] }}"></code-ref>
+          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
           </div>
           <table class="table table-hover">
             <tbody>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index b7c6063..cc9c8fe 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -5,14 +5,15 @@
 library heap_profile_element;
 
 import 'dart:html';
-import 'isolate_element.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
 import 'package:observatory/app.dart';
 
 /// Displays an Error response.
 @CustomTag('heap-profile')
-class HeapProfileElement extends IsolateElement {
+class HeapProfileElement extends ObservatoryElement {
   // Indexes into VM provided map.
   static const ALLOCATED_BEFORE_GC = 0;
   static const ALLOCATED_BEFORE_GC_SIZE = 1;
@@ -39,7 +40,7 @@
   var _fullDataTable;
   var _fullChart;
 
-  @published Map profile;
+  @published ServiceMap profile;
 
   HeapProfileElement.created() : super.created() {
     _fullDataTable = new DataTable();
@@ -100,13 +101,13 @@
     assert(_combinedDataTable != null);
     _fullDataTable.clearRows();
     _combinedDataTable.clearRows();
-    for (Map cls in profile['members']) {
+    for (ServiceMap cls in profile['members']) {
       if (_classHasNoAllocations(cls)) {
         // If a class has no allocations, don't display it.
         continue;
       }
       var vm_name = cls['class']['name'];
-      var url = isolate.relativeLink(cls['class']['id']);
+      var url = cls['class'].hashLink;
       _fullDataTable.addRow([
           '<a title="$vm_name" href="$url">'
           '${_fullTableColumnValue(cls, 0)}</a>',
@@ -132,10 +133,12 @@
     var heap = profile['heaps']['new'];
     _newPieDataTable.addRow(['Used', heap['used']]);
     _newPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
+    _newPieDataTable.addRow(['External', heap['external']]);
     _oldPieDataTable.clearRows();
     heap = profile['heaps']['old'];
     _oldPieDataTable.addRow(['Used', heap['used']]);
     _oldPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
+    _oldPieDataTable.addRow(['External', heap['external']]);
     _draw();
   }
 
@@ -223,7 +226,10 @@
   }
 
   void refresh(var done) {
-    isolate.getMap('/allocationprofile').then((Map response) {
+    if (profile == null) {
+      return;
+    }
+    profile.isolate.get('/allocationprofile').then((ServiceMap response) {
       assert(response['type'] == 'AllocationProfile');
       profile = response;
     }).catchError((e, st) {
@@ -232,7 +238,10 @@
   }
 
   void resetAccumulator(Event e, var detail, Node target) {
-    isolate.getMap('/allocationprofile/reset').then((Map response) {
+    if (profile == null) {
+      return;
+    }
+    profile.isolate.get('/allocationprofile/reset').then((ServiceMap response) {
       assert(response['type'] == 'AllocationProfile');
       profile = response;
     }).catchError((e, st) {
@@ -273,6 +282,6 @@
     }
     String space = newSpace ? 'new' : 'old';
     Map heap = profile['heaps'][space];
-    return '${ObservatoryApplication.timeUnits(heap['time'])} secs';
+    return '${formatSeconds(heap['time'])} secs';
   }
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index 624bd27..ada00da 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -1,13 +1,13 @@
 <head>
   <link rel="import" href="class_ref.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
 </head>
-<polymer-element name="heap-profile" extends="isolate-element">
+<polymer-element name="heap-profile" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
     <nav-menu link="." anchor="heap profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
   </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
index a256472..c97e484 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
@@ -4,38 +4,31 @@
 
 library instance_ref_element;
 
-import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
+import 'package:observatory/service.dart';
 import 'service_ref.dart';
 
 @CustomTag('instance-ref')
 class InstanceRefElement extends ServiceRefElement {
   InstanceRefElement.created() : super.created();
 
-  String get name {
-    if (ref == null) {
-      return super.name;
-    }
-    return ref['preview'];
-  }
-
   String get hoverText {
     if (ref != null) {
-      if (ref['type'] == '@Null') {
-        if (ref['id'] == 'objects/optimized-out') {
+      if (ref.serviceType == 'Null') {
+        if (ref.id == 'objects/optimized-out') {
           return 'This object is no longer needed and has been removed by the optimizing compiler.';
-        } else if (ref['id'] == 'objects/collected') {
+        } else if (ref.id == 'objects/collected') {
           return 'This object has been reclaimed by the garbage collector.';
-        } else if (ref['id'] == 'objects/expired') {
+        } else if (ref.id == 'objects/expired') {
           return 'The handle to this object has expired.  Consider refreshing the page.';
-        } else if (ref['id'] == 'objects/not-initialized') {
+        } else if (ref.id == 'objects/not-initialized') {
           return 'This object will be initialized once it is accessed by the program.';
-        } else if (ref['id'] == 'objects/being-initialized') {
+        } else if (ref.id == 'objects/being-initialized') {
           return 'This object is currently being initialized.';
         }
       }
     }
-    return '';
+    return super.hoverText;
   }
 
   // TODO(turnidge): This is here to workaround vm/dart2js differences.
@@ -44,29 +37,20 @@
   }
 
   void expandEvent(bool expand, var done) {
-    print("Calling expandEvent");
+    assert(ref is ServiceMap);
     if (expand) {
-      isolate.getMap(objectId).then((map) {
-          if (map['type'] == 'Null') {
-            // The object is no longer available.  For example, the
-            // object id may have expired or the object may have been
-            // collected by the gc.
-            map['type'] = '@Null';
-            ref = map;
-          } else {
-            ref['fields'] = map['fields'];
-            ref['elements'] = map['elements'];
-            ref['length'] = map['length'];
-          }
-        ref['fields'] = map['fields'];
-        ref['elements'] = map['elements'];
-        ref['length'] = map['length'];
-      }).catchError((e, trace) {
-          Logger.root.severe('Error while expanding instance-ref: $e\n$trace');
+      ref.reload().then((result) {
+        if (result['preview'] != null) {
+          result.name = result['preview'];
+          result.vmName = result['preview'];
+        }
+        ref = result;
+        notifyPropertyChange(#ref, 0, 1);
       }).whenComplete(done);
     } else {
-      ref['fields'] = null;
-      ref['elements'] = null;
+      ServiceMap refMap = ref;
+      refMap['fields'] = null;
+      refMap['elements'] = null;
       done();
     }
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index a2ed2c4..e03e1d2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -8,52 +8,56 @@
     <style>
       .member {
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 1px 0 1px 1em;
       }
     </style>
     <div>
-      <template if="{{ isUnexpectedRef(ref['type']) }}">
-        unexpected reference type &lt;{{ ref['type'] }}&gt;
+      <template if="{{ isUnexpected(ref.serviceType) }}">
+        unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNullRef(ref['type']) }}">
-        <div title="{{ hoverText }}">{{ name }}</div>
+      <template if="{{ isError(ref.serviceType) }}">
+        <pre>{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ (isStringRef(ref['type']) ||
-                        isBoolRef(ref['type']) ||
-                        isIntRef(ref['type'])) }}">
-        <a href="{{ url }}">{{ name }}</a>
+      <template if="{{ isNull(ref.serviceType) }}">
+        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
       </template>
 
-      <template if="{{ isClosureRef(ref['type']) }}">
+      <template if="{{ (isString(ref.serviceType) ||
+                        isBool(ref.serviceType) ||
+                        isInt(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['preview'] }}</a>
+      </template>
+
+      <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstanceRef(ref['type']) }}">
+      <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tr template repeat="{{ field in ref['fields'] }}">
               <td class="member">{{ field['decl']['user_name'] }}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref>
+                <instance-ref ref="{{ field['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
         </curly-block>
       </template>
 
-      <template if="{{ isListRef(ref['type']) }}">
+      <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <table>
             <tr template repeat="{{ element in ref['elements'] }}">
               <td class="member">[{{ element['index']}}]</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ element['value'] }}"></instance-ref>
+                <instance-ref ref="{{ element['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index fb7fcd1..5a0f9ba 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -4,11 +4,24 @@
 
 library instance_view_element;
 
-import 'isolate_element.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
+import 'dart:async';
+
 @CustomTag('instance-view')
-class InstanceViewElement extends IsolateElement {
-  @published Map instance;
+class InstanceViewElement extends ObservatoryElement {
+  @published ServiceMap instance;
+
   InstanceViewElement.created() : super.created();
+
+  Future<ServiceObject> eval(String text) {
+    return instance.isolate.get(
+        instance.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
+  void refresh(var done) {
+    instance.reload().whenComplete(done);
+  }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 813b4ad..c39183d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -1,55 +1,125 @@
 <head>
   <link rel="import" href="class_ref.html">
   <link rel="import" href="error_view.html">
+  <link rel="import" href="eval_box.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="instance_ref.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
 </head>
-<polymer-element name="instance-view" extends="isolate-element">
+<polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
       <!-- TODO(turnidge): Add library nav menu here. -->
-      <class-nav-menu isolate="{{ isolate }}" cls="{{ instance['class'] }}"></class-nav-menu>
+      <class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
-      <!-- TODO(turnidge): Add nav refresh here. -->
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-         Instance of
-         <class-ref isolate="{{ isolate }}" ref="{{ instance['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <template if="{{ instance['error'] == null }}">
-            <table class="table table-hover">
-              <tbody>
-                <tr>
-                  <td>Preview</td><td>{{ instance['preview'] }}</td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template repeat="{{ field in instance['fields'] }}">
-                  <td><field-ref isolate="{{ isolate }}" ref="{{ field['decl'] }}"></field-ref></td>
-                  <td><instance-ref isolate="{{ isolate }}" ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ instance['error'] != null }}">
-            <error-view error_obj="{{ instance['error'] }}"></error-view>
-          </template>
-        </div>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .memberBold {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <template if="{{ instance['error'] != null }}">
+      <error-view error_obj="{{ instance['error'] }}"></error-view>
+    </template>
+
+    <template if="{{ instance['error'] == null }}">
+      <div class="content">
+        <!-- TODO(turnidge): Handle null instances. -->
+        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <table>
+          <tr>
+            <td class="memberBold">class</td>
+            <td class="member">
+              <class-ref ref="{{ instance['class'] }}">
+              </class-ref>
+            </td>
+          </tr>
+          <tr template if="{{ instance['preview'] != null }}">
+            <td class="memberBold">preview</td>
+            <td class="member">{{ instance['preview'] }}</td>
+          </tr>
+          <tr>
+            <td class="memberBold">size</td>
+            <td class="member">{{ instance['size'] | formatSize }}</td>
+          </tr>
+        </table>
       </div>
-    </div>
-    </div>
+
+      <hr>
+
+      <div class="content">
+        <template if="{{ instance['fields'].isNotEmpty }}">
+          fields ({{ instance['fields'].length }})
+          <curly-block>
+            <table>
+              <tr template repeat="{{ field in instance['fields'] }}">
+                <td class="member">
+                  <field-ref ref="{{ field['decl'] }}"></field-ref>
+                </td>
+                <td class="member">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </td>
+              </tr>
+            </table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['nativeFields'].isNotEmpty }}">
+          native fields ({{ instance['nativeFields'].length }})
+          <curly-block>
+            <table>
+              <tr template repeat="{{ field in instance['nativeFields'] }}">
+                <td class="member">[{{ field['index']}}]</td>
+                <td class="member">[{{ field['value']}}]</td>
+              </tr>
+            </table>
+          </curly-block>
+        </template>
+
+        <template if="{{ instance['elements'].isNotEmpty }}">
+          elements ({{ instance['elements'].length }})
+          <curly-block>
+            <table>
+              <tr template repeat="{{ element in instance['elements'] }}">
+                <td class="member">[{{ element['index']}}]</td>
+                <td class="member">
+                  <instance-ref ref="{{ element['value'] }}">
+                  </instance-ref>
+                </td>
+              </tr>
+            </table>
+          </curly-block>
+        </template>
+      </div>
+
+      <hr>
+
+      <div class="content">
+        <eval-box callback="{{ eval }}"></eval-box>
+      </div>
+      <br><br><br><br>
+      <br><br><br><br>
+    </template>
   </template>
   <script type="application/dart" src="instance_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.dart
deleted file mode 100644
index 8b906e5..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.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 isolate_element;
-
-import 'package:observatory/app.dart';
-import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
-
-/// Base class for all custom elements which reference an isolate.
-/// Holds an observable [Isolate].
-@CustomTag('isolate-element')
-class IsolateElement extends ObservatoryElement {
-  IsolateElement.created() : super.created();
-  @published Isolate isolate;
-}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html
deleted file mode 100644
index 696ccf1..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_element.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="isolate-element" extends="observatory-element">
-  <script type="application/dart" src="isolate_element.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
index 5b6ffea..95691b54 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.dart
@@ -4,20 +4,17 @@
 
 library isolate_list_element;
 
-import 'vm_element.dart';
-import 'dart:async';
 import 'package:polymer/polymer.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 
 /// Displays an IsolateList response.
 @CustomTag('isolate-list')
-class IsolateListElement extends VMElement {
+class IsolateListElement extends ObservatoryElement {
   IsolateListElement.created() : super.created();
+  @published IsolateList isolates;
 
   void refresh(var done) {
-    var futures = [];
-    vm.isolates.forEach((id, isolate) {
-       futures.add(isolate.refresh());
-    });
-    Future.wait(futures).then((_) => done());
+    isolates.reload().whenComplete(done);
   }
 }
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
index 0a817d1..5c03caa 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_list.html
@@ -1,9 +1,9 @@
 <head>
   <link rel="import" href="isolate_summary.html">
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="vm_element.html">
+  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="isolate-list" extends="vm-element">
+<polymer-element name="isolate-list" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -11,7 +11,7 @@
       <nav-refresh callback="{{ refresh } }}"></nav-refresh>
     </nav-bar>
       <ul class="list-group">
-      <template repeat="{{ isolate in vm.isolates.values }}">
+      <template repeat="{{ isolate in isolates.isolates.values }}">
       	<li class="list-group-item">
         <isolate-summary isolate="{{ isolate }}"></isolate-summary>
         </li>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 8a2961b..39092b3 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -5,25 +5,28 @@
 library isolate_profile_element;
 
 import 'dart:html';
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
 class ProfileCallerTreeRow extends TableTreeRow {
-  final Isolate isolate;
-  @observable final Code code;
+  final ServiceMap profile;
+  @reflectable final Code code;
 
   static String formatPercent(num a, num total) {
     var percent = 100.0 * (a / total);
     return '${percent.toStringAsFixed(2)}%';
   }
 
-  ProfileCallerTreeRow(this.isolate, this.code, ProfileCallerTreeRow parent) :
+  ProfileCallerTreeRow(this.profile, this.code, ProfileCallerTreeRow parent) :
       super(parent) {
+    assert(profile != null);
+    assert(code != null);
+    var totalSamples = profile['samples'];
     // When the row is created, fill out the columns.
     columns.add(
-        formatPercent(code.exclusiveTicks, isolate.profile.totalSamples));
+        formatPercent(code.exclusiveTicks, totalSamples));
     if (parent == null) {
       // Fill with dummy data.
       columns.add('');
@@ -32,8 +35,6 @@
       var totalParentCalls = parent.code.sumCallersCount();
       columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
     }
-    columns.add(
-        formatPercent(code.inclusiveTicks, isolate.profile.totalSamples));
   }
 
   void onShow() {
@@ -44,7 +45,7 @@
     // Create child rows on demand.
     code.callers.forEach((CodeCallCount codeCaller) {
       var row =
-          new ProfileCallerTreeRow(isolate, codeCaller.code, this);
+          new ProfileCallerTreeRow(profile, codeCaller.code, this);
       children.add(row);
     });
   }
@@ -55,81 +56,73 @@
 
 /// Displays an IsolateProfile
 @CustomTag('isolate-profile')
-class IsolateProfileElement extends IsolateElement {
+class IsolateProfileElement extends ObservatoryElement {
   IsolateProfileElement.created() : super.created();
+  @published ServiceMap profile;
+  @reflectable final topExclusiveCodes = new ObservableList<Code>();
   @observable int methodCountSelected = 0;
-  final List methodCounts = [10, 20, 50];
-  @observable List topExclusiveCodes = toObservable([]);
-  final _id = '#tableTree';
-  TableTree tree;
-  @published Map profile;
   @observable String sampleCount = '';
   @observable String refreshTime = '';
 
+  final List methodCounts = [10, 20, 50];
+  final _id = '#tableTree';
+  TableTree tree;
+
   void profileChanged(oldValue) {
     if (profile == null) {
       return;
     }
-    print('profile changed');
-    var samples = profile['samples'];
-    _loadProfileData(isolate, samples, profile);
-    _refresh(isolate);
+    var totalSamples = profile['samples'];
+    var now = new DateTime.now();
+    sampleCount = totalSamples.toString();
+    refreshTime = now.toString();
+    profile.isolate.processProfile(profile);
+    _update();
   }
 
   void enteredView() {
-    tree = new TableTree(['Method', 'Exclusive', 'Caller', 'Inclusive']);
-    _refresh(isolate);
+    tree = new TableTree(['Method', 'Exclusive', 'Caller']);
+    _update();
   }
 
   methodCountSelectedChanged(oldValue) {
-    _refresh(isolate);
+    _update();
   }
 
   void refresh(var done) {
-    isolate.getMap('profile').then((Map profile) {
-      assert(profile['type'] == 'Profile');
-      var samples = profile['samples'];
-      Logger.root.info('Profile contains ${samples} samples.');
-      _loadProfileData(isolate, samples, profile);
-    }).catchError((e, st) {
-      Logger.root.warning('Error refreshing profile', e, st);
+    profile.isolate.get('profile').then((ServiceMap m) {
+      // Assert we got back the a profile.
+      assert(m.serviceType == 'Profile');
+      profile = m;
     }).whenComplete(done);
   }
 
-  void _loadProfileData(Isolate isolate, int totalSamples, Map response) {
-    sampleCount = totalSamples.toString();
-    var now = new DateTime.now();
-    refreshTime = now.toString();
-    isolate.profile = new Profile.fromMap(isolate, response);
-    _refresh(isolate);
+  void _update() {
+    if (profile == null) {
+      return;
+    }
+    _refreshTopMethods();
+    _rebuildTree();
   }
 
-  void _refresh(Isolate isolate) {
-    _refreshTopMethods(isolate);
-    _refreshTree(isolate);
+  void _refreshTopMethods() {
+    assert(profile != null);
+    var count = methodCounts[methodCountSelected];
+    topExclusiveCodes.clear();
+    topExclusiveCodes.addAll(profile.isolate.codes.topExclusive(count));
   }
 
-  void _refreshTree(Isolate isolate) {
+  void _rebuildTree() {
+    assert(profile != null);
     var rootChildren = [];
     for (var code in topExclusiveCodes) {
-      var row = new ProfileCallerTreeRow(isolate, code, null);
+      var row = new ProfileCallerTreeRow(profile, code, null);
       rootChildren.add(row);
     }
     tree.initialize(rootChildren);
     notifyPropertyChange(#tree, null, tree);
   }
 
-
-  void _refreshTopMethods(Isolate isolate) {
-    topExclusiveCodes.clear();
-    if ((isolate == null) || (isolate.profile == null)) {
-      return;
-    }
-    var count = methodCounts[methodCountSelected];
-    var topExclusive = isolate.profile.topExclusive(count);
-    topExclusiveCodes.addAll(topExclusive);
-  }
-
   @observable String padding(TableTreeRow row) {
     return 'padding-left: ${row.depth * 16}px;';
   }
@@ -147,4 +140,5 @@
       tree.toggle(row.rowIndex - 1);
     }
   }
+
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index 7d2fe1a..f8d14aa 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -3,11 +3,11 @@
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="isolate-profile" extends="isolate-element">
+<polymer-element name="isolate-profile" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -31,7 +31,6 @@
           <th>Method</th>
           <th>Exclusive</th>
           <th>Caller</th>
-          <th>Inclusive</th>
         </tr>
       </thead>
       <tbody>
@@ -39,11 +38,10 @@
           <td on-click="{{toggleExpanded}}"
               class="{{ coloring(row) }}"
               style="{{ padding(row) }}">
-            <code-ref isolate="{{ isolate }}" ref="{{ row.code.codeRef }}"></code-ref>
+            <code-ref ref="{{ row.code }}"></code-ref>
           </td>
           <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
           <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[2]}}</td>
         </tr>
       </tbody>
     </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 3085702..56baabf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -4,10 +4,12 @@
 
 library isolate_summary_element;
 
-import 'isolate_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
+import 'observatory_element.dart';
 
 @CustomTag('isolate-summary')
-class IsolateSummaryElement extends IsolateElement {
+class IsolateSummaryElement extends ObservatoryElement {
   IsolateSummaryElement.created() : super.created();
+  @published Isolate isolate;
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index 62b6c83..a5dbe18 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -3,7 +3,7 @@
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="script_ref.html">
 </head>
-<polymer-element name="isolate-summary" extends="isolate-element">
+<polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <div class="row">
       <div class="col-md-1">
@@ -28,9 +28,9 @@
 
         <div class="row">
           <small>
-            (<a href="{{ isolate.hashLink(isolate.rootLib) }}">library</a>)
-            (<a href="{{ isolate.hashLink('debug/breakpoints') }}">breakpoints</a>)
-            (<a href="{{ isolate.hashLink('profile') }}">profile</a>)
+            (<a href="{{ isolate.rootLib.hashLink }}">library</a>)
+            (<a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>)
+            (<a href="{{ isolate.relativeHashLink('profile') }}">profile</a>)
           </small>
         </div>
       </div>
@@ -63,7 +63,7 @@
         </div>
       </div>
       <div class="col-md-2">
-        <a href="{{ isolate.hashLink('allocationprofile') }}">
+        <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
       </div>
@@ -74,7 +74,7 @@
         <template if="{{ isolate.topFrame != null }}">
           run
         </template>
-        ( <a href="{{ isolate.hashLink('stacktrace') }}">stack trace</a> )
+        ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
     <div class="row">
@@ -82,10 +82,8 @@
       </div>
       <div class="col-md-6">
         <template if="{{ isolate.topFrame != null }}">
-          <function-ref isolate="{{ isolate }}"
-                        ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref isolate="{{ isolate }}"
-                       ref="{{ isolate.topFrame['script'] }}"
+          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+          (<script-ref ref="{{ isolate.topFrame['script'] }}"
                        line="{{ isolate.topFrame['line'] }}"></script-ref>)
           <br>
           <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index 08e23d3..398c508 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -4,21 +4,18 @@
 
 library library_view_element;
 
-import 'isolate_element.dart';
-import 'package:logging/logging.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+
 import 'package:polymer/polymer.dart';
 
 @CustomTag('library-view')
-class LibraryViewElement extends IsolateElement {
-  @published Map library = toObservable({});
+class LibraryViewElement extends ObservatoryElement {
+  @published ServiceMap library;
 
   LibraryViewElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap(library['id']).then((map) {
-        library = map;
-    }).catchError((e, trace) {
-          Logger.root.severe('Error while refreshing library-view: $e\n$trace');
-    }).whenComplete(done);
+    library.reload().whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 2a195b0..b54eb21 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -3,17 +3,17 @@
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="script_ref.html">
 </head>
-<polymer-element name="library-view" extends="isolate-element">
+<polymer-element name="library-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
-      <library-nav-menu isolate="{{ isolate }}" library="{{ library }}" last="{{ true }}"></library-nav-menu>
+      <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
@@ -22,10 +22,10 @@
     <tbody>
       <tr template repeat="{{ script in library['scripts']}}">
         <td>
-          {{ script['kind'] }}
+          {{ script.kind }}
         </td>
         <td>
-          <script-ref isolate="{{ isolate }}" ref="{{ script }}"></script-ref>
+          <script-ref ref="{{ script }}"></script-ref>
         </td>
       </tr>
     </tbody>
@@ -35,7 +35,7 @@
     <tbody>
       <tr template repeat="{{ lib in library['libraries'] }}">
         <td>
-          <library-ref isolate="{{ isolate }}" ref="{{ lib }}"></library-ref>
+          <library-ref ref="{{ lib }}"></library-ref>
         </td>
       </tr>
     </tbody>
@@ -44,8 +44,8 @@
   <table class="table table-hover">
     <tbody>
       <tr template repeat="{{ variable in library['variables'] }}">
-        <td><field-ref isolate="{{ isolate }}" ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref isolate="{{ isolate }}" ref="{{ variable['value'] }}"></instance-ref></td>
+        <td><field-ref ref="{{ variable }}"></field-ref></td>
+        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
       </tr>
     </tbody>
   </table>
@@ -54,7 +54,7 @@
     <tbody>
       <tr template repeat="{{ func in library['functions'] }}">
         <td>
-          <function-ref isolate="{{ isolate }}" ref="{{ func }}"></function-ref>
+          <function-ref ref="{{ func }}"></function-ref>
         </td>
       </tr>
     </tbody>
@@ -70,10 +70,10 @@
     <tbody>
       <tr template repeat="{{ cls in library['classes'] }}">
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}"></class-ref>
+          <class-ref ref="{{ cls }}"></class-ref>
         </td>
         <td>
-          <class-ref isolate="{{ isolate }}" ref="{{ cls }}" internal></class-ref>
+          <class-ref ref="{{ cls }}" internal></class-ref>
         </td>
       </tr>
     </tbody>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/message_viewer.dart b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.dart
deleted file mode 100644
index 9979d7a..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/message_viewer.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 message_viewer_element;
-
-import 'package:logging/logging.dart';
-import 'package:observatory/app.dart';
-import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
-
-@CustomTag('message-viewer')
-class MessageViewerElement extends ObservatoryElement {
-  Map _message;
-  @published Map get message => _message;
-  @published ObservatoryApplication app;
-
-  @published set message(Map m) {
-    if (m == null) {
-      Logger.root.info('Viewing null message.');
-      return;
-    }
-    Logger.root.info('Viewing message of type \'${m['type']}\'');
-    _message = m;
-    notifyPropertyChange(#messageType, "", messageType);
-  }
-
-  MessageViewerElement.created() : super.created();
-
-  String get messageType {
-    if (message == null || message['type'] == null) {
-      return 'Error';
-    }
-    return message['type'];
-  }
-}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html
deleted file mode 100644
index a00b2ff..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/message_viewer.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<head>
-  <link rel="import" href="breakpoint_list.html">
-  <link rel="import" href="class_view.html">
-  <link rel="import" href="code_view.html">
-  <link rel="import" href="error_view.html">
-  <link rel="import" href="field_view.html">
-  <link rel="import" href="function_view.html">
-  <link rel="import" href="heap_profile.html">
-  <link rel="import" href="instance_view.html">
-  <link rel="import" href="isolate_list.html">
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="library_view.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_view.html">
-  <link rel="import" href="stack_trace.html">
-</head>
-<polymer-element name="message-viewer" extends="observatory-element">
-  <!--
-    This is a big switch statement which instantiates the custom element
-    designated to display the message type.
-  -->
-  <template>
-  	<!-- If the message type is an IsolateList -->
-    <template if="{{ messageType == 'IsolateList' }}">
-      <isolate-list vm="{{ app.vm }}"></isolate-list>
-    </template>
-    <!-- If the message type is a StackTrace -->
-    <template if="{{ messageType == 'StackTrace' }}">
-      <stack-trace isolate="{{ app.isolate }}" trace="{{ message }}"></stack-trace>
-    </template>
-    <template if="{{ messageType == 'BreakpointList' }}">
-      <breakpoint-list isolate="{{ app.isolate }}" msg="{{ message }}"></breakpoint-list>
-    </template>
-    <template if="{{ messageType == 'Error' }}">
-      <error-view isolate="{{ app.isolate }}" error="{{ message }}"></error-view>
-    </template>
-    <template if="{{ messageType == 'Library' }}">
-      <library-view isolate="{{ app.isolate }}" library="{{ message }}"></library-view>
-    </template>
-    <template if="{{ messageType == 'Class' }}">
-      <class-view isolate="{{ app.isolate }}" cls="{{ message }}"></class-view>
-    </template>
-    <template if="{{ messageType == 'Field' }}">
-      <field-view isolate="{{ app.isolate }}" field="{{ message }}"></field-view>
-    </template>
-    <template if="{{ messageType == 'Closure' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Instance' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Array' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'GrowableObjectArray' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'String' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Bool' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Smi' }}">
-      <instance-view isolate="{{ app.isolate }}" instance="{{ message }}"></instance-view>
-    </template>
-    <template if="{{ messageType == 'Function' }}">
-      <function-view isolate="{{ app.isolate }}" function="{{ message }}"></function-view>
-    </template>
-    <template if="{{ messageType == 'Code' }}">
-      <code-view isolate="{{ app.isolate }}" code="{{ message['code'] }}"></code-view>
-    </template>
-    <template if="{{ messageType == 'Script' }}">
-      <script-view isolate="{{ app.isolate }}" script="{{ message['script'] }}"></script-view>
-    </template>
-    <template if="{{ messageType == 'AllocationProfile' }}">
-      <heap-profile isolate="{{ app.isolate }}" profile="{{ message }}"></heap-profile>
-    </template>
-    <template if="{{ messageType == 'Profile' }}">
-      <isolate-profile isolate="{{ app.isolate }}" profile="{{ message }}"></isolate-profile>
-    </template>
-    <!-- Add new views and message types in the future here. -->
-  </template>
-  <script type="application/dart" src="message_viewer.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index 96cb731..ad58d58 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -5,9 +5,8 @@
 library nav_bar_element;
 
 import 'dart:html';
-import 'isolate_element.dart';
 import 'observatory_element.dart';
-import 'package:observatory/app.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 
@@ -37,6 +36,7 @@
 class NavRefreshElement extends ObservatoryElement {
   @published var callback;
   @published bool active = false;
+  @published String label = 'Refresh';
 
   NavRefreshElement.created() : super.created();
 
@@ -63,23 +63,24 @@
 }
 
 @CustomTag('isolate-nav-menu')
-class IsolateNavMenuElement extends IsolateElement {
+class IsolateNavMenuElement extends ObservatoryElement {
   @published bool last = false;
+  @published Isolate isolate;
 
   IsolateNavMenuElement.created() : super.created();
 }
 
 @CustomTag('library-nav-menu')
-class LibraryNavMenuElement extends IsolateElement {
-  @published Map library;
+class LibraryNavMenuElement extends ObservatoryElement {
+  @published ServiceMap library;
   @published bool last = false;
 
   LibraryNavMenuElement.created() : super.created();
 }
 
 @CustomTag('class-nav-menu')
-class ClassNavMenuElement extends IsolateElement {
-  @published Map cls;
+class ClassNavMenuElement extends ObservatoryElement {
+  @published ServiceMap cls;
   @published bool last = false;
 
   ClassNavMenuElement.created() : super.created();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index 4d8a362..dbd2006 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -1,6 +1,5 @@
 <head>
   <link rel="import" href="observatory_element.html">
-  <link rel="import" href="isolate_element.html">
 </head>
 
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -141,10 +140,10 @@
     </style>
     <li>
       <template if="{{ active }}">
-        <button class="active" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="active" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
       <template if="{{ !active }}">
-        <button class="idle" on-click="{{ buttonClick }}">Refresh</button>
+        <button class="idle" on-click="{{ buttonClick }}">{{ label }}</button>
       </template>
     </li>
   </template>
@@ -158,35 +157,35 @@
   </template>
 </polymer-element>
 
-<polymer-element name="isolate-nav-menu" extends="isolate-element">
+<polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.hashLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('profile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
                      anchor="heap profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.hashLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="library-nav-menu" extends="isolate-element">
+<polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(library['id']) }}"
-              anchor="{{ library['name'] }}" last="{{ last }}">
+    <nav-menu link="{{ library.hashLink }}"
+              anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
 </polymer-element>
 
-<polymer-element name="class-nav-menu" extends="isolate-element">
+<polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ isolate.hashLink(cls['id']) }}"
-              anchor="{{ cls['user_name'] }}" last="{{ last }}">
+    <nav-menu link="{{ cls.hashLink }}"
+              anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index a5537a0..76c2347 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -64,6 +64,11 @@
 
   }
 
+  String formatSeconds(double x) {
+    return x.toStringAsFixed(2);
+  }
+
+
   String formatSize(int bytes) {
     const int bytesPerKB = 1024;
     const int bytesPerMB = 1024 * bytesPerKB;
@@ -89,47 +94,52 @@
     return "${shortFile}:${frame['line']}";
   }
 
-  bool isNullRef(String type) {
-    return type == '@Null';
+  bool isNull(String type) {
+    return type == 'Null';
+  }
+  
+  bool isError(String type) {
+    return type == 'Error';
   }
 
-  bool isIntRef(String type) {
-    return (type == '@Smi' ||
-            type == '@Mint' ||
-            type == '@Bigint');
+  bool isInt(String type) {
+    return (type == 'Smi' ||
+            type == 'Mint' ||
+            type == 'Bigint');
   }
 
-  bool isBoolRef(String type) {
-    return type == '@Bool';
+  bool isBool(String type) {
+    return type == 'Bool';
   }
 
-  bool isStringRef(String type) {
-    return type == '@String';
+  bool isString(String type) {
+    return type == 'String';
   }
 
-  bool isInstanceRef(String type) {
-    return type == '@Instance';
+  bool isInstance(String type) {
+    return type == 'Instance';
   }
 
-  bool isClosureRef(String type) {
-    return type == '@Closure';
+  bool isClosure(String type) {
+    return type == 'Closure';
   }
 
-  bool isListRef(String type) {
-    return (type == '@GrowableObjectArray' ||
-            type == '@Array');
+  bool isList(String type) {
+    return (type == 'GrowableObjectArray' ||
+            type == 'Array');
   }
 
-  bool isUnexpectedRef(String type) {
-    return (!['@Null',
-              '@Smi',
-              '@Mint',
-              '@Biginit',
-              '@Bool',
-              '@String',
-              '@Closure',
-              '@Instance',
-              '@GrowableObjectArray',
-              '@Array'].contains(type));
+  bool isUnexpected(String type) {
+    return (!['Null',
+              'Smi',
+              'Mint',
+              'Biginit',
+              'Bool',
+              'String',
+              'Closure',
+              'Instance',
+              'GrowableObjectArray',
+              'Array',
+              'Error'].contains(type));
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
index 18185f1..230120a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
@@ -1,10 +1,10 @@
 <head>
   <link rel="import" href="observatory_element.html">
-  <link rel="import" href="message_viewer.html">
+  <link rel="import" href="service_view.html">
 </head>
 <polymer-element name="response-viewer" extends="observatory-element">
   <template>
-    <message-viewer app="{{ app }}" message="{{ app.response }}"></message-viewer>
+    <service-view object="{{ app.response }}"></service-view>
   </template>
   <script type="application/dart" src="response_viewer.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
index 4f2794b..1eaf1b4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
@@ -11,36 +11,25 @@
 class ScriptRefElement extends ServiceRefElement {
   @published int line = -1;
 
-  String get objectId {
-    if (line < 0) {
-      return super.objectId;
-    }
-    // TODO(johnmccutchan): Add a ?line=XX invalidates the idea that this
-    // method returns an objectId.
-    return '${super.objectId}?line=$line';
-  }
-
   String get hoverText {
     if (ref == null) {
-      return '';
+      return super.hoverText;
     }
     if (line < 0) {
-      return ref['user_name'];
+      return ref.vmName;
     } else {
-      return "${ref['user_name']}:$line";
+      return '${ref.vmName}:$line';
     }
   }
 
   String get name {
     if (ref == null) {
-      return '';
+      return super.name;
     }
-    var scriptUrl = ref['user_name'];
-    var shortScriptUrl = scriptUrl.substring(scriptUrl.lastIndexOf('/') + 1);
     if (line < 0) {
-      return shortScriptUrl;
+      return ref.name;
     } else {
-      return "$shortScriptUrl:$line";
+      return '${ref.name}:$line';
     }
   }
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
index 7d04c2b..687f078 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
@@ -4,36 +4,61 @@
 
 library script_view_element;
 
-import 'dart:html';
-import 'isolate_element.dart';
-import 'package:observatory/app.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 /// Displays an Error response.
 @CustomTag('script-view')
-class ScriptViewElement extends IsolateElement {
+class ScriptViewElement extends ObservatoryElement {
   @published Script script;
+  @published bool showCoverage = false;
 
   ScriptViewElement.created() : super.created();
 
-  String hitsStyle(ScriptLine line) {
-    if (line.hits == -1) {
-      return 'min-width:32px;';
-    } else if (line.hits == 0) {
-      return 'min-width:32px;background-color:red';
+  void enteredView() {
+    super.enteredView();
+    if (script == null) {
+      return;
     }
-    return 'min-width:32px;background-color:green';
+    script.load();
   }
 
-  void refreshCoverage(Event e, var detail, Node target) {
-    isolate.getMap('coverage').then((Map coverage) {
-      assert(coverage['type'] == 'CodeCoverage');
-      isolate.updateCoverage(coverage['coverage']);
-      notifyPropertyChange(#hitsStyle, "", hitsStyle);
-    }).catchError((e, st) {
-      print('refreshCoverage $e $st');
+  void _triggerHitRefresh() {
+    notifyPropertyChange(#hitsStyle, 0, 1);
+  }
+
+  showCoverageChanged(oldValue) {
+    _triggerHitRefresh();
+  }
+
+  static const hitStyleNone = 'min-width:32px;';
+  static const hitStyleExecuted = 'min-width:32px;background-color:green';
+  static const hitStyleNotExecuted = 'min-width:32px;background-color:red';
+
+  @observable String hitsStyle(ScriptLine line) {
+    if ((script == null) || !showCoverage) {
+      return hitStyleNone;
+    }
+    var hit = script.hits[line.line];
+    if (hit == null) {
+      return hitStyleNone;
+    }
+    if (hit == 0) {
+      return hitStyleNotExecuted;
+    }
+    assert(hit > 0);
+    return hitStyleExecuted;
+  }
+
+  void refresh(var done) {
+    script.reload().whenComplete(done);
+  }
+
+  void refreshCoverage(var done) {
+    script.isolate.refreshCoverage().then((_) {
+      _triggerHitRefresh();
+      done();
     });
   }
-
-
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index af8b8f7..ef6b4a7 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -1,28 +1,32 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="script-view" extends="isolate-element">
+<polymer-element name="script-view" extends="observatory-element">
 <template>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ isolate }}">
+    <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <library-nav-menu isolate="{{ isolate }}" library="{{ script.libraryRef }}"></library-nav-menu>
-    <nav-menu link="." anchor="{{ script.shortName }}" last="{{ true }}"></nav-menu>
+    <library-nav-menu library="{{ script.library }}"></library-nav-menu>
+    <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
+      <li>
+        <input type="checkbox" checked="{{ showCoverage }}">
+        <label>Show Coverage Data</label>
+      </li>
+    </nav-menu>
+    <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <div class="row">
     <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">
-      <button on-click="{{refreshCoverage}}">Refresh Coverage</button>
-      {{ script.scriptRef['user_name'] }}
-      {{ script.coveredPercentageFormatted() }}
-      </div>
+      <div class="panel-heading">Script source for: {{ script.name }}</div>
       <div class="panel-body">
         <table style="width:100%">
           <tbody>
-          <tr template repeat="{{ line in script.linesForDisplay }}">
+          <tr template repeat="{{ line in script.lines }}">
             <td style="{{ hitsStyle(line) }}">  </td>
             <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
             <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 00c4175..9af8c16 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -5,11 +5,12 @@
 library service_ref_element;
 
 import 'package:polymer/polymer.dart';
-import 'isolate_element.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 
 @CustomTag('service-ref')
-class ServiceRefElement extends IsolateElement {
-  @published Map ref;
+class ServiceRefElement extends ObservatoryElement {
+  @published ServiceObject ref;
   @published bool internal = false;
   ServiceRefElement.created() : super.created();
 
@@ -20,35 +21,30 @@
   }
 
   String get url {
-    if ((isolate == null) || (ref == null)) {
-      return '';
+    if (ref == null) {
+      return 'NULL REF';
     }
-    return isolate.hashLink(objectId);
+    return ref.hashLink;
   }
 
-  String get objectId => ref == null ? '' : ref['id'];
+  String get serviceId {
+    if (ref == null) {
+      return 'NULL REF';
+    }
+    return ref.id;
+  }
 
   String get hoverText {
     if (ref == null) {
-      return '';
+      return 'NULL REF';
     }
-    // Return the VM name by default.
-    var name = ref['name'];
-    return name != null ? name : '';
+    return ref.vmName;
   }
 
   String get name {
     if (ref == null) {
       return 'NULL REF';
     }
-    String name_key = internal ? 'name' : 'user_name';
-    if (ref[name_key] != null) {
-      return ref[name_key];
-    } else if (ref['name'] != null) {
-      return ref['name'];
-    } else if (ref['user_name'] != null) {
-      return ref['user_name'];
-    }
-    return '';
+    return ref.name;
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
index e7e2779..1818675 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -1,6 +1,6 @@
 <head>
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
 </head>
-<polymer-element name="service-ref" extends="isolate-element">
+<polymer-element name="service-ref" extends="observatory-element">
   <script type="application/dart" src="service_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
new file mode 100644
index 0000000..2a81626
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service_object_view_element;
+
+import 'dart:html';
+import 'package:logging/logging.dart';
+import 'package:observatory/service.dart';
+import 'package:observatory/elements.dart';
+import 'package:polymer/polymer.dart';
+import 'observatory_element.dart';
+
+@CustomTag('service-view')
+class ServiceObjectViewElement extends ObservatoryElement {
+  @published ServiceObject object;
+
+  ServiceObjectViewElement.created() : super.created();
+
+  ObservatoryElement _constructElementForObject() {
+    var type = object.serviceType;
+    switch (type) {
+      case 'AllocationProfile':
+        HeapProfileElement element = new Element.tag('heap-profile');
+        element.profile = object;
+        return element;
+      case 'BreakpointList':
+        BreakpointListElement element = new Element.tag('breakpoint-list');
+        element.msg = object;
+        return element;
+      case 'Class':
+        ClassViewElement element = new Element.tag('class-view');
+        element.cls = object;
+        return element;
+      case 'Code':
+        CodeViewElement element = new Element.tag('code-view');
+        element.code = object;
+        return element;
+      case 'Error':
+        ErrorViewElement element = new Element.tag('error-view');
+        element.error = object;
+        return element;
+      case 'Field':
+        FieldViewElement element = new Element.tag('field-view');
+        element.field = object;
+        return element;
+      case 'Function':
+        FunctionViewElement element = new Element.tag('function-view');
+        element.function = object;
+        return element;
+      case 'Array':
+      case 'Bool':
+      case 'Closure':
+      case 'GrowableObjectArray':
+      case 'Instance':
+      case 'Smi':
+      case 'String':
+        InstanceViewElement element = new Element.tag('instance-view');
+        element.instance = object;
+        return element;
+      case 'IsolateList':
+        IsolateListElement element = new Element.tag('isolate-list');
+        element.isolates = object;
+        return element;
+      case 'Library':
+        LibraryViewElement element = new Element.tag('library-view');
+        element.library = object;
+        return element;
+      case 'Profile':
+        IsolateProfileElement element = new Element.tag('isolate-profile');
+        element.profile = object;
+        return element;
+      case 'Script':
+        ScriptViewElement element = new Element.tag('script-view');
+        element.script = object;
+        return element;
+      case 'StackTrace':
+        StackTraceElement element = new Element.tag('stack-trace');
+        element.trace = object;
+        return element;
+      default:
+        return null;
+    }
+  }
+
+  objectChanged(oldValue) {
+    // Remove the current view.
+    children.clear();
+    if (object == null) {
+      Logger.root.info('Viewing null object.');
+      return;
+    }
+    var type = object.serviceType;
+    var element = _constructElementForObject();
+    if (element == null) {
+      Logger.root.info('Unable to find a view element for \'${type}\'');
+      return;
+    }
+    children.add(element);
+    Logger.root.info('Viewing object of \'${type}\'');
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
new file mode 100644
index 0000000..93fadd0
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -0,0 +1,21 @@
+<head>
+  <link rel="import" href="breakpoint_list.html">
+  <link rel="import" href="class_view.html">
+  <link rel="import" href="code_view.html">
+  <link rel="import" href="error_view.html">
+  <link rel="import" href="field_view.html">
+  <link rel="import" href="function_view.html">
+  <link rel="import" href="heap_profile.html">
+  <link rel="import" href="instance_view.html">
+  <link rel="import" href="isolate_list.html">
+  <link rel="import" href="isolate_profile.html">
+  <link rel="import" href="library_view.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_view.html">
+  <link rel="import" href="stack_trace.html">
+</head>
+<polymer-element name="service-view" extends="observatory-element">
+  <!-- This element explicitly manages the child elements to avoid setting
+       an observable property on the old element to an invalid type. -->
+  <script type="application/dart" src="service_view.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
index 021e111..51ae660 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.dart
@@ -4,11 +4,11 @@
 
 library stack_frame_element;
 
-import 'isolate_element.dart';
+import 'observatory_element.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('stack-frame')
-class StackFrameElement extends IsolateElement {
-  @published Map frame = toObservable({});
+class StackFrameElement extends ObservatoryElement {
+  @published ObservableMap frame;
   StackFrameElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index c453c75..ca7313c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -2,10 +2,10 @@
   <link rel="import" href="curly_block.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="script_ref.html">
 </head>
-<polymer-element name="stack-frame" extends="isolate-element">
+<polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
       .member {
@@ -19,15 +19,15 @@
         #{{ frame['depth'] }}
       </div>
       <div class="col-md-9">
-        <function-ref isolate="{{ isolate }}" ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref isolate="{{ isolate }}" ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        <function-ref ref="{{ frame['function'] }}"></function-ref>
+        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
         <curly-block>
           <table>
             <tr template repeat="{{ v in frame['vars'] }}">
               <td class="member">{{ v['name']}}</td>
               <td class="member">
-                <instance-ref isolate="{{ isolate }}" ref="{{ v['value'] }}"></instance-ref>
+                <instance-ref ref="{{ v['value'] }}"></instance-ref>
               </td>
             </tr>
           </table>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
index 6ccbab2..f92630e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.dart
@@ -4,21 +4,17 @@
 
 library stack_trace_element;
 
-import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
-import 'isolate_element.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
 
 @CustomTag('stack-trace')
-class StackTraceElement extends IsolateElement {
-  @published Map trace = toObservable({});
+class StackTraceElement extends ObservatoryElement {
+  @published ServiceMap trace;
 
   StackTraceElement.created() : super.created();
 
   void refresh(var done) {
-    isolate.getMap('stacktrace').then((map) {
-        trace = map;
-    }).catchError((e, trace) {
-        Logger.root.severe('Error while reloading stack trace: $e\n$trace');
-    }).whenComplete(done);
+    trace.reload().whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index 9044754..a5625406 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -1,13 +1,13 @@
 <head>
   <link rel="import" href="nav_bar.html">
-  <link rel="import" href="isolate_element.html">
+  <link rel="import" href="observatory_element.html">
   <link rel="import" href="stack_frame.html">
 </head>
-<polymer-element name="stack-trace" extends="isolate-element">
+<polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ isolate }}"></isolate-nav-menu>
+      <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
@@ -22,7 +22,7 @@
       <ul class="list-group">
         <template repeat="{{ frame in trace['members'] }}">
           <li class="list-group-item">
-            <stack-frame isolate="{{ isolate }}" frame="{{ frame }}"></stack-frame>
+            <stack-frame frame="{{ frame }}"></stack-frame>
           </li>
         </template>
       </ul>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_element.dart b/runtime/bin/vmservice/client/lib/src/elements/vm_element.dart
deleted file mode 100644
index ec63553..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_element.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 vm_element;
-
-import 'observatory_element.dart';
-import 'package:observatory/app.dart';
-import 'package:polymer/polymer.dart';
-
-/// Base class for all custom elements which reference a VM.
-/// Holds an observable [VM].
-@CustomTag('vm-element')
-class VMElement extends ObservatoryElement {
-  VMElement.created() : super.created();
-  @published VM vm;
-}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_element.html b/runtime/bin/vmservice/client/lib/src/elements/vm_element.html
deleted file mode 100644
index 842ef6f..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_element.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="vm-element" extends="observatory-element">
-  <script type="application/dart" src="vm_element.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/service/cache.dart b/runtime/bin/vmservice/client/lib/src/service/cache.dart
new file mode 100644
index 0000000..6feb94a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/service/cache.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 service;
+
+/// Abstract [ServiceObjectCache].
+abstract class ServiceObjectCache<T extends ServiceObject> {
+  final Isolate isolate;
+  final _cache = new ObservableMap<String, T>();
+
+  ServiceObjectCache(this.isolate) {
+    assert(isolate != null);
+  }
+
+  /// Returns true if [this] caches objects with this [id].
+  bool cachesId(String id);
+
+  /// Upgrades [obj] into a [T].
+  T _upgrade(ObservableMap map);
+
+  /// Returns true if [this] has [id] in its cache.
+  bool contains(String id) {
+    assert(cachesId(id));
+    return _cache[id] != null;
+  }
+
+  /// Gets [id] from the cache. Returns null if not contained.
+  T operator[](String id) {
+    assert(cachesId(id));
+    return _cache[id];
+  }
+
+  /// Caches [serviceObject] with [id].
+  operator[]=(String id, T serviceObject) {
+    assert(cachesId(id));
+    _cache[id] = serviceObject;
+  }
+
+  /// Gets [id] from the cache or makes a network request for [id].
+  Future<T> get(String id) {
+    assert(cachesId(id));
+    T cached = _cache[id];
+    if (cached != null) {
+      return new Future.value(cached);
+    }
+    return isolate.get(id).then(_addToCache);
+  }
+
+  /// If [obj] is cached, return the cached object. Otherwise, upgrades [obj]
+  /// and adds the upgraded value to the cache.
+  T putIfAbsent(ObservableMap obj) {
+    assert(ServiceObject.isServiceMap(obj));
+    String id = obj['id'];
+    var type = obj['type'];
+    if (!cachesId(id)) {
+      Logger.root.warning('Cache does not cache this id: $id');
+    }
+    assert(cachesId(id));
+    if (contains(id)) {
+      return this[id];
+    }
+    return _addToCache(_upgrade(obj));
+  }
+
+  T _addToCache(T so) {
+    this[so.id] = so;
+    return so;
+  }
+}
+
+class ScriptCache extends ServiceObjectCache<Script> {
+  ScriptCache(Isolate isolate) : super(isolate);
+
+  bool cachesId(String id) => _matcher.hasMatch(id);
+  Script _upgrade(ObservableMap obj) => new Script.fromMap(isolate, obj);
+  static final RegExp _matcher = new RegExp(r'scripts/.+');
+
+  void _processCoverage(ServiceMap coverage) {
+    assert(coverage.serviceType == 'CodeCoverage');
+    var coverageList = coverage['coverage'];
+    assert(coverageList != null);
+    coverageList.forEach((scriptCoverage) {
+      _processScriptCoverage(scriptCoverage);
+    });
+  }
+
+  void _processScriptCoverage(ObservableMap scriptCoverage) {
+    // Because the coverage data was upgraded into a ServiceObject,
+    // the script can be directly accessed.
+    Script script = scriptCoverage['script'];
+    script._processHits(scriptCoverage['hits']);
+  }
+}
+
+class CodeCache extends ServiceObjectCache<Code> {
+  CodeCache(Isolate isolate) : super(isolate);
+
+  bool cachesId(String id) => _matcher.hasMatch(id);
+  Code _upgrade(ObservableMap obj) => new Code.fromMap(isolate, obj);
+
+  static final RegExp _matcher = new RegExp(r'code/.+');
+
+  List<Code> topExclusive(int count) {
+    var codeList = _cache.values.toList();
+    codeList.sort((Code a, Code b) {
+      return b.exclusiveTicks - a.exclusiveTicks;
+    });
+    if (codeList.length < count) {
+      return codeList;
+    }
+    codeList.length = count;
+    return codeList;
+  }
+
+  void _resetProfileData() {
+    _cache.forEach((k, Code code) {
+      code.resetProfileData();
+    });
+  }
+
+  void _updateProfileData(ServiceMap profile, List<Code> codeTable) {
+    var codeRegions = profile['codes'];
+    var sampleCount = profile['samples'];
+    for (var codeRegion in codeRegions) {
+      Code code = codeRegion['code'];
+      code.updateProfileData(codeRegion, codeTable, sampleCount);
+    }
+  }
+}
+
+class ClassCache extends ServiceObjectCache<ServiceMap> {
+  ClassCache(Isolate isolate) : super(isolate);
+
+  bool cachesId(String id) => _matcher.hasMatch(id);
+  bool cachesType(String type) => ServiceObject.stripRef(type) == 'Class';
+  ServiceMap _upgrade(ObservableMap obj) =>
+      new ServiceMap.fromMap(isolate, obj);
+
+  static final RegExp _matcher = new RegExp(r'classes/\d+$');
+}
+
+class FunctionCache extends ServiceObjectCache<ServiceMap> {
+  FunctionCache(Isolate isolate) : super(isolate);
+
+  bool cachesId(String id) => _matcher.hasMatch(id);
+
+  bool cachesType(String type) => ServiceObject.stripRef(type) == 'Function';
+  ServiceMap _upgrade(ObservableMap obj) =>
+      new ServiceMap.fromMap(isolate, obj);
+
+  static final RegExp _matcher =
+      new RegExp(r'^functions/native-.+|'
+                 r'^functions/collected-.+|'
+                 r'^functions/reused-.+|'
+                 r'^functions/stub-.+|'
+                 r'^classes/\d+/functions/.+|'
+                 r'^classes/\d+/closures/.+|'
+                 r'^classes/\d+/implicit_closures/.+|'
+                 r'^classes/\d+/dispatchers/.+');
+}
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
new file mode 100644
index 0000000..bbfe10a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -0,0 +1,634 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 service;
+
+/// State for a running isolate.
+class Isolate extends ServiceObject {
+  final VM vm;
+  String get link => _id;
+  String get hashLink => '#/$_id';
+
+  ScriptCache _scripts;
+  /// Script cache.
+  ScriptCache get scripts => _scripts;
+  CodeCache _codes;
+  /// Code cache.
+  CodeCache get codes => _codes;
+  /// Class cache.
+  ClassCache _classes;
+  ClassCache get classes => _classes;
+  /// Function cache.
+  FunctionCache _functions;
+  FunctionCache get functions => _functions;
+
+  void _initOnce() {
+    // Only called once.
+    assert(_isolate == null);
+    _isolate = this;
+    _scripts = new ScriptCache(this);
+    _codes = new CodeCache(this);
+    _classes = new ClassCache(this);
+    _functions = new FunctionCache(this);
+  }
+
+  Isolate.fromId(this.vm, String id) : super(null, id, '@Isolate') {
+    _initOnce();
+  }
+
+  Isolate.fromMap(this.vm, Map map) : super.fromMap(null, map) {
+    _initOnce();
+  }
+
+  /// Creates a link to [id] relative to [this].
+  @reflectable String relativeLink(String id) => '${this.id}/$id';
+  /// Creates a relative link to [id] with a '#/' prefix.
+  @reflectable String relativeHashLink(String id) => '#/${relativeLink(id)}';
+
+  Future<ScriptCache> refreshCoverage() {
+    return get('coverage').then(_scripts._processCoverage);
+  }
+
+  void processProfile(ServiceMap profile) {
+    assert(profile.serviceType == 'Profile');
+    var codeTable = new List<Code>();
+    var codeRegions = profile['codes'];
+    for (var codeRegion in codeRegions) {
+      Code code = codeRegion['code'];
+      assert(code != null);
+      codeTable.add(code);
+    }
+    _codes._resetProfileData();
+    _codes._updateProfileData(profile, codeTable);
+  }
+
+  /// Requests [serviceId] from [this]. Completes to a [ServiceObject].
+  /// Can return pre-existing, cached, [ServiceObject]s.
+  Future<ServiceObject> get(String serviceId) {
+    if (_scripts.cachesId(serviceId)) {
+      return _scripts.get(serviceId);
+    }
+    if (_codes.cachesId(serviceId)) {
+      return _codes.get(serviceId);
+    }
+    if (_classes.cachesId(serviceId)) {
+      return _classes.get(serviceId);
+    }
+    if (_functions.cachesId(serviceId)) {
+      return _functions.get(serviceId);
+    }
+    return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
+      return _upgradeToServiceObject(vm, this, m);
+    });
+  }
+
+  @observable ServiceMap rootLib;
+  @observable ObservableMap topFrame;
+
+  @observable String name;
+  @observable String vmName;
+  @observable Map entry;
+
+  @observable final Map<String, double> timers =
+      toObservable(new Map<String, double>());
+
+  @observable int newHeapUsed = 0;
+  @observable int oldHeapUsed = 0;
+
+  @observable String fileAndLine;
+
+  void _update(ObservableMap map) {
+    upgradeCollection(map, vm, this);
+    _ref = false;
+    if (map['rootLib'] == null ||
+        map['timers'] == null ||
+        map['heap'] == null) {
+      Logger.root.severe("Malformed 'Isolate' response: $map");
+      return;
+    }
+    rootLib = map['rootLib'];
+    vmName = map['name'];
+    if (map['entry'] != null) {
+      entry = map['entry'];
+      name = entry['name'];
+    } else {
+      // fred
+      name = 'root isolate';
+    }
+    if (map['topFrame'] != null) {
+      topFrame = map['topFrame'];
+    } else {
+      topFrame = null ;
+    }
+
+    var timerMap = {};
+    map['timers'].forEach((timer) {
+        timerMap[timer['name']] = timer['time'];
+      });
+    timers['total'] = timerMap['time_total_runtime'];
+    timers['compile'] = timerMap['time_compilation'];
+    timers['gc'] = 0.0;  // TODO(turnidge): Export this from VM.
+    timers['init'] = (timerMap['time_script_loading'] +
+                      timerMap['time_creating_snapshot'] +
+                      timerMap['time_isolate_initialization'] +
+                      timerMap['time_bootstrap']);
+    timers['dart'] = timerMap['time_dart_execution'];
+
+    newHeapUsed = map['heap']['usedNew'];
+    oldHeapUsed = map['heap']['usedOld'];
+  }
+}
+
+// TODO(johnmccutchan): Make this into an IsolateCache.
+class IsolateList extends ServiceObject {
+  final VM _vm;
+  VM get vm => _vm;
+  @observable final isolates = new ObservableMap<String, Isolate>();
+  IsolateList(this._vm) : super(null, 'isolates', 'IsolateList') {
+    name = 'IsolateList';
+    vmName = name;
+  }
+  IsolateList.fromMap(this._vm, Map m) : super.fromMap(null, m) {
+    name = 'IsolateList';
+    vmName = name;
+  }
+
+  Future<ServiceObject> reload() {
+    return vm.getAsMap(id).then(update);
+  }
+
+  void _update(ObservableMap map) {
+    _updateIsolates(map['members']);
+  }
+
+  void _updateIsolates(List<Map> members) {
+     // Find dead isolates.
+     var deadIsolates = [];
+     isolates.forEach((k, v) {
+       if (!_foundIsolateInMembers(k, members)) {
+         deadIsolates.add(k);
+       }
+     });
+     // Remove them.
+     deadIsolates.forEach((id) {
+       isolates.remove(id);
+       Logger.root.info('Isolate \'$id\' has gone away.');
+     });
+
+     // Add new isolates.
+     members.forEach((map) {
+       var id = map['id'];
+       var isolate = isolates[id];
+       if (isolate == null) {
+         isolate = new Isolate.fromMap(vm, map);
+         Logger.root.info('Created ServiceObject for \'${isolate.id}\' with '
+                          'type \'${isolate.serviceType}\'');
+         isolates[id] = isolate;
+       }
+     });
+
+     // After updating the isolate list, refresh each isolate.
+     _refreshIsolates();
+   }
+
+  void _refreshIsolates() {
+    // This is technically asynchronous but we don't need to wait for
+    // the result.
+    isolates.forEach((k, Isolate isolate) {
+      isolate.reload();
+    });
+  }
+
+  Isolate getIsolate(String id) {
+    assert(id.startsWith('isolates/'));
+    var isolate = isolates[id];
+    if (isolate != null) {
+      return isolate;
+    }
+    isolate = new Isolate.fromId(vm, id);
+    isolates[id] = isolate;
+    isolate.load();
+    return isolate;
+  }
+
+  Isolate getIsolateFromMap(ObservableMap m) {
+    assert(ServiceObject.isServiceMap(m));
+    String id = m['id'];
+    assert(id.startsWith('isolates/'));
+    var isolate = isolates[id];
+    if (isolate != null) {
+      isolate.update(m);
+      return isolate;
+    }
+    isolate = new Isolate.fromMap(vm, m);
+    isolates[id] = isolate;
+    isolate.load();
+    return isolate;
+  }
+
+  static bool _foundIsolateInMembers(String id, List<Map> members) {
+    return members.any((E) => E['id'] == id);
+  }
+}
+
+
+/// A [ServiceObject] which implements [ObservableMap].
+class ServiceMap extends ServiceObject implements ObservableMap {
+  final ObservableMap _map = new ObservableMap();
+  ServiceMap(Isolate isolate, String id, String serviceType) :
+      super(isolate, id, serviceType) {
+  }
+
+  ServiceMap.fromMap(Isolate isolate, ObservableMap m) :
+      super.fromMap(isolate, m);
+
+  String toString() => _map.toString();
+
+  void _upgradeValues() {
+    assert(isolate != null);
+    upgradeCollection(_map, vm, isolate);
+  }
+
+  void _update(ObservableMap m) {
+    _map.clear();
+    _map.addAll(m);
+    name = _map['user_name'];
+    vmName = _map['name'];
+    _upgradeValues();
+  }
+
+  // Forward Map interface calls.
+  void addAll(Map other) => _map.addAll(other);
+  void clear() => _map.clear();
+  bool containsValue(v) => _map.containsValue(v);
+  bool containsKey(k) => _map.containsKey(k);
+  void forEach(Function f) => _map.forEach(f);
+  putIfAbsent(key, Function ifAbsent) => _map.putIfAbsent(key, ifAbsent);
+  void remove(key) => _map.remove(key);
+  operator [](k) => _map[k];
+  operator []=(k, v) => _map[k] = v;
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  Iterable get keys => _map.keys;
+  Iterable get values => _map.values;
+  int get length => _map.length;
+
+  // Forward ChangeNotifier interface calls.
+  bool deliverChanges() => _map.deliverChanges();
+  void notifyChange(ChangeRecord record) => _map.notifyChange(record);
+  notifyPropertyChange(Symbol field, Object oldValue, Object newValue) =>
+      _map.notifyPropertyChange(field, oldValue, newValue);
+  void observed() => _map.observed();
+  void unobserved() => _map.unobserved();
+  Stream<List<ChangeRecord>> get changes => _map.changes;
+  bool get hasObservers => _map.hasObservers;
+}
+
+class ServiceError extends ServiceObject {
+  ServiceError.fromMap(Isolate isolate, Map m) : super.fromMap(isolate, m);
+
+  @observable String kind;
+  @observable String message;
+
+  void _update(ObservableMap map) {
+    kind = map['kind'];
+    message = map['message'];
+    name = 'ServiceError $kind';
+    vmName = name;
+  }
+
+  // TODO: stackTrace?
+}
+
+class ScriptLine {
+  @reflectable final int line;
+  @reflectable final String text;
+  ScriptLine(this.line, this.text);
+}
+
+class Script extends ServiceObject {
+  @reflectable final lines = new ObservableList<ScriptLine>();
+  @reflectable final hits = new ObservableMap<int, int>();
+  @observable ServiceObject library;
+  @observable String kind;
+
+  String _shortUrl;
+  String _url;
+
+  Script.fromMap(Isolate isolate, Map m) : super.fromMap(isolate, m);
+
+  void _update(ObservableMap m) {
+    // Assert that m is a service map.
+    assert(ServiceObject.isServiceMap(m));
+    if ((m['type'] == 'Error') && (m['kind'] == 'NotFoundError')) {
+      // TODO(johnmccutchan): Find out why dart:core/identical.dart can't
+      // be found but shows up in coverage. i.e. a function has reference
+      // to script that no library does.
+      Logger.root.info(m['message']);
+      return;
+    }
+    // Assert that the id hasn't changed.
+    assert(m['id'] == _id);
+    // Assert that the type hasn't changed.
+    assert(ServiceObject.stripRef(m['type']) == _serviceType);
+    _url = m['name'];
+    _shortUrl = _url.substring(_url.lastIndexOf('/') + 1);
+    name = _shortUrl;
+    vmName = _url;
+    kind = m['kind'];
+    _processSource(m['source']);
+  }
+
+  void _processHits(List scriptHits) {
+    if (_ref) {
+      // Eagerly grab script source.
+      load();
+    }
+    // Update hits table.
+    for (var i = 0; i < scriptHits.length; i += 2) {
+      var line = scriptHits[i];
+      var hit = scriptHits[i + 1]; // hit status.
+      assert(line >= 1); // Lines start at 1.
+      hits[line] = hit;
+    }
+  }
+
+  void _processSource(String source) {
+    // Preemptyively mark that this is a reference.
+    _ref = true;
+    if (source == null) {
+      return;
+    }
+    var sourceLines = source.split('\n');
+    if (sourceLines.length == 0) {
+      return;
+    }
+    // We have the source to the script. This is no longer a reference.
+    _ref = false;
+    lines.clear();
+    Logger.root.info('Adding ${sourceLines.length} source lines for ${_url}');
+    for (var i = 0; i < sourceLines.length; i++) {
+      lines.add(new ScriptLine(i + 1, sourceLines[i]));
+    }
+  }
+
+
+}
+
+class CodeTick {
+  final int address;
+  final int exclusiveTicks;
+  final int inclusiveTicks;
+  CodeTick(this.address, this.exclusiveTicks, this.inclusiveTicks);
+}
+
+
+class CodeInstruction extends Observable {
+  @observable final int address;
+  @observable final String machine;
+  @observable final String human;
+
+  static String formatPercent(num a, num total) {
+    var percent = 100.0 * (a / total);
+    return '${percent.toStringAsFixed(2)}%';
+  }
+
+  CodeInstruction(this.address, this.machine, this.human);
+
+  @reflectable String formattedAddress() {
+    if (address == 0) {
+      return '';
+    }
+    return '0x${address.toRadixString(16)}';
+  }
+
+  @reflectable String formattedInclusive(Code code) {
+    if (code == null) {
+      return '';
+    }
+    var tick = code.addressTicks[address];
+    if (tick == null) {
+      return '';
+    }
+    // Don't show inclusive ticks if they are the same as exclusive ticks.
+    if (tick.inclusiveTicks == tick.exclusiveTicks) {
+      return '';
+    }
+    var pcent = formatPercent(tick.inclusiveTicks, code.totalSamplesInProfile);
+    return '$pcent (${tick.inclusiveTicks})';
+  }
+
+  @reflectable String formattedExclusive(Code code) {
+    if (code == null) {
+      return '';
+    }
+    var tick = code.addressTicks[address];
+    if (tick == null) {
+      return '';
+    }
+    var pcent = formatPercent(tick.exclusiveTicks, code.totalSamplesInProfile);
+    return '$pcent (${tick.exclusiveTicks})';
+  }
+}
+
+class CodeKind {
+  final _value;
+  const CodeKind._internal(this._value);
+  String toString() => '$_value';
+
+  static CodeKind fromString(String s) {
+    if (s == 'Native') {
+      return Native;
+    } else if (s == 'Dart') {
+      return Dart;
+    } else if (s == 'Collected') {
+      return Collected;
+    } else if (s == 'Reused') {
+      return Reused;
+    }
+    Logger.root.warning('Unknown code kind $s');
+    throw new FallThroughError();
+  }
+  static const Native = const CodeKind._internal('Native');
+  static const Dart = const CodeKind._internal('Dart');
+  static const Collected = const CodeKind._internal('Collected');
+  static const Reused = const CodeKind._internal('Reused');
+}
+
+class CodeCallCount {
+  final Code code;
+  final int count;
+  CodeCallCount(this.code, this.count);
+}
+
+class Code extends ServiceObject {
+  @observable CodeKind kind;
+  @observable int totalSamplesInProfile = 0;
+  @reflectable int exclusiveTicks = 0;
+  @reflectable int inclusiveTicks = 0;
+  @reflectable int startAddress = 0;
+  @reflectable int endAddress = 0;
+  @reflectable final callers = new List<CodeCallCount>();
+  @reflectable final callees = new List<CodeCallCount>();
+  @reflectable final instructions = new ObservableList<CodeInstruction>();
+  @reflectable final addressTicks = new ObservableMap<int, CodeTick>();
+  @observable String formattedInclusiveTicks = '';
+  @observable String formattedExclusiveTicks = '';
+
+  @observable ServiceMap function;
+  String name;
+  String vmName;
+
+  Code.fromMap(Isolate isolate, Map map) : super.fromMap(isolate, map);
+
+  // Reset all data associated with a profile.
+  void resetProfileData() {
+    totalSamplesInProfile = 0;
+    exclusiveTicks = 0;
+    inclusiveTicks = 0;
+    formattedInclusiveTicks = '';
+    formattedExclusiveTicks = '';
+    callers.clear();
+    callees.clear();
+    addressTicks.clear();
+  }
+
+  /// Reload [this]. Returns a future which completes to [this] or
+  /// a [ServiceError].
+  Future<ServiceObject> reload() {
+    assert(kind != null);
+    if (kind == CodeKind.Dart) {
+      // We only reload Dart code.
+      return super.reload();
+    }
+    return new Future.value(this);
+  }
+
+  void _resolveCalls(List<CodeCallCount> calls, List data, List<Code> codes) {
+    // Assert that this has been cleared.
+    assert(calls.length == 0);
+    // Resolve.
+    for (var i = 0; i < data.length; i += 2) {
+      var index = int.parse(data[i]);
+      var count = int.parse(data[i + 1]);
+      assert(index >= 0);
+      assert(index < codes.length);
+      calls.add(new CodeCallCount(codes[index], count));
+    }
+    // Sort to descending count order.
+    calls.sort((a, b) => b.count - a.count);
+  }
+
+
+  static String formatPercent(num a, num total) {
+    var percent = 100.0 * (a / total);
+    return '${percent.toStringAsFixed(2)}%';
+  }
+
+  void updateProfileData(Map profileData,
+                         List<Code> codeTable,
+                         int sampleCount) {
+    // Assert we have a CodeRegion entry.
+    assert(profileData['type'] == 'CodeRegion');
+    // Assert we are handed profile data for this code object.
+    assert(profileData['code'] == this);
+    totalSamplesInProfile = sampleCount;
+    inclusiveTicks = int.parse(profileData['inclusive_ticks']);
+    exclusiveTicks = int.parse(profileData['exclusive_ticks']);
+    _resolveCalls(callers, profileData['callers'], codeTable);
+    _resolveCalls(callees, profileData['callees'], codeTable);
+    var ticks = profileData['ticks'];
+    if (ticks != null) {
+      _processTicks(ticks);
+    }
+    formattedInclusiveTicks =
+        '${formatPercent(inclusiveTicks, totalSamplesInProfile)} '
+        '($inclusiveTicks)';
+    formattedExclusiveTicks =
+        '${formatPercent(exclusiveTicks, totalSamplesInProfile)} '
+        '($inclusiveTicks)';
+  }
+
+  void _update(ObservableMap m) {
+    assert(ServiceObject.isServiceMap(m));
+    assert(m['id'] == _id);
+    assert(ServiceObject.stripRef(m['type']) == _serviceType);
+    name = m['user_name'];
+    vmName = m['name'];
+    kind = CodeKind.fromString(m['kind']);
+    startAddress = int.parse(m['start'], radix:16);
+    endAddress = int.parse(m['end'], radix:16);
+    // Upgrade the function.
+    function = _upgradeToServiceObject(isolate.vm, isolate, m['function']);
+    var disassembly = m['disassembly'];
+    if (disassembly != null) {
+      _processDisassembly(disassembly);
+    }
+    // We are a reference if we don't have instructions and are Dart code.
+    _ref = (instructions.length == 0) && (kind == CodeKind.Dart);
+    hasDisassembly = (instructions.length != 0) && (kind == CodeKind.Dart);
+  }
+
+  @observable bool hasDisassembly = false;
+
+  void _processDisassembly(List<String> disassembly){
+    assert(disassembly != null);
+    instructions.clear();
+    assert((disassembly.length % 3) == 0);
+    for (var i = 0; i < disassembly.length; i += 3) {
+      var address = 0;  // Assume code comment.
+      var machine = disassembly[i + 1];
+      var human = disassembly[i + 2];
+      if (disassembly[i] != '') {
+        // Not a code comment, extract address.
+        address = int.parse(disassembly[i]);
+      }
+      var instruction = new CodeInstruction(address, machine, human);
+      instructions.add(instruction);
+    }
+  }
+
+  void _processTicks(List<String> profileTicks) {
+    assert(profileTicks != null);
+    assert((profileTicks.length % 3) == 0);
+    for (var i = 0; i < profileTicks.length; i += 3) {
+      var address = int.parse(profileTicks[i], radix:16);
+      var exclusive = int.parse(profileTicks[i + 1]);
+      var inclusive = int.parse(profileTicks[i + 2]);
+      var tick = new CodeTick(address, exclusive, inclusive);
+      addressTicks[address] = tick;
+    }
+  }
+
+  /// Returns true if [address] is contained inside [this].
+  bool contains(int address) {
+    return (address >= startAddress) && (address < endAddress);
+  }
+
+  /// Sum all caller counts.
+  int sumCallersCount() => _sumCallCount(callers);
+  /// Specific caller count.
+  int callersCount(Code code) => _callCount(callers, code);
+  /// Sum of callees count.
+  int sumCalleesCount() => _sumCallCount(callees);
+  /// Specific callee count.
+  int calleesCount(Code code) => _callCount(callees, code);
+
+  int _sumCallCount(List<CodeCallCount> calls) {
+    var sum = 0;
+    for (CodeCallCount caller in calls) {
+      sum += caller.count;
+    }
+    return sum;
+  }
+
+  int _callCount(List<CodeCallCount> calls, Code code) {
+    for (CodeCallCount caller in calls) {
+      if (caller.code == code) {
+        return caller.count;
+      }
+    }
+    return 0;
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/service/service.dart b/runtime/bin/vmservice/client/lib/src/service/service.dart
new file mode 100644
index 0000000..3671116
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/service/service.dart
@@ -0,0 +1,190 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 service;
+
+/// A [ServiceObject] is an object known to the VM service and is tied
+/// to an owning [Isolate].
+abstract class ServiceObject extends Observable {
+  Isolate _isolate;
+
+  /// Owning isolate.
+  @reflectable Isolate get isolate => _isolate;
+
+  /// Owning vm.
+  @reflectable VM get vm => _isolate.vm;
+
+  /// The complete service url of this object.
+  @reflectable String get link => isolate.relativeLink(_id);
+
+  /// The complete service url of this object with a '#/' prefix.
+  @reflectable String get hashLink => isolate.relativeHashLink(_id);
+  set hashLink(var o) { /* silence polymer */ }
+
+  String _id;
+  /// The id of this object.
+  @reflectable String get id => _id;
+
+  String _serviceType;
+  /// The service type of this object.
+  @reflectable String get serviceType => _serviceType;
+
+  bool _ref;
+
+  @observable String name;
+  @observable String vmName;
+
+  ServiceObject(this._isolate, this._id, this._serviceType) {
+    _ref = isRefType(_serviceType);
+    _serviceType = stripRef(_serviceType);
+    _created();
+  }
+
+  ServiceObject.fromMap(this._isolate, ObservableMap m) {
+    assert(isServiceMap(m));
+    _id = m['id'];
+    _ref = isRefType(m['type']);
+    _serviceType = stripRef(m['type']);
+    _created();
+    update(m);
+  }
+
+  /// If [this] was created from a reference, load the full object
+  /// from the service by calling [reload]. Else, return [this].
+  Future<ServiceObject> load() {
+    if (!_ref) {
+      // Not a reference.
+      return new Future.value(this);
+    }
+    // Call refresh which will fill in the entire object.
+    return reload();
+  }
+
+  /// Reload [this]. Returns a future which completes to [this] or
+  /// a [ServiceError].
+  Future<ServiceObject> reload() {
+    assert(isolate != null);
+    if (id == '') {
+      // Errors don't have ids.
+      assert(serviceType == 'Error');
+      return new Future.value(this);
+    }
+    return isolate.vm.getAsMap(link).then(update);
+  }
+
+  /// Update [this] using [m] as a source. [m] can be a reference.
+  ServiceObject update(ObservableMap m) {
+    // Assert that m is a service map.
+    assert(ServiceObject.isServiceMap(m));
+    if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
+      // Got an unexpected error. Don't update the object.
+      return _upgradeToServiceObject(vm, isolate, m);
+    }
+    // TODO(johnmccutchan): Should we allow for a ServiceObject's id
+    // or type to change?
+    _id = m['id'];
+    _serviceType = stripRef(m['type']);
+    _update(m);
+    return this;
+  }
+
+  // update internal state from [map]. [map] can be a reference.
+  void _update(ObservableMap map);
+
+  /// Returns true if [this] has only been partially initialized via
+  /// a reference. See [load].
+  bool isRef() => _ref;
+
+  void _created() {
+    var refNotice = _ref ? ' Created from reference.' : '';
+    Logger.root.info('Created ServiceObject for \'${_id}\' with type '
+                     '\'${_serviceType}\'.' + refNotice);
+  }
+
+  /// Returns true if [map] is a service map. i.e. it has the following keys:
+  /// 'id' and a 'type'.
+  static bool isServiceMap(ObservableMap m) {
+    return (m != null) && (m['id'] != null) && (m['type'] != null);
+  }
+
+  /// Returns true if [type] is a reference type. i.e. it begins with an
+  /// '@' character.
+  static bool isRefType(String type) {
+    return type.startsWith('@');
+  }
+
+  /// Returns the unreffed version of [type].
+  static String stripRef(String type) {
+    if (!isRefType(type)) {
+      return type;
+    }
+    // Strip off the '@' character.
+    return type.substring(1);
+  }
+}
+
+/// Recursively upgrades all [ServiceObject]s inside [collection] which must
+/// be an [ObservableMap] or an [ObservableList]. Upgraded elements will be
+/// associated with [vm] and [isolate].
+void upgradeCollection(collection, VM vm, Isolate isolate) {
+  if (collection is ObservableMap) {
+    _upgradeObservableMap(collection, vm, isolate);
+  } else if (collection is ObservableList) {
+    _upgradeObservableList(collection, vm, isolate);
+  }
+}
+
+void _upgradeObservableMap(ObservableMap map, VM vm, Isolate isolate) {
+  map.forEach((k, v) {
+    if ((v is ObservableMap) && ServiceObject.isServiceMap(v)) {
+      map[k] = v = _upgradeToServiceObject(vm, isolate, v);
+    } else if (v is ObservableList) {
+      _upgradeObservableList(v, vm, isolate);
+    } else if (v is ObservableMap) {
+      _upgradeObservableMap(v, vm, isolate);
+    }
+  });
+}
+
+void _upgradeObservableList(ObservableList list, VM vm, Isolate isolate) {
+  for (var i = 0; i < list.length; i++) {
+    var v = list[i];
+    if ((v is ObservableMap) && ServiceObject.isServiceMap(v)) {
+      list[i] = _upgradeToServiceObject(vm, isolate, v);
+    } else if (v is ObservableList) {
+      _upgradeObservableList(v, vm, isolate);
+    } else if (v is ObservableMap) {
+      _upgradeObservableMap(v, vm, isolate);
+    }
+  }
+}
+
+/// Upgrades response ([m]) from [vm] and [isolate] to a [ServiceObject].
+/// This acts like a factory which consumes an ObservableMap and returns
+/// a fully upgraded ServiceObject.
+ServiceObject _upgradeToServiceObject(VM vm, Isolate isolate, ObservableMap m) {
+  if (!ServiceObject.isServiceMap(m)) {
+    Logger.root.severe("Malformed service object: $m");
+  }
+  assert(ServiceObject.isServiceMap(m));
+  var type = ServiceObject.stripRef(m['type']);
+  switch (type) {
+    case 'Error':
+      return new ServiceError.fromMap(isolate, m);
+    case 'IsolateList':
+      vm.isolates.update(m);
+      return vm.isolates;
+    case 'Script':
+      return isolate.scripts.putIfAbsent(m);
+    case 'Code':
+      return isolate.codes.putIfAbsent(m);
+    case 'Isolate':
+      return vm.isolates.getIsolateFromMap(m);
+    case 'Class':
+      return isolate.classes.putIfAbsent(m);
+    case 'Function':
+      return isolate.functions.putIfAbsent(m);
+  }
+  return new ServiceMap.fromMap(isolate, m);
+}
diff --git a/runtime/bin/vmservice/client/lib/src/service/vm.dart b/runtime/bin/vmservice/client/lib/src/service/vm.dart
new file mode 100644
index 0000000..4886517
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/service/vm.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of service;
+
+abstract class VM extends Observable {
+  @reflectable IsolateList _isolates;
+  @reflectable IsolateList get isolates => _isolates;
+
+  void _initOnce() {
+    assert(_isolates == null);
+    _isolates = new IsolateList(this);
+  }
+
+  VM() {
+    _initOnce();
+  }
+
+  /// Get [id] as an [ObservableMap] from the service directly.
+  Future<ObservableMap> getAsMap(String id) {
+    return getString(id).then((response) {
+      try {
+        var map = JSON.decode(response);
+        Logger.root.info('Decoded $id');
+        return toObservable(map);
+      } catch (e, st) {
+        return toObservable({
+          'type': 'Error',
+          'id': '',
+          'kind': 'DecodeError',
+          'message': '$e',
+        });
+      }
+    }).catchError((error) {
+      return toObservable({
+        'type': 'Error',
+        'id': '',
+        'kind': 'LastResort',
+        'message': '$error'
+      });
+    });
+  }
+
+  /// Get [id] as a [String] from the service directly. See [getAsMap].
+  Future<String> getString(String id);
+}
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 6467b7d..1dbbbfc 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -57,7 +57,8 @@
 
 
 class HttpRequestClient extends Client {
-  static ContentType jsonContentType = ContentType.parse('application/json');
+  static ContentType jsonContentType =
+      new ContentType("application", "json", charset: "utf-8");
   final HttpRequest request;
 
   HttpRequestClient(this.request, service) : super(service);
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 28d87f0..a048d5b 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -442,15 +442,18 @@
  * persistent handle and the peer as arguments. This gives the native code the
  * ability to cleanup data associated with the object and to delete the weak
  * persistent handle. It is illegal to call into the VM from the callback,
- * except to delete the weak persistent handle.
+ * except to delete the weak persistent handle. If the handle is deleted before
+ * the object becomes unreachable, the callback is never invoked.
  *
  * Requires there to be a current isolate.
  *
  * \param object An object.
  * \param peer A pointer to a native object or NULL.  This value is
  *   provided to callback when it is invoked.
+ * \param external_allocation_size The number of externally allocated
+ *   bytes for peer. Used to inform the garbage collector.
  * \param callback A function pointer that will be invoked sometime
- *   after the object is garbage collected.
+ *   after the object is garbage collected, unless the handle has been deleted.
  *
  * \return Success if the weak persistent handle was
  *   created. Otherwise, returns an error.
@@ -458,6 +461,7 @@
 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
     Dart_Handle object,
     void* peer,
+    intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback);
 
 DART_EXPORT void Dart_DeleteWeakPersistentHandle(
@@ -484,8 +488,10 @@
  * \param object An object.
  * \param peer A pointer to a native object or NULL.  This value is
  *   provided to callback when it is invoked.
+ * \param external_allocation_size The number of externally allocated
+ *   bytes for peer. Used to inform the garbage collector.
  * \param callback A function pointer that will be invoked sometime
- *   after the object is garbage collected.
+ *   after the object is garbage collected, unless the handle has been deleted.
  *
  * \return Success if the prologue weak persistent handle was created.
  *   Otherwise, returns an error.
@@ -493,6 +499,7 @@
 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle(
     Dart_Handle object,
     void* peer,
+    intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback);
 
 /**
@@ -549,56 +556,24 @@
 typedef void (*Dart_GcEpilogueCallback)();
 
 /**
- * Adds a garbage collection prologue callback.
+ * Adds garbage collection callbacks (prologue and epilogue).
  *
- * \param callback A function pointer to a prologue callback function.
- *   This function must not have been previously added as a prologue
- *   callback.
+ * \param prologue_callback A function pointer to a prologue callback function.
+ *   A prologue callback function should not be already set when this function
+ *   is called. A NULL value removes the existing prologue callback function
+ *   if any.
  *
- * \return Success if the callback was added.  Otherwise, returns an
+ * \param epilogue_callback A function pointer to an epilogue callback function.
+ *   An epilogue callback function should not be already set when this function
+ *   is called. A NULL value removes the existing epilogue callback function
+ *   if any.
+ *
+ * \return Success if the callbacks were added.  Otherwise, returns an
  *   error handle.
  */
-DART_EXPORT Dart_Handle Dart_AddGcPrologueCallback(
-    Dart_GcPrologueCallback callback);
-
-/**
- * Removes a garbage collection prologue callback.
- *
- * \param callback A function pointer to a prologue callback function.
- *   This function must have been added as a prologue callback.
- *
- * \return Success if the callback was removed.  Otherwise, returns an
- *   error handle.
- */
-DART_EXPORT Dart_Handle Dart_RemoveGcPrologueCallback(
-    Dart_GcPrologueCallback callback);
-
-/**
- * Adds a garbage collection epilogue callback.
- *
- * \param callback A function pointer to an epilogue callback
- *   function.  This function must not have been previously added as
- *   an epilogue callback.
- *
- * \return Success if the callback was added.  Otherwise, returns an
- *   error handle.
- */
-DART_EXPORT Dart_Handle Dart_AddGcEpilogueCallback(
-    Dart_GcEpilogueCallback callback);
-
-/**
- * Removes a garbage collection epilogue callback.
- *
- * \param callback A function pointer to an epilogue callback
- *   function.  This function must have been added as an epilogue
- *   callback.
- *
- * \return Success if the callback was removed.  Otherwise, returns an
- *   error handle.
- */
-DART_EXPORT Dart_Handle Dart_RemoveGcEpilogueCallback(
-    Dart_GcEpilogueCallback callback);
-
+DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
+    Dart_GcPrologueCallback prologue_callback,
+    Dart_GcEpilogueCallback epilogue_callback);
 
 /*
  * ==========================
@@ -863,8 +838,9 @@
  * isolate. */
 
 /**
- * Shuts down the current isolate. After this call, the current
- * isolate is NULL.
+ * Shuts down the current isolate. After this call, the current isolate
+ * is NULL. Invokes the shutdown callback and any callbacks of remaining
+ * weak persistent handles.
  *
  * Requires there to be a current isolate.
  */
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 9c503c4..5c9f7d8 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -260,40 +260,174 @@
   int _shrFromInt(int other) native "Smi_shrFromInt";
   int _shlFromInt(int other) native "Smi_shlFromInt";
 
+  /**
+   * The digits of '00', '01', ... '99' as a single array.
+   *
+   * Get the digits of `n`, with `0 <= n < 100`, as
+   * `_digitTable[n * 2]` and `_digitTable[n * 2 + 1]`.
+   */
+  static const _digitTable = const [
+    0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x30, 0x33,
+    0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37,
+    0x30, 0x38, 0x30, 0x39, 0x31, 0x30, 0x31, 0x31,
+    0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31, 0x35,
+    0x31, 0x36, 0x31, 0x37, 0x31, 0x38, 0x31, 0x39,
+    0x32, 0x30, 0x32, 0x31, 0x32, 0x32, 0x32, 0x33,
+    0x32, 0x34, 0x32, 0x35, 0x32, 0x36, 0x32, 0x37,
+    0x32, 0x38, 0x32, 0x39, 0x33, 0x30, 0x33, 0x31,
+    0x33, 0x32, 0x33, 0x33, 0x33, 0x34, 0x33, 0x35,
+    0x33, 0x36, 0x33, 0x37, 0x33, 0x38, 0x33, 0x39,
+    0x34, 0x30, 0x34, 0x31, 0x34, 0x32, 0x34, 0x33,
+    0x34, 0x34, 0x34, 0x35, 0x34, 0x36, 0x34, 0x37,
+    0x34, 0x38, 0x34, 0x39, 0x35, 0x30, 0x35, 0x31,
+    0x35, 0x32, 0x35, 0x33, 0x35, 0x34, 0x35, 0x35,
+    0x35, 0x36, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39,
+    0x36, 0x30, 0x36, 0x31, 0x36, 0x32, 0x36, 0x33,
+    0x36, 0x34, 0x36, 0x35, 0x36, 0x36, 0x36, 0x37,
+    0x36, 0x38, 0x36, 0x39, 0x37, 0x30, 0x37, 0x31,
+    0x37, 0x32, 0x37, 0x33, 0x37, 0x34, 0x37, 0x35,
+    0x37, 0x36, 0x37, 0x37, 0x37, 0x38, 0x37, 0x39,
+    0x38, 0x30, 0x38, 0x31, 0x38, 0x32, 0x38, 0x33,
+    0x38, 0x34, 0x38, 0x35, 0x38, 0x36, 0x38, 0x37,
+    0x38, 0x38, 0x38, 0x39, 0x39, 0x30, 0x39, 0x31,
+    0x39, 0x32, 0x39, 0x33, 0x39, 0x34, 0x39, 0x35,
+    0x39, 0x36, 0x39, 0x37, 0x39, 0x38, 0x39, 0x39
+  ];
+
+  // Powers of 10 above 1000000 are indistinguishable.
+  static const int _POW_10_7  = 10000000;
+  static const int _POW_10_8  = 100000000;
+  static const int _POW_10_9  = 1000000000;
+  static const int _POW_10_10 = 10000000000;
+
+  // Find the number of decimal digits in a positive smi.
+  static int _positiveBase10Length(var smi) {
+    // A positive smi has length <= 19 if 63-bit,  <=10 if 31-bit.
+    // Avoid comparing a 31-bit smi to a non-smi.
+    if (smi < 1000) return 3;
+    if (smi < 10000) return 4;
+    if (smi < _POW_10_7) {
+      if (smi < 100000) return 5;
+      if (smi < 1000000) return 6;
+      return 7;
+    }
+    if (smi < _POW_10_10) {
+      if (smi < _POW_10_8) return 8;
+      if (smi < _POW_10_9) return 9;
+      return 10;
+    }
+    smi = smi ~/ _POW_10_10;
+    if (smi < 10) return 11;
+    if (smi < 100) return 12;
+    return 10 + _positiveBase10Length(smi);
+  }
+
   String toString() {
-    if (this == 0) return "0";
-    var reversed = _toStringBuffer;
-    var negative = false;
-    var val = this;
-    int index = 0;
-
-    if (this < 0) {
-      negative = true;
-      // Handle the first digit as negative to avoid negating the minimum
-      // smi, for which the negation is not a smi.
-      int digit = -(val.remainder(10));
-      reversed[index++] = digit + 0x30;
-      val = -(val ~/ 10);
+    if (this < 0) return _negativeToString(this);
+    // Inspired by Andrei Alexandrescu: "Three Optimization Tips for C++"
+    // Avoid expensive remainder operation by doing it on more than
+    // one digit at a time.
+    const int DIGIT_ZERO = 0x30;
+    if (this < 10) {
+      return _OneByteString._allocate(1).._setAt(0, DIGIT_ZERO + this);
     }
-
-    while (val > 0) {
-      int digit = val % 10;
-      val = val ~/ 10;
-      reversed[index++] = (digit + 0x30);
+    if (this < 100) {
+      int digitIndex = 2 * this;
+      return _OneByteString._allocate(2)
+          .._setAt(0, _digitTable[digitIndex])
+          .._setAt(1, _digitTable[digitIndex + 1]);
     }
-    if (negative) reversed[index++] = 0x2D;  // '-'.
-
-    _OneByteString string = _OneByteString._allocate(index);
-    for (int i = 0, j = index; i < index; i++) {
-      string._setAt(i, reversed[--j]);
+    int length = _positiveBase10Length(this);
+    _OneByteString result = _OneByteString._allocate(length);
+    int index = length - 1;
+    var smi = this;
+    do {
+      // Two digits at a time.
+      var twoDigits = smi.remainder(100);
+      smi = smi ~/ 100;
+      int digitIndex = twoDigits * 2;
+      result._setAt(index, _digitTable[digitIndex + 1]);
+      result._setAt(index - 1, _digitTable[digitIndex]);
+      index -= 2;
+    } while (smi >= 100);
+    if (smi < 10) {
+      // Character code for '0'.
+      result._setAt(index, DIGIT_ZERO + smi);
+    } else {
+      // No remainder for this case.
+      int digitIndex = smi * 2;
+      result._setAt(index, _digitTable[digitIndex + 1]);
+      result._setAt(index - 1, _digitTable[digitIndex]);
     }
-    return string;
+    return result;
+  }
+
+  // Find the number of decimal digits in a negative smi.
+  static int _negativeBase10Length(var negSmi) {
+    // A negative smi has length <= 19 if 63-bit, <=10 if 31-bit.
+    // Avoid comparing a 31-bit smi to a non-smi.
+    if (negSmi > -1000) return 3;
+    if (negSmi > -10000) return 4;
+    if (negSmi > -_POW_10_7) {
+      if (negSmi > -100000) return 5;
+      if (negSmi > -1000000) return 6;
+      return 7;
+    }
+    if (negSmi > -_POW_10_10) {
+      if (negSmi > -_POW_10_8) return 8;
+      if (negSmi > -_POW_10_9) return 9;
+      return 10;
+    }
+    negSmi = negSmi ~/ _POW_10_10;
+    if (negSmi > -10) return 11;
+    if (negSmi > -100) return 12;
+    return 10 + _negativeBase10Length(negSmi);
+  }
+
+  // Convert a negative smi to a string.
+  // Doesn't negate the smi to avoid negating the most negative smi, which
+  // would become a non-smi.
+  static String _negativeToString(int negSmi) {
+    // Character code for '-'
+    const int MINUS_SIGN = 0x2d;
+    // Character code for '0'.
+    const int DIGIT_ZERO = 0x30;
+    if (negSmi > -10) {
+      return _OneByteString._allocate(2).._setAt(0, MINUS_SIGN)
+                                        .._setAt(1, DIGIT_ZERO - negSmi);
+    }
+    if (negSmi > -100) {
+      int digitIndex = 2 * -negSmi;
+      return _OneByteString._allocate(3)
+          .._setAt(0, MINUS_SIGN)
+          .._setAt(1, _digitTable[digitIndex])
+          .._setAt(2, _digitTable[digitIndex + 1]);
+    }
+    // Number of digits, not including minus.
+    int digitCount = _negativeBase10Length(negSmi);
+    _OneByteString result = _OneByteString._allocate(digitCount + 1);
+    result._setAt(0, MINUS_SIGN);  // '-'.
+    int index = digitCount;
+    do {
+      var twoDigits = negSmi.remainder(100);
+      negSmi = negSmi ~/ 100;
+      int digitIndex = -twoDigits * 2;
+      result._setAt(index, _digitTable[digitIndex + 1]);
+      result._setAt(index - 1, _digitTable[digitIndex]);
+      index -= 2;
+    } while (negSmi <= -100);
+    if (negSmi > -10) {
+      result._setAt(index, DIGIT_ZERO - negSmi);
+    } else {
+      // No remainder necessary for this case.
+      int digitIndex = -negSmi * 2;
+      result._setAt(index, _digitTable[digitIndex + 1]);
+      result._setAt(index - 1, _digitTable[digitIndex]);
+    }
+    return result;
   }
 }
 
-// Reusable buffer used by smi.toString.
-final List _toStringBuffer = new Uint8List(20);
-
 // Represents integers that cannot be represented by Smi but fit into 64bits.
 class _Mint extends _IntegerImplementation implements int {
   factory _Mint._uninstantiable() {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 94cda1b..098ef1e 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -376,6 +376,111 @@
 }
 
 
+static RawInstance* CreateCombinatorMirror(const Object& identifiers,
+                                           bool is_show) {
+  const Array& args = Array::Handle(Array::New(2));
+  args.SetAt(0, identifiers);
+  args.SetAt(1, Bool::Get(is_show));
+  return CreateMirror(Symbols::_LocalCombinatorMirror(), args);
+}
+
+
+static RawInstance* CreateLibraryDependencyMirror(const Instance& importer,
+                                                  const Namespace& ns,
+                                                  const String& prefix,
+                                                  bool is_import) {
+  const Library& importee = Library::Handle(ns.library());
+  const Instance& importee_mirror =
+      Instance::Handle(CreateLibraryMirror(importee));
+
+  const Array& show_names = Array::Handle(ns.show_names());
+  const Array& hide_names = Array::Handle(ns.hide_names());
+  intptr_t n = show_names.IsNull() ? 0 : show_names.Length();
+  intptr_t m = hide_names.IsNull() ? 0 : hide_names.Length();
+  const Array& combinators = Array::Handle(Array::New(n + m));
+  Object& t = Object::Handle();
+  intptr_t i = 0;
+  for (intptr_t j = 0; j < n; j++) {
+    t = show_names.At(j);
+    t = CreateCombinatorMirror(t, true);
+    combinators.SetAt(i++, t);
+  }
+  for (intptr_t j = 0; j < m; j++) {
+    t = hide_names.At(j);
+    t = CreateCombinatorMirror(t, false);
+    combinators.SetAt(i++, t);
+  }
+
+  Object& metadata = Object::Handle(ns.GetMetadata());
+  if (metadata.IsError()) {
+    ThrowInvokeError(Error::Cast(metadata));
+    UNREACHABLE();
+  }
+
+  const Array& args = Array::Handle(Array::New(6));
+  args.SetAt(0, importer);
+  args.SetAt(1, importee_mirror);
+  args.SetAt(2, combinators);
+  args.SetAt(3, prefix);
+  args.SetAt(4, Bool::Get(is_import));
+  args.SetAt(5, metadata);
+  // is_deferred?
+  return CreateMirror(Symbols::_LocalLibraryDependencyMirror(), args);
+}
+
+
+DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
+  const Library& lib = Library::Handle(ref.GetLibraryReferent());
+
+  Array& ports = Array::Handle();
+  Namespace& ns = Namespace::Handle();
+  Instance& dep = Instance::Handle();
+  String& prefix = String::Handle();
+  GrowableObjectArray& deps =
+      GrowableObjectArray::Handle(GrowableObjectArray::New());
+
+  // Unprefixed imports.
+  ports = lib.imports();
+  for (intptr_t i = 0; i < ports.Length(); i++) {
+    ns ^= ports.At(i);
+    if (!ns.IsNull()) {
+      dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true);
+      deps.Add(dep);
+    }
+  }
+
+  // Exports.
+  ports = lib.exports();
+  for (intptr_t i = 0; i < ports.Length(); i++) {
+    ns ^= ports.At(i);
+    dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, false);
+    deps.Add(dep);
+  }
+
+  // Prefixed imports.
+  DictionaryIterator entries(lib);
+  Object& entry = Object::Handle();
+  while (entries.HasNext()) {
+    entry = entries.GetNext();
+    if (entry.IsLibraryPrefix()) {
+      const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(entry);
+      prefix = lib_prefix.name();
+      ports = lib_prefix.imports();
+      for (intptr_t i = 0; i < ports.Length(); i++) {
+        ns ^= ports.At(i);
+        if (!ns.IsNull()) {
+          dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true);
+          deps.Add(dep);
+        }
+      }
+    }
+  }
+
+  return deps.raw();
+}
+
 static RawInstance* CreateTypeMirror(const AbstractType& type) {
   if (type.IsTypeRef()) {
     AbstractType& ref_type = AbstractType::Handle(TypeRef::Cast(type).type());
@@ -1871,37 +1976,27 @@
 
   if (function.IsNull()) {
     // Didn't find a method: try to find a getter and invoke call on its result.
-    const String& getter_name =
-        String::Handle(Field::GetterName(function_name));
-    function = library.LookupLocalFunction(getter_name);
-    if (!function.IsNull()) {
-      // Invoke getter.
-      const Object& getter_result = Object::Handle(
-          DartEntry::InvokeFunction(function, Object::empty_array()));
-      if (getter_result.IsError()) {
-        ThrowInvokeError(Error::Cast(getter_result));
-        UNREACHABLE();
-      }
-      // Make room for the closure (receiver) in arguments.
-      intptr_t numArgs = args.Length();
-      const Array& call_args = Array::Handle(Array::New(numArgs + 1));
-      Object& temp = Object::Handle();
-      for (int i = 0; i < numArgs; i++) {
-        temp = args.At(i);
-        call_args.SetAt(i + 1, temp);
-      }
-      call_args.SetAt(0, getter_result);
-      const Array& call_args_descriptor_array =
-        Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names));
-      // Call closure.
-      const Object& call_result = Object::Handle(
-          DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
-      if (call_result.IsError()) {
-        ThrowInvokeError(Error::Cast(call_result));
-        UNREACHABLE();
-      }
-      return call_result.raw();
+    const Instance& getter_result =
+        Instance::Handle(InvokeLibraryGetter(library, function_name, true));
+    // Make room for the closure (receiver) in arguments.
+    intptr_t numArgs = args.Length();
+    const Array& call_args = Array::Handle(Array::New(numArgs + 1));
+    Object& temp = Object::Handle();
+    for (int i = 0; i < numArgs; i++) {
+      temp = args.At(i);
+      call_args.SetAt(i + 1, temp);
     }
+    call_args.SetAt(0, getter_result);
+    const Array& call_args_descriptor_array =
+      Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names));
+    // Call closure.
+    const Object& call_result = Object::Handle(
+        DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
+    if (call_result.IsError()) {
+      ThrowInvokeError(Error::Cast(call_result));
+      UNREACHABLE();
+    }
+    return call_result.raw();
   }
 
   const Array& args_descriptor_array =
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index acb421b..bb8b56e 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -155,18 +155,6 @@
   String toString() => "IsolateMirror on '$debugName'";
 }
 
-class _InvocationTrampoline implements Function {
-  final ObjectMirror _receiver;
-  final Symbol _selector;
-  _InvocationTrampoline(this._receiver, this._selector);
-  noSuchMethod(Invocation msg) {
-    if (msg.memberName != #call) return super.noSuchMethod(msg);
-    return _receiver.invoke(_selector,
-                            msg.positionalArguments,
-                            msg.namedArguments);
-  }
-}
-
 class _SyntheticAccessor implements MethodMirror {
   final DeclarationMirror owner;
   final Symbol simpleName;
@@ -321,23 +309,6 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  Function operator [](Symbol selector) {
-    bool found = false;
-    for (ClassMirror c = type; c != null; c = c.superclass) {
-      var target = c._methods[selector];
-      if (target != null && !target.isStatic && target.isRegularMethod) {
-        found = true;
-        break;
-      }
-    }
-    if (!found) {
-      throw new ArgumentError(
-          "${MirrorSystem.getName(type.simpleName)} has no instance method "
-          "${MirrorSystem.getName(selector)}");
-    }
-    return new _InvocationTrampoline(this, selector);
-  }
-
   // TODO(16539): Make these weak or soft.
   static var _getFieldClosures = new HashMap();
   static var _setFieldClosures = new HashMap();
@@ -814,16 +785,6 @@
 
   String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'";
 
-  Function operator [](Symbol selector) {
-    var target = _methods[selector];
-    if (target == null || !target.isStatic || !target.isRegularMethod) {
-      throw new ArgumentError(
-          "${MirrorSystem.getName(simpleName)} has no static method "
-          "${MirrorSystem.getName(selector)}");
-    }
-    return new _InvocationTrampoline(this, selector);
-  }
-
   InstanceMirror newInstance(Symbol constructorName,
                              List positionalArguments,
                              [Map<Symbol, dynamic> namedArguments]) {
@@ -1257,14 +1218,6 @@
     return _cachedMembers;
   }
 
-  Map<Symbol, MethodMirror> _cachedFunctions;
-  Map<Symbol, MethodMirror> get _functions {
-    if (_cachedFunctions == null) {
-      _cachedFunctions = _filterMap(_members, (key, value) => (value is MethodMirror));
-    }
-    return _cachedFunctions;
-  }
-
   List<InstanceMirror> get metadata {
     // Get the metadata objects, convert them into InstanceMirrors using
     // reflect() and then make them into a Dart list.
@@ -1280,16 +1233,17 @@
 
   String toString() => "LibraryMirror on '${_n(simpleName)}'";
 
-  Function operator [](Symbol selector) {
-    var target = _functions[selector];
-    if (target == null || !target.isRegularMethod) {
-      throw new ArgumentError(
-          "${MirrorSystem.getName(simpleName)} has no top-level method "
-          "${MirrorSystem.getName(selector)}");
+  var _cachedLibraryDependencies;
+  get libraryDependencies {
+    if (_cachedLibraryDependencies == null) {
+      _cachedLibraryDependencies = _libraryDependencies(_reflectee);
     }
-    return new _InvocationTrampoline(this, selector);
+    return _cachedLibraryDependencies;
   }
 
+  _libraryDependencies(reflectee)
+      native 'LibraryMirror_libraryDependencies';
+
   _invoke(reflectee, memberName, arguments, argumentNames)
       native 'LibraryMirror_invoke';
 
@@ -1303,6 +1257,37 @@
       native "LibraryMirror_members";
 }
 
+class _LocalLibraryDependencyMirror
+    extends _LocalMirror implements LibraryDependencyMirror {
+  final LibraryMirror sourceLibrary;
+  final LibraryMirror targetLibrary;
+  final List<CombinatorMirror> combinators;
+  final Symbol prefix;
+  final bool isImport;
+  final List<InstanceMirror> metadata;
+
+  _LocalLibraryDependencyMirror(this.sourceLibrary,
+                                this.targetLibrary,
+                                this.combinators,
+                                prefixString,
+                                this.isImport,
+                                unwrappedMetadata)
+      : prefix = _s(prefixString),
+        metadata = new UnmodifiableListView(unwrappedMetadata.map(reflect));
+
+  bool get isExport => !isImport;
+}
+
+class _LocalCombinatorMirror extends _LocalMirror implements CombinatorMirror {
+  final List<Symbol> identifiers;
+  final bool isShow;
+
+  _LocalCombinatorMirror(identifierString, this.isShow)
+      : this.identifiers = [_s(identifierString)];
+
+  bool get isHide => !isShow;
+}
+
 class _LocalMethodMirror extends _LocalDeclarationMirror
     implements MethodMirror {
   final bool isStatic;
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 1bececf..667a087 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -294,12 +294,50 @@
       }
     }
     if ((first == 0) && (last == (len - 1))) {
-      // Returns this string if it does not have leading or trailing
+      // Returns this string since it does not have leading or trailing
       // whitespaces.
       return this;
-    } else {
-      return _substringUnchecked(first, last + 1);
     }
+    return _substringUnchecked(first, last + 1);
+  }
+
+  String trimLeft() {
+    final len = this.length;
+    int first = 0;
+    for (; first < len; first++) {
+      if (!_isWhitespace(this.codeUnitAt(first))) {
+        break;
+      }
+    }
+    if (len == first) {
+      // String contains only whitespaces.
+      return "";
+    }
+    if (first == 0) {
+      // Returns this string since it does not have leading or trailing
+      // whitespaces.
+      return this;
+    }
+    return _substringUnchecked(first, len);
+  }
+
+  String trimRight() {
+    final len = this.length;
+    int last = len - 1;
+    for (; last >= 0; last--) {
+      if (!_isWhitespace(this.codeUnitAt(last))) {
+        break;
+      }
+    }
+    if (last == -1) {
+      // String contains only whitespaces.
+      return "";
+    }
+    if (last == (len - 1)) {
+      // Returns this string since it does not have trailing whitespaces.
+      return this;
+    }
+    return _substringUnchecked(0, last + 1);
   }
 
   String operator*(int times) {
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index 65f5e74..e77ccdd 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -71,58 +71,97 @@
 template <typename DstType, typename SrcType>
 static RawBool* CopyData(const Instance& dst, const Instance& src,
                          const Smi& dst_start, const Smi& src_start,
-                         const Smi& length) {
+                         const Smi& length,
+                         bool clamped) {
   const DstType& dst_array = DstType::Cast(dst);
   const SrcType& src_array = SrcType::Cast(src);
   const intptr_t dst_offset_in_bytes = dst_start.Value();
   const intptr_t src_offset_in_bytes = src_start.Value();
   const intptr_t length_in_bytes = length.Value();
-  if (dst_array.ElementType() != src_array.ElementType()) {
-    return Bool::False().raw();
-  }
   ASSERT(Utils::RangeCheck(
       src_offset_in_bytes, length_in_bytes, src_array.LengthInBytes()));
   ASSERT(Utils::RangeCheck(
       dst_offset_in_bytes, length_in_bytes, dst_array.LengthInBytes()));
-  TypedData::Copy<DstType, SrcType>(dst_array, dst_offset_in_bytes,
-                                    src_array, src_offset_in_bytes,
-                                    length_in_bytes);
+  if (clamped) {
+    TypedData::ClampedCopy<DstType, SrcType>(dst_array, dst_offset_in_bytes,
+                                             src_array, src_offset_in_bytes,
+                                             length_in_bytes);
+  } else {
+    TypedData::Copy<DstType, SrcType>(dst_array, dst_offset_in_bytes,
+                                      src_array, src_offset_in_bytes,
+                                      length_in_bytes);
+  }
   return Bool::True().raw();
 }
 
-DEFINE_NATIVE_ENTRY(TypedData_setRange, 5) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, dst, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(1));
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(2));
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, src, arguments->NativeArgAt(3));
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(4));
+
+static bool IsClamped(intptr_t cid) {
+  switch (cid) {
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayViewCid:
+      return true;
+    default:
+      return false;
+  }
+}
+
+
+static bool IsUint8(intptr_t cid) {
+  switch (cid) {
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataUint8ClampedArrayViewCid:
+    case kTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kTypedDataUint8ArrayViewCid:
+      return true;
+    default:
+      return false;
+  }
+}
+
+
+DEFINE_NATIVE_ENTRY(TypedData_setRange, 7) {
+  const Instance& dst = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  const Smi& dst_start = Smi::CheckedHandle(arguments->NativeArgAt(1));
+  const Smi& length = Smi::CheckedHandle(arguments->NativeArgAt(2));
+  const Instance& src = Instance::CheckedHandle(arguments->NativeArgAt(3));
+  const Smi& src_start = Smi::CheckedHandle(arguments->NativeArgAt(4));
+  const Smi& to_cid_smi = Smi::CheckedHandle(arguments->NativeArgAt(5));
+  const Smi& from_cid_smi = Smi::CheckedHandle(arguments->NativeArgAt(6));
 
   if (length.Value() < 0) {
     const String& error = String::Handle(String::NewFormatted(
         "length (%" Pd ") must be non-negative", length.Value()));
     Exceptions::ThrowArgumentError(error);
   }
+  const intptr_t to_cid = to_cid_smi.Value();
+  const intptr_t from_cid = from_cid_smi.Value();
+
+  const bool needs_clamping = IsClamped(to_cid) && !IsUint8(from_cid);
   if (dst.IsTypedData()) {
     if (src.IsTypedData()) {
       return CopyData<TypedData, TypedData>(
-          dst, src, dst_start, src_start, length);
+          dst, src, dst_start, src_start, length, needs_clamping);
     } else if (src.IsExternalTypedData()) {
       return CopyData<TypedData, ExternalTypedData>(
-          dst, src, dst_start, src_start, length);
+          dst, src, dst_start, src_start, length, needs_clamping);
     }
   } else if (dst.IsExternalTypedData()) {
     if (src.IsTypedData()) {
       return CopyData<ExternalTypedData, TypedData>(
-          dst, src, dst_start, src_start, length);
+          dst, src, dst_start, src_start, length, needs_clamping);
     } else if (src.IsExternalTypedData()) {
       return CopyData<ExternalTypedData, ExternalTypedData>(
-          dst, src, dst_start, src_start, length);
+          dst, src, dst_start, src_start, length, needs_clamping);
     }
   }
   UNREACHABLE();
   return Bool::False().raw();
 }
 
+
 // We check the length parameter against a possible maximum length for the
 // array based on available physical addressable memory on the system. The
 // maximum possible length is a scaled value of kSmiMax which is set up based
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 49c8b20..53c59d1 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -56,8 +56,6 @@
                                              int length]) {
     return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
   }
-
-  bool _isClamped() { return true; }
 }
 
 
@@ -528,8 +526,6 @@
     return IterableMixinWorkaround.getRangeList(this, start, end);
   }
 
-  bool _isClamped() { return false; }
-
   void setRange(int start, int end, Iterable from, [int skipCount = 0]) {
     // Check ranges.
     if ((start < 0) || (start > length)) {
@@ -551,17 +547,16 @@
     }
 
     if (from is _TypedListBase) {
-      final needsClamping =
-          this._isClamped() && (this._isClamped() != from._isClamped());
       if (this.elementSizeInBytes == from.elementSizeInBytes) {
-        if (needsClamping) {
+        if ((count < 10) && (from.buffer != this.buffer)) {
           Lists.copy(from, skipCount, this, start, count);
           return;
         } else if (this.buffer._setRange(
-                     start * elementSizeInBytes + this.offsetInBytes,
-                     count * elementSizeInBytes,
-                     from.buffer,
-                     skipCount * elementSizeInBytes + from.offsetInBytes)) {
+              start * elementSizeInBytes + this.offsetInBytes,
+              count * elementSizeInBytes,
+              from.buffer,
+              skipCount * elementSizeInBytes + from.offsetInBytes,
+              this._cid, from._cid)) {
           return;
         }
       } else if (from.buffer == this.buffer) {
@@ -602,11 +597,16 @@
   // Internal utility methods.
 
   // Returns true if operation succeeds.
-  // Returns false if 'from' and 'this' do not have the same element types.
-  // The copy occurs using a memory copy (no clamping, conversion, etc).
+  // 'fromCid' and 'toCid' may be cid-s of the views and therefore may not
+  // match the cids of 'this' and 'from'.
+  // Uses toCid and fromCid to decide if clamping is necessary.
+  // Element size of toCid and fromCid must match (test at caller).
   bool _setRange(int startInBytes, int lengthInBytes,
-                 _TypedListBase from, int startFromInBytes)
+                 _TypedListBase from, int startFromInBytes,
+                 int toCid, int fromCid)
       native "TypedData_setRange";
+
+  int get _cid native "Object_cid";
 }
 
 
@@ -797,8 +797,6 @@
     return new _Uint8ClampedArrayView(buffer, offsetInBytes, length);
   }
 
-  bool _isClamped() { return true; }
-
   // Methods implementing List interface.
 
   int operator[](int index) {
@@ -1624,8 +1622,6 @@
     return _new(length);
   }
 
-  bool _isClamped() { return true; }
-
   // Method(s) implementing the List interface.
 
   int operator[](int index) {
@@ -2660,8 +2656,6 @@
   }
 
 
-  bool _isClamped() { return true; }
-
   // Method(s) implementing List interface.
 
   int operator[](int index) {
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 78693ad..6001a2f 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -246,6 +246,10 @@
 #define DART_UINT64_C(x) x##ULL
 #endif
 
+// Replace calls to strtoll with _strtoi64 on Windows.
+#ifdef _MSC_VER
+#define strtoll _strtoi64
+#endif
 
 // The following macro works on both 32 and 64-bit platforms.
 // Usage: instead of writing 0x1234567890123456ULL
@@ -325,14 +329,12 @@
 const int kNanosecondsPerSecond = (kNanosecondsPerMicrosecond *
                                    kMicrosecondsPerSecond);
 
-// Helpers to round micro second times to human understandable values.
-inline double RoundMicrosecondsToSeconds(int64_t micros) {
-  const int k1M = 1000000;  // Converting us to secs.
-  return static_cast<double>(micros + (k1M >> 1)) / k1M;
+// Helpers to scale micro second times to human understandable values.
+inline double MicrosecondsToSeconds(int64_t micros) {
+  return static_cast<double>(micros) / kMicrosecondsPerSecond;
 }
-inline double RoundMicrosecondsToMilliseconds(int64_t micros) {
-  const int k1K = 1000;  // Conversting us to ms.
-  return static_cast<double>(micros + (k1K >> 1)) / k1K;
+inline double MicrosecondsToMilliseconds(int64_t micros) {
+  return static_cast<double>(micros) / kMicrosecondsPerMillisecond;
 }
 
 // A macro to disallow the copy constructor and operator= functions.
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index e275f20..72e6022 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -43,7 +43,7 @@
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
 
-[ $arch == simmips ]
+[ $arch == simmips && $arch == mips ]
 cc/Service_Coverage: Skip # Dart bug 16250
 
 [ $compiler == dart2js ]
@@ -68,9 +68,9 @@
 *: Skip
 
 [ $arch == mips ]
-cc/Sdc1Ldc1: Crash # Illegal instructions
-cc/Cop1CvtDL: Crash
-cc/Cop1CvtDL_neg: Crash
+cc/Cop1CvtDL: Crash # Illegal instructions
+cc/Cop1CvtDL_neg: Crash # Illegal instructions
+cc/StaticNonNullSumCallCodegen: Crash # dartbug.com/17440
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index 99a00b5..bb23185 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -62,16 +62,11 @@
 
   BaseIsolate* isolate() const { return isolate_; }
 
-  // The delete operator should be private instead of public, but unfortunately
-  // the compiler complains when compiling the destructors for subclasses.
-  void operator delete(void* pointer) { UNREACHABLE(); }
-
  private:
-  BaseIsolate* isolate_;  // Current isolate for this stack resource.
+  BaseIsolate* const isolate_;  // Current isolate for this stack resource.
   StackResource* previous_;
 
-  void* operator new(uword size);
-
+  DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(StackResource);
 };
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index cd02b44..2bbdc40 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -23,7 +23,6 @@
 DEFINE_FLAG(bool, print_stop_message, true, "Print stop message.");
 DECLARE_FLAG(bool, inline_alloc);
 
-
 // Instruction encoding bits.
 enum {
   H   = 1 << 5,   // halfword (or byte)
@@ -1458,11 +1457,7 @@
     if (ShifterOperand::CanHold(offset_hi, &shifter_op)) {
       add(rd, PP, shifter_op, cond);
     } else {
-      movw(rd, Utils::Low16Bits(offset_hi));
-      const uint16_t value_high = Utils::High16Bits(offset_hi);
-      if (value_high != 0) {
-        movt(rd, value_high, cond);
-      }
+      LoadImmediate(rd, offset_hi, cond);
       add(rd, PP, ShifterOperand(LR), cond);
     }
     ldr(rd, Address(rd, offset_lo), cond);
@@ -1485,11 +1480,7 @@
   } else if (object.InVMHeap()) {
     // Make sure that class CallPattern is able to decode this load immediate.
     const int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
-    movw(rd, Utils::Low16Bits(object_raw), cond);
-    const uint16_t value_high = Utils::High16Bits(object_raw);
-    if (value_high != 0) {
-      movt(rd, value_high, cond);
-    }
+    LoadImmediate(rd, object_raw, cond);
   } else {
     // Make sure that class CallPattern is able to decode this load from the
     // object pool.
@@ -1668,7 +1659,7 @@
 }
 
 
-static int32_t DecodeLoadImmediate(int32_t movt, int32_t movw) {
+static int32_t DecodeARMv7LoadImmediate(int32_t movt, int32_t movw) {
   int32_t offset = 0;
   offset |= (movt & 0xf0000) << 12;
   offset |= (movt & 0xfff) << 16;
@@ -1678,18 +1669,78 @@
 }
 
 
+static int32_t DecodeARMv6LoadImmediate(int32_t mov, int32_t or1,
+                                        int32_t or2, int32_t or3) {
+  int32_t offset = 0;
+  offset |= (mov & 0xff) << 24;
+  offset |= (or1 & 0xff) << 16;
+  offset |= (or2 & 0xff) << 8;
+  offset |= (or3 & 0xff);
+  return offset;
+}
+
+
 class PatchFarBranch : public AssemblerFixup {
  public:
   PatchFarBranch() {}
 
   void Process(const MemoryRegion& region, intptr_t position) {
+    if (TargetCPUFeatures::arm_version() == ARMv6) {
+      ProcessARMv6(region, position);
+    } else {
+      ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+      ProcessARMv7(region, position);
+    }
+  }
+
+ private:
+  void ProcessARMv6(const MemoryRegion& region, intptr_t position) {
+    const int32_t mov = region.Load<int32_t>(position);
+    const int32_t or1 = region.Load<int32_t>(position + 1*Instr::kInstrSize);
+    const int32_t or2 = region.Load<int32_t>(position + 2*Instr::kInstrSize);
+    const int32_t or3 = region.Load<int32_t>(position + 3*Instr::kInstrSize);
+    const int32_t bx = region.Load<int32_t>(position + 4*Instr::kInstrSize);
+
+    if (((mov & 0xffffff00) == 0xe3a0c400) &&  // mov IP, (byte3 rot 4)
+        ((or1 & 0xffffff00) == 0xe38cc800) &&  // orr IP, IP, (byte2 rot 8)
+        ((or2 & 0xffffff00) == 0xe38ccc00) &&  // orr IP, IP, (byte1 rot 12)
+        ((or3 & 0xffffff00) == 0xe38cc000)) {  // orr IP, IP, byte0
+      const int32_t offset = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
+      const int32_t dest = region.start() + offset;
+      const int32_t dest0 = (dest & 0x000000ff);
+      const int32_t dest1 = (dest & 0x0000ff00) >> 8;
+      const int32_t dest2 = (dest & 0x00ff0000) >> 16;
+      const int32_t dest3 = (dest & 0xff000000) >> 24;
+      const int32_t patched_mov = 0xe3a0c400 | dest3;
+      const int32_t patched_or1 = 0xe38cc800 | dest2;
+      const int32_t patched_or2 = 0xe38ccc00 | dest1;
+      const int32_t patched_or3 = 0xe38cc000 | dest0;
+
+      region.Store<int32_t>(position + 0 * Instr::kInstrSize, patched_mov);
+      region.Store<int32_t>(position + 1 * Instr::kInstrSize, patched_or1);
+      region.Store<int32_t>(position + 2 * Instr::kInstrSize, patched_or2);
+      region.Store<int32_t>(position + 3 * Instr::kInstrSize, patched_or3);
+      return;
+    }
+
+    // If the offset loading instructions aren't there, we must have replaced
+    // the far branch with a near one, and so these instructions
+    // should be NOPs.
+    ASSERT((or1 == Instr::kNopInstruction) &&
+           (or2 == Instr::kNopInstruction) &&
+           (or3 == Instr::kNopInstruction) &&
+           (bx == Instr::kNopInstruction));
+  }
+
+
+  void ProcessARMv7(const MemoryRegion& region, intptr_t position) {
     const int32_t movw = region.Load<int32_t>(position);
     const int32_t movt = region.Load<int32_t>(position + Instr::kInstrSize);
     const int32_t bx = region.Load<int32_t>(position + 2 * Instr::kInstrSize);
 
     if (((movt & 0xfff0f000) == 0xe340c000) &&  // movt IP, high
         ((movw & 0xfff0f000) == 0xe300c000)) {   // movw IP, low
-      const int32_t offset = DecodeLoadImmediate(movt, movw);
+      const int32_t offset = DecodeARMv7LoadImmediate(movt, movw);
       const int32_t dest = region.start() + offset;
       const uint16_t dest_high = Utils::High16Bits(dest);
       const uint16_t dest_low = Utils::Low16Bits(dest);
@@ -1704,7 +1755,8 @@
     }
 
     // If the offset loading instructions aren't there, we must have replaced
-    // the far branch with a near one, and so these instructions should be NOPs.
+    // the far branch with a near one, and so these instructions
+    // should be NOPs.
     ASSERT((movt == Instr::kNopInstruction) &&
            (bx == Instr::kNopInstruction));
   }
@@ -1714,11 +1766,8 @@
 
 
 void Assembler::EmitFarBranch(Condition cond, int32_t offset, bool link) {
-  const uint16_t low = Utils::Low16Bits(offset);
-  const uint16_t high = Utils::High16Bits(offset);
   buffer_.EmitFixup(new PatchFarBranch());
-  movw(IP, low);
-  movt(IP, high);
+  LoadPatchableImmediate(IP, offset);
   if (link) {
     blx(IP, cond);
   } else {
@@ -1749,7 +1798,7 @@
 }
 
 
-void Assembler::Bind(Label* label) {
+void Assembler::BindARMv6(Label* label) {
   ASSERT(!label->IsBound());
   intptr_t bound_pc = buffer_.Size();
   while (label->IsLinked()) {
@@ -1759,34 +1808,45 @@
       // Far branches are enabled and we can't encode the branch offset.
 
       // Grab instructions that load the offset.
-      const int32_t movw =
+      const int32_t mov =
           buffer_.Load<int32_t>(position);
-      const int32_t movt =
+      const int32_t or1 =
           buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
+      const int32_t or2 =
+          buffer_.Load<int32_t>(position + 2 * Instr::kInstrSize);
+      const int32_t or3 =
+          buffer_.Load<int32_t>(position + 3 * Instr::kInstrSize);
 
-      // Change from relative to the branch to relative to the assembler buffer.
+      // Change from relative to the branch to relative to the assembler
+      // buffer.
       dest = buffer_.Size();
-      const uint16_t dest_high = Utils::High16Bits(dest);
-      const uint16_t dest_low = Utils::Low16Bits(dest);
-      const int32_t patched_movt =
-          0xe340c000 | ((dest_high >> 12) << 16) | (dest_high & 0xfff);
-      const int32_t patched_movw =
-          0xe300c000 | ((dest_low >> 12) << 16) | (dest_low & 0xfff);
+      const int32_t dest0 = (dest & 0x000000ff);
+      const int32_t dest1 = (dest & 0x0000ff00) >> 8;
+      const int32_t dest2 = (dest & 0x00ff0000) >> 16;
+      const int32_t dest3 = (dest & 0xff000000) >> 24;
+      const int32_t patched_mov = 0xe3a0c400 | dest3;
+      const int32_t patched_or1 = 0xe38cc800 | dest2;
+      const int32_t patched_or2 = 0xe38ccc00 | dest1;
+      const int32_t patched_or3 = 0xe38cc000 | dest0;
 
       // Rewrite the instructions.
-      buffer_.Store<int32_t>(position, patched_movw);
-      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize, patched_movt);
-      label->position_ = DecodeLoadImmediate(movt, movw);
+      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize, patched_mov);
+      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize, patched_or1);
+      buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize, patched_or2);
+      buffer_.Store<int32_t>(position + 3 * Instr::kInstrSize, patched_or3);
+      label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
     } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
-      // Far branches are enabled, but we can encode the branch offset.
-
       // Grab instructions that load the offset, and the branch.
-      const int32_t movw =
+      const int32_t mov =
           buffer_.Load<int32_t>(position);
-      const int32_t movt =
+      const int32_t or1 =
           buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
-      const int32_t branch =
+      const int32_t or2 =
           buffer_.Load<int32_t>(position + 2 * Instr::kInstrSize);
+      const int32_t or3 =
+          buffer_.Load<int32_t>(position + 3 * Instr::kInstrSize);
+      const int32_t branch =
+          buffer_.Load<int32_t>(position + 4 * Instr::kInstrSize);
 
       // Grab the branch condition, and encode the link bit.
       const int32_t cond = branch & 0xf0000000;
@@ -1802,8 +1862,12 @@
           Instr::kNopInstruction);
       buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize,
           Instr::kNopInstruction);
+      buffer_.Store<int32_t>(position + 3 * Instr::kInstrSize,
+          Instr::kNopInstruction);
+      buffer_.Store<int32_t>(position + 4 * Instr::kInstrSize,
+          Instr::kNopInstruction);
 
-      label->position_ = DecodeLoadImmediate(movt, movw);
+      label->position_ = DecodeARMv6LoadImmediate(mov, or1, or2, or3);
     } else {
       int32_t next = buffer_.Load<int32_t>(position);
       int32_t encoded = Assembler::EncodeBranchOffset(dest, next);
@@ -1815,6 +1879,84 @@
 }
 
 
+void Assembler::BindARMv7(Label* label) {
+  ASSERT(!label->IsBound());
+  intptr_t bound_pc = buffer_.Size();
+  while (label->IsLinked()) {
+    const int32_t position = label->Position();
+    int32_t dest = bound_pc - position;
+    if (use_far_branches() && !CanEncodeBranchOffset(dest)) {
+      // Far branches are enabled and we can't encode the branch offset.
+
+      // Grab instructions that load the offset.
+      const int32_t movw =
+          buffer_.Load<int32_t>(position + 0 * Instr::kInstrSize);
+      const int32_t movt =
+          buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
+
+      // Change from relative to the branch to relative to the assembler
+      // buffer.
+      dest = buffer_.Size();
+      const uint16_t dest_high = Utils::High16Bits(dest);
+      const uint16_t dest_low = Utils::Low16Bits(dest);
+      const int32_t patched_movt =
+          0xe340c000 | ((dest_high >> 12) << 16) | (dest_high & 0xfff);
+      const int32_t patched_movw =
+          0xe300c000 | ((dest_low >> 12) << 16) | (dest_low & 0xfff);
+
+      // Rewrite the instructions.
+      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize, patched_movw);
+      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize, patched_movt);
+      label->position_ = DecodeARMv7LoadImmediate(movt, movw);
+    } else if (use_far_branches() && CanEncodeBranchOffset(dest)) {
+      // Far branches are enabled, but we can encode the branch offset.
+
+      // Grab instructions that load the offset, and the branch.
+      const int32_t movw =
+          buffer_.Load<int32_t>(position + 0 * Instr::kInstrSize);
+      const int32_t movt =
+          buffer_.Load<int32_t>(position + 1 * Instr::kInstrSize);
+      const int32_t branch =
+          buffer_.Load<int32_t>(position + 2 * Instr::kInstrSize);
+
+      // Grab the branch condition, and encode the link bit.
+      const int32_t cond = branch & 0xf0000000;
+      const int32_t link = (branch & 0x20) << 19;
+
+      // Encode the branch and the offset.
+      const int32_t new_branch = cond | link | 0x0a000000;
+      const int32_t encoded = EncodeBranchOffset(dest, new_branch);
+
+      // Write the encoded branch instruction followed by two nops.
+      buffer_.Store<int32_t>(position + 0 * Instr::kInstrSize,
+          encoded);
+      buffer_.Store<int32_t>(position + 1 * Instr::kInstrSize,
+          Instr::kNopInstruction);
+      buffer_.Store<int32_t>(position + 2 * Instr::kInstrSize,
+          Instr::kNopInstruction);
+
+      label->position_ = DecodeARMv7LoadImmediate(movt, movw);
+    } else {
+      int32_t next = buffer_.Load<int32_t>(position);
+      int32_t encoded = Assembler::EncodeBranchOffset(dest, next);
+      buffer_.Store<int32_t>(position, encoded);
+      label->position_ = Assembler::DecodeBranchOffset(next);
+    }
+  }
+  label->BindTo(bound_pc);
+}
+
+
+void Assembler::Bind(Label* label) {
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    BindARMv6(label);
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    BindARMv7(label);
+  }
+}
+
+
 bool Address::CanHoldLoadOffset(OperandSize type,
                                 int32_t offset,
                                 int32_t* offset_mask) {
@@ -2024,8 +2166,7 @@
   // with this branch sequence.
   // Contrarily to BranchLinkPatchable, BranchPatchable requires an instruction
   // cache flush upon patching.
-  movw(IP, Utils::Low16Bits(label->address()));
-  movt(IP, Utils::High16Bits(label->address()));
+  LoadPatchableImmediate(IP, label->address());
   bx(IP);
 }
 
@@ -2064,6 +2205,43 @@
 }
 
 
+void Assembler::LoadPatchableImmediate(
+    Register rd, int32_t value, Condition cond) {
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    // This sequence is patched in a few places, and should remain fixed.
+    const uint32_t byte0 = (value & 0x000000ff);
+    const uint32_t byte1 = (value & 0x0000ff00) >> 8;
+    const uint32_t byte2 = (value & 0x00ff0000) >> 16;
+    const uint32_t byte3 = (value & 0xff000000) >> 24;
+    mov(rd, ShifterOperand(4, byte3), cond);
+    orr(rd, rd, ShifterOperand(8, byte2), cond);
+    orr(rd, rd, ShifterOperand(12, byte1), cond);
+    orr(rd, rd, ShifterOperand(byte0), cond);
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    const uint16_t value_low = Utils::Low16Bits(value);
+    const uint16_t value_high = Utils::High16Bits(value);
+    movw(rd, value_low, cond);
+    movt(rd, value_high, cond);
+  }
+}
+
+
+void Assembler::LoadDecodableImmediate(
+    Register rd, int32_t value, Condition cond) {
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    LoadPatchableImmediate(rd, value, cond);
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    movw(rd, Utils::Low16Bits(value), cond);
+    const uint16_t value_high = Utils::High16Bits(value);
+    if (value_high != 0) {
+      movt(rd, value_high, cond);
+    }
+  }
+}
+
+
 void Assembler::LoadImmediate(Register rd, int32_t value, Condition cond) {
   ShifterOperand shifter_op;
   if (ShifterOperand::CanHold(value, &shifter_op)) {
@@ -2071,11 +2249,7 @@
   } else if (ShifterOperand::CanHold(~value, &shifter_op)) {
     mvn(rd, shifter_op, cond);
   } else {
-    movw(rd, Utils::Low16Bits(value), cond);
-    const uint16_t value_high = Utils::High16Bits(value);
-    if (value_high != 0) {
-      movt(rd, value_high, cond);
-    }
+    LoadDecodableImmediate(rd, value, cond);
   }
 }
 
@@ -2241,7 +2415,7 @@
 
 
 void Assembler::AddImmediate(Register rd, Register rn, int32_t value,
-                            Condition cond) {
+                             Condition cond) {
   if (value == 0) {
     if (rd != rn) {
       mov(rd, ShifterOperand(rn), cond);
@@ -2265,11 +2439,7 @@
       mvn(IP, shifter_op, cond);
       sub(rd, rn, ShifterOperand(IP), cond);
     } else {
-      movw(IP, Utils::Low16Bits(value), cond);
-      const uint16_t value_high = Utils::High16Bits(value);
-      if (value_high != 0) {
-        movt(IP, value_high, cond);
-      }
+      LoadDecodableImmediate(IP, value, cond);
       add(rd, rn, ShifterOperand(IP), cond);
     }
   }
@@ -2292,11 +2462,7 @@
       mvn(IP, shifter_op, cond);
       subs(rd, rn, ShifterOperand(IP), cond);
     } else {
-      movw(IP, Utils::Low16Bits(value), cond);
-      const uint16_t value_high = Utils::High16Bits(value);
-      if (value_high != 0) {
-        movt(IP, value_high, cond);
-      }
+      LoadDecodableImmediate(IP, value, cond);
       adds(rd, rn, ShifterOperand(IP), cond);
     }
   }
@@ -2319,11 +2485,7 @@
       mvn(IP, shifter_op, cond);
       sbc(rd, rn, ShifterOperand(IP), cond);
     } else {
-      movw(IP, Utils::Low16Bits(value), cond);
-      const uint16_t value_high = Utils::High16Bits(value);
-      if (value_high != 0) {
-        movt(IP, value_high, cond);
-      }
+      LoadDecodableImmediate(IP, value, cond);
       adc(rd, rn, ShifterOperand(IP), cond);
     }
   }
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 10d9a7f..479deb0 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -63,6 +63,7 @@
   DISALLOW_COPY_AND_ASSIGN(Label);
 };
 
+
 // Encodes Addressing Mode 1 - Data-processing operands.
 class ShifterOperand : public ValueObject {
  public:
@@ -590,6 +591,8 @@
                      DRegister tmpl, DRegister tmpr);
 
   // Load and Store. May clobber IP.
+  void LoadPatchableImmediate(Register rd, int32_t value, Condition cond = AL);
+  void LoadDecodableImmediate(Register rd, int32_t value, Condition cond = AL);
   void LoadImmediate(Register rd, int32_t value, Condition cond = AL);
   void LoadSImmediate(SRegister sd, float value, Condition cond = AL);
   void LoadDImmediate(DRegister dd, double value,
@@ -755,6 +758,9 @@
   int32_t AddObject(const Object& obj);
   int32_t AddExternalLabel(const ExternalLabel* label);
 
+  void BindARMv6(Label* label);
+  void BindARMv7(Label* label);
+
   class CodeComment : public ZoneAllocated {
    public:
     CodeComment(intptr_t pc_offset, const String& comment)
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index f4f4887..60880ab 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -59,9 +59,18 @@
 
 
 ASSEMBLER_TEST_GENERATE(MovImm16, assembler) {
-  __ movw(R0, 0x5678);
-  __ movt(R0, 0x1234);
+#if defined(USING_SIMULATOR)
+  // ARMv7 is the default.
+  HostCPUFeatures::set_arm_version(ARMv6);
+  __ LoadDecodableImmediate(R0, 0x12345678 << 1);
+  HostCPUFeatures::set_arm_version(ARMv7);
+  __ LoadDecodableImmediate(R1, 0x12345678);
+  __ sub(R0, R0, ShifterOperand(R1));
   __ bx(LR);
+#else
+  __ LoadDecodableImmediate(R0, 0x12345678);
+  __ bx(LR);
+#endif
 }
 
 
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 9d2f409..c071936 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -921,6 +921,17 @@
 }
 
 
+void Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x66);
+  EmitUint8(0x0F);
+  EmitUint8(0xC6);
+  EmitXmmRegisterOperand(dst, src);
+  ASSERT(imm.is_uint8());
+  EmitUint8(imm.value());
+}
+
+
 void Assembler::subsd(XmmRegister dst, XmmRegister src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xF2);
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 1c88535..e21cc4c 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -438,6 +438,7 @@
   void sqrtpd(XmmRegister dst);
   void cvtps2pd(XmmRegister dst, XmmRegister src);
   void cvtpd2ps(XmmRegister dst, XmmRegister src);
+  void shufpd(XmmRegister dst, XmmRegister src, const Immediate& mask);
 
   void cvtsi2ss(XmmRegister dst, Register src);
   void cvtsi2sd(XmmRegister dst, Register src);
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index a652b8f..99152cf 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -1746,6 +1746,34 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(PackedDoubleShuffle, assembler) {
+  static const struct ALIGN16 {
+    double a;
+    double b;
+  } constant0 = { 2.0, 9.0 };
+  __ movups(XMM0, Address::Absolute(reinterpret_cast<uword>(&constant0)));
+  // Splat Y across all lanes.
+  __ shufpd(XMM0, XMM0, Immediate(0x33));
+  // Splat X across all lanes.
+  __ shufpd(XMM0, XMM0, Immediate(0x0));
+  // Set return value.
+  __ pushl(EAX);
+  __ pushl(EAX);
+  __ movsd(Address(ESP, 0), XMM0);
+  __ fldl(Address(ESP, 0));
+  __ popl(EAX);
+  __ popl(EAX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(PackedDoubleShuffle, test) {
+  typedef double (*PackedDoubleShuffle)();
+  double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())();
+  EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
+}
+
+
 ASSEMBLER_TEST_GENERATE(PackedDoubleToSingle, assembler) {
   static const struct ALIGN16 {
     double a;
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index a3bc9eb..4bedd21 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -1129,6 +1129,18 @@
 }
 
 
+void Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x66);
+  EmitREX_RB(dst, src);
+  EmitUint8(0x0F);
+  EmitUint8(0xC6);
+  EmitXmmRegisterOperand(dst & 7, src);
+  ASSERT(imm.is_uint8());
+  EmitUint8(imm.value());
+}
+
+
 void Assembler::comisd(XmmRegister a, XmmRegister b) {
   ASSERT(a <= XMM15);
   ASSERT(b <= XMM15);
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 1b12f5f..522928e 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -453,6 +453,7 @@
   void sqrtpd(XmmRegister dst);
   void cvtps2pd(XmmRegister dst, XmmRegister src);
   void cvtpd2ps(XmmRegister dst, XmmRegister src);
+  void shufpd(XmmRegister dst, XmmRegister src, const Immediate& mask);
 
   void comisd(XmmRegister a, XmmRegister b);
   void cvtsi2sd(XmmRegister a, Register b);
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 38567f0..8892ed4 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -1638,6 +1638,30 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(PackedDoubleShuffle, assembler) {
+  static const struct ALIGN16 {
+    double a;
+    double b;
+  } constant0 = { 2.0, 9.0 };
+  __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
+  __ movups(XMM10, Address(RAX, 0));
+  // Splat Y across all lanes.
+  __ shufpd(XMM10, XMM10, Immediate(0x33));
+  // Splat X across all lanes.
+  __ shufpd(XMM10, XMM10, Immediate(0x0));
+  // Set return value.
+  __ movaps(XMM0, XMM10);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(PackedDoubleShuffle, test) {
+  typedef double (*PackedDoubleShuffle)();
+  double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())();
+  EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
+}
+
+
 ASSEMBLER_TEST_GENERATE(PackedDoubleToSingle, assembler) {
   static const struct ALIGN16 {
     double a;
diff --git a/runtime/vm/ast_printer_test.cc b/runtime/vm/ast_printer_test.cc
index 79e47c3..872d5bb 100644
--- a/runtime/vm/ast_printer_test.cc
+++ b/runtime/vm/ast_printer_test.cc
@@ -16,7 +16,7 @@
   const intptr_t kPos = Scanner::kNoSourcePos;
   LocalVariable* v =
       new LocalVariable(kPos,
-                        String::ZoneHandle(String::New("wurscht")),
+                        String::ZoneHandle(Symbols::New("wurscht")),
                         Type::ZoneHandle(Type::DynamicType()));
   v->set_index(5);
   LoadLocalNode* ll = new LoadLocalNode(kPos, v);
diff --git a/runtime/vm/ast_test.cc b/runtime/vm/ast_test.cc
index 70b9f6e..83fea1b 100644
--- a/runtime/vm/ast_test.cc
+++ b/runtime/vm/ast_test.cc
@@ -14,7 +14,7 @@
 
 TEST_CASE(Ast) {
   LocalVariable* v = new LocalVariable(Scanner::kNoSourcePos,
-                                       String::ZoneHandle(String::New("v")),
+                                       String::ZoneHandle(Symbols::New("v")),
                                        Type::ZoneHandle(Type::DynamicType()));
   AstNode* ll = new LoadLocalNode(Scanner::kNoSourcePos, v);
   EXPECT(ll->IsLoadLocalNode());
@@ -25,7 +25,7 @@
   EXPECT_EQ(1, v->index());
 
   LocalVariable* p = new LocalVariable(Scanner::kNoSourcePos,
-                                       String::ZoneHandle(String::New("p")),
+                                       String::ZoneHandle(Symbols::New("p")),
                                        Type::ZoneHandle(Type::DynamicType()));
   EXPECT(!p->HasIndex());
   p->set_index(-1);
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index e445209..5fb336d 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -95,16 +95,6 @@
   }
 
 #if defined(DEBUG)
-  void set_reusable_handle_scope_active(bool value) {
-    reusable_handle_scope_active_ = value;
-  }
-
-  bool reusable_handle_scope_active() {
-    return reusable_handle_scope_active_;
-  }
-#endif
-
-#if defined(DEBUG)
   static void AssertCurrent(BaseIsolate* isolate);
 #endif
 
@@ -116,7 +106,6 @@
         top_handle_scope_(NULL),
         no_handle_scope_depth_(0),
         no_gc_scope_depth_(0),
-        reusable_handle_scope_active_(false),
 #endif
         no_callback_scope_depth_(0)
   {}
@@ -131,7 +120,6 @@
   HandleScope* top_handle_scope_;
   int32_t no_handle_scope_depth_;
   int32_t no_gc_scope_depth_;
-  bool reusable_handle_scope_active_;
 #endif
   int32_t no_callback_scope_depth_;
 
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index d1418c1..172952f 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -163,7 +163,7 @@
   V(ExternalTypedData_Int32x4Array_new, 1)                                     \
   V(ExternalTypedData_Float64x2Array_new, 1)                                   \
   V(TypedData_length, 1)                                                       \
-  V(TypedData_setRange, 5)                                                     \
+  V(TypedData_setRange, 7)                                                     \
   V(TypedData_GetInt8, 2)                                                      \
   V(TypedData_SetInt8, 3)                                                      \
   V(TypedData_GetUint8, 2)                                                     \
@@ -309,6 +309,7 @@
   V(ClassMirror_members, 2)                                                    \
   V(ClassMirror_constructors, 2)                                               \
   V(LibraryMirror_members, 2)                                                  \
+  V(LibraryMirror_libraryDependencies, 2)                                      \
   V(ClassMirror_invoke, 5)                                                     \
   V(ClassMirror_invokeGetter, 3)                                               \
   V(ClassMirror_invokeSetter, 4)                                               \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index ded1104..c49794a 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1188,7 +1188,7 @@
                     super_class_name.ToCString());
       }
     }
-    if (field.is_static() && (field.is_const() || field.is_final()) &&
+    if (field.is_static() &&
         (field.value() != Object::null()) &&
         (field.value() != Object::sentinel().raw())) {
       // The parser does not preset the value if the type is a type parameter or
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 8c05780..9052091 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -243,6 +243,7 @@
 void ClassHeapStats::PrintTOJSONArray(const Class& cls, JSONArray* array) {
   JSONObject obj(array);
   obj.AddProperty("type", "ClassHeapStats");
+  obj.AddPropertyF("id", "allocationprofile/%" Pd "", cls.id());
   obj.AddProperty("class", cls);
   {
     JSONArray new_stats(&obj, "new");
@@ -331,6 +332,7 @@
   ASSERT(heap != NULL);
   JSONObject obj(stream);
   obj.AddProperty("type", "AllocationProfile");
+  obj.AddProperty("id", "allocationprofile");
   {
     JSONObject heaps(&obj, "heaps");
     {
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 1f77260..0c284c2 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1026,11 +1026,18 @@
                                 ic_data,
                                 &result)) {
     ArgumentsDescriptor desc(args_descriptor);
-    const Function& target_function =
-        Function::Handle(receiver_class.GetInvocationDispatcher(
-            target_name,
-            args_descriptor,
-            RawFunction::kNoSuchMethodDispatcher));
+    Function& target_function = Function::Handle();
+    if (receiver.IsClosure() && target_name.Equals(Symbols::Call())) {
+      target_function = receiver_class.GetInvocationDispatcher(
+          target_name,
+          args_descriptor,
+          RawFunction::kInvokeClosureDispatcher);
+    } else {
+      target_function = receiver_class.GetInvocationDispatcher(
+          target_name,
+          args_descriptor,
+          RawFunction::kNoSuchMethodDispatcher);
+    }
     // Update IC data.
     ASSERT(!target_function.IsNull());
     intptr_t receiver_cid = receiver.GetClassId();
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 6a769cd..43072b2 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -59,7 +59,7 @@
 
 void CodePatcher::InsertCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
-  ASSERT(start + CallPattern::kFixedLengthInBytes <= target);
+  ASSERT(start + CallPattern::LengthInBytes() <= target);
   CallPattern::InsertAt(start, target);
 }
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 656481a..14e5a87 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -748,7 +748,7 @@
     return Error::null();
   }
   if (setjmp(*jump.Set()) == 0) {
-    TIMERSCOPE(time_compilation);
+    TIMERSCOPE(isolate, time_compilation);
     Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
     per_compile_timer.Start();
     ParsedFunction* parsed_function =
diff --git a/runtime/vm/compiler_stats.cc b/runtime/vm/compiler_stats.cc
index 786fff9..c0ae73f 100644
--- a/runtime/vm/compiler_stats.cc
+++ b/runtime/vm/compiler_stats.cc
@@ -13,10 +13,10 @@
 DEFINE_FLAG(bool, compiler_stats, false, "Compiler stat counters.");
 
 // Bytes allocated for generated code.
-intptr_t CompilerStats::code_allocated = 0;
+int64_t CompilerStats::code_allocated = 0;
 
 // Total number of characters in source.
-intptr_t CompilerStats::src_length = 0;
+int64_t CompilerStats::src_length = 0;
 
 // Cumulative runtime of parser.
 Timer CompilerStats::parser_timer(true, "parser timer");
@@ -53,44 +53,55 @@
 Timer CompilerStats::codefinalizer_timer(true, "code finalization timer");
 
 
-intptr_t CompilerStats::num_tokens_total = 0;
-intptr_t CompilerStats::num_literal_tokens_total = 0;
-intptr_t CompilerStats::num_ident_tokens_total = 0;
-intptr_t CompilerStats::num_tokens_consumed = 0;
-intptr_t CompilerStats::num_token_checks = 0;
-intptr_t CompilerStats::num_tokens_rewind = 0;
-intptr_t CompilerStats::num_tokens_lookahead = 0;
+int64_t CompilerStats::num_tokens_total = 0;
+int64_t CompilerStats::num_literal_tokens_total = 0;
+int64_t CompilerStats::num_ident_tokens_total = 0;
+int64_t CompilerStats::num_tokens_consumed = 0;
+int64_t CompilerStats::num_token_checks = 0;
+int64_t CompilerStats::num_tokens_rewind = 0;
+int64_t CompilerStats::num_tokens_lookahead = 0;
 
-intptr_t CompilerStats::num_lib_cache_hit = 0;
-intptr_t CompilerStats::num_names_cached = 0;
-intptr_t CompilerStats::make_accessor_name = 0;
-intptr_t CompilerStats::make_field_name = 0;
+int64_t CompilerStats::num_lib_cache_hit = 0;
+int64_t CompilerStats::num_names_cached = 0;
+int64_t CompilerStats::make_accessor_name = 0;
+int64_t CompilerStats::make_field_name = 0;
+
+int64_t CompilerStats::num_classes_compiled = 0;
+int64_t CompilerStats::num_functions_compiled = 0;
+
+int64_t CompilerStats::num_implicit_final_getters = 0;
+int64_t CompilerStats::num_static_initializer_funcs = 0;
 
 void CompilerStats::Print() {
   if (!FLAG_compiler_stats) {
     return;
   }
   OS::Print("==== Compiler Stats ====\n");
-  OS::Print("Number of tokens:   %" Pd "\n", num_tokens_total);
-  OS::Print("  Literal tokens:   %" Pd "\n", num_literal_tokens_total);
-  OS::Print("  Ident tokens:     %" Pd "\n", num_ident_tokens_total);
-  OS::Print("Tokens consumed:    %" Pd " (%.2f times number of tokens)\n",
+  OS::Print("Number of tokens:   %" Pd64 "\n", num_tokens_total);
+  OS::Print("  Literal tokens:   %" Pd64 "\n", num_literal_tokens_total);
+  OS::Print("  Ident tokens:     %" Pd64 "\n", num_ident_tokens_total);
+  OS::Print("Tokens consumed:    %" Pd64 " (%.2f times number of tokens)\n",
             num_tokens_consumed,
             (1.0 * num_tokens_consumed) / num_tokens_total);
-  OS::Print("Tokens checked:     %" Pd "  (%.2f times tokens consumed)\n",
+  OS::Print("Tokens checked:     %" Pd64 "  (%.2f times tokens consumed)\n",
             num_token_checks, (1.0 * num_token_checks) / num_tokens_consumed);
-  OS::Print("Token rewind:       %" Pd " (%" Pd "%% of tokens checked)\n",
+  OS::Print("Token rewind:       %" Pd64 " (%" Pd64 "%% of tokens checked)\n",
             num_tokens_rewind, (100 * num_tokens_rewind) / num_token_checks);
-  OS::Print("Token lookahead:    %" Pd " (%" Pd "%% of tokens checked)\n",
+  OS::Print("Token lookahead:    %" Pd64 " (%" Pd64 "%% of tokens checked)\n",
             num_tokens_lookahead,
             (100 * num_tokens_lookahead) / num_token_checks);
 
-  OS::Print("Lib names cached:   %" Pd "\n", num_names_cached);
-  OS::Print("Lib name cache hit: %" Pd "\n", num_lib_cache_hit);
-  OS::Print("Accessor mangling:  %" Pd " field->acc  %" Pd " acc->field\n",
+  OS::Print("Classes parsed:     %" Pd64 "\n", num_classes_compiled);
+  OS::Print("Functions compiled: %" Pd64 "\n", num_functions_compiled);
+  OS::Print("  Impl getters:     %" Pd64 "\n", num_implicit_final_getters);
+  OS::Print("  Init funcs:       %" Pd64 "\n", num_static_initializer_funcs);
+
+  OS::Print("Lib names cached:   %" Pd64 "\n", num_names_cached);
+  OS::Print("Lib name cache hit: %" Pd64 "\n", num_lib_cache_hit);
+  OS::Print("Accessor mangling:  %" Pd64 " field->acc  %" Pd64 " acc->field\n",
             make_accessor_name, make_field_name);
 
-  OS::Print("Source length:      %" Pd " characters\n", src_length);
+  OS::Print("Source length:      %" Pd64 " characters\n", src_length);
   int64_t scan_usecs = scanner_timer.TotalElapsedTime();
   OS::Print("Scanner time:       %" Pd64 " msecs\n",
             scan_usecs / 1000);
@@ -136,11 +147,11 @@
   OS::Print("  Code finalizer:   %" Pd64 " msecs\n",
             codefinalizer_usecs / 1000);
   OS::Print("Compilation speed:  %" Pd64 " tokens per msec\n",
-            1000 * num_tokens_total / (parse_usecs + codegen_usecs));
-  OS::Print("Code size:          %" Pd " KB\n",
+            (1000 * num_tokens_total) / (parse_usecs + codegen_usecs));
+  OS::Print("Code size:          %" Pd64 " KB\n",
             code_allocated / 1024);
-  OS::Print("Code density:       %" Pd " tokens per KB\n",
-            num_tokens_total * 1024 / code_allocated);
+  OS::Print("Code density:       %" Pd64 " tokens per KB\n",
+            (num_tokens_total * 1024) / code_allocated);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 57d4d65..1e0fd25 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -17,21 +17,26 @@
 
 class CompilerStats : AllStatic {
  public:
-  static intptr_t num_tokens_total;
-  static intptr_t num_literal_tokens_total;
-  static intptr_t num_ident_tokens_total;
-  static intptr_t num_tokens_consumed;
-  static intptr_t num_token_checks;
-  static intptr_t num_tokens_rewind;
-  static intptr_t num_tokens_lookahead;
+  static int64_t num_tokens_total;
+  static int64_t num_literal_tokens_total;
+  static int64_t num_ident_tokens_total;
+  static int64_t num_tokens_consumed;
+  static int64_t num_token_checks;
+  static int64_t num_tokens_rewind;
+  static int64_t num_tokens_lookahead;
 
-  static intptr_t num_lib_cache_hit;
-  static intptr_t num_names_cached;
-  static intptr_t make_accessor_name;
-  static intptr_t make_field_name;
+  static int64_t num_lib_cache_hit;
+  static int64_t num_names_cached;
+  static int64_t make_accessor_name;
+  static int64_t make_field_name;
 
-  static intptr_t src_length;        // Total number of characters in source.
-  static intptr_t code_allocated;    // Bytes allocated for generated code.
+  static int64_t num_classes_compiled;
+  static int64_t num_functions_compiled;
+  static int64_t num_implicit_final_getters;
+  static int64_t num_static_initializer_funcs;
+
+  static int64_t src_length;        // Total number of characters in source.
+  static int64_t code_allocated;    // Bytes allocated for generated code.
   static Timer parser_timer;         // Cumulative runtime of parser.
   static Timer scanner_timer;        // Cumulative runtime of scanner.
   static Timer codegen_timer;        // Cumulative runtime of code generator.
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index b15857f..b766c15 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -182,6 +182,7 @@
   Class& cls = Class::Handle();
   JSONObject coverage(stream);
   coverage.AddProperty("type", "CodeCoverage");
+  coverage.AddProperty("id", "coverage");
   {
     JSONArray jsarr(&coverage, "coverage");
     for (int i = 0; i < libs.Length(); i++) {
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 73f2ec0..a7ad919 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -54,6 +54,7 @@
 bool HostCPUFeatures::integer_division_supported_ = false;
 bool HostCPUFeatures::neon_supported_ = false;
 const char* HostCPUFeatures::hardware_ = NULL;
+ARMVersion HostCPUFeatures::arm_version_ = ARMvUnknown;
 #if defined(DEBUG)
 bool HostCPUFeatures::initialized_ = false;
 #endif
@@ -63,12 +64,20 @@
 void HostCPUFeatures::InitOnce() {
   CpuInfo::InitOnce();
   hardware_ = CpuInfo::GetCpuModel();
-  // Implements ARMv7.
-  ASSERT(CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv7"));
+  // Check for ARMv6 or ARMv7. It can be in either the Processor or
+  // Model information fields.
+  if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv6") ||
+      CpuInfo::FieldContains(kCpuInfoModel, "ARMv6")) {
+    arm_version_ = ARMv6;
+  } else {
+    ASSERT(CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv7") ||
+           CpuInfo::FieldContains(kCpuInfoModel, "ARMv7"));
+    arm_version_ = ARMv7;
+  }
   // Has floating point unit.
   ASSERT(CpuInfo::FieldContains(kCpuInfoFeatures, "vfp"));
   // Has integer division.
-  bool is_krait = CpuInfo::FieldContains(kCpuInfoModel, "QCT APQ8064");
+  bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064");
   if (is_krait) {
     // Special case for Qualcomm Krait CPUs in Nexus 4 and 7.
     integer_division_supported_ = true;
@@ -101,6 +110,7 @@
   hardware_ = CpuInfo::GetCpuModel();
   integer_division_supported_ = true;
   neon_supported_ = true;
+  arm_version_ = ARMv7;
 #if defined(DEBUG)
   initialized_ = true;
 #endif
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index cbcac11..92be988 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -18,6 +18,12 @@
 // additionally mock the options needed for the target architecture so that
 // they may be altered for testing.
 
+enum ARMVersion {
+  ARMv6,
+  ARMv7,
+  ARMvUnknown,
+};
+
 class HostCPUFeatures: public AllStatic {
  public:
   static void InitOnce();
@@ -34,6 +40,10 @@
     DEBUG_ASSERT(initialized_);
     return neon_supported_;
   }
+  static ARMVersion arm_version() {
+    DEBUG_ASSERT(initialized_);
+    return arm_version_;
+  }
 
 #if !defined(HOST_ARCH_ARM)
   static void set_integer_division_supported(bool supported) {
@@ -44,12 +54,17 @@
     DEBUG_ASSERT(initialized_);
     neon_supported_ = supported;
   }
+  static void set_arm_version(ARMVersion version) {
+    DEBUG_ASSERT(initialized_);
+    arm_version_ = version;
+  }
 #endif  // !defined(HOST_ARCH_ARM)
 
  private:
   static const char* hardware_;
   static bool integer_division_supported_;
   static bool neon_supported_;
+  static ARMVersion arm_version_;
 #if defined(DEBUG)
   static bool initialized_;
 #endif
@@ -75,6 +90,9 @@
   static const char* hardware() {
     return HostCPUFeatures::hardware();
   }
+  static ARMVersion arm_version() {
+    return HostCPUFeatures::arm_version();
+  }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/cpuinfo.h b/runtime/vm/cpuinfo.h
index f0f73b5..b468ee2 100644
--- a/runtime/vm/cpuinfo.h
+++ b/runtime/vm/cpuinfo.h
@@ -58,8 +58,8 @@
   // Returns the field describing the CPU model. Caller is responsible for
   // freeing the result.
   static const char* GetCpuModel() {
-    ASSERT(HasField(FieldName(kCpuInfoModel)));
-    return ExtractField(kCpuInfoModel);
+    ASSERT(HasField(FieldName(kCpuInfoHardware)));
+    return ExtractField(kCpuInfoHardware);
   }
 
  private:
diff --git a/runtime/vm/cpuinfo_android.cc b/runtime/vm/cpuinfo_android.cc
index ba90d25..fbbbe29 100644
--- a/runtime/vm/cpuinfo_android.cc
+++ b/runtime/vm/cpuinfo_android.cc
@@ -27,7 +27,7 @@
   fields_[kCpuInfoFeatures] = "flags";
 #elif defined(HOST_ARCH_ARM)
   fields_[kCpuInfoProcessor] = "Processor";
-  fields_[kCpuInfoModel] = "Hardware";
+  fields_[kCpuInfoModel] = "model name";
   fields_[kCpuInfoHardware] = "Hardware";
   fields_[kCpuInfoFeatures] = "Features";
 #elif defined(HOST_ARCH_MIPS)
diff --git a/runtime/vm/cpuinfo_linux.cc b/runtime/vm/cpuinfo_linux.cc
index 8e80ab9..e96e0d5 100644
--- a/runtime/vm/cpuinfo_linux.cc
+++ b/runtime/vm/cpuinfo_linux.cc
@@ -30,7 +30,7 @@
   CpuId::InitOnce();
 #elif defined(HOST_ARCH_ARM)
   fields_[kCpuInfoProcessor] = "Processor";
-  fields_[kCpuInfoModel] = "Hardware";
+  fields_[kCpuInfoModel] = "model name";
   fields_[kCpuInfoHardware] = "Hardware";
   fields_[kCpuInfoFeatures] = "Features";
   method_ = kCpuInfoSystem;
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 45f51e3..43f7b03 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -118,13 +118,13 @@
     HandleScope handle_scope(vm_isolate_);
     Heap::Init(vm_isolate_);
     ObjectStore::Init(vm_isolate_);
+    TargetCPUFeatures::InitOnce();
     Object::InitOnce();
     ArgumentsDescriptor::InitOnce();
     StubCode::InitOnce();
     Symbols::InitOnce(vm_isolate_);
     Scanner::InitOnce();
     Object::CreateInternalMetaData();
-    TargetCPUFeatures::InitOnce();
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
     // Dart VM requires at least SSE2.
     if (!TargetCPUFeatures::sse2_supported()) {
@@ -175,11 +175,12 @@
 
   ShutdownIsolate();
   vm_isolate_ = NULL;
+
+  TargetCPUFeatures::Cleanup();
 #endif
 
   Profiler::Shutdown();
   CodeObservers::DeleteAll();
-  TargetCPUFeatures::Cleanup();
 
   return NULL;
 }
@@ -195,8 +196,8 @@
 
 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) {
   // Initialize the new isolate.
-  TIMERSCOPE(time_isolate_initialization);
   Isolate* isolate = Isolate::Current();
+  TIMERSCOPE(isolate, time_isolate_initialization);
   ASSERT(isolate != NULL);
   StackZone zone(isolate);
   HandleScope handle_scope(isolate);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1ab063e..7ea19a5 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -623,11 +623,12 @@
     Dart_Handle object,
     bool is_prologue,
     void* peer,
+    intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& ref = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& ref = isolate->ObjectHandle();
   ref = Api::UnwrapHandle(object);
   FinalizablePersistentHandle* finalizable_ref = is_prologue ?
       state->prologue_weak_persistent_handles().AllocateHandle() :
@@ -636,6 +637,7 @@
   finalizable_ref->set_raw(ref);
   finalizable_ref->set_peer(peer);
   finalizable_ref->set_callback(callback);
+  finalizable_ref->SetExternalSize(external_allocation_size, isolate);
   if (is_prologue) {
     return finalizable_ref->apiPrologueHandle();
   } else {
@@ -647,6 +649,7 @@
 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
     Dart_Handle object,
     void* peer,
+    intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
@@ -654,6 +657,7 @@
                                    object,
                                    false,
                                    peer,
+                                   external_allocation_size,
                                    callback);
 }
 
@@ -661,6 +665,7 @@
 DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle(
     Dart_Handle object,
     void* peer,
+    intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
@@ -668,6 +673,7 @@
                                    object,
                                    true,
                                    peer,
+                                   external_allocation_size,
                                    callback);
 }
 
@@ -697,11 +703,13 @@
     ASSERT(state->IsValidPrologueWeakPersistentHandle(object));
     FinalizablePersistentHandle* weak_ref =
         FinalizablePersistentHandle::Cast(object);
+    weak_ref->EnsureFreeExternal(isolate);
     state->prologue_weak_persistent_handles().FreeHandle(weak_ref);
   } else {
     ASSERT(!state->IsValidPrologueWeakPersistentHandle(object));
     FinalizablePersistentHandle* weak_ref =
         FinalizablePersistentHandle::Cast(object);
+    weak_ref->EnsureFreeExternal(isolate);
     state->weak_persistent_handles().FreeHandle(weak_ref);
   }
 }
@@ -756,64 +764,41 @@
 
 // --- Garbage Collection Callbacks --
 
-DART_EXPORT Dart_Handle Dart_AddGcPrologueCallback(
-    Dart_GcPrologueCallback callback) {
+DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
+    Dart_GcPrologueCallback prologue_callback,
+    Dart_GcEpilogueCallback epilogue_callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  GcPrologueCallbacks& callbacks = isolate->gc_prologue_callbacks();
-  if (callbacks.Contains(callback)) {
-    return Api::NewError(
-        "%s permits only one instance of 'callback' to be present in the "
-        "prologue callback list.",
-        CURRENT_FUNC);
+  if (prologue_callback != NULL) {
+    if (isolate->gc_prologue_callback() != NULL) {
+      return Api::NewError(
+          "%s permits only one gc prologue callback to be registered, please "
+          "remove the existing callback and then add this callback",
+          CURRENT_FUNC);
+    }
+  } else {
+    if (isolate->gc_prologue_callback() == NULL) {
+      return Api::NewError(
+          "%s expects 'prologue_callback' to be present in the callback set.",
+          CURRENT_FUNC);
+    }
   }
-  callbacks.Add(callback);
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_RemoveGcPrologueCallback(
-    Dart_GcPrologueCallback callback) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
-  GcPrologueCallbacks& callbacks = isolate->gc_prologue_callbacks();
-  if (!callbacks.Contains(callback)) {
-    return Api::NewError(
-        "%s expects 'callback' to be present in the prologue callback list.",
-        CURRENT_FUNC);
+  if (epilogue_callback != NULL) {
+    if (isolate->gc_epilogue_callback() != NULL) {
+      return Api::NewError(
+          "%s permits only one gc epilogue callback to be registered, please "
+          "remove the existing callback and then add this callback",
+          CURRENT_FUNC);
+    }
+  } else {
+    if (isolate->gc_epilogue_callback() == NULL) {
+      return Api::NewError(
+          "%s expects 'epilogue_callback' to be present in the callback set.",
+          CURRENT_FUNC);
+    }
   }
-  callbacks.Remove(callback);
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_AddGcEpilogueCallback(
-    Dart_GcEpilogueCallback callback) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
-  GcEpilogueCallbacks& callbacks = isolate->gc_epilogue_callbacks();
-  if (callbacks.Contains(callback)) {
-    return Api::NewError(
-        "%s permits only one instance of 'callback' to be present in the "
-        "epilogue callback list.",
-        CURRENT_FUNC);
-  }
-  callbacks.Add(callback);
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_RemoveGcEpilogueCallback(
-    Dart_GcEpilogueCallback callback) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
-  GcEpilogueCallbacks& callbacks = isolate->gc_epilogue_callbacks();
-  if (!callbacks.Contains(callback)) {
-    return Api::NewError(
-        "%s expects 'callback' to be present in the epilogue callback list.",
-        CURRENT_FUNC);
-  }
-  callbacks.Remove(callback);
+  isolate->set_gc_prologue_callback(prologue_callback);
+  isolate->set_gc_epilogue_callback(epilogue_callback);
   return Api::Success();
 }
 
@@ -924,7 +909,7 @@
       if (FLAG_check_function_fingerprints) {
         Library::CheckFunctionFingerprints();
       }
-      START_TIMER(time_total_runtime);
+      START_TIMER(isolate, time_total_runtime);
       return reinterpret_cast<Dart_Isolate>(isolate);
     }
     *error = strdup(error_obj.ToErrorCString());
@@ -942,7 +927,7 @@
     HandleScope handle_scope(isolate);
     Dart::RunShutdownCallback();
   }
-  STOP_TIMER(time_total_runtime);
+  STOP_TIMER(isolate, time_total_runtime);
   Dart::ShutdownIsolate();
 }
 
@@ -1004,7 +989,7 @@
                                             intptr_t* size) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  TIMERSCOPE(time_creating_snapshot);
+  TIMERSCOPE(isolate, time_creating_snapshot);
   if (buffer == NULL) {
     RETURN_NULL_ERROR(buffer);
   }
@@ -1028,7 +1013,7 @@
                                                   intptr_t* size) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  TIMERSCOPE(time_creating_snapshot);
+  TIMERSCOPE(isolate, time_creating_snapshot);
   if (buffer == NULL) {
     RETURN_NULL_ERROR(buffer);
   }
@@ -1387,8 +1372,8 @@
 DART_EXPORT bool Dart_IsInstance(Dart_Handle object) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& ref = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& ref = isolate->ObjectHandle();
   ref = Api::UnwrapHandle(object);
   return ref.IsInstance();
 }
@@ -3131,7 +3116,9 @@
   if (type_obj.IsNull()) {
     RETURN_TYPE_ERROR(isolate, type, Type);
   }
-  const Class& cls = Class::Handle(isolate, type_obj.type_class());
+  REUSABLE_CLASS_HANDLESCOPE(isolate);
+  Class& cls = isolate->ClassHandle();
+  cls = type_obj.type_class();
 
   if (!cls.is_fields_marked_nullable()) {
     // Mark all fields as nullable.
@@ -3152,6 +3139,13 @@
     }
   }
 
+  REUSABLE_ERROR_HANDLESCOPE(isolate);
+  Error& error = isolate->ErrorHandle();
+  error = cls.EnsureIsFinalized(isolate);
+  if (!error.IsNull()) {
+    // An error occurred, return error object.
+    return Api::NewHandle(isolate, error.raw());
+  }
   // Allocate an object for the given class.
   return Api::NewHandle(isolate, Instance::New(cls));
 }
@@ -3275,7 +3269,7 @@
   CHECK_CALLBACK_STATE(isolate);
   // TODO(turnidge): This is a bit simplistic.  It overcounts when
   // other operations (gc, compilation) are active.
-  TIMERSCOPE(time_dart_execution);
+  TIMERSCOPE(isolate, time_dart_execution);
 
   const String& function_name = Api::UnwrapStringHandle(isolate, name);
   if (function_name.IsNull()) {
@@ -3828,7 +3822,7 @@
                                                     int index,
                                                     intptr_t* value) {
   Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
+  CHECK_ISOLATE(isolate);
   ReusableObjectHandleScope reused_obj_handle(isolate);
   const Instance& instance = Api::UnwrapInstanceHandle(reused_obj_handle, obj);
   if (instance.IsNull()) {
@@ -3908,8 +3902,8 @@
   }
   Isolate* isolate = arguments->isolate();
   CHECK_ISOLATE(isolate);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(arg_index);
   if (obj.IsNull()) {
     for (intptr_t i = 0; i < num_fields; i++) {
@@ -3959,8 +3953,8 @@
     return Api::Success();
   }
   *peer = NULL;
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(arg_index);
   if (RawObject::IsStringClassId(obj.GetClassId())) {
     return Api::NewHandle(isolate, obj.raw());
@@ -3984,8 +3978,8 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   Isolate* isolate = arguments->isolate();
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(index);
   intptr_t cid = obj.GetClassId();
   if (cid == kSmiCid) {
@@ -4041,8 +4035,8 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   Isolate* isolate = arguments->isolate();
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(index);
   intptr_t cid = obj.GetClassId();
   if (cid == kDoubleCid) {
@@ -4181,9 +4175,9 @@
                                         Dart_Handle source,
                                         intptr_t line_offset,
                                         intptr_t col_offset) {
-  TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  TIMERSCOPE(isolate, time_script_loading);
   const String& url_str = Api::UnwrapStringHandle(isolate, url);
   if (url_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, url, String);
@@ -4229,7 +4223,7 @@
                                                     intptr_t buffer_len) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
-  TIMERSCOPE(time_script_loading);
+  TIMERSCOPE(isolate, time_script_loading);
   if (buffer == NULL) {
     RETURN_NULL_ERROR(buffer);
   }
@@ -4409,9 +4403,9 @@
 
 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
                                          Dart_Handle source) {
-  TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  TIMERSCOPE(isolate, time_script_loading);
   const String& url_str = Api::UnwrapStringHandle(isolate, url);
   if (url_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, url, String);
@@ -4501,9 +4495,9 @@
 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
                                         Dart_Handle url,
                                         Dart_Handle source) {
-  TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  TIMERSCOPE(isolate, time_script_loading);
   const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
   if (lib.IsNull()) {
     RETURN_TYPE_ERROR(isolate, library, Library);
@@ -4531,9 +4525,9 @@
 DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library,
                                               Dart_Handle url,
                                               Dart_Handle patch_source) {
-  TIMERSCOPE(time_script_loading);
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
+  TIMERSCOPE(isolate, time_script_loading);
   const Library& lib = Api::UnwrapLibraryHandle(isolate, library);
   if (lib.IsNull()) {
     RETURN_TYPE_ERROR(isolate, library, Library);
@@ -4580,8 +4574,8 @@
   }
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = Api::UnwrapHandle(object);
   if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) {
     const char* msg =
@@ -4600,8 +4594,8 @@
 DART_EXPORT Dart_Handle Dart_SetPeer(Dart_Handle object, void* peer) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  ReusableObjectHandleScope reused_obj_handle(isolate);
-  Object& obj = reused_obj_handle.Handle();
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Object& obj = isolate->ObjectHandle();
   obj = Api::UnwrapHandle(object);
   if (obj.IsNull() || obj.IsNumber() || obj.IsBool()) {
     const char* msg =
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 4cd09d8..62c9e6d 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1794,7 +1794,8 @@
         Dart_TypedData_kUint8,
         data,
         ARRAY_SIZE(data));
-    Dart_NewWeakPersistentHandle(obj, &peer, ExternalTypedDataFinalizer);
+    Dart_NewWeakPersistentHandle(
+        obj, &peer, sizeof(data), ExternalTypedDataFinalizer);
     EXPECT_VALID(obj);
     Dart_ExitScope();
   }
@@ -1849,7 +1850,8 @@
   {
     Dart_Handle lcl = Dart_NewExternalTypedData(
         Dart_TypedData_kFloat32x4, data, 10);
-    Dart_NewWeakPersistentHandle(lcl, &peer, ExternalTypedDataFinalizer);
+    Dart_NewWeakPersistentHandle(
+        lcl, &peer, sizeof(data), ExternalTypedDataFinalizer);
     CheckFloat32x4Data(lcl);
   }
   Dart_ExitScope();
@@ -2037,11 +2039,11 @@
 TEST_CASE(WeakPersistentHandle) {
   Dart_Handle local_new_ref = Dart_Null();
   Dart_WeakPersistentHandle weak_new_ref = Dart_NewWeakPersistentHandle(
-      local_new_ref, NULL, NULL);
+      local_new_ref, NULL, 0, NULL);
 
   Dart_Handle local_old_ref = Dart_Null();
   Dart_WeakPersistentHandle weak_old_ref = Dart_NewWeakPersistentHandle(
-      local_old_ref, NULL, NULL);
+      local_old_ref, NULL, 0, NULL);
 
   {
     Dart_EnterScope();
@@ -2060,12 +2062,12 @@
     }
 
     // Create a weak ref to the new space object.
-    weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, NULL);
+    weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak_new_ref));
     EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
 
     // Create a weak ref to the old space object.
-    weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, NULL);
+    weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak_old_ref));
     EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
 
@@ -2157,7 +2159,7 @@
     Dart_EnterScope();
     Dart_Handle obj = NewString("new string");
     EXPECT_VALID(obj);
-    weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
+    weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
                                             WeakPersistentHandlePeerFinalizer);
     EXPECT_VALID(AsHandle(weak_ref));
     EXPECT(peer == 0);
@@ -2179,7 +2181,7 @@
     Dart_EnterScope();
     Dart_Handle obj = NewString("new string");
     EXPECT_VALID(obj);
-    weak_ref = Dart_NewWeakPersistentHandle(obj, &peer,
+    weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
                                             WeakPersistentHandlePeerFinalizer);
     Dart_ExitScope();
   }
@@ -2202,12 +2204,148 @@
   int peer = 1234;
   Dart_NewWeakPersistentHandle(ref,
                                &peer,
+                               0,
                                WeakPersistentHandlePeerFinalizer);
   Dart_ShutdownIsolate();
   EXPECT(peer == 42);
 }
 
 
+TEST_CASE(WeakPersistentHandleExternalAllocationSize) {
+  Heap* heap = Isolate::Current()->heap();
+  EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+  Dart_WeakPersistentHandle weak1 = NULL;
+  static const intptr_t kWeak1ExternalSize = 1 * KB;
+  {
+    Dart_EnterScope();
+    Dart_Handle obj = NewString("weakly referenced string");
+    EXPECT_VALID(obj);
+    weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize, NULL);
+    EXPECT_VALID(AsHandle(weak1));
+    EXPECT(!Dart_IsPrologueWeakPersistentHandle(weak1));
+    Dart_ExitScope();
+  }
+  Dart_PersistentHandle strong_ref = NULL;
+  Dart_WeakPersistentHandle weak2 = NULL;
+  static const intptr_t kWeak2ExternalSize = 2 * KB;
+  {
+    Dart_EnterScope();
+    Dart_Handle obj = NewString("strongly referenced string");
+    EXPECT_VALID(obj);
+    strong_ref = Dart_NewPersistentHandle(obj);
+    weak2 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak2ExternalSize, NULL);
+    EXPECT_VALID(AsHandle(strong_ref));
+    Dart_ExitScope();
+  }
+  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+  EXPECT(heap->ExternalInWords(Heap::kNew) ==
+         (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize);
+  // Collect weakly referenced string, and promote strongly referenced string.
+  GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
+  GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
+  EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak2ExternalSize / kWordSize);
+  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
+  Dart_DeleteWeakPersistentHandle(isolate, weak1);
+  Dart_DeleteWeakPersistentHandle(isolate, weak2);
+  Dart_DeletePersistentHandle(strong_ref);
+  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+}
+
+
+TEST_CASE(PrologueWeakPersistentHandleExternalAllocationSize) {
+  Heap* heap = Isolate::Current()->heap();
+  EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+  Dart_WeakPersistentHandle pwph = NULL;
+  static const intptr_t kWeakExternalSize = 1 * KB;
+  {
+    Dart_EnterScope();
+    Dart_Handle obj = NewString("a string");
+    EXPECT_VALID(obj);
+    pwph = Dart_NewPrologueWeakPersistentHandle(
+        obj, NULL, kWeakExternalSize, NULL);
+    EXPECT_VALID(AsHandle(pwph));
+    Dart_ExitScope();
+  }
+  EXPECT(heap->ExternalInWords(Heap::kNew) == kWeakExternalSize / kWordSize);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+  // Promoting the string should transfer the external size to old.
+  GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
+  GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
+  EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == kWeakExternalSize / kWordSize);
+  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+}
+
+
+TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) {
+  Heap* heap = Isolate::Current()->heap();
+  Dart_WeakPersistentHandle weak1 = NULL;
+  const intptr_t kWeak1ExternalSize = 100 * MB;
+  {
+    Dart_EnterScope();
+    Dart_Handle obj = NewString("weakly referenced string");
+    EXPECT_VALID(obj);
+    weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize, NULL);
+    EXPECT_VALID(AsHandle(weak1));
+    // While new space is "full" of external data, any allocation will
+    // trigger GC, so after two of them, obj should be promoted.
+    Dart_Handle trigger1 = NewString("trigger1");
+    EXPECT_VALID(trigger1);
+    Dart_Handle trigger2 = NewString("trigger2");
+    EXPECT_VALID(trigger2);
+    {
+      DARTSCOPE(Isolate::Current());
+      String& handle = String::Handle();
+      handle ^= Api::UnwrapHandle(obj);
+      EXPECT(handle.IsOld());
+    }
+    EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
+    EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak1ExternalSize / kWordSize);
+    Dart_ExitScope();
+  }
+  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
+  Dart_DeleteWeakPersistentHandle(isolate, weak1);
+  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+}
+
+
+TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) {
+  Heap* heap = Isolate::Current()->heap();
+  Dart_WeakPersistentHandle weak1 = NULL;
+  static const intptr_t kWeak1ExternalSize = 1 * KB;
+  Dart_WeakPersistentHandle weak2 = NULL;
+  static const intptr_t kWeak2ExternalSize = 2 * KB;
+  {
+    Dart_EnterScope();
+    Dart_Handle dart_null = Dart_Null();  // VM heap object.
+    EXPECT_VALID(dart_null);
+    weak1 = Dart_NewWeakPersistentHandle(
+        dart_null, NULL, kWeak1ExternalSize, NULL);
+    EXPECT_VALID(AsHandle(weak1));
+    Dart_Handle zero = Dart_NewInteger(0);  // Smi.
+    EXPECT_VALID(dart_null);
+    weak2 = Dart_NewWeakPersistentHandle(
+        zero, NULL, kWeak2ExternalSize, NULL);
+    EXPECT_VALID(AsHandle(weak2));
+    // Both should be charged to old space.
+    EXPECT(heap->ExternalInWords(Heap::kOld) ==
+           (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize);
+    Dart_ExitScope();
+  }
+  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
+  Dart_DeleteWeakPersistentHandle(isolate, weak1);
+  Dart_DeleteWeakPersistentHandle(isolate, weak2);
+  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+  EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+}
+
+
 TEST_CASE(ObjectGroups) {
   Dart_PersistentHandle strong = NULL;
   Dart_WeakPersistentHandle strong_weak = NULL;
@@ -2225,31 +2363,31 @@
     Dart_Handle local = Api::NewHandle(
         isolate, String::New("strongly reachable", Heap::kOld));
     strong = Dart_NewPersistentHandle(local);
-    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
+    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL);
     EXPECT_VALID(AsHandle(strong));
     EXPECT(!Dart_IsNull(AsHandle(strong)));
 
     weak1 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak1));
     EXPECT(!Dart_IsNull(AsHandle(weak1)));
 
     weak2 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak2));
     EXPECT(!Dart_IsNull(AsHandle(weak2)));
 
     weak3 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak3));
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
 
     weak4 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(weak4));
     EXPECT(!Dart_IsNull(AsHandle(weak4)));
   }
@@ -2442,13 +2580,13 @@
     new_pwph = Dart_NewPrologueWeakPersistentHandle(
         Api::NewHandle(isolate,
                        String::New("new space prologue weak", Heap::kNew)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(new_pwph));
     EXPECT(!Dart_IsNull(AsHandle(new_pwph)));
     old_pwph = Dart_NewPrologueWeakPersistentHandle(
         Api::NewHandle(isolate,
                        String::New("old space prologue weak", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT_VALID(AsHandle(old_pwph));
     EXPECT(!Dart_IsNull(AsHandle(old_pwph)));
   }
@@ -2530,7 +2668,7 @@
     Dart_Handle local = Api::NewHandle(
         isolate, String::New("strongly reachable", Heap::kOld));
     strong = Dart_NewPersistentHandle(local);
-    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
+    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL);
 
     EXPECT(!Dart_IsNull(AsHandle(strong)));
     EXPECT_VALID(AsHandle(strong));
@@ -2540,19 +2678,19 @@
 
     weak1 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak1)));
     EXPECT_VALID(AsHandle(weak1));
 
     weak2 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak2)));
     EXPECT_VALID(AsHandle(weak2));
 
     weak3 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     EXPECT_VALID(AsHandle(weak3));
   }
@@ -2636,7 +2774,7 @@
     Dart_Handle local = Api::NewHandle(
         isolate, String::New("strongly reachable", Heap::kOld));
     strong = Dart_NewPersistentHandle(local);
-    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, NULL);
+    strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL);
 
     EXPECT(!Dart_IsNull(AsHandle(strong)));
     EXPECT_VALID(AsHandle(strong));
@@ -2646,19 +2784,19 @@
 
     weak1 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak1)));
     EXPECT_VALID(AsHandle(weak1));
 
     weak2 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak2)));
     EXPECT_VALID(AsHandle(weak2));
 
     weak3 = Dart_NewWeakPersistentHandle(
         Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)),
-        NULL, NULL);
+        NULL, 0, NULL);
     EXPECT(!Dart_IsNull(AsHandle(weak3)));
     EXPECT_VALID(AsHandle(weak3));
   }
@@ -2732,6 +2870,10 @@
 static int global_epilogue_callback_status;
 
 
+static void EpilogueCallbackNOP() {
+}
+
+
 static void EpilogueCallbackTimes4() {
   global_epilogue_callback_status *= 4;
 }
@@ -2742,87 +2884,40 @@
 }
 
 
-TEST_CASE(AddGarbageCollectionCallbacks) {
-  // Add a prologue callback.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
+TEST_CASE(SetGarbageCollectionCallbacks) {
+  // GC callback addition testing.
 
-  // Add the same prologue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)));
+  // Add GC callbacks.
+  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
+                                   &EpilogueCallbackTimes4));
 
-  // Add another prologue callback.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
+  // Add the same callbacks again.  This is an error.
+  EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
+                                          &EpilogueCallbackTimes4)));
 
-  // Add the same prologue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)));
+  // Add another callback. This is an error.
+  EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes3,
+                                          &EpilogueCallbackTimes5)));
 
-  // Add an epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
+  // GC callback removal testing.
 
-  // Add the same epilogue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)));
+  // Remove GC callbacks.
+  EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
 
-  // Add annother epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
+  // Remove GC callbacks whennone exist.  This is an error.
+  EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL)));
 
-  // Add the same epilogue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)));
-}
-
-
-TEST_CASE(RemoveGarbageCollectionCallbacks) {
-  // Remove a prologue callback that has not been added.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
-
-  // Add a prologue callback.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
-
-  // Remove a prologue callback.
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
-
-  // Remove a prologue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
-
-  // Add two prologue callbacks.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
-
-  // Remove two prologue callbacks.
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3));
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
-
-  // Remove epilogue callbacks again.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
-
-  // Remove a epilogue callback that has not been added.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
-
-  // Add a epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Remove a epilogue callback.
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Remove a epilogue callback again.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
-
-  // Add two epilogue callbacks.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
-
-  // Remove two epilogue callbacks.
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5));
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Remove epilogue callbacks again.  This is an error.
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
-  EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
+  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
+                                   &EpilogueCallbackTimes4));
+  EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL)));
+  EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4)));
 }
 
 
 TEST_CASE(SingleGarbageCollectionCallback) {
   // Add a prologue callback.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
+  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
+                                   &EpilogueCallbackNOP));
 
   // Garbage collect new space ignoring callbacks.  This should not
   // invoke the prologue callback.  No status values should change.
@@ -2864,7 +2959,9 @@
   EXPECT_EQ(7, global_epilogue_callback_status);
 
   // Add an epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
+  EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
+  EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
+                                   &EpilogueCallbackTimes4));
 
   // Garbage collect new space.  This should not invoke the prologue
   // or the epilogue callback.  No status values should change.
@@ -2904,91 +3001,7 @@
   EXPECT_EQ(112, global_epilogue_callback_status);
 
   // Remove the prologue and epilogue callbacks
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Garbage collect old space.  No callbacks should be invoked.  No
-  // status values should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(3, global_prologue_callback_status);
-  EXPECT_EQ(7, global_epilogue_callback_status);
-}
-
-TEST_CASE(MultipleGarbageCollectionCallbacks) {
-  // Add prologue callbacks.
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
-  EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
-
-  // Add an epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Garbage collect new space.  This should not invoke the prologue
-  // or epilogue callbacks.  No status values should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
-  EXPECT_EQ(3, global_prologue_callback_status);
-  EXPECT_EQ(7, global_epilogue_callback_status);
-
-  // Garbage collect old space.  This should invoke both prologue
-  // callbacks and the epilogue callback.  The prologue and epilogue
-  // status values should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(18, global_prologue_callback_status);
-  EXPECT_EQ(28, global_epilogue_callback_status);
-
-  // Add another GC epilogue callback.
-  EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
-
-  // Garbage collect old space.  This should invoke both prologue
-  // callbacks and both epilogue callbacks.  The prologue and epilogue
-  // status values should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(18, global_prologue_callback_status);
-  EXPECT_EQ(140, global_epilogue_callback_status);
-
-  // Remove an epilogue callback.
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
-
-  // Garbage collect old space.  This should invoke both prologue
-  // callbacks and the remaining epilogue callback.  The prologue and
-  // epilogue status values should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(18, global_prologue_callback_status);
-  EXPECT_EQ(35, global_epilogue_callback_status);
-
-  // Remove the remaining epilogue callback.
-  EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5));
-
-  // Garbage collect old space.  This should invoke both prologue
-  // callbacks.  The prologue status value should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(18, global_prologue_callback_status);
-  EXPECT_EQ(7, global_epilogue_callback_status);
-
-  // Remove a prologue callback.
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3));
-
-  // Garbage collect old space.  This should invoke the remaining
-  // prologue callback.  The prologue status value should change.
-  global_prologue_callback_status = 3;
-  global_epilogue_callback_status = 7;
-  Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(6, global_prologue_callback_status);
-  EXPECT_EQ(7, global_epilogue_callback_status);
-
-  // Remove the remaining prologue callback.
-  EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
+  EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
 
   // Garbage collect old space.  No callbacks should be invoked.  No
   // status values should change.
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 1f63276..32593fa 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -8,6 +8,8 @@
 #include "include/dart_api.h"
 
 #include "platform/thread.h"
+#include "platform/utils.h"
+#include "vm/bitfield.h"
 #include "vm/dart_api_impl.h"
 #include "vm/flags.h"
 #include "vm/growable_array.h"
@@ -212,11 +214,70 @@
     return reinterpret_cast<Dart_WeakPersistentHandle>(this);
   }
 
+  void SetExternalSize(intptr_t size, Isolate* isolate) {
+    ASSERT(size >= 0);
+    set_external_size(Utils::RoundUp(size, kObjectAlignment));
+    if (SpaceForExternal() == Heap::kNew) {
+      SetExternalNewSpaceBit();
+    }
+    // TODO(koda): On repeated/large external allocations for existing objects,
+    // without any intervening normal allocation, GC will not trigger.
+    isolate->heap()->AllocateExternal(external_size(), SpaceForExternal());
+  }
+
+  // Called when the referent becomes unreachable.
+  void UpdateUnreachable(Isolate* isolate, bool is_prologue_weak) {
+    EnsureFreeExternal(isolate);
+    Finalize(isolate, this, is_prologue_weak);
+  }
+
+  // Called when the referent has moved, potentially between generations.
+  void UpdateRelocated(Isolate* isolate) {
+    if (IsSetNewSpaceBit() && (SpaceForExternal() == Heap::kOld)) {
+      isolate->heap()->FreeExternal(external_size(), Heap::kNew);
+      isolate->heap()->AllocateExternal(external_size(), Heap::kOld);
+      ClearExternalNewSpaceBit();
+    }
+  }
+
+  // Idempotent. Called when the handle is explicitly deleted or the
+  // referent becomes unreachable.
+  void EnsureFreeExternal(Isolate* isolate) {
+    isolate->heap()->FreeExternal(external_size(), SpaceForExternal());
+    set_external_size(0);
+  }
+
   static bool IsPrologueWeakPersistentHandle(Dart_WeakPersistentHandle handle) {
     uword addr = reinterpret_cast<uword>(handle);
     return (addr & kWeakPersistentTagMask) == kPrologueWeakPersistentTag;
   }
   static FinalizablePersistentHandle* Cast(Dart_WeakPersistentHandle handle);
+
+ private:
+  enum {
+    kWeakPersistentTag = 0,
+    kPrologueWeakPersistentTag = 1,
+    kWeakPersistentTagSize = 1,
+    kWeakPersistentTagMask = 1,
+  };
+
+  // This part of external_data_ is the number of externally allocated bytes.
+  // TODO(koda): Measure size in words instead.
+  class ExternalSizeBits : public BitField<intptr_t, 1, kBitsPerWord - 1> {};
+  // This bit of external_data_ is true if the referent was created in new
+  // space and UpdateRelocated has not yet detected any promotion.
+  class ExternalNewSpaceBit : public BitField<bool, 0, 1> {};
+  // TODO(koda): Use bitfield also for the prologue tag.
+
+  friend class FinalizablePersistentHandles;
+
+  FinalizablePersistentHandle()
+      : raw_(NULL),
+        peer_(NULL),
+        external_data_(0),
+        callback_(NULL) { }
+  ~FinalizablePersistentHandle() { }
+
   static void Finalize(Isolate* isolate,
                        FinalizablePersistentHandle* handle,
                        bool is_prologue_weak) {
@@ -233,19 +294,6 @@
     }
   }
 
- private:
-  enum {
-    kWeakPersistentTag = 0,
-    kPrologueWeakPersistentTag = 1,
-    kWeakPersistentTagSize = 1,
-    kWeakPersistentTagMask = 1,
-  };
-
-  friend class FinalizablePersistentHandles;
-
-  FinalizablePersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { }
-  ~FinalizablePersistentHandle() { }
-
   // Overload the raw_ field as a next pointer when adding freed
   // handles to the free list.
   FinalizablePersistentHandle* Next() {
@@ -263,11 +311,40 @@
   void Clear() {
     raw_ = Object::null();
     peer_ = NULL;
+    external_data_ = 0;
     callback_ = NULL;
   }
 
+  intptr_t external_size() const {
+    return ExternalSizeBits::decode(external_data_);
+  }
+
+  void set_external_size(intptr_t size) {
+    external_data_ = ExternalSizeBits::update(size, external_data_);
+  }
+
+  bool IsSetNewSpaceBit() const {
+    return ExternalNewSpaceBit::decode(external_data_);
+  }
+
+  void SetExternalNewSpaceBit() {
+    external_data_ = ExternalNewSpaceBit::update(true, external_data_);
+  }
+
+  void ClearExternalNewSpaceBit() {
+    external_data_ = ExternalNewSpaceBit::update(false, external_data_);
+  }
+
+  // Returns the space to charge for the external size.
+  Heap::Space SpaceForExternal() const {
+    // Non-heap and VM-heap objects count as old space here.
+    return (raw_->IsHeapObject() && raw_->IsNewObject()) ?
+           Heap::kNew : Heap::kOld;
+  }
+
   RawObject* raw_;
   void* peer_;
+  uword external_data_;
   Dart_WeakPersistentHandleFinalizer callback_;
   DISALLOW_ALLOCATION();  // Allocated through AllocateHandle methods.
   DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandle);
@@ -470,7 +547,7 @@
       handle = reinterpret_cast<FinalizablePersistentHandle*>(
           AllocateScopedHandle());
     }
-    handle->set_callback(NULL);
+    handle->Clear();
     return handle;
   }
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 00ea8f8..69fc769 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1474,6 +1474,7 @@
       (kind == RawFunction::kMethodExtractor) ||
       (kind == RawFunction::kNoSuchMethodDispatcher) ||
       (kind == RawFunction::kInvokeFieldDispatcher) ||
+      (kind == RawFunction::kInvokeClosureDispatcher) ||
       func.IsImplicitConstructor()) {
     return false;
   }
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 3e31cb2..80e217b 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -191,6 +191,7 @@
     case DeoptInstr::kInt64StackSlot:
     case DeoptInstr::kFloat32x4StackSlot:
     case DeoptInstr::kInt32x4StackSlot:
+    case DeoptInstr::kFloat64x2StackSlot:
     case DeoptInstr::kPp:
     case DeoptInstr::kCallerPp:
     case DeoptInstr::kMaterializedObjectRef:
@@ -201,6 +202,7 @@
     case DeoptInstr::kInt64FpuRegister:
     case DeoptInstr::kFloat32x4FpuRegister:
     case DeoptInstr::kInt32x4FpuRegister:
+    case DeoptInstr::kFloat64x2FpuRegister:
       // TODO(turnidge): Sometimes we encounter a deopt instruction
       // with a register source while deoptimizing frames during
       // debugging but we haven't saved our register set.  This
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index eca4dd4..3651210 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -1648,6 +1648,19 @@
             Print(",");
             PrintXmmRegister(rm);
             data += 2;
+          } else if (*data == 0xC6) {
+            int mod, regop, rm;
+            data++;
+            GetModRm(*data, &mod, &regop, &rm);
+            Print("shufpd ");
+            PrintXmmRegister(regop);
+            Print(",");
+            data += PrintRightXmmOperand(data);
+            int comparison = *data;
+            Print(" [");
+            PrintHex(comparison);
+            Print("]");
+            data++;
           } else {
               UNIMPLEMENTED();
           }
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index 40a0e45..3c751e5 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -1199,7 +1199,14 @@
   if (operand_size_ == 0x66) {
     // 0x66 0x0F prefix.
     int mod, regop, rm;
-    if (opcode == 0x3A) {
+    if (opcode == 0xC6) {
+      int mod, regop, rm;
+      get_modrm(*current, &mod, &regop, &rm);
+      AppendToBuffer("shufpd %s, ", NameOfXMMRegister(regop));
+      current += PrintRightXMMOperand(current);
+      AppendToBuffer(" [%x]", *current);
+      current++;
+    } else if (opcode == 0x3A) {
       uint8_t third_byte = *current;
       current = data + 3;
       if (third_byte == 0x17) {
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index be34899..98a774b 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -868,11 +868,10 @@
           (push != NULL) ||
           (drop != NULL) ||
           (constant != NULL)) {
-        intptr_t index;
-        Definition* result;
+        Definition* result = NULL;
         if (store != NULL) {
           // Update renaming environment.
-          index = store->local().BitIndexIn(num_non_copied_params_);
+          intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
           result = store->value()->definition();
 
           if (variable_liveness->IsStoreAlive(block_entry, store)) {
@@ -884,7 +883,7 @@
           // The graph construction ensures we do not have an unused LoadLocal
           // computation.
           ASSERT(definition->is_used());
-          index = load->local().BitIndexIn(num_non_copied_params_);
+          intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
           result = (*env)[index];
 
           PhiInstr* phi = result->AsPhi();
@@ -906,7 +905,10 @@
           for (intptr_t j = 0; j < drop->num_temps(); j++) {
             env->RemoveLast();
           }
-          result = drop->value()->definition();
+          if (drop->value() != NULL) {
+            result = drop->value()->definition();
+          }
+          ASSERT((drop->value() != NULL) || !drop->is_used());
         } else {
           ASSERT(definition->is_used());
           result = GetConstant(constant->value());
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 853034e..ae60f3f 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2106,34 +2106,19 @@
 
 
 void EffectGraphVisitor::VisitLetNode(LetNode* node) {
+  BuildLetTempExpressions(node);
+
+  // Visit body.
+  for (intptr_t i = 0; i < node->nodes().length(); ++i) {
+    EffectGraphVisitor for_effect(owner());
+    node->nodes()[i]->Visit(&for_effect);
+    Append(for_effect);
+  }
+
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
-    BuildLetTempExpressions(node);
-    // TODO(fschneider): Generate better code for effect context by visiting the
-    // body for effect. Currently, the value of the body expression is
-    // materialized and then dropped. This also requires changing DropTempsInstr
-    // to have zero or one inputs.
-
-    // Visit body.
-    for (intptr_t i = 0; i < node->nodes().length() - 1; ++i) {
-      EffectGraphVisitor for_effect(owner());
-      node->nodes()[i]->Visit(&for_effect);
-      Append(for_effect);
-    }
-    // Visit the last body expression for value.
-    ValueGraphVisitor for_value(owner());
-    node->nodes().Last()->Visit(&for_value);
-    Append(for_value);
-    Value* result_value = for_value.value();
     owner()->DeallocateTemps(num_temps);
-    Do(new DropTempsInstr(num_temps, result_value));
-  } else {
-    ASSERT(num_temps == 0);
-    for (intptr_t i = 0; i < node->nodes().length(); ++i) {
-      EffectGraphVisitor for_effect(owner());
-      node->nodes()[i]->Visit(&for_effect);
-      Append(for_effect);
-    }
+    Do(new DropTempsInstr(num_temps));
   }
 }
 
@@ -2277,35 +2262,13 @@
                                                        arguments);
   alloc->set_closure_function(function);
 
-  // Create fake fields for function and context. Only the context field is
-  // stored at the allocation to be used later when inlining a closure call.
-  const Field& function_field =
-      Field::ZoneHandle(
-          Field::New(Symbols::ClosureFunctionField(),
-          false,  // !static
-          true,  // final
-          false,  // !const
-          alloc->cls(),
-          0));  // No token position.
-  function_field.SetOffset(Closure::function_offset());
-  const Field& context_field =
-      Field::ZoneHandle(Field::New(
-          Symbols::ClosureContextField(),
-          false,  // !static
-          true,  // final
-          false,  // !const
-          alloc->cls(),
-          0));  // No token position.
-  context_field.SetOffset(Closure::context_offset());
-  alloc->set_context_field(context_field);
-
   Value* closure_val = Bind(alloc);
   { LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val);
     // Store function.
     Value* closure_tmp_val = Bind(new LoadLocalInstr(*closure_tmp_var));
     Value* func_val =
         Bind(new ConstantInstr(Function::ZoneHandle(function.raw())));
-    Do(new StoreInstanceFieldInstr(function_field,
+    Do(new StoreInstanceFieldInstr(Closure::function_offset(),
                                    closure_tmp_val,
                                    func_val,
                                    kEmitStoreBarrier));
@@ -2329,7 +2292,7 @@
         // Store new context in closure.
         closure_tmp_val = Bind(new LoadLocalInstr(*closure_tmp_var));
         context_tmp_val = Bind(new LoadLocalInstr(*context_tmp_var));
-        Do(new StoreInstanceFieldInstr(context_field,
+        Do(new StoreInstanceFieldInstr(Closure::context_offset(),
                                        closure_tmp_val,
                                        context_tmp_val,
                                        kEmitStoreBarrier));
@@ -2339,7 +2302,7 @@
       // Store current context in closure.
       closure_tmp_val = Bind(new LoadLocalInstr(*closure_tmp_var));
       Value* context = Bind(new CurrentContextInstr());
-      Do(new StoreInstanceFieldInstr(context_field,
+      Do(new StoreInstanceFieldInstr(Closure::context_offset(),
                                      closure_tmp_val,
                                      context,
                                      kEmitStoreBarrier));
@@ -3039,7 +3002,8 @@
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
       }
-      case MethodRecognizer::kObjectCid: {
+      case MethodRecognizer::kObjectCid:
+      case MethodRecognizer::kTypedListBaseCid: {
         Value* receiver = Bind(BuildLoadThisVar(node->scope()));
         LoadClassIdInstr* load = new LoadClassIdInstr(receiver);
         return ReturnDefinition(load);
@@ -3469,8 +3433,7 @@
         ASSERT(parameter.owner() == scope);
         if (parameter.is_captured()) {
           // Create a temporary local describing the original position.
-          const String& temp_name = String::ZoneHandle(String::Concat(
-              parameter.name(), String::Handle(Symbols::New("-orig"))));
+          const String& temp_name = Symbols::TempParam();
           LocalVariable* temp_local = new LocalVariable(
               0,  // Token index.
               temp_name,
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 0940572..137da67 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -581,6 +581,7 @@
           break;
         case kUnboxedFloat32x4:
         case kUnboxedInt32x4:
+        case kUnboxedFloat64x2:
           it.SetCurrentLocation(Location::QuadStackSlot(index));
           break;
         default:
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index dd8bc52..278f9bb 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -246,7 +246,7 @@
 
   static bool SupportsUnboxedMints();
   static bool SupportsSinCos();
-  static bool SupportsUnboxedFloat32x4();
+  static bool SupportsUnboxedSimd128();
 
   // Accessors.
   Assembler* assembler() const { return assembler_; }
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index c31dbaf..8a98431 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -44,7 +44,7 @@
 }
 
 
-bool FlowGraphCompiler::SupportsUnboxedFloat32x4() {
+bool FlowGraphCompiler::SupportsUnboxedSimd128() {
   return TargetCPUFeatures::neon_supported() && FLAG_enable_simd_inline;
 }
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index f540b32..436fd82 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -48,7 +48,7 @@
 }
 
 
-bool FlowGraphCompiler::SupportsUnboxedFloat32x4() {
+bool FlowGraphCompiler::SupportsUnboxedSimd128() {
   return FLAG_enable_simd_inline;
 }
 
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 42578b9..683a232 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -42,7 +42,7 @@
 }
 
 
-bool FlowGraphCompiler::SupportsUnboxedFloat32x4() {
+bool FlowGraphCompiler::SupportsUnboxedSimd128() {
   return false;
 }
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 871d955..638f612 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -44,7 +44,7 @@
 }
 
 
-bool FlowGraphCompiler::SupportsUnboxedFloat32x4() {
+bool FlowGraphCompiler::SupportsUnboxedSimd128() {
   return FLAG_enable_simd_inline;
 }
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 5424cd4..cc72cd6 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -675,20 +675,9 @@
       // TODO(fschneider): Avoid setting the context, if not needed.
       Definition* closure =
           closure_call->PushArgumentAt(0)->value()->definition();
-      AllocateObjectInstr* alloc =
-          closure_call->ArgumentAt(0)->AsAllocateObject();
-      Definition* context = NULL;
-      if ((alloc != NULL) && !alloc->closure_function().IsNull()) {
-        ASSERT(!alloc->context_field().IsNull());
-        context = new LoadFieldInstr(new Value(closure),
-                                     &alloc->context_field(),
-                                     Type::ZoneHandle());
-      } else {
-        context = new LoadFieldInstr(new Value(closure),
-                                     Closure::context_offset(),
-                                     Type::ZoneHandle());
-      }
-
+      Definition* context = new LoadFieldInstr(new Value(closure),
+                                               Closure::context_offset(),
+                                               Type::ZoneHandle());
       context->set_ssa_temp_index(caller_graph()->alloc_ssa_temp_index());
       context->InsertAfter(callee_entry);
       StoreContextInstr* set_context =
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index afa0bb9..5ee1e2f 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -48,7 +48,7 @@
 
 
 static bool ShouldInlineSimd() {
-  return FlowGraphCompiler::SupportsUnboxedFloat32x4();
+  return FlowGraphCompiler::SupportsUnboxedSimd128();
 }
 
 
@@ -1943,6 +1943,8 @@
         operands_type = kFloat32x4Cid;
       } else if (HasOnlyTwoOf(ic_data, kInt32x4Cid)) {
         operands_type = kInt32x4Cid;
+      } else if (HasOnlyTwoOf(ic_data, kFloat64x2Cid)) {
+        operands_type = kFloat64x2Cid;
       } else {
         return false;
       }
@@ -1958,6 +1960,8 @@
         operands_type = kDoubleCid;
       } else if (HasOnlyTwoOf(ic_data, kFloat32x4Cid)) {
         operands_type = kFloat32x4Cid;
+      } else if (HasOnlyTwoOf(ic_data, kFloat64x2Cid)) {
+        operands_type = kFloat64x2Cid;
       } else {
         return false;
       }
@@ -1968,6 +1972,8 @@
         operands_type = kDoubleCid;
       } else if (HasOnlyTwoOf(ic_data, kFloat32x4Cid)) {
         operands_type = kFloat32x4Cid;
+      } else if (HasOnlyTwoOf(ic_data, kFloat64x2Cid)) {
+        operands_type = kFloat64x2Cid;
       } else {
         return false;
       }
@@ -2063,6 +2069,8 @@
     return InlineFloat32x4BinaryOp(call, op_kind);
   } else if (operands_type == kInt32x4Cid) {
     return InlineInt32x4BinaryOp(call, op_kind);
+  } else if (operands_type == kFloat64x2Cid) {
+    return InlineFloat64x2BinaryOp(call, op_kind);
   } else if (op_kind == Token::kMOD) {
     ASSERT(operands_type == kSmiCid);
     if (right->IsConstant()) {
@@ -2333,6 +2341,29 @@
 }
 
 
+bool FlowGraphOptimizer::InlineFloat64x2Getter(InstanceCallInstr* call,
+                                               MethodRecognizer::Kind getter) {
+  AddCheckClass(call->ArgumentAt(0),
+                ICData::ZoneHandle(
+                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(),
+                call->env(),
+                call);
+  if ((getter == MethodRecognizer::kFloat64x2GetX) ||
+      (getter == MethodRecognizer::kFloat64x2GetY)) {
+    Simd64x2ShuffleInstr* instr = new Simd64x2ShuffleInstr(
+        getter,
+        new Value(call->ArgumentAt(0)),
+        0,
+        call->deopt_id());
+    ReplaceCall(call, instr);
+    return true;
+  }
+  UNREACHABLE();
+  return false;
+}
+
+
 bool FlowGraphOptimizer::InlineInt32x4Getter(InstanceCallInstr* call,
                                               MethodRecognizer::Kind getter) {
   if (!ShouldInlineSimd()) {
@@ -2471,6 +2502,37 @@
 }
 
 
+bool FlowGraphOptimizer::InlineFloat64x2BinaryOp(InstanceCallInstr* call,
+                                                 Token::Kind op_kind) {
+  if (!ShouldInlineSimd()) {
+    return false;
+  }
+  ASSERT(call->ArgumentCount() == 2);
+  Definition* left = call->ArgumentAt(0);
+  Definition* right = call->ArgumentAt(1);
+  // Type check left.
+  AddCheckClass(left,
+                ICData::ZoneHandle(
+                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                call->deopt_id(),
+                call->env(),
+                call);
+  // Type check right.
+  AddCheckClass(right,
+                ICData::ZoneHandle(
+                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                call->deopt_id(),
+                call->env(),
+                call);
+  // Replace call.
+  BinaryFloat64x2OpInstr* float64x2_bin_op =
+      new BinaryFloat64x2OpInstr(op_kind, new Value(left), new Value(right),
+                                 call->deopt_id());
+  ReplaceCall(call, float64x2_bin_op);
+  return true;
+}
+
+
 // Only unique implicit instance getters can be currently handled.
 bool FlowGraphOptimizer::TryInlineInstanceGetter(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
@@ -2863,6 +2925,10 @@
     return TryInlineInt32x4Method(call, recognized_kind);
   }
 
+  if ((class_ids[0] == kFloat64x2Cid) && (ic_data.NumberOfChecks() == 1)) {
+    return TryInlineFloat64x2Method(call, recognized_kind);
+  }
+
   if (recognized_kind == MethodRecognizer::kIntegerLeftShiftWithMask32) {
     ASSERT(call->ArgumentCount() == 3);
     ASSERT(ic_data.num_args_tested() == 2);
@@ -2958,6 +3024,46 @@
                                     call->deopt_id());
     ReplaceCall(call, cast);
     return true;
+  } else if (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2) {
+    Float64x2ToFloat32x4Instr* cast =
+        new Float64x2ToFloat32x4Instr(new Value(call->ArgumentAt(1)),
+                                      call->deopt_id());
+    ReplaceCall(call, cast);
+    return true;
+  }
+  return false;
+}
+
+
+bool FlowGraphOptimizer::TryInlineFloat64x2Constructor(
+    StaticCallInstr* call,
+    MethodRecognizer::Kind recognized_kind) {
+  if (!ShouldInlineSimd()) {
+    return false;
+  }
+  if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
+    Float64x2ZeroInstr* zero = new Float64x2ZeroInstr(call->deopt_id());
+    ReplaceCall(call, zero);
+    return true;
+  } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
+    Float64x2SplatInstr* splat =
+        new Float64x2SplatInstr(new Value(call->ArgumentAt(1)),
+                                call->deopt_id());
+    ReplaceCall(call, splat);
+    return true;
+  } else if (recognized_kind == MethodRecognizer::kFloat64x2Constructor) {
+    Float64x2ConstructorInstr* con =
+        new Float64x2ConstructorInstr(new Value(call->ArgumentAt(1)),
+                                      new Value(call->ArgumentAt(2)),
+                                      call->deopt_id());
+    ReplaceCall(call, con);
+    return true;
+  } else if (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4) {
+    Float32x4ToFloat64x2Instr* cast =
+        new Float32x4ToFloat64x2Instr(new Value(call->ArgumentAt(1)),
+                                    call->deopt_id());
+    ReplaceCall(call, cast);
+    return true;
   }
   return false;
 }
@@ -3144,6 +3250,63 @@
 }
 
 
+bool FlowGraphOptimizer::TryInlineFloat64x2Method(
+    InstanceCallInstr* call,
+    MethodRecognizer::Kind recognized_kind) {
+  if (!ShouldInlineSimd()) {
+    return false;
+  }
+  ASSERT(call->HasICData());
+  switch (recognized_kind) {
+    case MethodRecognizer::kFloat64x2GetX:
+    case MethodRecognizer::kFloat64x2GetY:
+      ASSERT(call->ic_data()->HasReceiverClassId(kFloat64x2Cid));
+      ASSERT(call->ic_data()->HasOneTarget());
+      return InlineFloat64x2Getter(call, recognized_kind);
+    case MethodRecognizer::kFloat64x2Negate:
+    case MethodRecognizer::kFloat64x2Abs:
+    case MethodRecognizer::kFloat64x2Sqrt:
+    case MethodRecognizer::kFloat64x2GetSignMask: {
+      Definition* left = call->ArgumentAt(0);
+      // Type check left.
+      AddCheckClass(left,
+                    ICData::ZoneHandle(
+                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    call->deopt_id(),
+                    call->env(),
+                    call);
+      Float64x2ZeroArgInstr* zeroArg =
+          new Float64x2ZeroArgInstr(recognized_kind, new Value(left),
+                                    call->deopt_id());
+      ReplaceCall(call, zeroArg);
+      return true;
+    }
+    case MethodRecognizer::kFloat64x2Scale:
+    case MethodRecognizer::kFloat64x2WithX:
+    case MethodRecognizer::kFloat64x2WithY:
+    case MethodRecognizer::kFloat64x2Min:
+    case MethodRecognizer::kFloat64x2Max: {
+      Definition* left = call->ArgumentAt(0);
+      Definition* right = call->ArgumentAt(1);
+      // Type check left.
+      AddCheckClass(left,
+                    ICData::ZoneHandle(
+                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    call->deopt_id(),
+                    call->env(),
+                    call);
+      Float64x2OneArgInstr* zeroArg =
+          new Float64x2OneArgInstr(recognized_kind, new Value(left),
+                                   new Value(right), call->deopt_id());
+      ReplaceCall(call, zeroArg);
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+
+
 bool FlowGraphOptimizer::TryInlineInt32x4Method(
     InstanceCallInstr* call,
     MethodRecognizer::Kind recognized_kind) {
@@ -3818,8 +3981,14 @@
     ReplaceCall(call, math_unary);
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
-             (recognized_kind == MethodRecognizer::kFloat32x4Constructor)) {
+             (recognized_kind == MethodRecognizer::kFloat32x4Constructor) ||
+             (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2)) {
     TryInlineFloat32x4Constructor(call, recognized_kind);
+  } else if ((recognized_kind == MethodRecognizer::kFloat64x2Constructor) ||
+             (recognized_kind == MethodRecognizer::kFloat64x2Zero) ||
+             (recognized_kind == MethodRecognizer::kFloat64x2Splat) ||
+             (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4)) {
+    TryInlineFloat64x2Constructor(call, recognized_kind);
   } else if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
     TryInlineInt32x4Constructor(call, recognized_kind);
   } else if (recognized_kind == MethodRecognizer::kObjectConstructor) {
@@ -4869,8 +5038,8 @@
   // All indexed load/stores alias each other.
   // TODO(vegorov): incorporate type of array into alias to disambiguate
   // different typed data and normal arrays.
-  static Alias Indexes() {
-    return Alias(kIndexesAlias, 0);
+  static Alias UnknownIndex(intptr_t id) {
+    return Alias(kUnknownIndexAlias, id);
   }
 
   static Alias ConstantIndex(intptr_t id) {
@@ -4889,10 +5058,9 @@
   // VMField load/stores alias each other when field offset matches.
   // TODO(vegorov) storing a context variable does not alias loading array
   // length.
-  static Alias VMField(intptr_t offset_in_bytes) {
-    ASSERT(offset_in_bytes >= 0);
-    const intptr_t idx = offset_in_bytes / kWordSize;
-    return Alias(kVMFieldAlias, idx);
+  static Alias VMField(intptr_t id) {
+    ASSERT(id != 0);
+    return Alias(kVMFieldAlias, id);
   }
 
   // Current context load/stores alias each other.
@@ -4927,7 +5095,7 @@
   enum Kind {
     kNoneAlias = -1,
     kCurrentContextAlias = 0,
-    kIndexesAlias = 1,
+    kUnknownIndexAlias = 1,
     kFieldAlias = 2,
     kVMFieldAlias = 3,
     kConstantIndex = 4,
@@ -5264,7 +5432,11 @@
         max_field_id_(0),
         field_ids_(),
         max_index_id_(0),
-        index_ids_() { }
+        index_ids_(),
+        max_unknown_index_id_(0),
+        unknown_index_ids_(),
+        max_vm_field_id_(0),
+        vm_field_ids_() { }
 
   Alias ComputeAlias(Place* place) {
     switch (place->kind()) {
@@ -5272,15 +5444,18 @@
         if (place->index()->IsConstant()) {
           const Object& index = place->index()->AsConstant()->value();
           if (index.IsSmi()) {
-            return Alias::ConstantIndex(GetIndexId(Smi::Cast(index).Value()));
+            return Alias::ConstantIndex(
+                GetInstanceIndexId(place->instance(),
+                                   Smi::Cast(index).Value()));
           }
         }
-        return Alias::Indexes();
+        return Alias::UnknownIndex(GetUnknownIndexId(place->instance()));
       case Place::kField:
         return Alias::Field(
             GetInstanceFieldId(place->instance(), place->field()));
       case Place::kVMField:
-        return Alias::VMField(place->offset_in_bytes());
+        return Alias::VMField(
+            GetInstanceVMFieldId(place->instance(), place->offset_in_bytes()));
       case Place::kContext:
         return Alias::CurrentContext();
       case Place::kNone:
@@ -5294,14 +5469,16 @@
   Alias ComputeAliasForStore(Instruction* instr) {
     StoreIndexedInstr* store_indexed = instr->AsStoreIndexed();
     if (store_indexed != NULL) {
+      Definition* instance = store_indexed->array()->definition();
       if (store_indexed->index()->definition()->IsConstant()) {
         const Object& index =
             store_indexed->index()->definition()->AsConstant()->value();
         if (index.IsSmi()) {
-          return Alias::ConstantIndex(GetIndexId(Smi::Cast(index).Value()));
+          return Alias::ConstantIndex(
+              GetInstanceIndexId(instance, Smi::Cast(index).Value()));
         }
       }
-      return Alias::Indexes();
+      return Alias::UnknownIndex(GetUnknownIndexId(instance));
     }
 
     StoreInstanceFieldInstr* store_instance_field =
@@ -5309,10 +5486,12 @@
     if (store_instance_field != NULL) {
       Definition* instance = store_instance_field->instance()->definition();
       if (!store_instance_field->field().IsNull()) {
-        return Alias::Field(GetInstanceFieldId(instance,
-                                               store_instance_field->field()));
+        return Alias::Field(
+            GetInstanceFieldId(instance, store_instance_field->field()));
       }
-      return Alias::VMField(store_instance_field->offset_in_bytes());
+      return Alias::VMField(
+          GetInstanceVMFieldId(instance,
+                               store_instance_field->offset_in_bytes()));
     }
 
     if (instr->IsStoreContext()) {
@@ -5342,27 +5521,32 @@
     }
   }
 
-  void EnsureAliasingForIndexes() {
-    BitVector* indexes = Get(Alias::Indexes());
-    if (indexes == NULL) {
-      return;
-    }
-
-    // Constant indexes alias all non-constant indexes.
-    // Non-constant indexes alias all constant indexes.
-    // First update alias set for const-indices, then
-    // update set for all indices. Ids start at 1.
-    for (intptr_t id = 1; id <= max_index_id_; id++) {
-      BitVector* const_indexes = Get(Alias::ConstantIndex(id));
-      if (const_indexes != NULL) {
-        const_indexes->AddAll(indexes);
+  void EnsureAliasingForUnknownIndices() {
+    // Ids start at 1 because the hash-map uses 0 for element not found.
+    for (intptr_t unknown_index_id = 1;
+         unknown_index_id <= max_unknown_index_id_;
+         unknown_index_id++) {
+      BitVector* unknown_index = Get(Alias::UnknownIndex(unknown_index_id));
+      if (unknown_index == NULL) {
+        return;
       }
-    }
 
-    for (intptr_t id = 1; id <= max_index_id_; id++) {
-      BitVector* const_indexes = Get(Alias::ConstantIndex(id));
-      if (const_indexes != NULL) {
-        indexes->AddAll(const_indexes);
+      // Constant indexes alias all non-constant indexes.
+      // Non-constant indexes alias all constant indexes.
+      // First update alias set for const-indices, then
+      // update set for all indices. Ids start at 1.
+      for (intptr_t id = 1; id <= max_index_id_; id++) {
+        BitVector* const_indexes = Get(Alias::ConstantIndex(id));
+        if (const_indexes != NULL) {
+          const_indexes->AddAll(unknown_index);
+        }
+      }
+
+      for (intptr_t id = 1; id <= max_index_id_; id++) {
+        BitVector* const_indexes = Get(Alias::ConstantIndex(id));
+        if (const_indexes != NULL) {
+          unknown_index->AddAll(const_indexes);
+        }
       }
     }
   }
@@ -5408,8 +5592,12 @@
   // some other SSA variable and false otherwise. Currently simply checks if
   // this value is stored in a field, escapes to another function or
   // participates in a phi.
-  static bool CanBeAliased(AllocateObjectInstr* alloc) {
-    if (alloc->identity() == AllocateObjectInstr::kUnknown) {
+  static bool CanBeAliased(Definition* alloc) {
+    ASSERT(alloc->IsAllocateObject() ||
+           alloc->IsCreateArray() ||
+           (alloc->IsStaticCall() &&
+            alloc->AsStaticCall()->IsRecognizedFactory()));
+    if (alloc->Identity() == kIdentityUnknown) {
       bool escapes = false;
       for (Value* use = alloc->input_use_list();
            use != NULL;
@@ -5429,11 +5617,10 @@
         }
       }
 
-      alloc->set_identity(escapes ? AllocateObjectInstr::kAliased
-                                  : AllocateObjectInstr::kNotAliased);
+      alloc->SetIdentity(escapes ? kIdentityAliased : kIdentityNotAliased);
     }
 
-    return alloc->identity() != AllocateObjectInstr::kNotAliased;
+    return alloc->Identity() != kIdentityNotAliased;
   }
 
  private:
@@ -5448,12 +5635,14 @@
     return id;
   }
 
-  intptr_t GetIndexId(intptr_t index) {
-    intptr_t id = index_ids_.Lookup(index);
+  intptr_t GetIndexId(intptr_t instance_id, intptr_t index) {
+    intptr_t id = index_ids_.Lookup(
+        ConstantIndexIdPair::Key(instance_id, index));
     if (id == 0) {
       // Zero is used to indicate element not found. The first id is one.
       id = ++max_index_id_;
-      index_ids_.Insert(IndexIdPair(index, id));
+      index_ids_.Insert(ConstantIndexIdPair(
+          ConstantIndexIdPair::Key(instance_id, index), id));
     }
     return id;
   }
@@ -5487,6 +5676,66 @@
     return GetFieldId(instance_id, field);
   }
 
+  intptr_t GetInstanceVMFieldId(Definition* defn, intptr_t offset) {
+    intptr_t instance_id = kAnyInstance;
+
+    ASSERT(defn != NULL);
+    if ((defn->IsAllocateObject() ||
+         defn->IsCreateArray() ||
+         (defn->IsStaticCall() &&
+          defn->AsStaticCall()->IsRecognizedFactory())) &&
+        !CanBeAliased(defn)) {
+      instance_id = defn->ssa_temp_index();
+      ASSERT(instance_id != kAnyInstance);
+    }
+
+    intptr_t id = vm_field_ids_.Lookup(VMFieldIdPair::Key(instance_id, offset));
+    if (id == 0) {
+      id = ++max_vm_field_id_;
+      vm_field_ids_.Insert(
+          VMFieldIdPair(VMFieldIdPair::Key(instance_id, offset), id));
+    }
+    return id;
+  }
+
+  intptr_t GetInstanceIndexId(Definition* defn, intptr_t index) {
+    intptr_t instance_id = kAnyInstance;
+
+    ASSERT(defn != NULL);
+    if ((defn->IsCreateArray() ||
+         (defn->IsStaticCall() &&
+          defn->AsStaticCall()->IsRecognizedFactory())) &&
+        !CanBeAliased(defn)) {
+      instance_id = defn->ssa_temp_index();
+      ASSERT(instance_id != kAnyInstance);
+    }
+
+    return GetIndexId(instance_id, index);
+  }
+
+  intptr_t GetUnknownIndexId(Definition* defn) {
+    intptr_t instance_id = kAnyInstance;
+
+    ASSERT(defn != NULL);
+    if ((defn->IsCreateArray() ||
+         (defn->IsStaticCall() &&
+          defn->AsStaticCall()->IsRecognizedFactory())) &&
+        !CanBeAliased(defn)) {
+      instance_id = defn->ssa_temp_index();
+      ASSERT(instance_id != kAnyInstance);
+    }
+
+    intptr_t id = unknown_index_ids_.Lookup(
+        UnknownIndexIdPair::Key(instance_id));
+    if (id == 0) {
+      // Zero is used to indicate element not found. The first id is one.
+      id = ++max_unknown_index_id_;
+      unknown_index_ids_.Insert(
+          UnknownIndexIdPair(UnknownIndexIdPair::Key(instance_id), id));
+    }
+    return id;
+  }
+
   // Get or create an identifier for a static field.
   intptr_t GetStaticFieldId(const Field& field) {
     ASSERT(field.is_static());
@@ -5560,27 +5809,63 @@
     Value value_;
   };
 
-  class IndexIdPair {
+  class ConstantIndexIdPair {
    public:
-    typedef intptr_t Key;
+    struct Key {
+      Key(intptr_t instance_id, intptr_t index)
+          : instance_id_(instance_id), index_(index) { }
+
+      intptr_t instance_id_;
+      intptr_t index_;
+    };
     typedef intptr_t Value;
-    typedef IndexIdPair Pair;
+    typedef ConstantIndexIdPair Pair;
 
-    IndexIdPair(Key key, Value value) : key_(key), value_(value) { }
+    ConstantIndexIdPair(Key key, Value value) : key_(key), value_(value) { }
 
-    static Key KeyOf(IndexIdPair kv) {
+    static Key KeyOf(ConstantIndexIdPair kv) {
       return kv.key_;
     }
 
-    static Value ValueOf(IndexIdPair kv) {
+    static Value ValueOf(ConstantIndexIdPair kv) {
       return kv.value_;
     }
 
     static intptr_t Hashcode(Key key) {
-      return key;
+      return (key.instance_id_ + 1) * 1024 + key.index_;
     }
 
-    static inline bool IsKeyEqual(IndexIdPair kv, Key key) {
+    static inline bool IsKeyEqual(ConstantIndexIdPair kv, Key key) {
+      return (KeyOf(kv).index_ == key.index_)
+          && (KeyOf(kv).instance_id_ == key.instance_id_);
+    }
+
+   private:
+    Key key_;
+    Value value_;
+  };
+
+  class UnknownIndexIdPair {
+   public:
+    typedef intptr_t Key;
+    typedef intptr_t Value;
+    typedef UnknownIndexIdPair Pair;
+
+    UnknownIndexIdPair(Key key, Value value) : key_(key), value_(value) { }
+
+    static Key KeyOf(UnknownIndexIdPair kv) {
+      return kv.key_;
+    }
+
+    static Value ValueOf(UnknownIndexIdPair kv) {
+      return kv.value_;
+    }
+
+    static intptr_t Hashcode(Key key) {
+      return key + 1;
+    }
+
+    static inline bool IsKeyEqual(UnknownIndexIdPair kv, Key key) {
       return KeyOf(kv) == key;
     }
 
@@ -5589,6 +5874,43 @@
     Value value_;
   };
 
+  class VMFieldIdPair {
+   public:
+    struct Key {
+      Key(intptr_t instance_id, intptr_t offset)
+          : instance_id_(instance_id), offset_(offset) { }
+
+      intptr_t instance_id_;
+      intptr_t offset_;
+    };
+
+    typedef intptr_t Value;
+    typedef VMFieldIdPair Pair;
+
+    VMFieldIdPair(Key key, Value value) : key_(key), value_(value) { }
+
+    static Key KeyOf(Pair kv) {
+      return kv.key_;
+    }
+
+    static Value ValueOf(Pair kv) {
+      return kv.value_;
+    }
+
+    static intptr_t Hashcode(Key key) {
+      return (key.instance_id_ + 1) * 1024 + key.offset_;
+    }
+
+    static inline bool IsKeyEqual(Pair kv, Key key) {
+      return (KeyOf(kv).offset_ == key.offset_) &&
+          (KeyOf(kv).instance_id_ == key.instance_id_);
+    }
+
+   private:
+    Key key_;
+    Value value_;
+  };
+
   const ZoneGrowableArray<Place*>& places_;
 
   const PhiPlaceMoves* phi_moves_;
@@ -5604,7 +5926,13 @@
   DirectChainedHashMap<FieldIdPair> field_ids_;
 
   intptr_t max_index_id_;
-  DirectChainedHashMap<IndexIdPair> index_ids_;
+  DirectChainedHashMap<ConstantIndexIdPair> index_ids_;
+
+  intptr_t max_unknown_index_id_;
+  DirectChainedHashMap<UnknownIndexIdPair> unknown_index_ids_;
+
+  intptr_t max_vm_field_id_;
+  DirectChainedHashMap<VMFieldIdPair> vm_field_ids_;
 };
 
 
@@ -5739,7 +6067,7 @@
     aliased_set->AddRepresentative(place);
   }
 
-  aliased_set->EnsureAliasingForIndexes();
+  aliased_set->EnsureAliasingForUnknownIndices();
 
   return aliased_set;
 }
@@ -7735,6 +8063,58 @@
 }
 
 
+void ConstantPropagator::VisitSimd64x2Shuffle(Simd64x2ShuffleInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitBinaryFloat64x2Op(BinaryFloat64x2OpInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat32x4ToFloat64x2(
+    Float32x4ToFloat64x2Instr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2ToFloat32x4(
+    Float64x2ToFloat32x4Instr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2Zero(
+    Float64x2ZeroInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2Splat(
+    Float64x2SplatInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2Constructor(
+    Float64x2ConstructorInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2ZeroArg(Float64x2ZeroArgInstr* instr) {
+  // TODO(johnmccutchan): Implement constant propagation.
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitFloat64x2OneArg(Float64x2OneArgInstr* instr) {
+  // TODO(johnmccutchan): Implement constant propagation.
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitMathUnary(MathUnaryInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsNonConstant(value)) {
@@ -8491,7 +8871,7 @@
         }
 
         // All sinking candidate are known to be not aliased.
-        alloc->set_identity(AllocateObjectInstr::kNotAliased);
+        alloc->SetIdentity(kIdentityNotAliased);
 
         candidates.Add(alloc);
       }
@@ -8556,15 +8936,15 @@
 }
 
 
-// Add the given field to the list of fields if it is not yet present there.
-static void AddField(ZoneGrowableArray<const Field*>* fields,
-                     const Field& field) {
-  for (intptr_t i = 0; i < fields->length(); i++) {
-    if ((*fields)[i]->raw() == field.raw()) {
+// Add a field/offset to the list of fields if it is not yet present there.
+static void AddSlot(ZoneGrowableArray<const Object*>* slots,
+                    const Object& slot) {
+  for (intptr_t i = 0; i < slots->length(); i++) {
+    if ((*slots)[i]->raw() == slot.raw()) {
       return;
     }
   }
-  fields->Add(&field);
+  slots->Add(&slot);
 }
 
 
@@ -8588,22 +8968,25 @@
     Instruction* exit,
     AllocateObjectInstr* alloc,
     const Class& cls,
-    const ZoneGrowableArray<const Field*>& fields) {
+    const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new ZoneGrowableArray<Value*>(fields.length());
+      new ZoneGrowableArray<Value*>(slots.length());
 
   // Insert load instruction for every field.
-  for (intptr_t i = 0; i < fields.length(); i++) {
-    const Field* field = fields[i];
-    LoadFieldInstr* load = new LoadFieldInstr(new Value(alloc),
-                                              field,
-                                              AbstractType::ZoneHandle());
+  for (intptr_t i = 0; i < slots.length(); i++) {
+    LoadFieldInstr* load = slots[i]->IsField()
+        ? new LoadFieldInstr(new Value(alloc),
+                             &Field::Cast(*slots[i]),
+                             AbstractType::ZoneHandle())
+        : new LoadFieldInstr(new Value(alloc),
+                             Smi::Cast(*slots[i]).Value(),
+                             AbstractType::ZoneHandle());
     flow_graph_->InsertBefore(
         exit, load, NULL, Definition::kValue);
     values->Add(new Value(load));
   }
 
-  MaterializeObjectInstr* mat = new MaterializeObjectInstr(cls, fields, values);
+  MaterializeObjectInstr* mat = new MaterializeObjectInstr(cls, slots, values);
   flow_graph_->InsertBefore(exit, mat, NULL, Definition::kValue);
 
   // Replace all mentions of this allocation with a newly inserted
@@ -8628,29 +9011,24 @@
 
 void AllocationSinking::InsertMaterializations(AllocateObjectInstr* alloc) {
   // Collect all fields that are written for this instance.
-  ZoneGrowableArray<const Field*>* fields =
-      new ZoneGrowableArray<const Field*>(5);
+  ZoneGrowableArray<const Object*>* slots =
+      new ZoneGrowableArray<const Object*>(5);
 
   for (Value* use = alloc->input_use_list();
        use != NULL;
        use = use->next_use()) {
-    ASSERT(use->instruction()->IsStoreInstanceField());
-    AddField(fields, use->instruction()->AsStoreInstanceField()->field());
+    StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
+    if (!store->field().IsNull()) {
+      AddSlot(slots, store->field());
+    } else {
+      AddSlot(slots, Smi::ZoneHandle(Smi::New(store->offset_in_bytes())));
+    }
   }
 
   if (alloc->ArgumentCount() > 0) {
     ASSERT(alloc->ArgumentCount() == 1);
-    const String& name = String::Handle(Symbols::New(":type_args"));
-    const Field& type_args_field =
-        Field::ZoneHandle(Field::New(
-            name,
-            false,  // !static
-            false,  // !final
-            false,  // !const
-            alloc->cls(),
-            0));  // No token position.
-    type_args_field.SetOffset(alloc->cls().type_arguments_field_offset());
-    AddField(fields, type_args_field);
+    intptr_t type_args_offset = alloc->cls().type_arguments_field_offset();
+    AddSlot(slots, Smi::ZoneHandle(Smi::New(type_args_offset)));
   }
 
   // Collect all instructions that mention this object in the environment.
@@ -8663,7 +9041,7 @@
 
   // Insert materializations at environment uses.
   for (intptr_t i = 0; i < exits.length(); i++) {
-    CreateMaterializationAt(exits[i], alloc, alloc->cls(), *fields);
+    CreateMaterializationAt(exits[i], alloc, alloc->cls(), *slots);
   }
 }
 
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index f68f52b..9b8d841 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -111,10 +111,14 @@
   bool TryInlineInstanceMethod(InstanceCallInstr* call);
   bool TryInlineFloat32x4Constructor(StaticCallInstr* call,
                                      MethodRecognizer::Kind recognized_kind);
+  bool TryInlineFloat64x2Constructor(StaticCallInstr* call,
+                                     MethodRecognizer::Kind recognized_kind);
   bool TryInlineInt32x4Constructor(StaticCallInstr* call,
                                     MethodRecognizer::Kind recognized_kind);
   bool TryInlineFloat32x4Method(InstanceCallInstr* call,
                                 MethodRecognizer::Kind recognized_kind);
+  bool TryInlineFloat64x2Method(InstanceCallInstr* call,
+                                MethodRecognizer::Kind recognized_kind);
   bool TryInlineInt32x4Method(InstanceCallInstr* call,
                                MethodRecognizer::Kind recognized_kind);
   void ReplaceWithInstanceOf(InstanceCallInstr* instr);
@@ -208,12 +212,16 @@
 
   bool InlineFloat32x4Getter(InstanceCallInstr* call,
                              MethodRecognizer::Kind getter);
+  bool InlineFloat64x2Getter(InstanceCallInstr* call,
+                             MethodRecognizer::Kind getter);
   bool InlineInt32x4Getter(InstanceCallInstr* call,
                             MethodRecognizer::Kind getter);
   bool InlineFloat32x4BinaryOp(InstanceCallInstr* call,
                                Token::Kind op_kind);
   bool InlineInt32x4BinaryOp(InstanceCallInstr* call,
                               Token::Kind op_kind);
+  bool InlineFloat64x2BinaryOp(InstanceCallInstr* call,
+                               Token::Kind op_kind);
   void InlineImplicitInstanceGetter(InstanceCallInstr* call);
 
   RawBool* InstanceOfAsBool(const ICData& ic_data,
@@ -398,7 +406,7 @@
       Instruction* exit,
       AllocateObjectInstr* alloc,
       const Class& cls,
-      const ZoneGrowableArray<const Field*>& fields);
+      const ZoneGrowableArray<const Object*>& fields);
 
   FlowGraph* flow_graph_;
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index bbb4667..e83951c 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -1132,6 +1132,54 @@
 }
 
 
+CompileType Simd64x2ShuffleInstr::ComputeType() const {
+  if ((op_kind() == MethodRecognizer::kFloat64x2GetX) ||
+      (op_kind() == MethodRecognizer::kFloat64x2GetY)) {
+    return CompileType::FromCid(kDoubleCid);
+  }
+  UNREACHABLE();
+  return CompileType::FromCid(kDoubleCid);
+}
+
+
+CompileType Float64x2ZeroInstr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
+CompileType Float64x2SplatInstr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
+CompileType Float64x2ConstructorInstr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
+CompileType Float32x4ToFloat64x2Instr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
+CompileType Float64x2ToFloat32x4Instr::ComputeType() const {
+  return CompileType::FromCid(kFloat32x4Cid);
+}
+
+
+CompileType Float64x2ZeroArgInstr::ComputeType() const {
+  if (op_kind() == MethodRecognizer::kFloat64x2GetSignMask) {
+    return CompileType::Int();
+  }
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
+CompileType Float64x2OneArgInstr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
 CompileType Int32x4BoolConstructorInstr::ComputeType() const {
   return CompileType::FromCid(kInt32x4Cid);
 }
@@ -1162,6 +1210,11 @@
 }
 
 
+CompileType BinaryFloat64x2OpInstr::ComputeType() const {
+  return CompileType::FromCid(kFloat64x2Cid);
+}
+
+
 CompileType MathUnaryInstr::ComputeType() const {
   return CompileType::FromCid(kDoubleCid);
 }
diff --git a/runtime/vm/gc_callbacks.h b/runtime/vm/gc_callbacks.h
deleted file mode 100644
index 1081fa8..0000000
--- a/runtime/vm/gc_callbacks.h
+++ /dev/null
@@ -1,111 +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.
-
-#ifndef VM_GC_CALLBACKS_H_
-#define VM_GC_CALLBACKS_H_
-
-#include "include/dart_api.h"
-#include "platform/utils.h"
-
-namespace dart {
-
-// A container for garbage collection callback function pointers.
-// Pointers to the callback methods are stored within linked list
-// nodes managed by the container.
-template<typename T>
-class GcCallbacks {
- public:
-  GcCallbacks() : head_(NULL) {
-  }
-
-  ~GcCallbacks() {
-    while (head_ != NULL) {
-      Link* prev = head_;
-      head_ = head_->next_;
-      delete prev;
-    }
-  }
-
-  // Adds a new callback to the list.  The new callback must not
-  // already be present in the list.
-  void Add(T callback) {
-    ASSERT(callback != NULL);
-    Link* link = new Link(callback, head_);
-    head_ = link;
-  }
-
-  // Removes a callback from the list.  The callback must be present
-  // in the list.
-  void Remove(T callback) {
-    ASSERT(callback != NULL);
-    if (head_ == NULL) return;
-    Link* prev = head_;
-    Link* curr = head_->next_;
-    if (prev->callback_ == callback) {
-      head_ = curr;
-      delete prev;
-      return;
-    }
-    while (curr != NULL) {
-      if (curr->callback_ == callback) {
-        prev->next_ = curr->next_;
-        delete curr;
-        return;
-      }
-      prev = curr;
-      curr = curr->next_;
-    }
-  }
-
-  // Iterates through all of the callbacks in the list and invokes
-  // their callback methods.
-  void Invoke() const {
-    for (Link* curr = head_; curr != NULL; curr = curr->next_) {
-      (*curr->callback_)();
-    }
-  }
-
-  // Returns the number of callbacks stored in the list.
-  intptr_t Count() const {
-    intptr_t sum = 0;
-    for (Link* curr = head_; curr != NULL; curr = curr->next_) {
-      ++sum;
-    }
-    return sum;
-  }
-
-  // Returns true if the specified callback is present in the
-  // container.
-  bool Contains(T callback) const {
-    for (Link* curr = head_; curr != NULL; curr = curr->next_) {
-      if (curr->callback_ == callback) {
-        return true;
-      }
-    }
-    return false;
-  }
-
- private:
-  // A linked-list element.
-  struct Link {
-    Link(T callback, Link* next) : callback_(callback), next_(next) {
-    }
-    T callback_;
-    Link* next_;
-  };
-
-  Link* head_;
-};
-
-
-// A container for storing garbage collection prologue methods.
-class GcPrologueCallbacks : public GcCallbacks<Dart_GcPrologueCallback> {};
-
-
-// A container for storing garbage collection epilogue methods.
-class GcEpilogueCallbacks : public GcCallbacks<Dart_GcEpilogueCallback> {};
-
-};  // namespace dart
-
-#endif  // VM_GC_CALLBACKS_H_
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index a8ce1be..f0737bc 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -306,9 +306,7 @@
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     RawObject* raw_obj = handle->raw();
     if (IsUnreachable(raw_obj)) {
-      FinalizablePersistentHandle::Finalize(isolate(),
-                                            handle,
-                                            is_prologue_weak);
+      handle->UpdateUnreachable(isolate(), is_prologue_weak);
     }
   }
 
@@ -318,8 +316,8 @@
 
 
 void GCMarker::Prologue(Isolate* isolate, bool invoke_api_callbacks) {
-  if (invoke_api_callbacks) {
-    isolate->gc_prologue_callbacks().Invoke();
+  if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) {
+    (isolate->gc_prologue_callback())();
   }
   // The store buffers will be rebuilt as part of marking, reset them now.
   isolate->store_buffer()->Reset();
@@ -327,8 +325,8 @@
 
 
 void GCMarker::Epilogue(Isolate* isolate, bool invoke_api_callbacks) {
-  if (invoke_api_callbacks) {
-    isolate->gc_epilogue_callbacks().Invoke();
+  if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) {
+    (isolate->gc_epilogue_callback())();
   }
 }
 
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index e2e97c2..4348d6b 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -90,6 +90,23 @@
   return addr;
 }
 
+void Heap::AllocateExternal(intptr_t size, Space space) {
+  if (space == kNew) {
+    new_space_->AllocateExternal(size);
+  } else {
+    ASSERT(space == kOld);
+    old_space_->AllocateExternal(size);
+  }
+}
+
+void Heap::FreeExternal(intptr_t size, Space space) {
+  if (space == kNew) {
+    new_space_->FreeExternal(size);
+  } else {
+    ASSERT(space == kOld);
+    old_space_->FreeExternal(size);
+  }
+}
 
 bool Heap::Contains(uword addr) const {
   return new_space_->Contains(addr) ||
@@ -324,6 +341,10 @@
                          old_space_->CapacityInWords();
 }
 
+intptr_t Heap::ExternalInWords(Space space) const {
+  return space == kNew ? new_space_->ExternalInWords() :
+                         old_space_->ExternalInWords();
+}
 
 int64_t Heap::GCTimeInMicros(Space space) const {
   if (space == kNew) {
@@ -410,8 +431,10 @@
   stats_.before_.micros_ = OS::GetCurrentTimeMicros();
   stats_.before_.new_used_in_words_ = new_space_->UsedInWords();
   stats_.before_.new_capacity_in_words_ = new_space_->CapacityInWords();
+  stats_.before_.new_external_in_words_ = new_space_->ExternalInWords();
   stats_.before_.old_used_in_words_ = old_space_->UsedInWords();
   stats_.before_.old_capacity_in_words_ = old_space_->CapacityInWords();
+  stats_.before_.old_external_in_words_ = old_space_->ExternalInWords();
   stats_.times_[0] = 0;
   stats_.times_[1] = 0;
   stats_.times_[2] = 0;
@@ -435,8 +458,10 @@
   }
   stats_.after_.new_used_in_words_ = new_space_->UsedInWords();
   stats_.after_.new_capacity_in_words_ = new_space_->CapacityInWords();
+  stats_.after_.new_external_in_words_ = new_space_->ExternalInWords();
   stats_.after_.old_used_in_words_ = old_space_->UsedInWords();
   stats_.after_.old_capacity_in_words_ = old_space_->CapacityInWords();
+  stats_.after_.old_external_in_words_ = old_space_->ExternalInWords();
   ASSERT(gc_in_progress_);
   gc_in_progress_ = false;
 }
@@ -451,7 +476,7 @@
     OS::PrintErr("[    GC    |  space  | count | start | gc time | "
                  "new gen (KB) | old gen (KB) | timers | data ]\n"
                  "[ (isolate)| (reason)|       |  (s)  |   (ms)  | "
-                 " used , cap  |  used , cap  |  (ms)  |      ]\n");
+                 "used,cap,ext | used,cap,ext |  (ms)  |      ]\n");
   }
 
   const char* space_str = stats_.space_ == kNew ? "Scavenge" : "Mark-Sweep";
@@ -462,28 +487,34 @@
     "%.3f, "  // total time
     "%" Pd ", %" Pd ", "  // new gen: in use before/after
     "%" Pd ", %" Pd ", "  // new gen: capacity before/after
+    "%" Pd ", %" Pd ", "  // new gen: external before/after
     "%" Pd ", %" Pd ", "  // old gen: in use before/after
     "%" Pd ", %" Pd ", "  // old gen: capacity before/after
+    "%" Pd ", %" Pd ", "  // old gen: external before/after
     "%.3f, %.3f, %.3f, %.3f, "  // times
     "%" Pd ", %" Pd ", %" Pd ", %" Pd ", "  // data
     "]\n",  // End with a comma to make it easier to import in spreadsheets.
     isolate->main_port(), space_str, GCReasonToString(stats_.reason_),
     stats_.num_,
-    RoundMicrosecondsToSeconds(stats_.before_.micros_ - isolate->start_time()),
-    RoundMicrosecondsToMilliseconds(stats_.after_.micros_ -
+    MicrosecondsToSeconds(stats_.before_.micros_ - isolate->start_time()),
+    MicrosecondsToMilliseconds(stats_.after_.micros_ -
                                     stats_.before_.micros_),
     RoundWordsToKB(stats_.before_.new_used_in_words_),
     RoundWordsToKB(stats_.after_.new_used_in_words_),
     RoundWordsToKB(stats_.before_.new_capacity_in_words_),
     RoundWordsToKB(stats_.after_.new_capacity_in_words_),
+    RoundWordsToKB(stats_.before_.new_external_in_words_),
+    RoundWordsToKB(stats_.after_.new_external_in_words_),
     RoundWordsToKB(stats_.before_.old_used_in_words_),
     RoundWordsToKB(stats_.after_.old_used_in_words_),
     RoundWordsToKB(stats_.before_.old_capacity_in_words_),
     RoundWordsToKB(stats_.after_.old_capacity_in_words_),
-    RoundMicrosecondsToMilliseconds(stats_.times_[0]),
-    RoundMicrosecondsToMilliseconds(stats_.times_[1]),
-    RoundMicrosecondsToMilliseconds(stats_.times_[2]),
-    RoundMicrosecondsToMilliseconds(stats_.times_[3]),
+    RoundWordsToKB(stats_.before_.old_external_in_words_),
+    RoundWordsToKB(stats_.after_.old_external_in_words_),
+    MicrosecondsToMilliseconds(stats_.times_[0]),
+    MicrosecondsToMilliseconds(stats_.times_[1]),
+    MicrosecondsToMilliseconds(stats_.times_[2]),
+    MicrosecondsToMilliseconds(stats_.times_[3]),
     stats_.data_[0],
     stats_.data_[1],
     stats_.data_[2],
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 45d6963..7365714 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -102,6 +102,10 @@
     return 0;
   }
 
+  // Track external data.
+  void AllocateExternal(intptr_t size, Space space);
+  void FreeExternal(intptr_t size, Space space);
+
   // Heap contains the specified address.
   bool Contains(uword addr) const;
   bool NewContains(uword addr) const;
@@ -162,9 +166,10 @@
   // Print heap sizes.
   void PrintSizes() const;
 
-  // Return amount of memory used and capacity in a space.
+  // Return amount of memory used and capacity in a space, excluding external.
   intptr_t UsedInWords(Space space) const;
   intptr_t CapacityInWords(Space space) const;
+  intptr_t ExternalInWords(Space space) const;
   // Return the amount of GCing in microseconds.
   int64_t GCTimeInMicros(Space space) const;
 
@@ -234,6 +239,11 @@
 
   void PrintToJSONObject(Space space, JSONObject* object) const;
 
+  // The heap map is an array of sizes and class ids (except freelist is 0).
+  void PrintHeapMapToJSONStream(JSONStream* stream) const {
+    return old_space_->PrintHeapMapToJSONStream(stream);
+  }
+
  private:
   class GCStats : public ValueObject {
    public:
@@ -248,8 +258,10 @@
       int64_t micros_;
       intptr_t new_used_in_words_;
       intptr_t new_capacity_in_words_;
+      intptr_t new_external_in_words_;
       intptr_t old_used_in_words_;
       intptr_t old_capacity_in_words_;
+      intptr_t old_external_in_words_;
     private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 032e74b..a349017 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -312,8 +312,11 @@
 
 
 void DropTempsInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%" Pd ", ", num_temps());
-  value()->PrintTo(f);
+  f->Print("%" Pd "", num_temps());
+  if (value() != NULL) {
+    f->Print(", ");
+    value()->PrintTo(f);
+  }
 }
 
 
@@ -493,7 +496,7 @@
   f->Print("%s", String::Handle(cls_.Name()).ToCString());
   for (intptr_t i = 0; i < InputCount(); i++) {
     f->Print(", ");
-    f->Print("%s: ", String::Handle(fields_[i]->name()).ToCString());
+    f->Print("%s: ", slots_[i]->ToCString());
     InputAt(i)->PrintTo(f);
   }
 }
@@ -593,12 +596,21 @@
 }
 
 
+void BinaryFloat64x2OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+}
+
+
 void Simd32x4ShuffleInstr::PrintOperandsTo(BufferFormatter* f) const {
   // TODO(johnmccutchan): Add proper string enumeration of shuffle.
   f->Print("%s, ", MethodRecognizer::KindToCString(op_kind()));
   value()->PrintTo(f);
 }
 
+
 void Simd32x4ShuffleMixInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s, ", MethodRecognizer::KindToCString(op_kind()));
   xy()->PrintTo(f);
@@ -699,8 +711,59 @@
 }
 
 
+void Simd64x2ShuffleInstr::PrintOperandsTo(BufferFormatter* f) const {
+  // TODO(johnmccutchan): Add proper string enumeration of shuffle.
+  f->Print("%s, ", MethodRecognizer::KindToCString(op_kind()));
+  value()->PrintTo(f);
+}
 
 
+void Float64x2ZeroInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Float64x2.zero ");
+}
+
+
+void Float64x2SplatInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Float64x2.splat ");
+  value()->PrintTo(f);
+}
+
+
+void Float64x2ConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Float64x2(");
+  value0()->PrintTo(f);
+  f->Print(", ");
+  value1()->PrintTo(f);
+  f->Print(")");
+}
+
+
+void Float32x4ToFloat64x2Instr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Float64x2.fromFloat32x4 ");
+  left()->PrintTo(f);
+}
+
+
+void Float64x2ToFloat32x4Instr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Float32x4.fromFloat64x2 ");
+  left()->PrintTo(f);
+}
+
+
+void Float64x2ZeroArgInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", MethodRecognizer::KindToCString(op_kind()));
+  left()->PrintTo(f);
+}
+
+
+void Float64x2OneArgInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s(", MethodRecognizer::KindToCString(op_kind()));
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+  f->Print(")");
+}
+
 
 void Int32x4BoolConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("Int32x4.bool(");
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 9cc0d58..03aff85 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -5,6 +5,7 @@
 #include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM.
 #if defined(TARGET_ARCH_ARM)
 
+#include "vm/assembler.h"
 #include "vm/constants_arm.h"
 #include "vm/cpu.h"
 #include "vm/instructions.h"
@@ -33,6 +34,16 @@
 }
 
 
+int CallPattern::LengthInBytes() {
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    return 5 * Instr::kInstrSize;
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    return 3 * Instr::kInstrSize;
+  }
+}
+
+
 // Decodes a load sequence ending at 'end' (the last instruction of the load
 // sequence is the instruction before the one at end).  Returns a pointer to
 // the first instruction in the sequence.  Returns the register being loaded
@@ -69,17 +80,41 @@
   uword start = end - Instr::kInstrSize;
   int32_t instr = Instr::At(start)->InstructionBits();
   intptr_t imm = 0;
-  if ((instr & 0xfff00000) == 0xe3400000) {  // movt reg, #imm_hi
-    imm |= (instr & 0xf0000) << 12;
-    imm |= (instr & 0xfff) << 16;
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    ASSERT((instr & 0xfff00000) == 0xe3800000);  // orr rd, rd, byte0
+    imm |= (instr & 0x000000ff);
+
     start -= Instr::kInstrSize;
     instr = Instr::At(start)->InstructionBits();
+    ASSERT((instr & 0xfff00000) == 0xe3800c00);  // orr rd, rd, (byte1 rot 12)
+    imm |= (instr & 0x000000ff);
+
+    start -= Instr::kInstrSize;
+    instr = Instr::At(start)->InstructionBits();
+    ASSERT((instr & 0xfff00f00) == 0xe3800800);  // orr rd, rd, (byte2 rot 8)
+    imm |= (instr & 0x000000ff);
+
+    start -= Instr::kInstrSize;
+    instr = Instr::At(start)->InstructionBits();
+    ASSERT((instr & 0xffff0f00) == 0xe3a00400);  // mov rd, (byte3 rot 4)
+    imm |= (instr & 0x000000ff);
+
+    *reg = static_cast<Register>((instr & 0x0000f000) >> 12);
+    *value = imm;
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    if ((instr & 0xfff00000) == 0xe3400000) {  // movt reg, #imm_hi
+      imm |= (instr & 0xf0000) << 12;
+      imm |= (instr & 0xfff) << 16;
+      start -= Instr::kInstrSize;
+      instr = Instr::At(start)->InstructionBits();
+    }
+    ASSERT((instr & 0xfff00000) == 0xe3000000);  // movw reg, #imm_lo
+    imm |= (instr & 0xf0000) >> 4;
+    imm |= instr & 0xfff;
+    *reg = static_cast<Register>((instr & 0xf000) >> 12);
+    *value = imm;
   }
-  ASSERT((instr & 0xfff00000) == 0xe3000000);  // movw reg, #imm_lo
-  imm |= (instr & 0xf0000) >> 4;
-  imm |= instr & 0xfff;
-  *reg = static_cast<Register>((instr & 0xf000) >> 12);
-  *value = imm;
   return start;
 }
 
@@ -168,49 +203,138 @@
 
 
 void CallPattern::InsertAt(uword pc, uword target_address) {
-  uint16_t target_lo = target_address & 0xffff;
-  uint16_t target_hi = target_address >> 16;
-  uword movw_ip = 0xe300c000 | ((target_lo >> 12) << 16) | (target_lo & 0xfff);
-  uword movt_ip = 0xe340c000 | ((target_hi >> 12) << 16) | (target_hi & 0xfff);
-  uword blx_ip = 0xe12fff3c;
-  *reinterpret_cast<uword*>(pc + (0 * Instr::kInstrSize)) = movw_ip;
-  *reinterpret_cast<uword*>(pc + (1 * Instr::kInstrSize)) = movt_ip;
-  *reinterpret_cast<uword*>(pc + (2 * Instr::kInstrSize)) = blx_ip;
-  ASSERT(kFixedLengthInBytes == 3 * Instr::kInstrSize);
-  CPU::FlushICache(pc, kFixedLengthInBytes);
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    const uint32_t byte0 = (target_address & 0x000000ff);
+    const uint32_t byte1 = (target_address & 0x0000ff00) >> 8;
+    const uint32_t byte2 = (target_address & 0x00ff0000) >> 16;
+    const uint32_t byte3 = (target_address & 0xff000000) >> 24;
+
+    const uword mov_ip = 0xe3a0c400 | byte3;  // mov ip, (byte3 rot 4)
+    const uword or1_ip = 0xe38cc800 | byte2;  // orr ip, ip, (byte2 rot 8)
+    const uword or2_ip = 0xe38ccc00 | byte1;  // orr ip, ip, (byte1 rot 12)
+    const uword or3_ip = 0xe38cc000 | byte0;  // orr ip, ip, byte0
+    const uword blx_ip = 0xe12fff3c;
+
+    *reinterpret_cast<uword*>(pc + (0 * Instr::kInstrSize)) = mov_ip;
+    *reinterpret_cast<uword*>(pc + (1 * Instr::kInstrSize)) = or1_ip;
+    *reinterpret_cast<uword*>(pc + (2 * Instr::kInstrSize)) = or2_ip;
+    *reinterpret_cast<uword*>(pc + (3 * Instr::kInstrSize)) = or3_ip;
+    *reinterpret_cast<uword*>(pc + (4 * Instr::kInstrSize)) = blx_ip;
+
+    ASSERT(LengthInBytes() == 5 * Instr::kInstrSize);
+    CPU::FlushICache(pc, LengthInBytes());
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    const uint16_t target_lo = target_address & 0xffff;
+    const uint16_t target_hi = target_address >> 16;
+
+    const uword movw_ip =
+        0xe300c000 | ((target_lo >> 12) << 16) | (target_lo & 0xfff);
+    const uword movt_ip =
+        0xe340c000 | ((target_hi >> 12) << 16) | (target_hi & 0xfff);
+    const uword blx_ip = 0xe12fff3c;
+
+    *reinterpret_cast<uword*>(pc + (0 * Instr::kInstrSize)) = movw_ip;
+    *reinterpret_cast<uword*>(pc + (1 * Instr::kInstrSize)) = movt_ip;
+    *reinterpret_cast<uword*>(pc + (2 * Instr::kInstrSize)) = blx_ip;
+
+    ASSERT(LengthInBytes() == 3 * Instr::kInstrSize);
+    CPU::FlushICache(pc, LengthInBytes());
+  }
 }
 
 
 JumpPattern::JumpPattern(uword pc, const Code& code) : pc_(pc) { }
 
 
+int JumpPattern::pattern_length_in_bytes() {
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    return 5 * Instr::kInstrSize;
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    return 3 * Instr::kInstrSize;
+  }
+}
+
+
 bool JumpPattern::IsValid() const {
-  Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
-  Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
-  Instr* bx_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
-  return (movw_ip->InstructionBits() & 0xfff0f000) == 0xe300c000 &&
-         (movt_ip->InstructionBits() & 0xfff0f000) == 0xe340c000 &&
-         (bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c;
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
+    Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
+    Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
+    Instr* or3_ip = Instr::At(pc_ + (3 * Instr::kInstrSize));
+    Instr* bx_ip = Instr::At(pc_ + (4 * Instr::kInstrSize));
+    return ((mov_ip->InstructionBits() & 0xffffff00) == 0xe3a0c400) &&
+           ((or1_ip->InstructionBits() & 0xffffff00) == 0xe38cc800) &&
+           ((or2_ip->InstructionBits() & 0xffffff00) == 0xe38ccc00) &&
+           ((or3_ip->InstructionBits() & 0xffffff00) == 0xe38cc000) &&
+           ((bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c);
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
+    Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
+    Instr* bx_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
+    return (movw_ip->InstructionBits() & 0xfff0f000) == 0xe300c000 &&
+           (movt_ip->InstructionBits() & 0xfff0f000) == 0xe340c000 &&
+           (bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c;
+  }
 }
 
 
 uword JumpPattern::TargetAddress() const {
-  Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
-  Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
-  uint16_t target_lo = movw_ip->MovwField();
-  uint16_t target_hi = movt_ip->MovwField();
-  return (target_hi << 16) | target_lo;
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
+    Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
+    Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
+    Instr* or3_ip = Instr::At(pc_ + (3 * Instr::kInstrSize));
+    uword imm = 0;
+    imm |= or3_ip->Immed8Field();
+    imm |= or2_ip->Immed8Field() << 8;
+    imm |= or1_ip->Immed8Field() << 16;
+    imm |= mov_ip->Immed8Field() << 24;
+    return imm;
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
+    Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
+    uint16_t target_lo = movw_ip->MovwField();
+    uint16_t target_hi = movt_ip->MovwField();
+    return (target_hi << 16) | target_lo;
+  }
 }
 
 
 void JumpPattern::SetTargetAddress(uword target_address) const {
-  uint16_t target_lo = target_address & 0xffff;
-  uint16_t target_hi = target_address >> 16;
-  uword movw_ip = 0xe300c000 | ((target_lo >> 12) << 16) | (target_lo & 0xfff);
-  uword movt_ip = 0xe340c000 | ((target_hi >> 12) << 16) | (target_hi & 0xfff);
-  *reinterpret_cast<uword*>(pc_ + (0 * Instr::kInstrSize)) = movw_ip;
-  *reinterpret_cast<uword*>(pc_ + (1 * Instr::kInstrSize)) = movt_ip;
-  CPU::FlushICache(pc_, 2 * Instr::kInstrSize);
+  if (TargetCPUFeatures::arm_version() == ARMv6) {
+    const uint32_t byte0 = (target_address & 0x000000ff);
+    const uint32_t byte1 = (target_address & 0x0000ff00) >> 8;
+    const uint32_t byte2 = (target_address & 0x00ff0000) >> 16;
+    const uint32_t byte3 = (target_address & 0xff000000) >> 24;
+
+    const uword mov_ip = 0xe3a0c400 | byte3;  // mov ip, (byte3 rot 4)
+    const uword or1_ip = 0xe38cc800 | byte2;  // orr ip, ip, (byte2 rot 8)
+    const uword or2_ip = 0xe38ccc00 | byte1;  // orr ip, ip, (byte1 rot 12)
+    const uword or3_ip = 0xe38cc000 | byte0;  // orr ip, ip, byte0
+
+    *reinterpret_cast<uword*>(pc_ + (0 * Instr::kInstrSize)) = mov_ip;
+    *reinterpret_cast<uword*>(pc_ + (1 * Instr::kInstrSize)) = or1_ip;
+    *reinterpret_cast<uword*>(pc_ + (2 * Instr::kInstrSize)) = or2_ip;
+    *reinterpret_cast<uword*>(pc_ + (3 * Instr::kInstrSize)) = or3_ip;
+    CPU::FlushICache(pc_, 4 * Instr::kInstrSize);
+  } else {
+    ASSERT(TargetCPUFeatures::arm_version() == ARMv7);
+    const uint16_t target_lo = target_address & 0xffff;
+    const uint16_t target_hi = target_address >> 16;
+
+    const uword movw_ip =
+        0xe300c000 | ((target_lo >> 12) << 16) | (target_lo & 0xfff);
+    const uword movt_ip =
+        0xe340c000 | ((target_hi >> 12) << 16) | (target_hi & 0xfff);
+
+    *reinterpret_cast<uword*>(pc_ + (0 * Instr::kInstrSize)) = movw_ip;
+    *reinterpret_cast<uword*>(pc_ + (1 * Instr::kInstrSize)) = movt_ip;
+    CPU::FlushICache(pc_, 2 * Instr::kInstrSize);
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index 05235d1..b802fa6 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -59,7 +59,7 @@
 
   // This constant length is only valid for inserted call patterns used for
   // lazy deoptimization. Regular call pattern may vary in length.
-  static const int kFixedLengthInBytes = 3 * Instr::kInstrSize;
+  static int LengthInBytes();
 
   static void InsertAt(uword pc, uword target_address);
 
@@ -84,9 +84,7 @@
 
   static const int kLengthInBytes = 3 * Instr::kInstrSize;
 
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
+  static int pattern_length_in_bytes();
 
   bool IsValid() const;
   uword TargetAddress() const;
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc
index 9970592..46dbb1c 100644
--- a/runtime/vm/instructions_arm_test.cc
+++ b/runtime/vm/instructions_arm_test.cc
@@ -6,6 +6,7 @@
 #if defined(TARGET_ARCH_ARM)
 
 #include "vm/assembler.h"
+#include "vm/cpu.h"
 #include "vm/instructions.h"
 #include "vm/stub_code.h"
 #include "vm/unit_test.h"
@@ -62,6 +63,45 @@
             jump2.TargetAddress());
 }
 
+
+#if defined(USING_SIMULATOR)
+ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) {
+  // ARMv7 is the default.
+  HostCPUFeatures::set_arm_version(ARMv6);
+  __ BranchPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchPatchable(&StubCode::AllocateArrayLabel());
+  HostCPUFeatures::set_arm_version(ARMv7);
+}
+
+
+ASSEMBLER_TEST_RUN(JumpARMv6, test) {
+  HostCPUFeatures::set_arm_version(ARMv6);
+  const Code& code = test->code();
+  const Instructions& instrs = Instructions::Handle(code.instructions());
+  bool status =
+      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
+                             instrs.size(),
+                             VirtualMemory::kReadWrite);
+  EXPECT(status);
+  JumpPattern jump1(test->entry(), test->code());
+  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+            jump1.TargetAddress());
+  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
+                    test->code());
+  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+            jump2.TargetAddress());
+  uword target1 = jump1.TargetAddress();
+  uword target2 = jump2.TargetAddress();
+  jump1.SetTargetAddress(target2);
+  jump2.SetTargetAddress(target1);
+  EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
+            jump1.TargetAddress());
+  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+            jump2.TargetAddress());
+  HostCPUFeatures::set_arm_version(ARMv7);
+}
+#endif
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index cf8301f..41890cb 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -162,6 +162,8 @@
         return kUnboxedDouble;
       case kFloat32x4Cid:
         return kUnboxedFloat32x4;
+      case kFloat64x2Cid:
+        return kUnboxedFloat64x2;
       default:
         UNREACHABLE();
     }
@@ -194,6 +196,8 @@
         return kUnboxedDouble;
       case kFloat32x4Cid:
         return kUnboxedFloat32x4;
+      case kFloat64x2Cid:
+        return kUnboxedFloat64x2;
       default:
         UNREACHABLE();
     }
@@ -2058,17 +2062,20 @@
 
 
 LocationSummary* DropTempsInstr::MakeLocationSummary(bool optimizing) const {
-  return LocationSummary::Make(1,
-                               Location::SameAsFirstInput(),
-                               LocationSummary::kNoCall);
+  return (InputCount() == 1)
+      ? LocationSummary::Make(1,
+                              Location::SameAsFirstInput(),
+                              LocationSummary::kNoCall)
+      : LocationSummary::Make(0,
+                              Location::NoLocation(),
+                              LocationSummary::kNoCall);
 }
 
 
 void DropTempsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  Register value = locs()->in(0).reg();
-  Register result = locs()->out().reg();
-  ASSERT(result == value);  // Assert that register assignment is correct.
+  // Assert that register assignment is correct.
+  ASSERT((InputCount() == 0) || locs()->out().reg() == locs()->in(0).reg());
   __ Drop(num_temps());
 }
 
@@ -3036,6 +3043,12 @@
   //   StoreIndexed(v2, v3, v4)   -- v3:constant index, v4: value.
   //   ..
   //   v8 <- StringInterpolate(v2)
+
+  // Don't compile-time fold when optimizing the interpolation function itself.
+  if (flow_graph->parsed_function().function().raw() == CallFunction().raw()) {
+    return this;
+  }
+
   CreateArrayInstr* create_array = value()->definition()->AsCreateArray();
   ASSERT(create_array != NULL);
   // Check if the string interpolation has only constant inputs.
@@ -3080,13 +3093,14 @@
   const Array& interpolate_arg = Array::Handle(Array::New(1));
   interpolate_arg.SetAt(0, array_argument);
   // Call interpolation function.
-  String& concatenated = String::ZoneHandle();
-  concatenated ^=
-      DartEntry::InvokeFunction(CallFunction(), interpolate_arg);
-  if (concatenated.IsUnhandledException()) {
+  const Object& result = Object::Handle(
+      DartEntry::InvokeFunction(CallFunction(), interpolate_arg));
+  if (result.IsUnhandledException()) {
     return this;
   }
-  concatenated = Symbols::New(concatenated);
+  ASSERT(result.IsString());
+  const String& concatenated =
+      String::ZoneHandle(Symbols::New(String::Cast(result)));
   return flow_graph->GetConstant(concatenated);
 }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index d794a99..0a77113 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -41,6 +41,7 @@
   V(Object, ==, ObjectEquals, 1068471689)                                      \
   V(Object, Object., ObjectConstructor, 1058615085)                            \
   V(Object, get:_cid, ObjectCid, 1498751301)                                   \
+  V(_TypedListBase, get:_cid, TypedListBaseCid, 1938244762)                    \
   V(_List, get:length, ObjectArrayLength, 215183186)                           \
   V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
   V(_TypedList, get:length, TypedDataLength, 26646119)                         \
@@ -94,6 +95,7 @@
   V(Float32x4, Float32x4.splat, Float32x4Splat, 1148280442)                    \
   V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
       872145194)                                                               \
+  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1511660322)    \
   V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105)                         \
   V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119)                    \
   V(_Float32x4, get:x, Float32x4ShuffleX, 1351747629)                          \
@@ -120,6 +122,21 @@
   V(_Float32x4, withY, Float32x4WithY, 1806065938)                             \
   V(_Float32x4, withZ, Float32x4WithZ, 320659034)                              \
   V(_Float32x4, withW, Float32x4WithW, 1108437255)                             \
+  V(Float64x2, Float64x2., Float64x2Constructor, 1283521526)                   \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, 1971574037)                      \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, 823230813)                     \
+  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1383666060)    \
+  V(_Float64x2, get:x, Float64x2GetX, 176817227)                               \
+  V(_Float64x2, get:y, Float64x2GetY, 1858031019)                              \
+  V(_Float64x2, _negate, Float64x2Negate, 1345265430)                          \
+  V(_Float64x2, abs, Float64x2Abs, 778551930)                                  \
+  V(_Float64x2, sqrt, Float64x2Sqrt, 591345168)                                \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, 601579087)                 \
+  V(_Float64x2, scale, Float64x2Scale, 1781090062)                             \
+  V(_Float64x2, withX, Float64x2WithX, 1624377250)                             \
+  V(_Float64x2, withY, Float64x2WithY, 2078610265)                             \
+  V(_Float64x2, min, Float64x2Min, 876488999)                                  \
+  V(_Float64x2, max, Float64x2Max, 389912972)                                  \
   V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 295910141)                  \
   V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
       893850947)                                                               \
@@ -753,6 +770,15 @@
   M(TestSmi)                                                                   \
   M(BoxFloat64x2)                                                              \
   M(UnboxFloat64x2)                                                            \
+  M(BinaryFloat64x2Op)                                                         \
+  M(Float64x2Zero)                                                             \
+  M(Float64x2Constructor)                                                      \
+  M(Float64x2Splat)                                                            \
+  M(Float32x4ToFloat64x2)                                                      \
+  M(Float64x2ToFloat32x4)                                                      \
+  M(Simd64x2Shuffle)                                                           \
+  M(Float64x2ZeroArg)                                                          \
+  M(Float64x2OneArg)                                                           \
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -1037,12 +1063,21 @@
   friend class Float32x4ClampInstr;
   friend class Float32x4WithInstr;
   friend class Float32x4ToInt32x4Instr;
+  friend class Simd64x2ShuffleInstr;
+  friend class Float64x2ZeroArgInstr;
+  friend class Float64x2OneArgInstr;
+  friend class Float32x4ToFloat64x2Instr;
+  friend class Float64x2ToFloat32x4Instr;
+  friend class Float64x2ZeroInstr;
+  friend class Float64x2SplatInstr;
+  friend class Float64x2ConstructorInstr;
   friend class Int32x4BoolConstructorInstr;
   friend class Int32x4GetFlagInstr;
   friend class Int32x4SetFlagInstr;
   friend class Int32x4SelectInstr;
   friend class Int32x4ToFloat32x4Instr;
   friend class BinaryInt32x4OpInstr;
+  friend class BinaryFloat64x2OpInstr;
   friend class BinaryMintOpInstr;
   friend class BinarySmiOpInstr;
   friend class UnarySmiOpInstr;
@@ -1685,6 +1720,16 @@
 };
 
 
+// If the result of the allocation is not stored into any field, passed
+// as an argument or used in a phi then it can't alias with any other
+// SSA value.
+enum AliasIdentity {
+  kIdentityUnknown,
+  kIdentityAliased,
+  kIdentityNotAliased
+};
+
+
 // Abstract super-class of all instructions that define a value (Bind, Phi).
 class Definition : public Instruction {
  public:
@@ -1822,6 +1867,16 @@
     temp_index_ = reinterpret_cast<intptr_t>(other);
   }
 
+  virtual AliasIdentity Identity() const {
+    // Only implemented for allocation instructions.
+    UNREACHABLE();
+    return kIdentityUnknown;
+  }
+
+  virtual void SetIdentity(AliasIdentity identity) {
+    UNREACHABLE();
+  }
+
  protected:
   friend class RangeAnalysis;
   friend class Value;
@@ -3244,7 +3299,8 @@
         arguments_(arguments),
         result_cid_(kDynamicCid),
         is_known_list_constructor_(false),
-        is_native_list_factory_(false) {
+        is_native_list_factory_(false),
+        identity_(kIdentityUnknown) {
     ASSERT(function.IsZoneHandle());
     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap());
   }
@@ -3288,8 +3344,15 @@
     is_native_list_factory_ = value;
   }
 
+  bool IsRecognizedFactory() const {
+    return is_known_list_constructor() || is_native_list_factory();
+  }
+
   virtual bool MayThrow() const { return true; }
 
+  virtual AliasIdentity Identity() const { return identity_; }
+  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
+
  private:
   const ICData* ic_data_;
   const intptr_t token_pos_;
@@ -3302,6 +3365,8 @@
   bool is_known_list_constructor_;
   bool is_native_list_factory_;
 
+  AliasIdentity identity_;
+
   DISALLOW_COPY_AND_ASSIGN(StaticCallInstr);
 };
 
@@ -3370,16 +3435,24 @@
 };
 
 
-class DropTempsInstr : public TemplateDefinition<1> {
+class DropTempsInstr : public Definition {
  public:
-  explicit DropTempsInstr(intptr_t num_temps, Value* value)
-      : num_temps_(num_temps) {
-    SetInputAt(0, value);
+  explicit DropTempsInstr(intptr_t num_temps, Value* value = NULL)
+      : num_temps_(num_temps), value_(NULL) {
+    if (value != NULL) {
+      SetInputAt(0, value);
+    }
   }
 
   DECLARE_INSTRUCTION(DropTemps)
 
-  Value* value() const { return inputs_[0]; }
+  virtual intptr_t InputCount() const { return value_ != NULL ? 1 : 0; }
+  virtual Value* InputAt(intptr_t i) const {
+    ASSERT((value_ != NULL) && (i == 0));
+    return value_;
+  }
+
+  Value* value() const { return value_; }
 
   intptr_t num_temps() const { return num_temps_; }
 
@@ -3400,7 +3473,12 @@
   }
 
  private:
-  intptr_t num_temps_;
+  virtual void RawSetInputAt(intptr_t i, Value* value) {
+    value_ = value;
+  }
+
+  const intptr_t num_temps_;
+  Value* value_;
 
   DISALLOW_COPY_AND_ASSIGN(DropTempsInstr);
 };
@@ -4016,9 +4094,8 @@
       : token_pos_(token_pos),
         cls_(cls),
         arguments_(arguments),
-        identity_(kUnknown),
-        closure_function_(Function::ZoneHandle()),
-        context_field_(Field::ZoneHandle()) {
+        identity_(kIdentityUnknown),
+        closure_function_(Function::ZoneHandle()) {
     // Either no arguments or one type-argument and one instantiator.
     ASSERT(arguments->is_empty() || (arguments->length() == 1));
   }
@@ -4039,11 +4116,6 @@
     closure_function_ ^= function.raw();
   }
 
-  const Field& context_field() const { return context_field_; }
-  void set_context_field(const Field& field) {
-    context_field_ ^= field.raw();
-  }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   virtual bool CanDeoptimize() const { return false; }
@@ -4052,25 +4124,15 @@
 
   virtual bool MayThrow() const { return false; }
 
-  // If the result of the allocation is not stored into any field, passed
-  // as an argument or used in a phi then it can't alias with any other
-  // SSA value.
-  enum Identity {
-    kUnknown,
-    kAliased,
-    kNotAliased
-  };
-
-  Identity identity() const { return identity_; }
-  void set_identity(Identity identity) { identity_ = identity; }
+  virtual AliasIdentity Identity() const { return identity_; }
+  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
  private:
   const intptr_t token_pos_;
   const Class& cls_;
   ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
-  Identity identity_;
+  AliasIdentity identity_;
   Function& closure_function_;
-  Field& context_field_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr);
 };
@@ -4082,10 +4144,10 @@
 class MaterializeObjectInstr : public Definition {
  public:
   MaterializeObjectInstr(const Class& cls,
-                         const ZoneGrowableArray<const Field*>& fields,
+                         const ZoneGrowableArray<const Object*>& slots,
                          ZoneGrowableArray<Value*>* values)
-      : cls_(cls), fields_(fields), values_(values), locations_(NULL) {
-    ASSERT(fields_.length() == values_->length());
+      : cls_(cls), slots_(slots), values_(values), locations_(NULL) {
+    ASSERT(slots_.length() == values_->length());
     for (intptr_t i = 0; i < InputCount(); i++) {
       InputAt(i)->set_instruction(this);
       InputAt(i)->set_use_index(i);
@@ -4094,7 +4156,9 @@
 
   const Class& cls() const { return cls_; }
   intptr_t FieldOffsetAt(intptr_t i) const {
-    return fields_[i]->Offset();
+    return slots_[i]->IsField()
+        ? Field::Cast(*slots_[i]).Offset()
+        : Smi::Cast(*slots_[i]).Value();
   }
   const Location& LocationAt(intptr_t i) {
     return locations_[i];
@@ -4135,7 +4199,7 @@
   }
 
   const Class& cls_;
-  const ZoneGrowableArray<const Field*>& fields_;
+  const ZoneGrowableArray<const Object*>& slots_;
   ZoneGrowableArray<Value*>* values_;
   Location* locations_;
 
@@ -4148,7 +4212,7 @@
   CreateArrayInstr(intptr_t token_pos,
                    Value* element_type,
                    Value* num_elements)
-      : token_pos_(token_pos) {
+      : token_pos_(token_pos), identity_(kIdentityUnknown)  {
     SetInputAt(kElementTypePos, element_type);
     SetInputAt(kLengthPos, num_elements);
   }
@@ -4174,8 +4238,12 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual AliasIdentity Identity() const { return identity_; }
+  virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
+
  private:
   const intptr_t token_pos_;
+  AliasIdentity identity_;
 
   DISALLOW_COPY_AND_ASSIGN(CreateArrayInstr);
 };
@@ -5723,6 +5791,72 @@
 };
 
 
+class Simd64x2ShuffleInstr : public TemplateDefinition<1> {
+ public:
+  Simd64x2ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value,
+                       intptr_t mask,
+                       intptr_t deopt_id)
+      : op_kind_(op_kind), mask_(mask) {
+    SetInputAt(0, value);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  MethodRecognizer::Kind op_kind() const { return op_kind_; }
+
+  intptr_t mask() const { return mask_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    if ((op_kind_ == MethodRecognizer::kFloat64x2GetX) ||
+        (op_kind_ == MethodRecognizer::kFloat64x2GetY)) {
+      return kUnboxedDouble;
+    }
+    UNIMPLEMENTED();
+    return kUnboxedDouble;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    if ((op_kind_ == MethodRecognizer::kFloat64x2GetX) ||
+        (op_kind_ == MethodRecognizer::kFloat64x2GetY)) {
+      return kUnboxedFloat64x2;
+    }
+    UNIMPLEMENTED();
+    return kUnboxedFloat64x2;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Simd64x2Shuffle)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return (op_kind() == other->AsSimd64x2Shuffle()->op_kind()) &&
+           (mask() == other->AsSimd64x2Shuffle()->mask());
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const MethodRecognizer::Kind op_kind_;
+  const intptr_t mask_;
+
+  DISALLOW_COPY_AND_ASSIGN(Simd64x2ShuffleInstr);
+};
+
+
 class Float32x4ToInt32x4Instr : public TemplateDefinition<1> {
  public:
   Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id) {
@@ -5766,6 +5900,334 @@
 };
 
 
+class Float32x4ToFloat64x2Instr : public TemplateDefinition<1> {
+ public:
+  Float32x4ToFloat64x2Instr(Value* left, intptr_t deopt_id) {
+    SetInputAt(0, left);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedFloat32x4;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float32x4ToFloat64x2)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Float32x4ToFloat64x2Instr);
+};
+
+
+class Float64x2ToFloat32x4Instr : public TemplateDefinition<1> {
+ public:
+  Float64x2ToFloat32x4Instr(Value* left, intptr_t deopt_id) {
+    SetInputAt(0, left);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat32x4;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedFloat64x2;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2ToFloat32x4)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Float64x2ToFloat32x4Instr);
+};
+
+
+class Float64x2ConstructorInstr : public TemplateDefinition<2> {
+ public:
+  Float64x2ConstructorInstr(Value* value0, Value* value1, intptr_t deopt_id) {
+    SetInputAt(0, value0);
+    SetInputAt(1, value1);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value0() const { return inputs_[0]; }
+  Value* value1() const { return inputs_[1]; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx >= 0 && idx < 2);
+    return kUnboxedDouble;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2Constructor)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Float64x2ConstructorInstr);
+};
+
+
+class Float64x2SplatInstr : public TemplateDefinition<1> {
+ public:
+  Float64x2SplatInstr(Value* value, intptr_t deopt_id) {
+    SetInputAt(0, value);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedDouble;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2Splat)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Float64x2SplatInstr);
+};
+
+
+class Float64x2ZeroInstr : public TemplateDefinition<0> {
+ public:
+  explicit Float64x2ZeroInstr(intptr_t deopt_id) {
+    deopt_id_ = deopt_id;
+  }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    UNIMPLEMENTED();
+    return kUnboxedFloat64x2;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2Zero)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Float64x2ZeroInstr);
+};
+
+
+class Float64x2ZeroArgInstr : public TemplateDefinition<1> {
+ public:
+  Float64x2ZeroArgInstr(MethodRecognizer::Kind op_kind, Value* left,
+                        intptr_t deopt_id) : op_kind_(op_kind) {
+    SetInputAt(0, left);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+
+  MethodRecognizer::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    if (op_kind() == MethodRecognizer::kFloat64x2GetSignMask) {
+      // Smi.
+      return kTagged;
+    }
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedFloat64x2;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2ZeroArg)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return op_kind() == other->AsFloat64x2ZeroArg()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const MethodRecognizer::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(Float64x2ZeroArgInstr);
+};
+
+
+class Float64x2OneArgInstr : public TemplateDefinition<2> {
+ public:
+  Float64x2OneArgInstr(MethodRecognizer::Kind op_kind, Value* left,
+                       Value* right, intptr_t deopt_id) : op_kind_(op_kind) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  MethodRecognizer::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    if (idx == 0) {
+      return kUnboxedFloat64x2;
+    }
+    ASSERT(idx == 1);
+    if ((op_kind() == MethodRecognizer::kFloat64x2WithX) ||
+        (op_kind() == MethodRecognizer::kFloat64x2WithY) ||
+        (op_kind() == MethodRecognizer::kFloat64x2Scale)) {
+      return kUnboxedDouble;
+    }
+    return kUnboxedFloat64x2;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Float64x2OneArg)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return op_kind() == other->AsFloat64x2OneArg()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const MethodRecognizer::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(Float64x2OneArgInstr);
+};
+
+
 class Int32x4BoolConstructorInstr : public TemplateDefinition<4> {
  public:
   Int32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
@@ -6125,6 +6587,63 @@
   DISALLOW_COPY_AND_ASSIGN(BinaryInt32x4OpInstr);
 };
 
+
+class BinaryFloat64x2OpInstr : public TemplateDefinition<2> {
+ public:
+  BinaryFloat64x2OpInstr(Token::Kind op_kind,
+                         Value* left,
+                         Value* right,
+                         intptr_t deopt_id)
+      : op_kind_(op_kind) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  Token::Kind op_kind() const { return op_kind_; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedFloat64x2;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return kUnboxedFloat64x2;
+  }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(BinaryFloat64x2Op)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    ASSERT(other->IsBinaryFloat64x2Op());
+    return op_kind() == other->AsBinaryFloat64x2Op()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(BinaryFloat64x2OpInstr);
+};
+
+
 class BinaryMintOpInstr : public TemplateDefinition<2> {
  public:
   BinaryMintOpInstr(Token::Kind op_kind,
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 9cda279..4b6e712 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1687,6 +1687,9 @@
         case kFloat32x4Cid:
           cls = &compiler->float32x4_class();
           break;
+        case kFloat64x2Cid:
+          cls = &compiler->float64x2_class();
+          break;
         default:
           UNREACHABLE();
       }
@@ -1719,6 +1722,13 @@
         __ StoreDToOffset(value_odd, temp,
             Float32x4::value_offset() + 2 * kWordSize - kHeapObjectTag);
         break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
+        __ StoreDToOffset(value, temp,
+            Float64x2::value_offset() - kHeapObjectTag);
+        __ StoreDToOffset(value_odd, temp,
+            Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+        break;
       default:
         UNREACHABLE();
     }
@@ -1736,6 +1746,7 @@
     Label store_pointer;
     Label store_double;
     Label store_float32x4;
+    Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()));
 
@@ -1755,6 +1766,10 @@
     __ CompareImmediate(temp2, kFloat32x4Cid);
     __ b(&store_float32x4, EQ);
 
+    __ ldr(temp2, FieldAddress(temp, Field::guarded_cid_offset()));
+    __ CompareImmediate(temp2, kFloat64x2Cid);
+    __ b(&store_float64x2, EQ);
+
     // Fall through.
     __ b(&store_pointer);
 
@@ -1828,6 +1843,40 @@
       __ b(&skip_store);
     }
 
+    {
+      __ Bind(&store_float64x2);
+      Label copy_float64x2;
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->float64x2_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ CompareImmediate(temp,
+                          reinterpret_cast<intptr_t>(Object::null()));
+      __ b(&copy_float64x2, NE);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     temp,
+                     temp2);
+      __ Bind(slow_path->exit_label());
+      __ MoveRegister(temp2, temp);
+      __ StoreIntoObject(instance_reg,
+                         FieldAddress(instance_reg, offset_in_bytes_),
+                         temp2);
+      __ Bind(&copy_float64x2);
+      // TODO(zra): Maybe use vldmd here.
+      __ LoadDFromOffset(fpu_temp, value_reg,
+          Float64x2::value_offset() - kHeapObjectTag);
+      __ LoadDFromOffset(fpu_temp_odd, value_reg,
+          Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+      __ StoreDToOffset(fpu_temp, temp,
+          Float64x2::value_offset() - kHeapObjectTag);
+      __ StoreDToOffset(fpu_temp_odd, temp,
+          Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+      __ b(&skip_store);
+    }
+
     __ Bind(&store_pointer);
   }
 
@@ -2094,6 +2143,14 @@
         __ LoadDFromOffset(result_odd, temp,
             Float32x4::value_offset() + 2 * kWordSize - kHeapObjectTag);
         break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2LoadFieldInstr");
+        // TODO(zra): Maybe use vldmd here.
+        __ LoadDFromOffset(result, temp,
+            Float64x2::value_offset() - kHeapObjectTag);
+        __ LoadDFromOffset(result_odd, temp,
+            Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+        break;
       default:
         UNREACHABLE();
     }
@@ -2110,6 +2167,7 @@
     Label load_pointer;
     Label load_double;
     Label load_float32x4;
+    Label load_float64x2;
 
     __ LoadObject(result_reg, Field::ZoneHandle(field()->raw()));
 
@@ -2129,6 +2187,10 @@
     __ CompareImmediate(temp, kFloat32x4Cid);
     __ b(&load_float32x4, EQ);
 
+    __ ldr(temp, field_cid_operand);
+    __ CompareImmediate(temp, kFloat64x2Cid);
+    __ b(&load_float64x2, EQ);
+
     // Fall through.
     __ b(&load_pointer);
 
@@ -2177,6 +2239,29 @@
       __ b(&done);
     }
 
+    {
+      __ Bind(&load_float64x2);
+      BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     result_reg,
+                     temp);
+      __ Bind(slow_path->exit_label());
+      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      // TODO(zra): Maybe use vldmd here.
+      __ LoadDFromOffset(value, temp,
+          Float64x2::value_offset() - kHeapObjectTag);
+      __ LoadDFromOffset(value_odd, temp,
+          Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+      __ StoreDToOffset(value, result_reg,
+          Float64x2::value_offset() - kHeapObjectTag);
+      __ StoreDToOffset(value_odd, result_reg,
+          Float64x2::value_offset() + 2 * kWordSize - kHeapObjectTag);
+      __ b(&done);
+    }
+
     __ Bind(&load_pointer);
   }
   __ LoadFromOffset(kWord, result_reg,
@@ -3310,6 +3395,54 @@
 }
 
 
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister left = locs()->in(0).fpu_reg();
+  QRegister right = locs()->in(1).fpu_reg();
+  QRegister result = locs()->out().fpu_reg();
+
+  DRegister left0 = EvenDRegisterOf(left);
+  DRegister left1 = OddDRegisterOf(left);
+
+  DRegister right0 = EvenDRegisterOf(right);
+  DRegister right1 = OddDRegisterOf(right);
+
+  DRegister result0 = EvenDRegisterOf(result);
+  DRegister result1 = OddDRegisterOf(result);
+
+  switch (op_kind()) {
+    case Token::kADD:
+      __ vaddd(result0, left0, right0);
+      __ vaddd(result1, left1, right1);
+      break;
+    case Token::kSUB:
+      __ vsubd(result0, left0, right0);
+      __ vsubd(result1, left1, right1);
+      break;
+    case Token::kMUL:
+      __ vmuld(result0, left0, right0);
+      __ vmuld(result1, left1, right1);
+      break;
+    case Token::kDIV:
+      __ vdivd(result0, left0, right0);
+      __ vdivd(result1, left1, right1);
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -3813,6 +3946,310 @@
 }
 
 
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister value = locs()->in(0).fpu_reg();
+
+  DRegister dvalue0 = EvenDRegisterOf(value);
+  DRegister dvalue1 = OddDRegisterOf(value);
+
+  QRegister result = locs()->out().fpu_reg();
+
+  DRegister dresult0 = EvenDRegisterOf(result);
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2GetX:
+      __ vmovd(dresult0, dvalue0);
+      break;
+    case MethodRecognizer::kFloat64x2GetY:
+      __ vmovd(dresult0, dvalue1);
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister q = locs()->out().fpu_reg();
+  __ veorq(q, q, q);
+}
+
+
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister value = locs()->in(0).fpu_reg();
+
+  DRegister dvalue = EvenDRegisterOf(value);
+
+  QRegister result = locs()->out().fpu_reg();
+
+  DRegister dresult0 = EvenDRegisterOf(result);
+  DRegister dresult1 = OddDRegisterOf(result);
+
+  // Splat across all lanes.
+  __ vmovd(dresult0, dvalue);
+  __ vmovd(dresult1, dvalue);
+}
+
+
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister q0 = locs()->in(0).fpu_reg();
+  QRegister q1 = locs()->in(1).fpu_reg();
+  QRegister r = locs()->out().fpu_reg();
+
+  DRegister d0 = EvenDRegisterOf(q0);
+  DRegister d1 = EvenDRegisterOf(q1);
+
+  DRegister dr0 = EvenDRegisterOf(r);
+  DRegister dr1 = OddDRegisterOf(r);
+
+  __ vmovd(dr0, d0);
+  __ vmovd(dr1, d1);
+}
+
+
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  // Low (< 7) Q registers are needed for the vcvtsd instruction.
+  summary->set_out(Location::FpuRegisterLocation(Q6));
+  return summary;
+}
+
+
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister q = locs()->in(0).fpu_reg();
+  QRegister r = locs()->out().fpu_reg();
+
+  DRegister dq0 = EvenDRegisterOf(q);
+  DRegister dq1 = OddDRegisterOf(q);
+
+  DRegister dr0 = EvenDRegisterOf(r);
+
+  // Zero register.
+  __ veorq(r, r, r);
+  // Set X lane.
+  __ vcvtsd(EvenSRegisterOf(dr0), dq0);
+  // Set Y lane.
+  __ vcvtsd(OddSRegisterOf(dr0), dq1);
+}
+
+
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  // Low (< 7) Q registers are needed for the vcvtsd instruction.
+  summary->set_out(Location::FpuRegisterLocation(Q6));
+  return summary;
+}
+
+
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister q = locs()->in(0).fpu_reg();
+  QRegister r = locs()->out().fpu_reg();
+
+  DRegister dq0 = EvenDRegisterOf(q);
+
+  DRegister dr0 = EvenDRegisterOf(r);
+  DRegister dr1 = OddDRegisterOf(r);
+
+  // Set X.
+  __ vcvtds(dr0, EvenSRegisterOf(dq0));
+  // Set Y.
+  __ vcvtds(dr1, OddSRegisterOf(dq0));
+}
+
+
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+
+  if (representation() == kTagged) {
+    ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
+    // Grabbing the S components means we need a low (< 7) Q.
+    summary->set_in(0, Location::FpuRegisterLocation(Q6));
+    summary->set_out(Location::RequiresRegister());
+    summary->AddTemp(Location::RequiresRegister());
+  } else {
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_out(Location::RequiresFpuRegister());
+  }
+  return summary;
+}
+
+
+void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister q = locs()->in(0).fpu_reg();
+
+  if ((op_kind() == MethodRecognizer::kFloat64x2GetSignMask)) {
+    DRegister dvalue0 = EvenDRegisterOf(q);
+    DRegister dvalue1 = OddDRegisterOf(q);
+
+    Register out = locs()->out().reg();
+    Register temp = locs()->temp(0).reg();
+
+    // Upper 32-bits of X lane.
+    __ vmovrs(out, OddSRegisterOf(dvalue0));
+    __ Lsr(out, out, 31);
+    // Upper 32-bits of Y lane.
+    __ vmovrs(temp, OddSRegisterOf(dvalue1));
+    __ Lsr(temp, temp, 31);
+    __ orr(out, out, ShifterOperand(temp, LSL, 1));
+    // Tag.
+    __ SmiTag(out);
+    return;
+  }
+  ASSERT(representation() == kUnboxedFloat64x2);
+  QRegister r = locs()->out().fpu_reg();
+
+  DRegister dvalue0 = EvenDRegisterOf(q);
+  DRegister dvalue1 = OddDRegisterOf(q);
+  DRegister dresult0 = EvenDRegisterOf(r);
+  DRegister dresult1 = OddDRegisterOf(r);
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Negate:
+      __ vnegd(dresult0, dvalue0);
+      __ vnegd(dresult1, dvalue1);
+      break;
+    case MethodRecognizer::kFloat64x2Abs:
+      __ vabsd(dresult0, dvalue0);
+      __ vabsd(dresult1, dvalue1);
+      break;
+    case MethodRecognizer::kFloat64x2Sqrt:
+      __ vsqrtd(dresult0, dvalue0);
+      __ vsqrtd(dresult1, dvalue1);
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  QRegister left = locs()->in(0).fpu_reg();
+  DRegister left0 = EvenDRegisterOf(left);
+  DRegister left1 = OddDRegisterOf(left);
+  QRegister right = locs()->in(1).fpu_reg();
+  DRegister right0 = EvenDRegisterOf(right);
+  DRegister right1 = OddDRegisterOf(right);
+  QRegister out = locs()->out().fpu_reg();
+  ASSERT(left == out);
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Scale:
+      __ vmuld(left0, left0, right0);
+      __ vmuld(left1, left1, right0);
+      break;
+    case MethodRecognizer::kFloat64x2WithX:
+      __ vmovd(left0, right0);
+      break;
+    case MethodRecognizer::kFloat64x2WithY:
+      __ vmovd(left1, right0);
+      break;
+    case MethodRecognizer::kFloat64x2Min: {
+      // X lane.
+      Label l0;
+      __ vcmpd(left0, right0);
+      __ vmstat();
+      __ b(&l0, LT);
+      __ vmovd(left0, right0);
+      __ Bind(&l0);
+      // Y lane.
+      Label l1;
+      __ vcmpd(left1, right1);
+      __ vmstat();
+      __ b(&l1, LT);
+      __ vmovd(left1, right1);
+      __ Bind(&l1);
+      break;
+    }
+    case MethodRecognizer::kFloat64x2Max: {
+      // X lane.
+      Label g0;
+      __ vcmpd(left0, right0);
+      __ vmstat();
+      __ b(&g0, GT);
+      __ vmovd(left0, right0);
+      __ Bind(&g0);
+      // Y lane.
+      Label g1;
+      __ vcmpd(left1, right1);
+      __ vmstat();
+      __ b(&g1, GT);
+      __ vmovd(left1, right1);
+      __ Bind(&g1);
+      break;
+    }
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     bool opt) const {
   const intptr_t kNumInputs = 4;
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index aca4b09..1649a8c 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1677,6 +1677,9 @@
         case kFloat32x4Cid:
           cls = &compiler->float32x4_class();
           break;
+        case kFloat64x2Cid:
+          cls = &compiler->float64x2_class();
+          break;
         default:
           UNREACHABLE();
       }
@@ -1707,6 +1710,10 @@
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
         __ movups(FieldAddress(temp, Float32x4::value_offset()), value);
       break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
+        __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
+      break;
       default:
         UNREACHABLE();
     }
@@ -1722,6 +1729,7 @@
     Label store_pointer;
     Label store_double;
     Label store_float32x4;
+    Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()));
 
@@ -1741,6 +1749,10 @@
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
+            Immediate(kFloat64x2Cid));
+    __ j(EQUAL, &store_float64x2);
+
     // Fall through.
     __ jmp(&store_pointer);
 
@@ -1811,6 +1823,38 @@
       __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
       __ jmp(&skip_store);
     }
+
+    {
+      __ Bind(&store_float64x2);
+      Label copy_float64x2;
+
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->float64x2_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      const Immediate& raw_null =
+          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ cmpl(temp, raw_null);
+      __ j(NOT_EQUAL, &copy_float64x2);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     temp,
+                     temp2);
+      __ Bind(slow_path->exit_label());
+      __ movl(temp2, temp);
+      __ StoreIntoObject(instance_reg,
+                         FieldAddress(instance_reg, offset_in_bytes_),
+                         temp2);
+
+      __ Bind(&copy_float64x2);
+      __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
+      __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
+      __ jmp(&skip_store);
+    }
+
     __ Bind(&store_pointer);
   }
 
@@ -2072,6 +2116,10 @@
         __ Comment("UnboxedFloat32x4LoadFieldInstr");
         __ movups(result, FieldAddress(temp, Float32x4::value_offset()));
         break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2LoadFieldInstr");
+        __ movups(result, FieldAddress(temp, Float64x2::value_offset()));
+        break;
       default:
         UNREACHABLE();
     }
@@ -2088,6 +2136,7 @@
     Label load_pointer;
     Label load_double;
     Label load_float32x4;
+    Label load_float64x2;
 
     __ LoadObject(result, Field::ZoneHandle(field()->raw()));
 
@@ -2103,6 +2152,9 @@
     __ cmpl(field_cid_operand, Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
+    __ cmpl(field_cid_operand, Immediate(kFloat64x2Cid));
+    __ j(EQUAL, &load_float64x2);
+
     // Fall through.
     __ jmp(&load_pointer);
 
@@ -2145,6 +2197,24 @@
       __ jmp(&done);
     }
 
+    {
+      __ Bind(&load_float64x2);
+
+      BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     result,
+                     temp);
+      __ Bind(slow_path->exit_label());
+      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
+      __ movups(FieldAddress(result, Float64x2::value_offset()), value);
+      __ jmp(&done);
+    }
+
     __ Bind(&load_pointer);
   }
   __ movl(result, FieldAddress(instance_reg, offset_in_bytes()));
@@ -3404,6 +3474,34 @@
 }
 
 
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
+
+  ASSERT(locs()->out().fpu_reg() == left);
+
+  switch (op_kind()) {
+    case Token::kADD: __ addpd(left, right); break;
+    case Token::kSUB: __ subpd(left, right); break;
+    case Token::kMUL: __ mulpd(left, right); break;
+    case Token::kDIV: __ divpd(left, right); break;
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -3422,7 +3520,7 @@
 
   switch (op_kind()) {
     case MethodRecognizer::kFloat32x4ShuffleX:
-      __ shufps(value, value, Immediate(0x00));
+      // Shuffle not necessary.
       __ cvtss2sd(value, value);
       break;
     case MethodRecognizer::kFloat32x4ShuffleY:
@@ -3835,6 +3933,224 @@
 }
 
 
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->in(0).fpu_reg();
+
+  ASSERT(locs()->out().fpu_reg() == value);
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2GetX:
+      // nop.
+      break;
+    case MethodRecognizer::kFloat64x2GetY:
+      __ shufpd(value, value, Immediate(0x33));
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ xorpd(value, value);
+}
+
+
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ shufpd(value, value, Immediate(0x0));
+}
+
+
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister v0 = locs()->in(0).fpu_reg();
+  XmmRegister v1 = locs()->in(1).fpu_reg();
+  ASSERT(v0 == locs()->out().fpu_reg());
+  __ subl(ESP, Immediate(16));
+  __ movsd(Address(ESP, 0), v0);
+  __ movsd(Address(ESP, 8), v1);
+  __ movups(v0, Address(ESP, 0));
+  __ addl(ESP, Immediate(16));
+}
+
+
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ cvtpd2ps(value, value);
+}
+
+
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ cvtps2pd(value, value);
+}
+
+
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  if (representation() == kTagged) {
+    ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
+    summary->set_out(Location::RequiresRegister());
+  } else {
+    ASSERT(representation() == kUnboxedFloat64x2);
+    summary->set_out(Location::SameAsFirstInput());
+  }
+  return summary;
+}
+
+
+void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+
+  ASSERT((op_kind() == MethodRecognizer::kFloat64x2GetSignMask) ||
+         (locs()->out().fpu_reg() == left));
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Negate:
+      __ negatepd(left);
+      break;
+    case MethodRecognizer::kFloat64x2Abs:
+      __ abspd(left);
+      break;
+    case MethodRecognizer::kFloat64x2Sqrt:
+      __ sqrtpd(left);
+      break;
+    case MethodRecognizer::kFloat64x2GetSignMask:
+      __ movmskpd(locs()->out().reg(), left);
+      __ SmiTag(locs()->out().reg());
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
+  ASSERT((locs()->out().fpu_reg() == left));
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Scale:
+      __ shufpd(right, right, Immediate(0x00));
+      __ mulpd(left, right);
+      break;
+    case MethodRecognizer::kFloat64x2WithX:
+      __ subl(ESP, Immediate(16));
+      // Move value to stack.
+      __ movups(Address(ESP, 0), left);
+      // Write over X value.
+      __ movsd(Address(ESP, 0), right);
+      // Move updated value into output register.
+      __ movups(left, Address(ESP, 0));
+      __ addl(ESP, Immediate(16));
+      break;
+    case MethodRecognizer::kFloat64x2WithY:
+      __ subl(ESP, Immediate(16));
+      // Move value to stack.
+      __ movups(Address(ESP, 0), left);
+      // Write over Y value.
+      __ movsd(Address(ESP, 8), right);
+      // Move updated value into output register.
+      __ movups(left, Address(ESP, 0));
+      __ addl(ESP, Immediate(16));
+      break;
+    case MethodRecognizer::kFloat64x2Min:
+      __ minpd(left, right);
+      break;
+    case MethodRecognizer::kFloat64x2Max:
+      __ maxpd(left, right);
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     bool opt) const {
   const intptr_t kNumInputs = 4;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 5682843..4a063cd 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -3039,6 +3039,17 @@
 }
 
 
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
   UNIMPLEMENTED();
   return NULL;
@@ -3184,6 +3195,97 @@
 }
 
 
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+    UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     bool opt) const {
   UNIMPLEMENTED();
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 2fb6ded..20e8c49 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1578,6 +1578,9 @@
         case kFloat32x4Cid:
           cls = &compiler->float32x4_class();
           break;
+        case kFloat64x2Cid:
+          cls = &compiler->float64x2_class();
+          break;
         default:
           UNREACHABLE();
       }
@@ -1608,6 +1611,10 @@
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
         __ movups(FieldAddress(temp, Float32x4::value_offset()), value);
         break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
+        __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
+      break;
       default:
         UNREACHABLE();
     }
@@ -1623,6 +1630,7 @@
     Label store_pointer;
     Label store_double;
     Label store_float32x4;
+    Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
@@ -1642,6 +1650,10 @@
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
+            Immediate(kFloat64x2Cid));
+    __ j(EQUAL, &store_float64x2);
+
     // Fall through.
     __ jmp(&store_pointer);
 
@@ -1706,6 +1718,35 @@
       __ jmp(&skip_store);
     }
 
+    {
+      __ Bind(&store_float64x2);
+      Label copy_float64x2;
+
+      StoreInstanceFieldSlowPath* slow_path =
+          new StoreInstanceFieldSlowPath(this, compiler->float64x2_class());
+      compiler->AddSlowPathCode(slow_path);
+
+      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ CompareObject(temp, Object::null_object(), PP);
+      __ j(NOT_EQUAL, &copy_float64x2);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     temp,
+                     temp2);
+      __ Bind(slow_path->exit_label());
+      __ movq(temp2, temp);
+      __ StoreIntoObject(instance_reg,
+                         FieldAddress(instance_reg, offset_in_bytes_),
+                         temp2);
+
+      __ Bind(&copy_float64x2);
+      __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
+      __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
+      __ jmp(&skip_store);
+    }
+
     __ Bind(&store_pointer);
   }
 
@@ -1963,6 +2004,10 @@
         __ Comment("UnboxedFloat32x4LoadFieldInstr");
         __ movups(result, FieldAddress(temp, Float32x4::value_offset()));
         break;
+      case kFloat64x2Cid:
+        __ Comment("UnboxedFloat64x2LoadFieldInstr");
+        __ movups(result, FieldAddress(temp, Float64x2::value_offset()));
+        break;
       default:
         UNREACHABLE();
     }
@@ -1978,6 +2023,7 @@
     Label load_pointer;
     Label load_double;
     Label load_float32x4;
+    Label load_float64x2;
 
     __ LoadObject(result, Field::ZoneHandle(field()->raw()), PP);
 
@@ -1993,6 +2039,10 @@
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
+    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+            Immediate(kFloat64x2Cid));
+    __ j(EQUAL, &load_float64x2);
+
     // Fall through.
     __ jmp(&load_pointer);
 
@@ -2032,6 +2082,23 @@
       __ movups(FieldAddress(result, Float32x4::value_offset()), value);
       __ jmp(&done);
     }
+    {
+      __ Bind(&load_float64x2);
+
+      BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
+
+      __ TryAllocate(compiler->float64x2_class(),
+                     slow_path->entry_label(),
+                     Assembler::kFarJump,
+                     result,
+                     temp);
+      __ Bind(slow_path->exit_label());
+      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
+      __ movups(FieldAddress(result, Float64x2::value_offset()), value);
+      __ jmp(&done);
+    }
 
     __ Bind(&load_pointer);
   }
@@ -3270,6 +3337,34 @@
 }
 
 
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
+
+  ASSERT(locs()->out().fpu_reg() == left);
+
+  switch (op_kind()) {
+    case Token::kADD: __ addpd(left, right); break;
+    case Token::kSUB: __ subpd(left, right); break;
+    case Token::kMUL: __ mulpd(left, right); break;
+    case Token::kDIV: __ divpd(left, right); break;
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -3288,7 +3383,7 @@
 
   switch (op_kind()) {
     case MethodRecognizer::kFloat32x4ShuffleX:
-      __ shufps(value, value, Immediate(0x00));
+      // Shuffle not necessary.
       __ cvtss2sd(value, value);
       break;
     case MethodRecognizer::kFloat32x4ShuffleY:
@@ -3701,6 +3796,222 @@
 }
 
 
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->in(0).fpu_reg();
+
+  ASSERT(locs()->out().fpu_reg() == value);
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2GetX:
+      // nop.
+      break;
+    case MethodRecognizer::kFloat64x2GetY:
+      __ shufpd(value, value, Immediate(0x33));
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_out(Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ xorpd(value, value);
+}
+
+
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ shufpd(value, value, Immediate(0x0));
+}
+
+
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister v0 = locs()->in(0).fpu_reg();
+  XmmRegister v1 = locs()->in(1).fpu_reg();
+  ASSERT(v0 == locs()->out().fpu_reg());
+  __ AddImmediate(RSP, Immediate(-16), PP);
+  __ movsd(Address(RSP, 0), v0);
+  __ movsd(Address(RSP, 8), v1);
+  __ movups(v0, Address(RSP, 0));
+  __ AddImmediate(RSP, Immediate(16), PP);
+}
+
+
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ cvtpd2ps(value, value);
+}
+
+
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
+    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister value = locs()->out().fpu_reg();
+  __ cvtps2pd(value, value);
+}
+
+
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  if (representation() == kTagged) {
+    ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
+    summary->set_out(Location::RequiresRegister());
+  } else {
+    ASSERT(representation() == kUnboxedFloat64x2);
+    summary->set_out(Location::SameAsFirstInput());
+  }
+  return summary;
+}
+
+
+void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+
+  ASSERT((op_kind() == MethodRecognizer::kFloat64x2GetSignMask) ||
+         (locs()->out().fpu_reg() == left));
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Negate:
+      __ negatepd(left);
+      break;
+    case MethodRecognizer::kFloat64x2Abs:
+      __ abspd(left);
+      break;
+    case MethodRecognizer::kFloat64x2Sqrt:
+      __ sqrtpd(left);
+      break;
+    case MethodRecognizer::kFloat64x2GetSignMask:
+      __ movmskpd(locs()->out().reg(), left);
+      __ SmiTag(locs()->out().reg());
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  XmmRegister left = locs()->in(0).fpu_reg();
+  XmmRegister right = locs()->in(1).fpu_reg();
+  ASSERT((locs()->out().fpu_reg() == left));
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Scale:
+      __ shufpd(right, right, Immediate(0x00));
+      __ mulpd(left, right);
+      break;
+    case MethodRecognizer::kFloat64x2WithX:
+      __ subq(RSP, Immediate(16));
+      // Move value to stack.
+      __ movups(Address(RSP, 0), left);
+      // Write over X value.
+      __ movsd(Address(RSP, 0), right);
+      // Move updated value into output register.
+      __ movups(left, Address(RSP, 0));
+      __ addq(RSP, Immediate(16));
+      break;
+    case MethodRecognizer::kFloat64x2WithY:
+      __ subq(RSP, Immediate(16));
+      // Move value to stack.
+      __ movups(Address(RSP, 0), left);
+      // Write over Y value.
+      __ movsd(Address(RSP, 8), right);
+      // Move updated value into output register.
+      __ movups(left, Address(RSP, 0));
+      __ addq(RSP, Immediate(16));
+      break;
+    case MethodRecognizer::kFloat64x2Min:
+      __ minpd(left, right);
+      break;
+    case MethodRecognizer::kFloat64x2Max:
+      __ maxpd(left, right);
+      break;
+    default: UNREACHABLE();
+  }
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     bool opt) const {
   const intptr_t kNumInputs = 4;
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index a405284..993fe06 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -109,6 +109,9 @@
     cls = lib.LookupClassAllowPrivate(str);                                    \
     ASSERT(!cls.IsNull());                                                     \
     error = cls.EnsureIsFinalized(isolate);                                    \
+    if (!error.IsNull()) {                                                     \
+      OS::PrintErr("%s\n", error.ToErrorCString());                            \
+    }                                                                          \
     ASSERT(error.IsNull());                                                    \
     if (#function_name[0] == '.') {                                            \
       str = String::New(#class_name#function_name);                            \
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index d2b863b..b5de9a3 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -116,7 +116,7 @@
   HandleScope handle_scope(isolate_);
   // TODO(turnidge): Rework collection total dart execution.  This can
   // overcount when other things (gc, compilation) are active.
-  TIMERSCOPE(time_dart_execution);
+  TIMERSCOPE(isolate_, time_dart_execution);
 
   // If the message is in band we lookup the receive port to dispatch to.  If
   // the receive port is closed, we drop the message without deserializing it.
@@ -281,8 +281,14 @@
 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) {
   ASSERT(isolate == Isolate::Current());
 }
-#endif
+#endif  // defined(DEBUG)
 
+#if defined(DEBUG)
+#define REUSABLE_HANDLE_SCOPE_INIT(object)                                     \
+  reusable_##object##_handle_scope_active_(false),
+#else
+#define REUSABLE_HANDLE_SCOPE_INIT(object)
+#endif  // defined(DEBUG)
 
 #define REUSABLE_HANDLE_INITIALIZERS(object)                                   \
   object##_handle_(NULL),
@@ -316,8 +322,8 @@
       message_handler_(NULL),
       spawn_state_(NULL),
       is_runnable_(false),
-      gc_prologue_callbacks_(),
-      gc_epilogue_callbacks_(),
+      gc_prologue_callback_(NULL),
+      gc_epilogue_callback_(NULL),
       defer_finalization_count_(0),
       deopt_context_(NULL),
       stacktrace_(NULL),
@@ -328,8 +334,10 @@
       thread_state_(NULL),
       next_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
+      REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
       reusable_handles_() {
 }
+#undef REUSABLE_HANDLE_SCOPE_INIT
 #undef REUSABLE_HANDLE_INITIALIZERS
 
 
@@ -405,8 +413,7 @@
 
   // Setup the isolate specific resuable handles.
 #define REUSABLE_HANDLE_ALLOCATION(object)                                     \
-  result->object##_handle_ = result->AllocateReusableHandle<object>();         \
-
+  result->object##_handle_ = result->AllocateReusableHandle<object>();
   REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ALLOCATION)
 #undef REUSABLE_HANDLE_ALLOCATION
 
@@ -734,7 +741,7 @@
   void VisitHandle(uword addr, bool is_prologue_weak) {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
-    FinalizablePersistentHandle::Finalize(isolate(), handle, is_prologue_weak);
+    handle->UpdateUnreachable(isolate(), is_prologue_weak);
   }
 
  private:
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 77544cd..5410ab8 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -10,7 +10,6 @@
 #include "platform/thread.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
-#include "vm/gc_callbacks.h"
 #include "vm/handles.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/random.h"
@@ -27,6 +26,7 @@
 class CodeIndexTable;
 class Debugger;
 class DeoptContext;
+class Error;
 class Field;
 class Function;
 class HandleScope;
@@ -63,18 +63,6 @@
 class ObjectIdRing;
 
 
-#define REUSABLE_HANDLE_LIST(V)                                                \
-  V(Object)                                                                    \
-  V(Array)                                                                     \
-  V(String)                                                                    \
-  V(Instance)                                                                  \
-  V(Function)                                                                  \
-  V(Field)                                                                     \
-  V(Class)                                                                     \
-  V(TypeParameter)                                                             \
-  V(TypeArguments)                                                             \
-
-
 class IsolateVisitor {
  public:
   IsolateVisitor() {}
@@ -86,6 +74,17 @@
   DISALLOW_COPY_AND_ASSIGN(IsolateVisitor);
 };
 
+#define REUSABLE_HANDLE_LIST(V)                                                \
+  V(Array)                                                                     \
+  V(Class)                                                                     \
+  V(Error)                                                                     \
+  V(Field)                                                                     \
+  V(Function)                                                                  \
+  V(Instance)                                                                  \
+  V(Object)                                                                    \
+  V(String)                                                                    \
+  V(TypeArguments)                                                             \
+  V(TypeParameter)                                                             \
 
 class Isolate : public BaseIsolate {
  public:
@@ -306,12 +305,20 @@
   Simulator* simulator() const { return simulator_; }
   void set_simulator(Simulator* value) { simulator_ = value; }
 
-  GcPrologueCallbacks& gc_prologue_callbacks() {
-    return gc_prologue_callbacks_;
+  Dart_GcPrologueCallback gc_prologue_callback() const {
+    return gc_prologue_callback_;
   }
 
-  GcEpilogueCallbacks& gc_epilogue_callbacks() {
-    return gc_epilogue_callbacks_;
+  void set_gc_prologue_callback(Dart_GcPrologueCallback callback) {
+    gc_prologue_callback_ = callback;
+  }
+
+  Dart_GcEpilogueCallback gc_epilogue_callback() const {
+    return gc_epilogue_callback_;
+  }
+
+  void set_gc_epilogue_callback(Dart_GcEpilogueCallback callback) {
+    gc_epilogue_callback_ = callback;
   }
 
   static void SetCreateCallback(Dart_IsolateCreateCallback cb) {
@@ -438,6 +445,25 @@
     return thread_state_;
   }
 
+#if defined(DEBUG)
+#define REUSABLE_HANDLE_SCOPE_ACCESSORS(object)                                \
+  void set_reusable_##object##_handle_scope_active(bool value) {               \
+    reusable_##object##_handle_scope_active_ = value;                          \
+  }                                                                            \
+  bool reusable_##object##_handle_scope_active() const {                       \
+    return reusable_##object##_handle_scope_active_;                           \
+  }
+  REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_ACCESSORS)
+#undef REUSABLE_HANDLE_SCOPE_ACCESSORS
+#endif  // defined(DEBUG)
+
+#define REUSABLE_HANDLE(object)                                                \
+  object& object##Handle() const {                                             \
+    return *object##_handle_;                                                  \
+  }
+  REUSABLE_HANDLE_LIST(REUSABLE_HANDLE)
+#undef REUSABLE_HANDLE
+
   static void VisitIsolates(IsolateVisitor* visitor);
 
  private:
@@ -480,8 +506,8 @@
   MessageHandler* message_handler_;
   IsolateSpawnState* spawn_state_;
   bool is_runnable_;
-  GcPrologueCallbacks gc_prologue_callbacks_;
-  GcEpilogueCallbacks gc_epilogue_callbacks_;
+  Dart_GcPrologueCallback gc_prologue_callback_;
+  Dart_GcEpilogueCallback gc_epilogue_callback_;
   intptr_t defer_finalization_count_;
   DeoptContext* deopt_context_;
 
@@ -503,10 +529,17 @@
 
   // Reusable handles support.
 #define REUSABLE_HANDLE_FIELDS(object)                                         \
-  object* object##_handle_;                                                    \
-
+  object* object##_handle_;
   REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_FIELDS)
 #undef REUSABLE_HANDLE_FIELDS
+
+#if defined(DEBUG)
+#define REUSABLE_HANDLE_SCOPE_VARIABLE(object)                                 \
+  bool reusable_##object##_handle_scope_active_;
+  REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_VARIABLE);
+#undef REUSABLE_HANDLE_SCOPE_VARIABLE
+#endif  // defined(DEBUG)
+
   VMHandles reusable_handles_;
 
   static Dart_IsolateCreateCallback create_callback_;
@@ -528,8 +561,10 @@
   static Monitor* isolates_list_monitor_;
   static Isolate* isolates_list_head_;
 
-  friend class ReusableHandleScope;
-  friend class ReusableObjectHandleScope;
+#define REUSABLE_FRIEND_DECLARATION(name)                                      \
+  friend class Reusable##name##HandleScope;
+REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
+#undef REUSABLE_FRIEND_DECLARATION
 
   DISALLOW_COPY_AND_ASSIGN(Isolate);
 };
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 9fffcae..5c4ec91 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -9,6 +9,7 @@
 #include "vm/json_stream.h"
 #include "vm/message.h"
 #include "vm/object.h"
+#include "vm/unicode.h"
 
 
 namespace dart {
@@ -80,8 +81,12 @@
     Isolate* isolate = Isolate::Current();
     ASSERT(isolate != NULL);
     const char* isolate_name = isolate->name();
-    OS::Print("Isolate %s processing service request /%s\n",
+    OS::Print("Isolate %s processing service request /%s",
               isolate_name, command_);
+    for (intptr_t i = 1; i < num_arguments(); i++) {
+      OS::Print("/%s", GetArgument(i));
+    }
+    OS::Print("\n");
     setup_time_micros_ = OS::GetCurrentTimeMicros();
   }
 }
@@ -114,8 +119,12 @@
     Isolate* isolate = Isolate::Current();
     ASSERT(isolate != NULL);
     const char* isolate_name = isolate->name();
-    OS::Print("Isolate %s processed service request /%s in %" Pd64" us.\n",
-              isolate_name, command_, process_delta_micros);
+    OS::Print("Isolate %s processed service request /%s",
+              isolate_name, command_);
+    for (intptr_t i = 1; i < num_arguments(); i++) {
+      OS::Print("/%s", GetArgument(i));
+    }
+    OS::Print(" in %" Pd64" us.\n", process_delta_micros);
   }
 }
 
@@ -197,7 +206,7 @@
 void JSONStream::PrintValue(const char* s) {
   PrintCommaIfNeeded();
   buffer_.AddChar('"');
-  buffer_.AddEscapedString(s);
+  AddEscapedUTF8String(s);
   buffer_.AddChar('"');
 }
 
@@ -215,7 +224,7 @@
   va_end(args);
   ASSERT(len == len2);
   buffer_.AddChar('"');
-  buffer_.AddEscapedString(p);
+  AddEscapedUTF8String(p);
   buffer_.AddChar('"');
   free(p);
 }
@@ -275,7 +284,7 @@
   va_end(args);
   ASSERT(len == len2);
   buffer_.AddChar('"');
-  buffer_.AddEscapedString(p);
+  AddEscapedUTF8String(p);
   buffer_.AddChar('"');
   free(p);
 }
@@ -311,7 +320,7 @@
   ASSERT(name != NULL);
   PrintCommaIfNeeded();
   buffer_.AddChar('"');
-  buffer_.AddEscapedString(name);
+  AddEscapedUTF8String(name);
   buffer_.AddChar('"');
   buffer_.AddChar(':');
 }
@@ -335,6 +344,23 @@
 }
 
 
+void JSONStream::AddEscapedUTF8String(const char* s) {
+  intptr_t len = strlen(s);
+  const uint8_t* s8 = reinterpret_cast<const uint8_t*>(s);
+  intptr_t i = 0;
+  for (; i < len; ) {
+    // Extract next UTF8 character.
+    int32_t ch = 0;
+    int32_t ch_len = Utf8::Decode(&s8[i], len - i, &ch);
+    ASSERT(ch_len != 0);
+    buffer_.AddEscapedChar(ch);
+    // Move i forward.
+    i += ch_len;
+  }
+  ASSERT(i == len);
+}
+
+
 JSONObject::JSONObject(const JSONArray* arr) : stream_(arr->stream_) {
   stream_->OpenObject();
 }
@@ -353,7 +379,7 @@
   va_end(args);
   ASSERT(len == len2);
   stream_->buffer_.AddChar('"');
-  stream_->buffer_.AddEscapedString(p);
+  stream_->AddEscapedUTF8String(p);
   stream_->buffer_.AddChar('"');
   free(p);
 }
@@ -371,7 +397,7 @@
   va_end(args);
   ASSERT(len == len2);
   stream_->buffer_.AddChar('"');
-  stream_->buffer_.AddEscapedString(p);
+  stream_->AddEscapedUTF8String(p);
   stream_->buffer_.AddChar('"');
   free(p);
 }
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 81b3272..50a9e23 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -92,6 +92,8 @@
   void PrintCommaIfNeeded();
   bool NeedComma();
 
+  void AddEscapedUTF8String(const char* s);
+
   intptr_t nesting_level() const { return open_objects_; }
 
   intptr_t open_objects_;
diff --git a/runtime/vm/longjump.cc b/runtime/vm/longjump.cc
index ed6b82d..791fab1 100644
--- a/runtime/vm/longjump.cc
+++ b/runtime/vm/longjump.cc
@@ -44,6 +44,13 @@
 
   Isolate* isolate = Isolate::Current();
 
+#if defined(DEBUG)
+#define CHECK_REUSABLE_HANDLE(name)                                            \
+  ASSERT(!isolate->reusable_##name##_handle_scope_active());
+REUSABLE_HANDLE_LIST(CHECK_REUSABLE_HANDLE)
+#undef CHECK_REUSABLE_HANDLE
+#endif  // defined(DEBUG)
+
   // Remember the error in the sticky error of this isolate.
   isolate->object_store()->set_sticky_error(error);
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ba744e3..ec96fea 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -902,7 +902,7 @@
 
 
 RawError* Object::Init(Isolate* isolate) {
-  TIMERSCOPE(time_bootstrap);
+  TIMERSCOPE(isolate, time_bootstrap);
   ObjectStore* object_store = isolate->object_store();
 
   Class& cls = Class::Handle();
@@ -1336,7 +1336,7 @@
 
 
 void Object::InitFromSnapshot(Isolate* isolate) {
-  TIMERSCOPE(time_bootstrap);
+  TIMERSCOPE(isolate, time_bootstrap);
   ObjectStore* object_store = isolate->object_store();
 
   Class& cls = Class::Handle();
@@ -1808,11 +1808,12 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return -1;
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
+  Function& function = isolate->FunctionHandle();
   funcs ^= functions();
   ASSERT(!funcs.IsNull());
-  Function& function = reused_handles.FunctionHandle();
   const intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
     function ^= funcs.At(i);
@@ -1860,12 +1861,13 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return -1;
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
+  Function& function = isolate->FunctionHandle();
   funcs ^= functions();
   ASSERT(!funcs.IsNull());
-  Function& function = reused_handles.FunctionHandle();
-  Function& implicit_closure = Function::Handle();
+  Function& implicit_closure = Function::Handle(isolate);
   const intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
     function ^= funcs.At(i);
@@ -1890,11 +1892,12 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return -1;
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
+  Object& object = isolate->ObjectHandle();
   funcs ^= invocation_dispatcher_cache();
   ASSERT(!funcs.IsNull());
-  Object& object = reused_handles.ObjectHandle();
   const intptr_t len = funcs.Length();
   for (intptr_t i = 0; i < len; i++) {
     object = funcs.At(i);
@@ -1902,7 +1905,7 @@
     // are functions.
     if (object.IsFunction()) {
       if (Function::Cast(object).raw() == needle.raw()) {
-      return i;
+        return i;
       }
     }
   }
@@ -1913,10 +1916,12 @@
 
 
 RawFunction* Class::InvocationDispatcherFunctionFromIndex(intptr_t idx) const {
-  ReusableHandleScope reused_handles(Isolate::Current());
-  Array& dispatcher_cache = reused_handles.ArrayHandle();
+  Isolate* isolate = Isolate::Current();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  Array& dispatcher_cache = isolate->ArrayHandle();
+  Object& object = isolate->ObjectHandle();
   dispatcher_cache ^= invocation_dispatcher_cache();
-  Object& object = reused_handles.ObjectHandle();
   object = dispatcher_cache.At(idx);
   if (!object.IsFunction()) {
     return Function::null();
@@ -1970,10 +1975,10 @@
     return -1;
   }
   Isolate* isolate = Isolate::Current();
-  ReusableHandleScope reused_handles(isolate);
   const GrowableObjectArray& closures_array =
       GrowableObjectArray::Handle(isolate, closures());
-  Function& closure = reused_handles.FunctionHandle();
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  Function& closure = isolate->FunctionHandle();
   intptr_t num_closures = closures_array.Length();
   for (intptr_t i = 0; i < num_closures; i++) {
     closure ^= closures_array.At(i);
@@ -2027,8 +2032,8 @@
   if (type_parameters() == TypeArguments::null()) {
     return 0;
   }
-  ReusableHandleScope reused_handles(isolate);
-  TypeArguments& type_params = reused_handles.TypeArgumentsHandle();
+  REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate);
+  TypeArguments& type_params = isolate->TypeArgumentsHandle();
   type_params = type_parameters();
   return type_params.Length();
 }
@@ -2168,11 +2173,14 @@
 RawTypeParameter* Class::LookupTypeParameter(const String& type_name) const {
   ASSERT(!type_name.IsNull());
   Isolate* isolate = Isolate::Current();
-  ReusableHandleScope reused_handles(isolate);
-  TypeArguments& type_params = reused_handles.TypeArgumentsHandle();
+  REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate);
+  REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  TypeArguments& type_params = isolate->TypeArgumentsHandle();
+  TypeParameter&  type_param = isolate->TypeParameterHandle();
+  String& type_param_name = isolate->StringHandle();
+
   type_params ^= type_parameters();
-  TypeParameter& type_param = reused_handles.TypeParameterHandle();
-  String& type_param_name = reused_handles.StringHandle();
   if (!type_params.IsNull()) {
     const intptr_t num_type_params = type_params.Length();
     for (intptr_t i = 0; i < num_type_params; i++) {
@@ -2246,7 +2254,8 @@
   };
 
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
-         kind == RawFunction::kInvokeFieldDispatcher);
+         kind == RawFunction::kInvokeFieldDispatcher ||
+         kind == RawFunction::kInvokeClosureDispatcher);
   Function& dispatcher = Function::Handle();
   Array& cache = Array::Handle(invocation_dispatcher_cache());
   ASSERT(!cache.IsNull());
@@ -2707,12 +2716,14 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return -1;
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& fields_array = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FIELD_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  Array& fields_array = isolate->ArrayHandle();
+  Field& field = isolate->FieldHandle();
+  String& field_name = isolate->StringHandle();
   fields_array ^= fields();
   ASSERT(!fields_array.IsNull());
-  Field& field = reused_handles.FieldHandle();
-  String& field_name = reused_handles.StringHandle();
   String& needle_name = String::Handle(isolate);
   needle_name ^= needle.name();
   const intptr_t len = fields_array.Length();
@@ -3552,12 +3563,13 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Function::null();
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
   funcs ^= functions();
   ASSERT(!funcs.IsNull());
-  Function& function = reused_handles.FunctionHandle();
   const intptr_t len = funcs.Length();
+  Function& function = isolate->FunctionHandle();
   if (name.IsSymbol()) {
     // Quick Symbol compare.
     NoGCScope no_gc;
@@ -3568,7 +3580,8 @@
       }
     }
   } else {
-    String& function_name = reused_handles.StringHandle();
+    REUSABLE_STRING_HANDLESCOPE(isolate);
+    String& function_name = isolate->StringHandle();
     for (intptr_t i = 0; i < len; i++) {
       function ^= funcs.At(i);
       function_name ^= function.name();
@@ -3588,13 +3601,15 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Function::null();
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
   funcs ^= functions();
   ASSERT(!funcs.IsNull());
-  Function& function = reused_handles.FunctionHandle();
-  String& function_name = reused_handles.StringHandle();
   intptr_t len = funcs.Length();
+  Function& function = isolate->FunctionHandle();
+  String& function_name = isolate->StringHandle();
   for (intptr_t i = 0; i < len; i++) {
     function ^= funcs.At(i);
     function_name ^= function.name();
@@ -3624,12 +3639,14 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Function::null();
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& funcs = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FUNCTION_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  Array& funcs = isolate->ArrayHandle();
   funcs ^= functions();
-  Function& function = reused_handles.FunctionHandle();
-  String& function_name = reused_handles.StringHandle();
   intptr_t len = funcs.Length();
+  Function& function = isolate->FunctionHandle();
+  String& function_name = isolate->StringHandle();
   for (intptr_t i = 0; i < len; i++) {
     function ^= funcs.At(i);
     function_name ^= function.name();
@@ -3689,13 +3706,15 @@
   if (EnsureIsFinalized(isolate) != Error::null()) {
     return Field::null();
   }
-  ReusableHandleScope reused_handles(isolate);
-  Array& flds = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_FIELD_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  Array& flds = isolate->ArrayHandle();
   flds ^= fields();
   ASSERT(!flds.IsNull());
-  Field& field = reused_handles.FieldHandle();
-  String& field_name = reused_handles.StringHandle();
   intptr_t len = flds.Length();
+  Field& field = isolate->FieldHandle();
+  String& field_name = isolate->StringHandle();
   for (intptr_t i = 0; i < len; i++) {
     field ^= flds.At(i);
     field_name ^= field.name();
@@ -4638,7 +4657,8 @@
 
 RawArray* Function::saved_args_desc() const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher ||
+         kind() == RawFunction::kInvokeClosureDispatcher);
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsArray());
   return Array::Cast(obj).raw();
@@ -4647,7 +4667,8 @@
 
 void Function::set_saved_args_desc(const Array& value) const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher ||
+         kind() == RawFunction::kInvokeClosureDispatcher);
   ASSERT(raw_ptr()->data_ == Object::null());
   set_data(value);
 }
@@ -4796,6 +4817,9 @@
     case RawFunction::kInvokeFieldDispatcher:
       return "kInvokeFieldDispatcher";
       break;
+    case RawFunction::kInvokeClosureDispatcher:
+      return "kInvokeClosureDispatcher";
+      break;
     default:
       UNREACHABLE();
       return NULL;
@@ -6048,6 +6072,9 @@
     case RawFunction::kInvokeFieldDispatcher:
       kind_str = "invoke-field-dispatcher";
       break;
+    case RawFunction::kInvokeClosureDispatcher:
+      kind_str = "invoke-closure-dispatcher";
+      break;
     default:
       UNREACHABLE();
   }
@@ -6079,7 +6106,9 @@
   } else if (IsImplicitClosureFunction()) {
     id = cls.FindImplicitClosureFunctionIndex(*this);
     selector = "implicit_closures";
-  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
+  } else if (IsNoSuchMethodDispatcher() ||
+             IsInvokeFieldDispatcher() ||
+             IsInvokeClosureDispatcher()) {
     id = cls.FindInvocationDispatcherFunctionIndex(*this);
     selector = "dispatchers";
   } else {
@@ -6093,13 +6122,14 @@
   jsobj.AddPropertyF("id", "classes/%" Pd "/%s/%" Pd "", cid, selector, id);
   jsobj.AddProperty("name", internal_name);
   jsobj.AddProperty("user_name", user_name);
+  jsobj.AddProperty("class", cls);
+  const char* kind_string = Function::KindToCString(kind());
+  jsobj.AddProperty("kind", kind_string);
   if (ref) return;
   jsobj.AddProperty("is_static", is_static());
   jsobj.AddProperty("is_const", is_const());
   jsobj.AddProperty("is_optimizable", is_optimizable());
   jsobj.AddProperty("is_inlinable", IsInlineable());
-  const char* kind_string = Function::KindToCString(kind());
-  jsobj.AddProperty("kind", kind_string);
   jsobj.AddProperty("unoptimized_code", Object::Handle(unoptimized_code()));
   jsobj.AddProperty("usage_counter", usage_counter());
   jsobj.AddProperty("optimized_call_site_count", optimized_call_site_count());
@@ -6352,8 +6382,10 @@
 
 bool Field::IsUnboxedField() const {
   bool valid_class = (guarded_cid() == kDoubleCid) ||
-                     (FlowGraphCompiler::SupportsUnboxedFloat32x4() &&
-                      (guarded_cid() == kFloat32x4Cid));
+                     (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                      (guarded_cid() == kFloat32x4Cid)) ||
+                     (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                      (guarded_cid() == kFloat64x2Cid));
   return is_unboxing_candidate() && !is_final() && !is_nullable() &&
          valid_class;
 }
@@ -6761,12 +6793,17 @@
     switch (curr) {
       case Token::kLBRACE:
       case Token::kRBRACE:
+        if (next != Token::kNEWLINE) {
+          separator = &Symbols::Blank();
+        }
+        break;
       case Token::kPERIOD:
       case Token::kLBRACK:
       case Token::kINTERPOL_VAR:
       case Token::kINTERPOL_START:
       case Token::kINTERPOL_END:
       case Token::kBIT_NOT:
+      case Token::kNOT:
         break;
       // In case we see an opening parentheses '(' we increase the indent to
       // align multi-line parameters accordingly. The indent will be removed as
@@ -6802,10 +6839,10 @@
     switch (next) {
       case Token::kRBRACE:
         break;
+      case Token::kNEWLINE:
       case Token::kSEMICOLON:
       case Token::kPERIOD:
       case Token::kCOMMA:
-      case Token::kLPAREN:
       case Token::kRPAREN:
       case Token::kLBRACK:
       case Token::kRBRACK:
@@ -6814,6 +6851,13 @@
       case Token::kINTERPOL_END:
         separator = NULL;
         break;
+      case Token::kLPAREN:
+        if (curr == Token::kCATCH) {
+          separator = &Symbols::Blank();
+        } else {
+          separator = NULL;
+        }
+        break;
       case Token::kELSE:
         separator = &Symbols::Blank();
         break;
@@ -8018,14 +8062,15 @@
 
 RawObject* Library::LookupEntry(const String& name, intptr_t *index) const {
   Isolate* isolate = Isolate::Current();
-  ReusableHandleScope reused_handles(isolate);
-  Array& dict = reused_handles.ArrayHandle();
+  REUSABLE_ARRAY_HANDLESCOPE(isolate);
+  REUSABLE_OBJECT_HANDLESCOPE(isolate);
+  REUSABLE_STRING_HANDLESCOPE(isolate);
+  Array& dict = isolate->ArrayHandle();
   dict ^= dictionary();
   intptr_t dict_size = dict.Length() - 1;
   *index = name.Hash() % dict_size;
-
-  Object& entry = reused_handles.ObjectHandle();
-  String& entry_name = reused_handles.StringHandle();
+  Object& entry = isolate->ObjectHandle();
+  String& entry_name = isolate->StringHandle();
   entry = dict.At(*index);
   // Search the entry in the hash set.
   while (!entry.IsNull()) {
@@ -8947,6 +8992,45 @@
 }
 
 
+void Namespace::set_metadata_field(const Field& value) const {
+  StorePointer(&raw_ptr()->metadata_field_, value.raw());
+}
+
+
+void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) {
+  ASSERT(Field::Handle(metadata_field()).IsNull());
+  Field& field = Field::Handle(Field::New(Symbols::TopLevel(),
+                                          true,   // is_static
+                                          false,  // is_final
+                                          false,  // is_const
+                                          owner_class,
+                                          token_pos));
+  field.set_type(Type::Handle(Type::DynamicType()));
+  field.set_value(Array::empty_array());
+  set_metadata_field(field);
+}
+
+
+RawObject* Namespace::GetMetadata() const {
+  Field& field = Field::Handle(metadata_field());
+  if (field.IsNull()) {
+    // There is no metadata for this object.
+    return Object::empty_array().raw();
+  }
+  Object& metadata = Object::Handle();
+  metadata = field.value();
+  if (field.value() == Object::empty_array().raw()) {
+    metadata = Parser::ParseMetadata(Class::Handle(field.owner()),
+                                     field.token_pos());
+    if (metadata.IsArray()) {
+      ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
+      field.set_value(Array::Cast(metadata));
+    }
+  }
+  return metadata.raw();
+}
+
+
 const char* Namespace::ToCString() const {
   const char* kFormat = "Namespace for library '%s'";
   const Library& lib = Library::Handle(library());
@@ -10185,6 +10269,7 @@
     result.set_is_optimized(false);
     result.set_is_alive(false);
     result.set_comments(Comments::New(0));
+    result.set_compile_timestamp(0);
     result.set_pc_descriptors(Object::empty_descriptors());
   }
   return result.raw();
@@ -10211,6 +10296,7 @@
   assembler->FinalizeInstructions(region);
   CPU::FlushICache(instrs.EntryPoint(), instrs.size());
 
+  code.set_compile_timestamp(OS::GetCurrentTimeMicros());
   CodeObservers::NotifyAll(name,
                            instrs.EntryPoint(),
                            assembler->prologue_offset(),
@@ -10306,6 +10392,24 @@
 }
 
 
+// Given a pc and a timestamp, lookup the code.
+RawCode* Code::FindCode(uword pc, int64_t timestamp) {
+  Code& code = Code::Handle(Code::LookupCode(pc));
+  if (!code.IsNull() && (code.compile_timestamp() == timestamp) &&
+      (code.EntryPoint() == pc)) {
+    // Found code in isolate.
+    return code.raw();
+  }
+  code ^= Code::LookupCodeInVmIsolate(pc);
+  if (!code.IsNull() && (code.compile_timestamp() == timestamp) &&
+      (code.EntryPoint() == pc)) {
+    // Found code in VM isolate.
+    return code.raw();
+  }
+  return Code::null();
+}
+
+
 intptr_t Code::GetTokenIndexOfPC(uword pc) const {
   intptr_t token_pos = -1;
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
@@ -10399,11 +10503,13 @@
 void Code::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
-  jsobj.AddPropertyF("id", "code/%" Px "", EntryPoint());
+  jsobj.AddPropertyF("id", "code/%" Px64"-%" Px "", compile_timestamp(),
+                     EntryPoint());
   jsobj.AddPropertyF("start", "%" Px "", EntryPoint());
   jsobj.AddPropertyF("end", "%" Px "", EntryPoint() + Size());
   jsobj.AddProperty("is_optimized", is_optimized());
   jsobj.AddProperty("is_alive", is_alive());
+  jsobj.AddProperty("kind", "Dart");
   const String& name = String::Handle(Name());
   const String& user_name = String::Handle(UserName());
   const char* name_prefix = is_optimized() ? "*" : "";
@@ -10412,6 +10518,14 @@
   const Object& obj = Object::Handle(owner());
   if (obj.IsFunction()) {
     jsobj.AddProperty("function", obj);
+  } else {
+    // Generate a fake function reference.
+    JSONObject func(&jsobj, "function");
+    func.AddProperty("type", "@Function");
+    func.AddProperty("kind", "Stub");
+    func.AddPropertyF("id", "functions/stub-%" Pd "", EntryPoint());
+    func.AddProperty("user_name", user_name.ToCString());
+    func.AddProperty("name", name.ToCString());
   }
   if (ref) {
     return;
@@ -10761,7 +10875,7 @@
 
 intptr_t ICData::NumberOfChecks() const {
   // Do not count the sentinel;
-  return (Array::Handle(ic_data()).Length() / TestEntryLength()) - 1;
+  return (Smi::Value(ic_data()->ptr()->length_) / TestEntryLength()) - 1;
 }
 
 
@@ -11373,9 +11487,7 @@
 
 
 void Error::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(false));
-  jsobj.AddProperty("error_msg", ToErrorCString());
+  UNREACHABLE();
 }
 
 
@@ -11421,8 +11533,10 @@
 
 void ApiError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(false));
-  jsobj.AddProperty("error_msg", ToErrorCString());
+  jsobj.AddProperty("type", "Error");
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("kind", JSONType(false));
+  jsobj.AddProperty("message", ToErrorCString());
 }
 
 
@@ -11607,8 +11721,10 @@
 
 void LanguageError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(false));
-  jsobj.AddProperty("error_msg", ToErrorCString());
+  jsobj.AddProperty("type", "Error");
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("kind", JSONType(false));
+  jsobj.AddProperty("message", ToErrorCString());
 }
 
 
@@ -11680,11 +11796,20 @@
 }
 
 
+
 void UnhandledException::PrintToJSONStream(JSONStream* stream,
                                            bool ref) const {
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(false));
-  jsobj.AddProperty("error_msg", ToErrorCString());
+  jsobj.AddProperty("type", "Error");
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("kind", JSONType(false));
+  jsobj.AddProperty("message", ToErrorCString());
+
+  Instance& instance = Instance::Handle();
+  instance = exception();
+  jsobj.AddProperty("exception", instance);
+  instance = stacktrace();
+  jsobj.AddProperty("stacktrace", instance);
 }
 
 
@@ -11721,8 +11846,10 @@
 
 void UnwindError::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(false));
-  jsobj.AddProperty("error_msg", ToErrorCString());
+  jsobj.AddProperty("type", "Error");
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("kind", JSONType(false));
+  jsobj.AddProperty("message", ToErrorCString());
 }
 
 
@@ -12052,7 +12179,10 @@
 
 
 bool Instance::IsValidFieldOffset(intptr_t offset) const {
-  const Class& cls = Class::Handle(clazz());
+  Isolate* isolate = Isolate::Current();
+  REUSABLE_CLASS_HANDLESCOPE(isolate);
+  Class& cls = isolate->ClassHandle();
+  cls = clazz();
   return (offset >= 0 && offset <= (cls.instance_size() - kWordSize));
 }
 
@@ -12110,20 +12240,22 @@
 void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   Class& cls = Class::Handle(this->clazz());
-  jsobj.AddProperty("preview", ToUserCString(40));
 
   // TODO(turnidge): Handle <optimized out> like other null-like values.
   if (IsNull()) {
     jsobj.AddProperty("type", ref ? "@Null" : "Null");
     jsobj.AddProperty("id", "objects/null");
+    jsobj.AddProperty("preview", "null");
     return;
   } else if (raw() == Object::sentinel().raw()) {
     jsobj.AddProperty("type", ref ? "@Null" : "Null");
     jsobj.AddProperty("id", "objects/not-initialized");
+    jsobj.AddProperty("preview", "<not initialized>");
     return;
   } else if (raw() == Object::transition_sentinel().raw()) {
     jsobj.AddProperty("type", ref ? "@Null" : "Null");
     jsobj.AddProperty("id", "objects/being-initialized");
+    jsobj.AddProperty("preview", "<being initialized>");
     return;
   } else if (raw() == Symbols::OptimizedOut().raw()) {
     // TODO(turnidge): This is a hack.  The user could have this
@@ -12145,6 +12277,7 @@
     }
     jsobj.AddPropertyF("id", "objects/%" Pd "", id);
     jsobj.AddProperty("class", cls);
+    jsobj.AddProperty("preview", ToUserCString(40));
   }
   if (ref) {
     return;
@@ -12171,6 +12304,18 @@
       cls = cls.SuperClass();
     }
   }
+
+  if (NumNativeFields() > 0) {
+    JSONArray jsarr(&jsobj, "nativeFields");
+    for (intptr_t i = 0; i < NumNativeFields(); i++) {
+      intptr_t value = GetNativeField(i);
+      JSONObject jsfield(&jsarr);
+      jsfield.AddProperty("index", i);
+      jsfield.AddProperty("value", value);
+    }
+  }
+
+  jsobj.AddProperty("size", raw()->Size());
 }
 
 
@@ -14169,7 +14314,7 @@
 void Smi::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
-  jsobj.AddPropertyF("id", "objects/int/%" Pd "", Value());
+  jsobj.AddPropertyF("id", "objects/int-%" Pd "", Value());
   class Class& cls = Class::Handle(this->clazz());
   jsobj.AddProperty("class", cls);
   jsobj.AddPropertyF("preview", "%" Pd "", Value());
@@ -16209,7 +16354,7 @@
   const char* str = ToCString();
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
-  jsobj.AddPropertyF("id", "objects/bool/%s", str);
+  jsobj.AddPropertyF("id", "objects/bool-%s", str);
   class Class& cls = Class::Handle(this->clazz());
   jsobj.AddProperty("class", cls);
   jsobj.AddPropertyF("preview", "%s", str);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index b1c89e8..7105637 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -35,8 +35,12 @@
 class DeoptInstr;
 class FinalizablePersistentHandle;
 class LocalScope;
-class ReusableHandleScope;
-class ReusableObjectHandleScope;
+
+#define REUSABLE_FORWARD_DECLARATION(name)                                     \
+  class Reusable##name##HandleScope;
+REUSABLE_HANDLE_LIST(REUSABLE_FORWARD_DECLARATION)
+#undef REUSABLE_FORWARD_DECLARATION
+
 class Symbols;
 
 #if defined(DEBUG)
@@ -89,6 +93,9 @@
     initializeHandle(obj, object::null());                                     \
     return obj;                                                                \
   }                                                                            \
+  static object& ZoneHandle(Isolate* isolate) {                                \
+    return ZoneHandle(isolate, object::null());                                \
+  }                                                                            \
   static object& ZoneHandle() {                                                \
     return ZoneHandle(Isolate::Current(), object::null());                     \
   }                                                                            \
@@ -639,8 +646,10 @@
   friend class ExternalOneByteString;
   friend class ExternalTwoByteString;
   friend class Isolate;
-  friend class ReusableHandleScope;
-  friend class ReusableObjectHandleScope;
+#define REUSABLE_FRIEND_DECLARATION(name)                                      \
+  friend class Reusable##name##HandleScope;
+REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION)
+#undef REUSABLE_FRIEND_DECLARATION
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Object);
@@ -1535,6 +1544,10 @@
     return kind() == RawFunction::kInvokeFieldDispatcher;
   }
 
+  bool IsInvokeClosureDispatcher() const {
+    return kind() == RawFunction::kInvokeClosureDispatcher;
+  }
+
   // Returns true iff an implicit closure function has been created
   // for this function.
   bool HasImplicitClosureFunction() const {
@@ -1587,6 +1600,7 @@
       case RawFunction::kMethodExtractor:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
+      case RawFunction::kInvokeClosureDispatcher:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
@@ -2553,6 +2567,8 @@
   RawArray* anonymous_classes() const { return raw_ptr()->anonymous_classes_; }
 
   // Library imports.
+  RawArray* imports() const { return raw_ptr()->imports_; }
+  RawArray* exports() const { return raw_ptr()->exports_; }
   void AddImport(const Namespace& ns) const;
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
   RawNamespace* ImportAt(intptr_t index) const;
@@ -2644,8 +2660,6 @@
   void set_num_imports(intptr_t value) const {
     raw_ptr()->num_imports_ = value;
   }
-  RawArray* imports() const { return raw_ptr()->imports_; }
-  RawArray* exports() const { return raw_ptr()->exports_; }
   bool HasExports() const;
   RawArray* loaded_scripts() const { return raw_ptr()->loaded_scripts_; }
   RawGrowableObjectArray* metadata() const { return raw_ptr()->metadata_; }
@@ -2729,6 +2743,9 @@
   RawArray* show_names() const { return raw_ptr()->show_names_; }
   RawArray* hide_names() const { return raw_ptr()->hide_names_; }
 
+  void AddMetadata(intptr_t token_pos, const Class& owner_class);
+  RawObject* GetMetadata() const;
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawNamespace));
   }
@@ -2743,6 +2760,9 @@
  private:
   static RawNamespace* New();
 
+  RawField* metadata_field() const { return raw_ptr()->metadata_field_; }
+  void set_metadata_field(const Field& value) const;
+
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Namespace, Object);
   friend class Class;
 };
@@ -3323,6 +3343,7 @@
                                bool optimized = false);
   static RawCode* LookupCode(uword pc);
   static RawCode* LookupCodeInVmIsolate(uword pc);
+  static RawCode* FindCode(uword pc, int64_t timestamp);
 
   int32_t GetPointerOffsetAt(int index) const {
     return *PointerOffsetAddrAt(index);
@@ -3352,6 +3373,10 @@
   RawString* Name() const;
   RawString* UserName() const;
 
+  int64_t compile_timestamp() const {
+    return raw_ptr()->compile_timestamp_;
+  }
+
  private:
   void set_state_bits(intptr_t bits) const;
 
@@ -3384,6 +3409,10 @@
 
   static const intptr_t kEntrySize = sizeof(int32_t);  // NOLINT
 
+  void set_compile_timestamp(int64_t timestamp) const {
+    raw_ptr()->compile_timestamp_ = timestamp;
+  }
+
   void set_instructions(RawInstructions* instructions) {
     // RawInstructions are never allocated in New space and hence a
     // store buffer update is not needed here.
@@ -6064,7 +6093,6 @@
   static void Copy(const DstType& dst, intptr_t dst_offset_in_bytes,
                    const SrcType& src, intptr_t src_offset_in_bytes,
                    intptr_t length_in_bytes) {
-    ASSERT(dst.ElementType() == src.ElementType());
     ASSERT(Utils::RangeCheck(src_offset_in_bytes,
                              length_in_bytes,
                              src.LengthInBytes()));
@@ -6081,6 +6109,35 @@
     }
   }
 
+
+  template <typename DstType, typename SrcType>
+  static void ClampedCopy(const DstType& dst, intptr_t dst_offset_in_bytes,
+                          const SrcType& src, intptr_t src_offset_in_bytes,
+                          intptr_t length_in_bytes) {
+    ASSERT(Utils::RangeCheck(src_offset_in_bytes,
+                             length_in_bytes,
+                             src.LengthInBytes()));
+    ASSERT(Utils::RangeCheck(dst_offset_in_bytes,
+                             length_in_bytes,
+                             dst.LengthInBytes()));
+    {
+      NoGCScope no_gc;
+      if (length_in_bytes > 0) {
+        uint8_t* dst_data =
+            reinterpret_cast<uint8_t*>(dst.DataAddr(dst_offset_in_bytes));
+        int8_t* src_data =
+            reinterpret_cast<int8_t*>(src.DataAddr(src_offset_in_bytes));
+        for (intptr_t ix = 0; ix < length_in_bytes; ix++) {
+          int8_t v = *src_data;
+          if (v < 0) v = 0;
+          *dst_data = v;
+          src_data++;
+          dst_data++;
+        }
+      }
+    }
+  }
+
   static bool IsTypedData(const Instance& obj) {
     ASSERT(!obj.IsNull());
     intptr_t cid = obj.raw()->GetClassId();
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index cad024b..f333897 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -185,6 +185,40 @@
 }
 
 
+TEST_CASE(GenerateExactSource) {
+  // Verify the exact formatting of generated sources.
+  const char* kScriptChars =
+  "\n"
+  "class A {\n"
+  "  static bar() { return 42; }\n"
+  "  static fly() { return 5; }\n"
+  "  void catcher(x) {\n"
+  "    try {\n"
+  "      if (x) {\n"
+  "        fly();\n"
+  "      } else {\n"
+  "        !fly();\n"
+  "      }\n"
+  "    } on Blah catch (a) {\n"
+  "      _print(17);\n"
+  "    } catch (e, s) {\n"
+  "      bar()\n"
+  "    }\n"
+  "  }\n"
+  "}\n";
+
+  String& url = String::Handle(String::New("dart-test:GenerateExactSource"));
+  String& source = String::Handle(String::New(kScriptChars));
+  Script& script = Script::Handle(Script::New(url,
+                                              source,
+                                              RawScript::kScriptTag));
+  script.Tokenize(String::Handle(String::New("")));
+  const TokenStream& tokens = TokenStream::Handle(script.tokens());
+  const String& gen_source = String::Handle(tokens.GenerateSource());
+  EXPECT_STREQ(source.ToCString(), gen_source.ToCString());
+}
+
+
 TEST_CASE(InstanceClass) {
   // Allocate the class first.
   String& class_name = String::Handle(Symbols::New("EmptyClass"));
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 3081414..bddb9be 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -126,6 +126,7 @@
       max_capacity_in_words_(max_capacity_in_words),
       capacity_in_words_(0),
       used_in_words_(0),
+      external_in_words_(0),
       sweeping_(false),
       page_space_controller_(FLAG_heap_growth_space_ratio,
                              FLAG_heap_growth_rate,
@@ -272,6 +273,18 @@
 }
 
 
+void PageSpace::AllocateExternal(intptr_t size) {
+  intptr_t size_in_words = size >> kWordSizeLog2;
+  external_in_words_ += size_in_words;
+}
+
+
+void PageSpace::FreeExternal(intptr_t size) {
+  intptr_t size_in_words = size >> kWordSizeLog2;
+  external_in_words_ -= size_in_words;
+}
+
+
 bool PageSpace::Contains(uword addr) const {
   HeapPage* page = pages_;
   while (page != NULL) {
@@ -410,7 +423,42 @@
   space.AddProperty("collections", collections());
   space.AddProperty("used", UsedInWords() * kWordSize);
   space.AddProperty("capacity", CapacityInWords() * kWordSize);
-  space.AddProperty("time", RoundMicrosecondsToSeconds(gc_time_micros()));
+  space.AddProperty("external", ExternalInWords() * kWordSize);
+  space.AddProperty("time", MicrosecondsToSeconds(gc_time_micros()));
+}
+
+
+class HeapMapAsJSONVisitor : public ObjectVisitor {
+ public:
+  explicit HeapMapAsJSONVisitor(JSONArray* array)
+      : ObjectVisitor(NULL), array_(array) {}
+  virtual void VisitObject(RawObject* obj) {
+    array_->AddValue(obj->Size() / kObjectAlignment);
+    array_->AddValue(obj->GetClassId());
+  }
+ private:
+  JSONArray* array_;
+};
+
+
+void PageSpace::PrintHeapMapToJSONStream(JSONStream* stream) {
+  JSONObject heap_map(stream);
+  heap_map.AddProperty("type", "HeapMap");
+  heap_map.AddProperty("id", "heapmap");
+  heap_map.AddProperty("free_class_id",
+                       static_cast<intptr_t>(kFreeListElement));
+  heap_map.AddProperty("unit_size_bytes",
+                       static_cast<intptr_t>(kObjectAlignment));
+  {
+    // "pages" is an array [page0, page1, ..., pageN], each page an array
+    // [size, class id, size, class id, ...] (size unit is kObjectAlignment).
+    JSONArray all_pages(&heap_map, "pages");
+    for (HeapPage* page = pages_; page != NULL; page = page->next()) {
+      JSONArray page_map(&all_pages);
+      HeapMapAsJSONVisitor printer(&page_map);
+      page->VisitObjects(&printer);
+    }
+  }
 }
 
 
@@ -473,6 +521,9 @@
     }
   }
 
+  // Save old value before GCMarker visits the weak persistent handles.
+  intptr_t external_before_in_words = external_in_words_;
+
   // Mark all reachable old-gen objects.
   bool collect_code = FLAG_collect_code && ShouldCollectCode();
   GCMarker marker(heap_);
@@ -546,10 +597,11 @@
 
   int64_t end = OS::GetCurrentTimeMicros();
 
-  // Record signals for growth control.
-  page_space_controller_.EvaluateGarbageCollection(used_before_in_words,
-                                                   used_in_words,
-                                                   start, end);
+  // Record signals for growth control. Include size of external allocations.
+  page_space_controller_.EvaluateGarbageCollection(
+      used_before_in_words + external_before_in_words,
+      used_in_words + external_in_words_,
+      start, end);
 
   heap_->RecordTime(kMarkObjects, mid1 - start);
   heap_->RecordTime(kResetFreeLists, mid2 - mid1);
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index f20b440..2fbc2a2 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -188,6 +188,9 @@
 
   intptr_t UsedInWords() const { return used_in_words_; }
   intptr_t CapacityInWords() const { return capacity_in_words_; }
+  intptr_t ExternalInWords() const {
+    return external_in_words_;
+  }
 
   bool Contains(uword addr) const;
   bool Contains(uword addr, HeapPage::PageType type) const;
@@ -237,6 +240,10 @@
   }
 
   void PrintToJSONObject(JSONObject* object);
+  void PrintHeapMapToJSONStream(JSONStream* stream);
+
+  void AllocateExternal(intptr_t size);
+  void FreeExternal(intptr_t size);
 
  private:
   // Ids for time and data records in Heap::GCStats.
@@ -280,6 +287,7 @@
   intptr_t max_capacity_in_words_;
   intptr_t capacity_in_words_;
   intptr_t used_in_words_;
+  intptr_t external_in_words_;
 
   // Keep track whether a MarkSweep is currently running.
   bool sweeping_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 1cf58b5..10a4034 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -761,6 +761,7 @@
 
 void Parser::ParseFunction(ParsedFunction* parsed_function) {
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
+  CompilerStats::num_functions_compiled++;
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
@@ -792,9 +793,11 @@
       break;
     case RawFunction::kImplicitStaticFinalGetter:
       node_sequence = parser.ParseStaticFinalGetter(func);
+      CompilerStats::num_implicit_final_getters++;
       break;
     case RawFunction::kStaticInitializer:
       node_sequence = parser.ParseStaticInitializer(func);
+      CompilerStats::num_static_initializer_funcs++;
       break;
     case RawFunction::kMethodExtractor:
       node_sequence = parser.ParseMethodExtractor(func);
@@ -807,6 +810,10 @@
       node_sequence =
           parser.ParseInvokeFieldDispatcher(func, default_parameter_values);
       break;
+    case RawFunction::kInvokeClosureDispatcher:
+      node_sequence =
+          parser.ParseInvokeClosureDispatcher(func, default_parameter_values);
+      break;
     default:
       UNREACHABLE();
   }
@@ -1402,6 +1409,53 @@
 }
 
 
+SequenceNode* Parser::ParseInvokeClosureDispatcher(const Function& func,
+                                                   Array& default_values) {
+  TRACE_PARSER("ParseInvokeClosureDispatcher");
+
+  ASSERT(func.IsInvokeClosureDispatcher());
+  intptr_t token_pos = func.token_pos();
+  ASSERT(func.token_pos() == 0);
+  ASSERT(current_class().raw() == func.Owner());
+
+  const Array& args_desc = Array::Handle(func.saved_args_desc());
+  ArgumentsDescriptor desc(args_desc);
+  ASSERT(desc.Count() > 0);
+
+  // Set up scope for this function.
+  BuildDispatcherScope(func, desc, default_values);
+
+  // Receiver is local 0.
+  LocalScope* scope = current_block_->scope;
+  LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
+
+  // Pass arguments 1..n to the closure call.
+  ArgumentListNode* closure_args = new ArgumentListNode(token_pos);
+  const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld));
+  // Positional parameters.
+  intptr_t i = 1;
+  for (; i < desc.PositionalCount(); ++i) {
+    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
+  }
+  // Named parameters.
+  for (; i < desc.Count(); i++) {
+    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
+    intptr_t index = i - desc.PositionalCount();
+    names.SetAt(index, String::Handle(desc.NameAt(index)));
+  }
+  closure_args->set_names(names);
+
+  EnsureSavedCurrentContext();
+  ClosureCallNode* closure_call = new ClosureCallNode(token_pos,
+                                                      receiver,
+                                                      closure_args);
+
+  ReturnNode* return_node = new ReturnNode(token_pos, closure_call);
+  current_block_->statements->Add(return_node);
+  return CloseBlock();
+}
+
+
 void Parser::SkipBlock() {
   ASSERT(CurrentToken() == Token::kLBRACE);
   GrowableArray<Token::Kind> token_stack(8);
@@ -3405,22 +3459,19 @@
     if (has_initializer) {
       ConsumeToken();
       init_value = Object::sentinel().raw();
-      // For static const fields and static final non-const fields, the
-      // initialization expression will be parsed through the
-      // kImplicitStaticFinalGetter method invocation/compilation.
+      // For static fields, the initialization expression will be parsed
+      // through the kImplicitStaticFinalGetter method invocation/compilation.
       // For instance fields, the expression is parsed when a constructor
       // is compiled.
-      // For static const fields and static final non-const fields with very
-      // simple initializer expressions (e.g. a literal number or string), we
-      // optimize away the kImplicitStaticFinalGetter and initialize the field
-      // here. However, the class finalizer will check the value type for
+      // For static fields with very simple initializer expressions
+      // (e.g. a literal number or string), we optimize away the
+      // kImplicitStaticFinalGetter and initialize the field here.
+      // However, the class finalizer will check the value type for
       // assignability once the declared field type can be resolved. If the
       // value is not assignable (assuming checked mode and disregarding actual
       // mode), the field value is reset and a kImplicitStaticFinalGetter is
       // created at finalization time.
-
-      if (field->has_static && (field->has_const || field->has_final) &&
-          (LookaheadToken(1) == Token::kSEMICOLON)) {
+      if (field->has_static && (LookaheadToken(1) == Token::kSEMICOLON)) {
         has_simple_literal = IsSimpleLiteral(*field->type, &init_value);
       }
       SkipExpr();
@@ -3966,6 +4017,7 @@
 
 void Parser::ParseClassDefinition(const Class& cls) {
   TRACE_PARSER("ParseClassDefinition");
+  CompilerStats::num_classes_compiled++;
   set_current_class(cls);
   is_top_level_ = true;
   String& class_name = String::Handle(cls.Name());
@@ -4580,7 +4632,7 @@
       ConsumeToken();
       Instance& field_value = Instance::Handle(Object::sentinel().raw());
       bool has_simple_literal = false;
-      if ((is_const || is_final) && (LookaheadToken(1) == Token::kSEMICOLON)) {
+      if (LookaheadToken(1) == Token::kSEMICOLON) {
         has_simple_literal = IsSimpleLiteral(type, &field_value);
       }
       SkipExpr();
@@ -4925,7 +4977,7 @@
 }
 
 
-void Parser::ParseLibraryImportExport() {
+void Parser::ParseLibraryImportExport(intptr_t metadata_pos) {
   bool is_import = (CurrentToken() == Token::kIMPORT);
   bool is_export = (CurrentToken() == Token::kEXPORT);
   ASSERT(is_import || is_export);
@@ -4988,8 +5040,13 @@
       library.Register();
     }
   }
-  const Namespace& ns =
-    Namespace::Handle(Namespace::New(library, show_names, hide_names));
+
+  Namespace& ns =
+      Namespace::Handle(Namespace::New(library, show_names, hide_names));
+  if (metadata_pos >= 0) {
+    ns.AddMetadata(metadata_pos, current_class());
+  }
+
   if (is_import) {
     // Ensure that private dart:_ libraries are only imported into dart:
     // libraries.
@@ -5062,7 +5119,7 @@
   }
   while ((CurrentToken() == Token::kIMPORT) ||
       (CurrentToken() == Token::kEXPORT)) {
-    ParseLibraryImportExport();
+    ParseLibraryImportExport(metadata_pos);
     rewind_pos = TokenPos();
     metadata_pos = SkipMetadata();
   }
@@ -5827,8 +5884,7 @@
   // resolved at class finalization time, and if the type of the literal is one
   // of int, double, String, or bool, then preset the field with the value and
   // perform the type check (in checked mode only) at finalization time.
-  if (type.IsTypeParameter() ||
-      (type.arguments() != TypeArguments::null())) {
+  if (type.IsTypeParameter() || (type.arguments() != TypeArguments::null())) {
     // Type parameters are always resolved eagerly by the parser and never
     // resolved later by the class finalizer. Therefore, we know here that if
     // 'type' is not a type parameter (an unresolved type will not get resolved
@@ -8847,12 +8903,13 @@
 AstNode* Parser::RunStaticFieldInitializer(const Field& field,
                                            intptr_t field_ref_pos) {
   ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(field.owner());
-  const String& field_name = String::ZoneHandle(field.name());
-  const String& getter_name = String::Handle(Field::GetterName(field_name));
-  const Function& getter =
-      Function::Handle(field_owner.LookupStaticFunction(getter_name));
-  const Instance& value = Instance::Handle(field.value());
+  const Class& field_owner = Class::ZoneHandle(isolate(), field.owner());
+  const String& field_name = String::ZoneHandle(isolate(), field.name());
+  const String& getter_name = String::Handle(isolate(),
+                                             Field::GetterName(field_name));
+  const Function& getter = Function::Handle(
+      isolate(), field_owner.LookupStaticFunction(getter_name));
+  const Instance& value = Instance::Handle(isolate(), field.value());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
       ErrorMsg("circular dependency while initializing static field '%s'",
@@ -8872,15 +8929,18 @@
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func =
-          Function::Handle(Resolver::ResolveStatic(field_owner,
-                                                   getter_name,
-                                                   kNumArguments,
-                                                   Object::empty_array()));
+      const Function& func = Function::Handle(
+          isolate(), Resolver::ResolveStatic(field_owner,
+                                             getter_name,
+                                             kNumArguments,
+                                             Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
-      Object& const_value = Object::Handle(
-          DartEntry::InvokeFunction(func, Object::empty_array()));
+      Object& const_value = Object::Handle(isolate());
+      {
+        PAUSETIMERSCOPE(isolate(), time_compilation);
+        const_value = DartEntry::InvokeFunction(func, Object::empty_array());
+      }
       if (const_value.IsError()) {
         const Error& error = Error::Cast(const_value);
         if (error.IsUnhandledException()) {
@@ -8934,8 +8994,9 @@
   // Constructors have 2 extra arguments: rcvr and construction phase.
   const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2;
   const int num_arguments = arguments->length() + kNumExtraArgs;
-  const Array& arg_values = Array::Handle(Array::New(num_arguments));
-  Instance& instance = Instance::Handle();
+  const Array& arg_values = Array::Handle(isolate(),
+                                          Array::New(num_arguments));
+  Instance& instance = Instance::Handle(isolate());
   if (!constructor.IsFactory()) {
     instance = Instance::New(type_class, Heap::kOld);
     if (!type_arguments.IsNull()) {
@@ -8958,13 +9019,14 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(num_arguments,
-                                             arguments->names()));
-  const Object& result =
-      Object::Handle(DartEntry::InvokeFunction(constructor,
-                                               arg_values,
-                                               args_descriptor));
+  const Array& args_descriptor = Array::Handle(
+      isolate(), ArgumentsDescriptor::New(num_arguments, arguments->names()));
+  Object& result = Object::Handle(isolate());
+  {
+    PAUSETIMERSCOPE(isolate(), time_compilation);
+    result = DartEntry::InvokeFunction(
+        constructor, arg_values, args_descriptor);
+  }
   if (result.IsError()) {
       // An exception may not occur in every parse attempt, i.e., the
       // generated AST is not deterministic. Therefore mark the function as
@@ -10128,28 +10190,31 @@
 
 
 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
-  const Class& cls =
-      Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
+  const Class& cls = Class::Handle(
+      isolate(), Library::LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
-  const Function& func =
-      Function::Handle(cls.LookupStaticFunction(
-          Library::PrivateCoreLibName(Symbols::Interpolate())));
+  const Function& func = Function::Handle(isolate(), cls.LookupStaticFunction(
+      Library::PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
-  const Array& value_arr = Array::Handle(Array::New(values.length()));
+  const Array& value_arr = Array::Handle(isolate(),
+                                         Array::New(values.length()));
   for (int i = 0; i < values.length(); i++) {
     ASSERT(values[i]->IsLiteralNode());
     value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
   }
 
   // Build argument array to pass to the interpolation function.
-  const Array& interpolate_arg = Array::Handle(Array::New(1));
+  const Array& interpolate_arg = Array::Handle(isolate(), Array::New(1));
   interpolate_arg.SetAt(0, value_arr);
 
   // Call interpolation function.
-  String& concatenated = String::ZoneHandle();
-  concatenated ^= DartEntry::InvokeFunction(func, interpolate_arg);
+  String& concatenated = String::ZoneHandle(isolate());
+  {
+    PAUSETIMERSCOPE(isolate(), time_compilation);
+    concatenated ^= DartEntry::InvokeFunction(func, interpolate_arg);
+  }
   if (concatenated.IsUnhandledException()) {
     ErrorMsg("Exception thrown in Parser::Interpolate");
   }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 6595632..97ff35f 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -346,7 +346,7 @@
   void ParseIdentList(GrowableObjectArray* names);
   void ParseLibraryDefinition();
   void ParseLibraryName();
-  void ParseLibraryImportExport();
+  void ParseLibraryImportExport(intptr_t metadata_pos);
   void ParseLibraryPart();
   void ParsePartHeader();
   void ParseLibraryNameObsoleteSyntax();
@@ -450,6 +450,8 @@
                                             Array& default_values);
   SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
                                            Array& default_values);
+  SequenceNode* ParseInvokeClosureDispatcher(const Function& func,
+                                             Array& default_values);
   void BuildDispatcherScope(const Function& func,
                             const ArgumentsDescriptor& desc,
                             Array& default_values);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 53bc048..112183a 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -162,6 +162,31 @@
 }
 
 
+class ScopeStopwatch : public ValueObject {
+ public:
+  explicit ScopeStopwatch(const char* name) : name_(name) {
+    start_ = FLAG_trace_profiled_isolates ? OS::GetCurrentTimeMillis() : 0;
+  }
+
+  intptr_t GetElapsed() const {
+    intptr_t end = OS::GetCurrentTimeMillis();
+    ASSERT(end >= start_);
+    return end - start_;
+  }
+
+  ~ScopeStopwatch() {
+    if (FLAG_trace_profiled_isolates) {
+      intptr_t elapsed = GetElapsed();
+      OS::Print("%s took %" Pd " millis.\n", name_, elapsed);
+    }
+  }
+
+ private:
+  const char* name_;
+  intptr_t start_;
+};
+
+
 struct AddressEntry {
   uword pc;
   intptr_t exclusive_ticks;
@@ -183,16 +208,20 @@
 
 typedef bool (*RegionCompare)(uword pc, uword region_start, uword region_end);
 
-// A region of code. Each region is a kind of code (Dart, Collected, or Native).
+// A contiguous address region that holds code. Each CodeRegion has a "kind"
+// which describes the type of code contained inside the region. Each
+// region covers the following interval: [start, end).
 class CodeRegion : public ZoneAllocated {
  public:
   enum Kind {
-    kDartCode,
-    kCollectedCode,
-    kNativeCode
+    kDartCode,       // Live Dart code.
+    kCollectedCode,  // Dead Dart code.
+    kNativeCode,     // Native code.
+    kReusedCode,     // Dead Dart code that has been reused by new kDartCode.
+    kTagCode,        // A special kind of code representing a tag.
   };
 
-  CodeRegion(Kind kind, uword start, uword end) :
+  CodeRegion(Kind kind, uword start, uword end, int64_t timestamp) :
       kind_(kind),
       start_(start),
       end_(end),
@@ -200,14 +229,14 @@
       exclusive_ticks_(0),
       inclusive_tick_serial_(0),
       name_(NULL),
+      compile_timestamp_(timestamp),
+      creation_serial_(0),
       address_table_(new ZoneGrowableArray<AddressEntry>()),
       callers_table_(new ZoneGrowableArray<CallEntry>()),
       callees_table_(new ZoneGrowableArray<CallEntry>()) {
     ASSERT(start_ < end_);
   }
 
-  ~CodeRegion() {
-  }
 
   uword start() const { return start_; }
   void set_start(uword start) {
@@ -241,6 +270,15 @@
            contains(other->end() - 1);
   }
 
+  intptr_t creation_serial() const { return creation_serial_; }
+  void set_creation_serial(intptr_t serial) {
+    creation_serial_ = serial;
+  }
+  int64_t compile_timestamp() const { return compile_timestamp_; }
+  void set_compile_timestamp(int64_t timestamp) {
+    compile_timestamp_ = timestamp;
+  }
+
   intptr_t inclusive_ticks() const { return inclusive_ticks_; }
   void set_inclusive_ticks(intptr_t inclusive_ticks) {
     inclusive_ticks_ = inclusive_ticks;
@@ -272,17 +310,25 @@
         return "Collected";
       case kNativeCode:
         return "Native";
+      case kReusedCode:
+        return "Overwritten";
+      case kTagCode:
+        return "Tag";
     }
     UNREACHABLE();
     return NULL;
   }
 
   void DebugPrint() const {
-    printf("%s [%" Px ", %" Px ") %s\n", KindToCString(kind_), start(), end(),
-           name_);
+    OS::Print("%s [%" Px ", %" Px ") %" Pd " %" Pd64 "\n",
+              KindToCString(kind_),
+              start(),
+              end(),
+              creation_serial_,
+              compile_timestamp_);
   }
 
-  void AddTickAtAddress(uword pc, bool exclusive, intptr_t serial) {
+  void Tick(uword pc, bool exclusive, intptr_t serial) {
     // Assert that exclusive ticks are never passed a valid serial number.
     ASSERT((exclusive && (serial == -1)) || (!exclusive && (serial != -1)));
     if (!exclusive && (inclusive_tick_serial_ == serial)) {
@@ -293,35 +339,11 @@
     if (exclusive) {
       exclusive_ticks_++;
     } else {
+      inclusive_ticks_++;
       // Mark the last serial we ticked the inclusive count.
       inclusive_tick_serial_ = serial;
-      inclusive_ticks_++;
     }
-    // Tick the address entry.
-    const intptr_t length = address_table_->length();
-    intptr_t i = 0;
-    for (; i < length; i++) {
-      AddressEntry& entry = (*address_table_)[i];
-      if (entry.pc == pc) {
-        entry.tick(exclusive);
-        return;
-      }
-      if (entry.pc > pc) {
-        break;
-      }
-    }
-    AddressEntry entry;
-    entry.pc = pc;
-    entry.exclusive_ticks = 0;
-    entry.inclusive_ticks = 0;
-    entry.tick(exclusive);
-    if (i < length) {
-      // Insert at i.
-      address_table_->InsertAt(i, entry);
-    } else {
-      // Add to end.
-      address_table_->Add(entry);
-    }
+    TickAddress(pc, exclusive);
   }
 
   void AddCaller(intptr_t index) {
@@ -341,7 +363,16 @@
     obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
-    obj.AddPropertyF("id", "code/native/%" Px "", start());
+    obj.AddPropertyF("id", "code/native-%" Px "", start());
+    {
+      // Generate a fake function entry.
+      JSONObject func(&obj, "function");
+      func.AddProperty("type", "@Function");
+      func.AddPropertyF("id", "functions/native-%" Px "", start());
+      func.AddProperty("name", name());
+      func.AddProperty("user_name", name());
+      func.AddProperty("kind", "Native");
+    }
   }
 
   void PrintCollectedCode(JSONObject* profile_code_obj) {
@@ -353,18 +384,48 @@
     obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
-    obj.AddPropertyF("id", "code/collected/%" Px "", start());
+    obj.AddPropertyF("id", "code/collected-%" Px "", start());
+    {
+      // Generate a fake function entry.
+      JSONObject func(&obj, "function");
+      func.AddProperty("type", "@Function");
+      obj.AddPropertyF("id", "functions/collected-%" Px "", start());
+      func.AddProperty("name", name());
+      func.AddProperty("user_name", name());
+      func.AddProperty("kind", "Collected");
+    }
+  }
+
+  void PrintOverwrittenCode(JSONObject* profile_code_obj) {
+    ASSERT(kind() == kReusedCode);
+    JSONObject obj(profile_code_obj, "code");
+    obj.AddProperty("type", "@Code");
+    obj.AddProperty("kind", "Reused");
+    obj.AddProperty("name", name());
+    obj.AddProperty("user_name", name());
+    obj.AddPropertyF("start", "%" Px "", start());
+    obj.AddPropertyF("end", "%" Px "", end());
+    obj.AddPropertyF("id", "code/reused-%" Px "", start());
+    {
+      // Generate a fake function entry.
+      JSONObject func(&obj, "function");
+      func.AddProperty("type", "@Function");
+      obj.AddPropertyF("id", "functions/reused-%" Px "", start());
+      func.AddProperty("name", name());
+      func.AddProperty("user_name", name());
+      func.AddProperty("kind", "Reused");
+    }
   }
 
   void PrintToJSONArray(Isolate* isolate, JSONArray* events, bool full) {
     JSONObject obj(events);
-    obj.AddProperty("type", "ProfileCode");
+    obj.AddProperty("type", "CodeRegion");
     obj.AddProperty("kind", KindToCString(kind()));
     obj.AddPropertyF("inclusive_ticks", "%" Pd "", inclusive_ticks());
     obj.AddPropertyF("exclusive_ticks", "%" Pd "", exclusive_ticks());
     if (kind() == kDartCode) {
       // Look up code in Dart heap.
-      Code& code = Code::Handle();
+      Code& code = Code::Handle(isolate);
       code ^= Code::LookupCode(start());
       if (code.IsNull()) {
         // Code is a stub in the Vm isolate.
@@ -375,14 +436,20 @@
     } else if (kind() == kCollectedCode) {
       if (name() == NULL) {
         // Lazily set generated name.
-        GenerateAndSetSymbolName("Collected");
+        GenerateAndSetSymbolName("[Collected]");
       }
       PrintCollectedCode(&obj);
+    } else if (kind() == kReusedCode) {
+      if (name() == NULL) {
+        // Lazily set generated name.
+        GenerateAndSetSymbolName("[Reused]");
+      }
+      PrintOverwrittenCode(&obj);
     } else {
       ASSERT(kind() == kNativeCode);
       if (name() == NULL) {
         // Lazily set generated name.
-        GenerateAndSetSymbolName("Native");
+        GenerateAndSetSymbolName("[Native]");
       }
       PrintNativeCode(&obj);
     }
@@ -414,6 +481,36 @@
   }
 
  private:
+  void TickAddress(uword pc, bool exclusive) {
+    const intptr_t length = address_table_->length();
+    intptr_t i = 0;
+    for (; i < length; i++) {
+      AddressEntry& entry = (*address_table_)[i];
+      if (entry.pc == pc) {
+        // Tick the address entry.
+        entry.tick(exclusive);
+        return;
+      }
+      if (entry.pc > pc) {
+        break;
+      }
+    }
+    // New address, add entry.
+    AddressEntry entry;
+    entry.pc = pc;
+    entry.exclusive_ticks = 0;
+    entry.inclusive_ticks = 0;
+    entry.tick(exclusive);
+    if (i < length) {
+      // Insert at i.
+      address_table_->InsertAt(i, entry);
+    } else {
+      // Add to end.
+      address_table_->Add(entry);
+    }
+  }
+
+
   void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index) {
     const intptr_t length = table->length();
     intptr_t i = 0;
@@ -445,77 +542,72 @@
     SetName(buff);
   }
 
-  Kind kind_;
+  // CodeRegion kind.
+  const Kind kind_;
+  // CodeRegion start address.
   uword start_;
+  // CodeRegion end address.
   uword end_;
+  // Inclusive ticks.
   intptr_t inclusive_ticks_;
+  // Exclusive ticks.
   intptr_t exclusive_ticks_;
+  // Inclusive tick serial number, ensures that each CodeRegion is only given
+  // a single inclusive tick per sample.
   intptr_t inclusive_tick_serial_;
+  // Name of code region.
   const char* name_;
+  // The compilation timestamp associated with this code region.
+  int64_t compile_timestamp_;
+  // Serial number at which this CodeRegion was created.
+  intptr_t creation_serial_;
   ZoneGrowableArray<AddressEntry>* address_table_;
   ZoneGrowableArray<CallEntry>* callers_table_;
   ZoneGrowableArray<CallEntry>* callees_table_;
   DISALLOW_COPY_AND_ASSIGN(CodeRegion);
 };
 
-
-class ScopeStopwatch : public ValueObject {
+// A sorted table of CodeRegions. Does not allow for overlap.
+class CodeRegionTable : public ValueObject {
  public:
-  explicit ScopeStopwatch(const char* name) : name_(name) {
-    start_ = OS::GetCurrentTimeMillis();
-  }
+  enum TickResult {
+    kTicked = 0,     // CodeRegion found and ticked.
+    kNotFound = -1,   // No CodeRegion found.
+    kNewerCode = -2,  // CodeRegion found but it was compiled after sample.
+  };
 
-  intptr_t GetElapsed() const {
-    intptr_t end = OS::GetCurrentTimeMillis();
-    ASSERT(end >= start_);
-    return end - start_;
-  }
-
-  ~ScopeStopwatch() {
-    if (FLAG_trace_profiled_isolates) {
-      intptr_t elapsed = GetElapsed();
-      OS::Print("%s took %" Pd " millis.\n", name_, elapsed);
-    }
-  }
-
- private:
-  const char* name_;
-  intptr_t start_;
-};
-
-
-// All code regions. Code region tables are built on demand when a profile
-// is requested (through the service or on isolate shutdown).
-class ProfilerCodeRegionTable : public ValueObject {
- public:
-  explicit ProfilerCodeRegionTable(Isolate* isolate) :
-      heap_(isolate->heap()),
+  CodeRegionTable() :
       code_region_table_(new ZoneGrowableArray<CodeRegion*>(64)) {
   }
 
-  ~ProfilerCodeRegionTable() {
-  }
-
-  void AddTick(uword pc, bool exclusive, intptr_t serial) {
+  // Ticks the CodeRegion containing pc if it is alive at timestamp.
+  TickResult Tick(uword pc, bool exclusive, intptr_t serial,
+                  int64_t timestamp) {
     intptr_t index = FindIndex(pc);
     if (index < 0) {
-      CodeRegion* code_region = CreateCodeRegion(pc);
-      ASSERT(code_region != NULL);
-      index = InsertCodeRegion(code_region);
+      // Not found.
+      return kNotFound;
     }
-    ASSERT(index >= 0);
     ASSERT(index < code_region_table_->length());
-
-    // Update code object counters.
-    (*code_region_table_)[index]->AddTickAtAddress(pc, exclusive, serial);
+    CodeRegion* region = At(index);
+    if (region->compile_timestamp() > timestamp) {
+      // Compiled after tick.
+      return kNewerCode;
+    }
+    region->Tick(pc, exclusive, serial);
+    return kTicked;
   }
 
+  // Table length.
   intptr_t Length() const { return code_region_table_->length(); }
 
-  CodeRegion* At(intptr_t idx) {
-    return (*code_region_table_)[idx];
+  // Get the CodeRegion at index.
+  CodeRegion* At(intptr_t index) const {
+    return (*code_region_table_)[index];
   }
 
+  // Find the table index to the CodeRegion containing pc.
+  // Returns < 0 if not found.
   intptr_t FindIndex(uword pc) const {
     intptr_t index = FindRegionIndex(pc, &CompareLowerBound);
     const CodeRegion* code_region = NULL;
@@ -523,12 +615,71 @@
       // Not present.
       return -1;
     }
-    code_region = (*code_region_table_)[index];
+    code_region = At(index);
     if (code_region->contains(pc)) {
       // Found at index.
       return index;
     }
-    return -1;
+    return -2;
+  }
+
+  // Insert code_region into the table. Returns the table index where the
+  // CodeRegion was inserted. Will merge with an overlapping CodeRegion if
+  // one is present.
+  intptr_t InsertCodeRegion(CodeRegion* code_region) {
+    const uword start = code_region->start();
+    const uword end = code_region->end();
+    const intptr_t length = code_region_table_->length();
+    if (length == 0) {
+      code_region_table_->Add(code_region);
+      return length;
+    }
+    // Determine the correct place to insert or merge code_region into table.
+    intptr_t lo = FindRegionIndex(start, &CompareLowerBound);
+    intptr_t hi = FindRegionIndex(end - 1, &CompareUpperBound);
+    // TODO(johnmccutchan): Simplify below logic.
+    if ((lo == length) && (hi == length)) {
+      lo = length - 1;
+    }
+    if (lo == length) {
+      CodeRegion* region = At(hi);
+      if (region->overlaps(code_region)) {
+        HandleOverlap(region, code_region, start, end);
+        return hi;
+      }
+      code_region_table_->Add(code_region);
+      return length;
+    } else if (hi == length) {
+      CodeRegion* region = At(lo);
+      if (region->overlaps(code_region)) {
+        HandleOverlap(region, code_region, start, end);
+        return lo;
+      }
+      code_region_table_->Add(code_region);
+      return length;
+    } else if (lo == hi) {
+      CodeRegion* region = At(lo);
+      if (region->overlaps(code_region)) {
+        HandleOverlap(region, code_region, start, end);
+        return lo;
+      }
+      code_region_table_->InsertAt(lo, code_region);
+      return lo;
+    } else {
+      CodeRegion* region = At(lo);
+      if (region->overlaps(code_region)) {
+        HandleOverlap(region, code_region, start, end);
+        return lo;
+      }
+      region = At(hi);
+      if (region->overlaps(code_region)) {
+        HandleOverlap(region, code_region, start, end);
+        return hi;
+      }
+      code_region_table_->InsertAt(hi, code_region);
+      return hi;
+    }
+    UNREACHABLE();
   }
 
 #if defined(DEBUG)
@@ -538,6 +689,14 @@
   }
 #endif
 
+  void DebugPrint() {
+    OS::Print("Dumping CodeRegionTable:\n");
+    for (intptr_t i = 0; i < code_region_table_->length(); i++) {
+      CodeRegion* region = At(i);
+      region->DebugPrint();
+    }
+  }
+
  private:
   intptr_t FindRegionIndex(uword pc, RegionCompare comparator) const {
     ASSERT(comparator != NULL);
@@ -547,7 +706,7 @@
       intptr_t it = first;
       intptr_t step = count / 2;
       it += step;
-      const CodeRegion* code_region = (*code_region_table_)[it];
+      const CodeRegion* code_region = At(it);
       if (comparator(pc, code_region->start(), code_region->end())) {
         first = ++it;
         count -= (step + 1);
@@ -566,38 +725,6 @@
     return end <= pc;
   }
 
-  CodeRegion* CreateCodeRegion(uword pc) {
-    Code& code = Code::Handle();
-    code ^= Code::LookupCode(pc);
-    if (!code.IsNull()) {
-      return new CodeRegion(CodeRegion::kDartCode, code.EntryPoint(),
-                            code.EntryPoint() + code.Size());
-    }
-    code ^= Code::LookupCodeInVmIsolate(pc);
-    if (!code.IsNull()) {
-      return new CodeRegion(CodeRegion::kDartCode, code.EntryPoint(),
-                            code.EntryPoint() + code.Size());
-    }
-    if (heap_->CodeContains(pc)) {
-      const intptr_t kDartCodeAlignment = OS::PreferredCodeAlignment();
-      const intptr_t kDartCodeAlignmentMask = ~(kDartCodeAlignment - 1);
-      return new CodeRegion(CodeRegion::kCollectedCode, pc,
-                            (pc & kDartCodeAlignmentMask) + kDartCodeAlignment);
-    }
-    uintptr_t native_start = 0;
-    char* native_name = NativeSymbolResolver::LookupSymbolName(pc,
-                                                               &native_start);
-    if (native_name == NULL) {
-      return new CodeRegion(CodeRegion::kNativeCode, pc, pc + 1);
-    }
-    ASSERT(pc >= native_start);
-    CodeRegion* code_region =
-        new CodeRegion(CodeRegion::kNativeCode, native_start, pc + 1);
-    code_region->SetName(native_name);
-    free(native_name);
-    return code_region;
-  }
-
   void HandleOverlap(CodeRegion* region, CodeRegion* code_region,
                      uword start, uword end) {
     // We should never see overlapping Dart code regions.
@@ -607,61 +734,6 @@
     region->AdjustExtent(start, end);
   }
 
-  intptr_t InsertCodeRegion(CodeRegion* code_region) {
-    const uword start = code_region->start();
-    const uword end = code_region->end();
-    const intptr_t length = code_region_table_->length();
-    if (length == 0) {
-      code_region_table_->Add(code_region);
-      return length;
-    }
-    // Determine the correct place to insert or merge code_region into table.
-    intptr_t lo = FindRegionIndex(start, &CompareLowerBound);
-    intptr_t hi = FindRegionIndex(end - 1, &CompareUpperBound);
-    if ((lo == length) && (hi == length)) {
-      lo = length - 1;
-    }
-    if (lo == length) {
-      CodeRegion* region = (*code_region_table_)[hi];
-      if (region->overlaps(code_region)) {
-        HandleOverlap(region, code_region, start, end);
-        return hi;
-      }
-      code_region_table_->Add(code_region);
-      return length;
-    } else if (hi == length) {
-      CodeRegion* region = (*code_region_table_)[lo];
-      if (region->overlaps(code_region)) {
-        HandleOverlap(region, code_region, start, end);
-        return lo;
-      }
-      code_region_table_->Add(code_region);
-      return length;
-    } else if (lo == hi) {
-      CodeRegion* region = (*code_region_table_)[lo];
-      if (region->overlaps(code_region)) {
-        HandleOverlap(region, code_region, start, end);
-        return lo;
-      }
-      code_region_table_->InsertAt(lo, code_region);
-      return lo;
-    } else {
-      CodeRegion* region = (*code_region_table_)[lo];
-      if (region->overlaps(code_region)) {
-        HandleOverlap(region, code_region, start, end);
-        return lo;
-      }
-      region = (*code_region_table_)[hi];
-      if (region->overlaps(code_region)) {
-        HandleOverlap(region, code_region, start, end);
-        return hi;
-      }
-      code_region_table_->InsertAt(hi, code_region);
-      return hi;
-    }
-    UNREACHABLE();
-  }
-
 #if defined(DEBUG)
   void VerifyOrder() {
     const intptr_t length = code_region_table_->length();
@@ -691,7 +763,6 @@
   }
 #endif
 
-  Heap* heap_;
   ZoneGrowableArray<CodeRegion*>* code_region_table_;
 };
 
@@ -699,11 +770,20 @@
 class CodeRegionTableBuilder : public SampleVisitor {
  public:
   CodeRegionTableBuilder(Isolate* isolate,
-                         ProfilerCodeRegionTable* code_region_table)
-      : SampleVisitor(isolate), code_region_table_(code_region_table) {
+                         CodeRegionTable* live_code_table,
+                         CodeRegionTable* dead_code_table)
+      : SampleVisitor(isolate),
+        live_code_table_(live_code_table),
+        dead_code_table_(dead_code_table),
+        isolate_(isolate),
+        vm_isolate_(Dart::vm_isolate()) {
+    ASSERT(live_code_table_ != NULL);
+    ASSERT(dead_code_table_ != NULL);
     frames_ = 0;
     min_time_ = kMaxInt64;
     max_time_ = 0;
+    ASSERT(isolate_ != NULL);
+    ASSERT(vm_isolate_ != NULL);
   }
 
   void VisitSample(Sample* sample) {
@@ -714,44 +794,148 @@
     if (timestamp < min_time_) {
       min_time_ = timestamp;
     }
-    // Give the bottom frame an exclusive tick.
-    code_region_table_->AddTick(sample->At(0), true, -1);
-    // Give all frames (including the bottom) an inclusive tick.
+    // Exclusive tick for bottom frame.
+    Tick(sample->At(0), true, timestamp);
+    // Inclusive tick for all frames.
     for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
       if (sample->At(i) == 0) {
         break;
       }
       frames_++;
-      code_region_table_->AddTick(sample->At(i), false, visited());
+      Tick(sample->At(i), false, timestamp);
     }
   }
 
   intptr_t frames() const { return frames_; }
+
   intptr_t  TimeDeltaMicros() const {
     return static_cast<intptr_t>(max_time_ - min_time_);
   }
   int64_t  max_time() const { return max_time_; }
 
  private:
+  void Tick(uword pc, bool exclusive, int64_t timestamp) {
+    CodeRegionTable::TickResult r;
+    intptr_t serial = exclusive ? -1 : visited();
+    r = live_code_table_->Tick(pc, exclusive, serial, timestamp);
+    if (r == CodeRegionTable::kTicked) {
+      // Live code found and ticked.
+      return;
+    }
+    if (r == CodeRegionTable::kNewerCode) {
+      // Code has been overwritten by newer code.
+      // Update shadow table of dead code regions.
+      r = dead_code_table_->Tick(pc, exclusive, serial, timestamp);
+      ASSERT(r != CodeRegionTable::kNewerCode);
+      if (r == CodeRegionTable::kTicked) {
+        // Dead code found and ticked.
+        return;
+      }
+      ASSERT(r == CodeRegionTable::kNotFound);
+      CreateAndTickDeadCodeRegion(pc, exclusive, serial);
+      return;
+    }
+    // Create new live CodeRegion.
+    ASSERT(r == CodeRegionTable::kNotFound);
+    CodeRegion* region = CreateCodeRegion(pc);
+    region->set_creation_serial(visited());
+    intptr_t index = live_code_table_->InsertCodeRegion(region);
+    ASSERT(index >= 0);
+    region = live_code_table_->At(index);
+    if (region->compile_timestamp() <= timestamp) {
+      region->Tick(pc, exclusive, serial);
+      return;
+    }
+    // We have created a new code region but it's for a CodeRegion
+    // compiled after the sample.
+    ASSERT(region->kind() == CodeRegion::kDartCode);
+    CreateAndTickDeadCodeRegion(pc, exclusive, serial);
+  }
+
+  void CreateAndTickDeadCodeRegion(uword pc, bool exclusive, intptr_t serial) {
+    // Need to create dead code.
+    CodeRegion* region = new CodeRegion(CodeRegion::kReusedCode,
+                                        pc,
+                                        pc + 1,
+                                        0);
+    intptr_t index = dead_code_table_->InsertCodeRegion(region);
+    region->set_creation_serial(visited());
+    ASSERT(index >= 0);
+    dead_code_table_->At(index)->Tick(pc, exclusive, serial);
+  }
+
+  CodeRegion* CreateCodeRegion(uword pc) {
+    const intptr_t kDartCodeAlignment = OS::PreferredCodeAlignment();
+    const intptr_t kDartCodeAlignmentMask = ~(kDartCodeAlignment - 1);
+    Code& code = Code::Handle(isolate_);
+    // Check current isolate for pc.
+    if (isolate_->heap()->CodeContains(pc)) {
+      code ^= Code::LookupCode(pc);
+      if (!code.IsNull()) {
+        return new CodeRegion(CodeRegion::kDartCode, code.EntryPoint(),
+                              code.EntryPoint() + code.Size(),
+                              code.compile_timestamp());
+      }
+      return new CodeRegion(CodeRegion::kCollectedCode, pc,
+                            (pc & kDartCodeAlignmentMask) + kDartCodeAlignment,
+                            0);
+    }
+    // Check VM isolate for pc.
+    if (vm_isolate_->heap()->CodeContains(pc)) {
+      code ^= Code::LookupCodeInVmIsolate(pc);
+      if (!code.IsNull()) {
+        return new CodeRegion(CodeRegion::kDartCode, code.EntryPoint(),
+                              code.EntryPoint() + code.Size(),
+                              code.compile_timestamp());
+      }
+      return new CodeRegion(CodeRegion::kCollectedCode, pc,
+                            (pc & kDartCodeAlignmentMask) + kDartCodeAlignment,
+                            0);
+    }
+    // Check NativeSymbolResolver for pc.
+    uintptr_t native_start = 0;
+    char* native_name = NativeSymbolResolver::LookupSymbolName(pc,
+                                                               &native_start);
+    if (native_name == NULL) {
+      // No native name found.
+      return new CodeRegion(CodeRegion::kNativeCode, pc, pc + 1, 0);
+    }
+    ASSERT(pc >= native_start);
+    CodeRegion* code_region =
+        new CodeRegion(CodeRegion::kNativeCode, native_start, pc + 1, 0);
+    code_region->SetName(native_name);
+    free(native_name);
+    return code_region;
+  }
+
   intptr_t frames_;
   int64_t min_time_;
   int64_t max_time_;
-  ProfilerCodeRegionTable* code_region_table_;
+  CodeRegionTable* live_code_table_;
+  CodeRegionTable* dead_code_table_;
+  Isolate* isolate_;
+  Isolate* vm_isolate_;
 };
 
 
 class CodeRegionTableCallersBuilder : public SampleVisitor {
  public:
   CodeRegionTableCallersBuilder(Isolate* isolate,
-                                ProfilerCodeRegionTable* code_region_table)
-      : SampleVisitor(isolate), code_region_table_(code_region_table) {
-    ASSERT(code_region_table_ != NULL);
+                                CodeRegionTable* live_code_table,
+                                CodeRegionTable* dead_code_table)
+      : SampleVisitor(isolate),
+        live_code_table_(live_code_table),
+        dead_code_table_(dead_code_table) {
+    ASSERT(live_code_table_ != NULL);
+    ASSERT(dead_code_table_ != NULL);
+    dead_code_table_offset_ = live_code_table_->Length();
   }
 
   void VisitSample(Sample* sample) {
-    intptr_t current_index = code_region_table_->FindIndex(sample->At(0));
-    ASSERT(current_index != -1);
-    CodeRegion* current = code_region_table_->At(current_index);
+    int64_t timestamp = sample->timestamp();
+    intptr_t current_index = FindFinalIndex(sample->At(0), timestamp);
+    ASSERT(current_index >= 0);
+    CodeRegion* current = At(current_index);
     intptr_t caller_index = -1;
     CodeRegion* caller = NULL;
     intptr_t callee_index = -1;
@@ -760,9 +944,9 @@
       if (sample->At(i) == 0) {
         break;
       }
-      caller_index = code_region_table_->FindIndex(sample->At(i));
-      ASSERT(caller_index != -1);
-      caller = code_region_table_->At(caller_index);
+      caller_index = FindFinalIndex(sample->At(i), timestamp);
+      ASSERT(caller_index >= 0);
+      caller = At(caller_index);
       current->AddCaller(caller_index);
       if (callee != NULL) {
         current->AddCallee(callee_index);
@@ -776,7 +960,36 @@
   }
 
  private:
-  ProfilerCodeRegionTable* code_region_table_;
+  intptr_t FindFinalIndex(uword pc, int64_t timestamp) const {
+    intptr_t index = live_code_table_->FindIndex(pc);
+    ASSERT(index >= 0);
+    CodeRegion* region = live_code_table_->At(index);
+    ASSERT(region->contains(pc));
+    if (region->compile_timestamp() > timestamp) {
+      // Overwritten code, find in dead code table.
+      index = dead_code_table_->FindIndex(pc);
+      ASSERT(index >= 0);
+      region = dead_code_table_->At(index);
+      ASSERT(region->contains(pc));
+      ASSERT(region->compile_timestamp() <= timestamp);
+      return index + dead_code_table_offset_;
+    }
+    ASSERT(region->compile_timestamp() <= timestamp);
+    return index;
+  }
+
+  CodeRegion* At(intptr_t final_index) {
+    ASSERT(final_index >= 0);
+    if (final_index < dead_code_table_offset_) {
+      return live_code_table_->At(final_index);
+    } else {
+      return dead_code_table_->At(final_index - dead_code_table_offset_);
+    }
+  }
+
+  CodeRegionTable* live_code_table_;
+  CodeRegionTable* dead_code_table_;
+  intptr_t dead_code_table_offset_;
 };
 
 void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream,
@@ -797,38 +1010,59 @@
   {
     StackZone zone(isolate);
     {
-      // Build code region table.
-      ProfilerCodeRegionTable code_region_table(isolate);
-      CodeRegionTableBuilder builder(isolate, &code_region_table);
-      CodeRegionTableCallersBuilder build_callers(isolate, &code_region_table);
+      // Live code holds Dart, Native, and Collected CodeRegions.
+      CodeRegionTable live_code_table;
+      // Dead code holds Overwritten CodeRegions.
+      CodeRegionTable dead_code_table;
+      CodeRegionTableBuilder builder(isolate,
+                                     &live_code_table,
+                                     &dead_code_table);
       {
+        // Build CodeRegion tables.
         ScopeStopwatch sw("CodeTableBuild");
         sample_buffer->VisitSamples(&builder);
       }
-#if defined(DEBUG)
-      code_region_table.Verify();
-#endif
-      {
-        ScopeStopwatch sw("CodeTableCallersBuild");
-        sample_buffer->VisitSamples(&build_callers);
-      }
-      // Number of samples we processed.
       intptr_t samples = builder.visited();
       intptr_t frames = builder.frames();
       if (FLAG_trace_profiled_isolates) {
-        OS::Print("%" Pd " frames produced %" Pd " code objects.\n",
-                  frames, code_region_table.Length());
+        intptr_t total_live_code_objects = live_code_table.Length();
+        intptr_t total_dead_code_objects = dead_code_table.Length();
+        OS::Print("Processed %" Pd " frames\n", frames);
+        OS::Print("CodeTables: live=%" Pd " dead=%" Pd "\n",
+                  total_live_code_objects,
+                  total_dead_code_objects);
+      }
+#if defined(DEBUG)
+      live_code_table.Verify();
+      dead_code_table.Verify();
+      if (FLAG_trace_profiled_isolates) {
+        OS::Print("CodeRegionTables verified to be ordered and not overlap.\n");
+      }
+#endif
+      CodeRegionTableCallersBuilder build_callers(isolate,
+                                                  &live_code_table,
+                                                  &dead_code_table);
+      {
+        // Build CodeRegion callers.
+        ScopeStopwatch sw("CodeTableCallersBuild");
+        sample_buffer->VisitSamples(&build_callers);
       }
       {
         ScopeStopwatch sw("CodeTableStream");
         // Serialize to JSON.
         JSONObject obj(stream);
         obj.AddProperty("type", "Profile");
+        obj.AddProperty("id", "profile");
         obj.AddProperty("samples", samples);
         obj.AddProperty("time_delta_micros", builder.TimeDeltaMicros());
         JSONArray codes(&obj, "codes");
-        for (intptr_t i = 0; i < code_region_table.Length(); i++) {
-          CodeRegion* region = code_region_table.At(i);
+        for (intptr_t i = 0; i < live_code_table.Length(); i++) {
+          CodeRegion* region = live_code_table.At(i);
+          ASSERT(region != NULL);
+          region->PrintToJSONArray(isolate, &codes, full);
+        }
+        for (intptr_t i = 0; i < dead_code_table.Length(); i++) {
+          CodeRegion* region = dead_code_table.At(i);
           ASSERT(region != NULL);
           region->PrintToJSONArray(isolate, &codes, full);
         }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 21f97e2..087be7d 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -444,6 +444,7 @@
   friend class GCMarker;
   friend class ExternalTypedData;
   friend class Heap;
+  friend class HeapMapAsJSONVisitor;
   friend class ClassStatsVisitor;
   friend class MarkingVisitor;
   friend class Object;
@@ -591,6 +592,7 @@
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,  // invokes a field as a closure.
+    kInvokeClosureDispatcher  // invokes this as a closure (implements .call)
   };
 
  private:
@@ -803,8 +805,10 @@
   RawLibrary* library_;          // library with name dictionary.
   RawArray* show_names_;         // list of names that are exported.
   RawArray* hide_names_;         // blacklist of names that are not exported.
+  RawField* metadata_field_;     // remembers the token pos of metadata if any,
+                                 // and the metadata values if computed.
   RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->hide_names_);
+    return reinterpret_cast<RawObject**>(&ptr()->metadata_field_);
   }
 };
 
@@ -832,6 +836,8 @@
     return reinterpret_cast<RawObject**>(&ptr()->comments_);
   }
 
+  // Compilation timestamp.
+  int64_t compile_timestamp_;
   intptr_t pointer_offsets_length_;
   // Alive: If true, the embedded object pointers will be visited during GC.
   // This field cannot be shorter because of alignment issues on x64
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index ba9b256..4cbf721 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -24,120 +24,78 @@
 //   Array& funcs = reused_handles.ArrayHandle();
 //   ....
 // }
+
 #if defined(DEBUG)
-class ReusableObjectHandleScope : public StackResource {
- public:
-  explicit ReusableObjectHandleScope(Isolate* isolate)
-      : StackResource(isolate), isolate_(isolate) {
-    ASSERT(!isolate->reusable_handle_scope_active());
-    isolate->set_reusable_handle_scope_active(true);
-  }
-  ReusableObjectHandleScope()
-      : StackResource(Isolate::Current()), isolate_(Isolate::Current()) {
-    ASSERT(!isolate()->reusable_handle_scope_active());
-    isolate()->set_reusable_handle_scope_active(true);
-  }
-  ~ReusableObjectHandleScope() {
-    ASSERT(isolate()->reusable_handle_scope_active());
-    isolate()->set_reusable_handle_scope_active(false);
-    Handle().raw_ = Object::null();
-  }
-  Object& Handle() const {
-    ASSERT(isolate_->Object_handle_ != NULL);
-    return *isolate_->Object_handle_;
-  }
-
- private:
-  Isolate* isolate_;
-  DISALLOW_COPY_AND_ASSIGN(ReusableObjectHandleScope);
-};
-
-
-class ReusableHandleScope : public StackResource {
- public:
-  explicit ReusableHandleScope(Isolate* isolate)
-      : StackResource(isolate), isolate_(isolate) {
-    ASSERT(!isolate->reusable_handle_scope_active());
-    isolate->set_reusable_handle_scope_active(true);
-  }
-  ReusableHandleScope()
-      : StackResource(Isolate::Current()), isolate_(Isolate::Current()) {
-    ASSERT(!isolate()->reusable_handle_scope_active());
-    isolate()->set_reusable_handle_scope_active(true);
-  }
-  ~ReusableHandleScope() {
-    ASSERT(isolate()->reusable_handle_scope_active());
-    isolate()->set_reusable_handle_scope_active(false);
-#define CLEAR_REUSABLE_HANDLE(object)                                          \
-    object##Handle().raw_ = Object::null();                                    \
-
-    REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE);
-  }
-
-#define REUSABLE_HANDLE_ACCESSORS(object)                                      \
-  object& object##Handle() const {                                             \
-    ASSERT(isolate_->object##_handle_ != NULL);                                \
-    return *isolate_->object##_handle_;                                        \
-  }                                                                            \
-
-  REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ACCESSORS)
-#undef REUSABLE_HANDLE_ACCESSORS
-
- private:
-  void ResetHandles();
-  Isolate* isolate_;
-  DISALLOW_COPY_AND_ASSIGN(ReusableHandleScope);
-};
+#define REUSABLE_SCOPE(name)                                                   \
+  class Reusable##name##HandleScope : public ValueObject {                     \
+    public:                                                                    \
+    explicit Reusable##name##HandleScope(Isolate* isolate)                     \
+        : isolate_(isolate) {                                                  \
+      ASSERT(!isolate->reusable_##name##_handle_scope_active());               \
+      isolate->set_reusable_##name##_handle_scope_active(true);                \
+    }                                                                          \
+    Reusable##name##HandleScope() : isolate_(Isolate::Current()) {             \
+      ASSERT(!isolate_->reusable_##name##_handle_scope_active());              \
+      isolate_->set_reusable_##name##_handle_scope_active(true);               \
+    }                                                                          \
+    ~Reusable##name##HandleScope() {                                           \
+      ASSERT(isolate_->reusable_##name##_handle_scope_active());               \
+      isolate_->set_reusable_##name##_handle_scope_active(false);              \
+      Handle().raw_ = name::null();                                            \
+    }                                                                          \
+    name& Handle() const {                                                     \
+      ASSERT(isolate_->name##_handle_ != NULL);                                \
+      return *isolate_->name##_handle_;                                        \
+    }                                                                          \
+    private:                                                                   \
+    Isolate* isolate_;                                                         \
+    DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope);                     \
+  };
 #else
-class ReusableObjectHandleScope : public ValueObject {
- public:
-  explicit ReusableObjectHandleScope(Isolate* isolate)
-      : handle_(isolate->Object_handle_) {
-  }
-  ReusableObjectHandleScope() : handle_(Isolate::Current()->Object_handle_) {
-  }
-  ~ReusableObjectHandleScope() {
-    handle_->raw_ = Object::null();
-  }
-  Object& Handle() const {
-    ASSERT(handle_ != NULL);
-    return *handle_;
-  }
-
- private:
-  Object* handle_;
-  DISALLOW_COPY_AND_ASSIGN(ReusableObjectHandleScope);
-};
-
-
-class ReusableHandleScope : public ValueObject {
- public:
-  explicit ReusableHandleScope(Isolate* isolate) : isolate_(isolate) {
-  }
-  ReusableHandleScope() : isolate_(Isolate::Current()) {
-  }
-  ~ReusableHandleScope() {
-#define CLEAR_REUSABLE_HANDLE(object)                                          \
-    object##Handle().raw_ = Object::null();                                    \
-
-    REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE);
-  }
-
-#define REUSABLE_HANDLE_ACCESSORS(object)                                      \
-  object& object##Handle() const {                                             \
-    ASSERT(isolate_->object##_handle_ != NULL);                                \
-    return *isolate_->object##_handle_;                                        \
-  }                                                                            \
-
-  REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ACCESSORS)
-#undef REUSABLE_HANDLE_ACCESSORS
-
- private:
-  void ResetHandles();
-  Isolate* isolate_;
-  DISALLOW_COPY_AND_ASSIGN(ReusableHandleScope);
-};
+#define REUSABLE_SCOPE(name)                                                   \
+  class Reusable##name##HandleScope : public ValueObject {                     \
+    public:                                                                    \
+    explicit Reusable##name##HandleScope(Isolate* isolate)                     \
+        : handle_(isolate->name##_handle_) {                                   \
+    }                                                                          \
+    Reusable##name##HandleScope()                                              \
+        : handle_(Isolate::Current()->name##_handle_) {                        \
+    }                                                                          \
+    ~Reusable##name##HandleScope() {                                           \
+      handle_->raw_ = name::null();                                            \
+    }                                                                          \
+    name& Handle() const {                                                     \
+      ASSERT(handle_ != NULL);                                                 \
+      return *handle_;                                                         \
+    }                                                                          \
+    private:                                                                   \
+    name* handle_;                                                             \
+    DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope);                     \
+  };
 #endif  // defined(DEBUG)
+REUSABLE_HANDLE_LIST(REUSABLE_SCOPE)
+#undef REUSABLE_SCOPE
+
+#define REUSABLE_OBJECT_HANDLESCOPE(isolate)                                   \
+  ReusableObjectHandleScope reused_object_handle(isolate);
+#define REUSABLE_ERROR_HANDLESCOPE(isolate)                                    \
+  ReusableErrorHandleScope reused_error_handle(isolate);
+#define REUSABLE_ARRAY_HANDLESCOPE(isolate)                                    \
+  ReusableArrayHandleScope reused_array_handle(isolate);
+#define REUSABLE_STRING_HANDLESCOPE(isolate)                                   \
+  ReusableStringHandleScope reused_string_handle(isolate);
+#define REUSABLE_INSTANCE_HANDLESCOPE(isolate)                                 \
+  ReusableInstanceHandleScope reused_instance_handle(isolate);
+#define REUSABLE_FUNCTION_HANDLESCOPE(isolate)                                 \
+  ReusableFunctionHandleScope reused_function_handle(isolate);
+#define REUSABLE_FIELD_HANDLESCOPE(isolate)                                    \
+  ReusableFieldHandleScope reused_field_handle(isolate);
+#define REUSABLE_CLASS_HANDLESCOPE(isolate)                                    \
+  ReusableClassHandleScope reused_class_handle(isolate);
+#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate)                           \
+  ReusableTypeParameterHandleScope reused_type_parameter(isolate);
+#define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate)                           \
+  ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate);
 
 }  // namespace dart
 
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index ae6501e..4b6ebe8 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -271,24 +271,29 @@
 
 class ScavengerWeakVisitor : public HandleVisitor {
  public:
-  explicit ScavengerWeakVisitor(Scavenger* scavenger)
+  // 'prologue_weak_were_strong' is currently only used for sanity checking.
+  explicit ScavengerWeakVisitor(Scavenger* scavenger,
+                                bool prologue_weak_were_strong)
       :  HandleVisitor(Isolate::Current()),
-         scavenger_(scavenger) {
+         scavenger_(scavenger),
+         prologue_weak_were_strong_(prologue_weak_were_strong) {
   }
 
   void VisitHandle(uword addr, bool is_prologue_weak) {
     FinalizablePersistentHandle* handle =
-        reinterpret_cast<FinalizablePersistentHandle*>(addr);
+      reinterpret_cast<FinalizablePersistentHandle*>(addr);
     RawObject** p = handle->raw_addr();
     if (scavenger_->IsUnreachable(p)) {
-      FinalizablePersistentHandle::Finalize(isolate(),
-                                            handle,
-                                            is_prologue_weak);
+      ASSERT(!is_prologue_weak || !prologue_weak_were_strong_);
+      handle->UpdateUnreachable(isolate(), is_prologue_weak);
+    } else {
+      handle->UpdateRelocated(isolate());
     }
   }
 
  private:
   Scavenger* scavenger_;
+  bool prologue_weak_were_strong_;
 
   DISALLOW_COPY_AND_ASSIGN(ScavengerWeakVisitor);
 };
@@ -324,7 +329,8 @@
       object_alignment_(object_alignment),
       scavenging_(false),
       gc_time_micros_(0),
-      collections_(0) {
+      collections_(0),
+      external_size_(0) {
   // Verify assumptions about the first word in objects which the scavenger is
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
@@ -371,8 +377,8 @@
 
 
 void Scavenger::Prologue(Isolate* isolate, bool invoke_api_callbacks) {
-  if (invoke_api_callbacks) {
-    isolate->gc_prologue_callbacks().Invoke();
+  if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) {
+    (isolate->gc_prologue_callback())();
   }
   // Flip the two semi-spaces so that to_ is always the space for allocating
   // objects.
@@ -408,8 +414,8 @@
 
   memset(from_->pointer(), 0xf3, from_->size());
 #endif  // defined(DEBUG)
-  if (invoke_api_callbacks) {
-    isolate->gc_epilogue_callbacks().Invoke();
+  if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) {
+    (isolate->gc_epilogue_callback())();
   }
 }
 
@@ -686,16 +692,27 @@
     OS::PrintErr(" done.\n");
   }
 
+  // During from/to flip and promoted stack use, move external allocation
+  // out of tospace temporarily.
+  intptr_t saved_external = external_size_;
+  FreeExternal(saved_external);
+
   // Setup the visitor and run a scavenge.
   ScavengerVisitor visitor(isolate, this);
   Prologue(isolate, invoke_api_callbacks);
-  IterateRoots(isolate, &visitor, !invoke_api_callbacks);
+  const bool prologue_weak_are_strong = !invoke_api_callbacks;
+  IterateRoots(isolate, &visitor, prologue_weak_are_strong);
   int64_t start = OS::GetCurrentTimeMicros();
   ProcessToSpace(&visitor);
   int64_t middle = OS::GetCurrentTimeMicros();
   IterateWeakReferences(isolate, &visitor);
-  ScavengerWeakVisitor weak_visitor(this);
-  IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks);
+  // Done with promoted stack; restore external allocation.
+  ASSERT(!PromotedStackHasMore());
+  AllocateExternal(saved_external);
+  ScavengerWeakVisitor weak_visitor(this, prologue_weak_are_strong);
+  // Include the prologue weak handles, since we must process any promotion.
+  const bool visit_prologue_weak_handles = true;
+  IterateWeakRoots(isolate, &weak_visitor, visit_prologue_weak_handles);
   visitor.Finalize();
   ProcessWeakTables();
   int64_t end = OS::GetCurrentTimeMicros();
@@ -730,8 +747,24 @@
   space.AddProperty("collections", collections());
   space.AddProperty("used", UsedInWords() * kWordSize);
   space.AddProperty("capacity", CapacityInWords() * kWordSize);
-  space.AddProperty("time", RoundMicrosecondsToSeconds(gc_time_micros()));
+  space.AddProperty("external", ExternalInWords() * kWordSize);
+  space.AddProperty("time", MicrosecondsToSeconds(gc_time_micros()));
 }
 
 
+void Scavenger::AllocateExternal(intptr_t size) {
+  ASSERT(size >= 0);
+  external_size_ += size;
+  intptr_t remaining = end_ - top_;
+  end_ -= Utils::Minimum(remaining, size);
+}
+
+
+void Scavenger::FreeExternal(intptr_t size) {
+  ASSERT(size >= 0);
+  external_size_ -= size;
+  ASSERT(external_size_ >= 0);
+  end_ = Utils::Minimum(to_->end(), end_ + size);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 83e8a57..a9995a8 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -73,7 +73,12 @@
   intptr_t UsedInWords() const {
     return (top_ - FirstObjectStart()) >> kWordSizeLog2;
   }
-  intptr_t CapacityInWords() const { return space_->size() >> kWordSizeLog2; }
+  intptr_t CapacityInWords() const {
+    return (end_ - FirstObjectStart()) >> kWordSizeLog2;
+  }
+  intptr_t ExternalInWords() const {
+    return external_size_ >> kWordSizeLog2;
+  }
 
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
@@ -108,6 +113,9 @@
 
   void PrintToJSONObject(JSONObject* object);
 
+  void AllocateExternal(intptr_t size);
+  void FreeExternal(intptr_t size);
+
  private:
   // Ids for time and data records in Heap::GCStats.
   enum {
@@ -149,17 +157,23 @@
   // object sizes are always greater than sizeof(uword) and promoted objects do
   // not consume space in the to space they leave enough room for this stack.
   void PushToPromotedStack(uword addr) {
+    ASSERT(scavenging_);
+    ASSERT(external_size_ == 0);
     end_ -= sizeof(addr);
     ASSERT(end_ > top_);
     *reinterpret_cast<uword*>(end_) = addr;
   }
   uword PopFromPromotedStack() {
+    ASSERT(scavenging_);
+    ASSERT(external_size_ == 0);
     uword result = *reinterpret_cast<uword*>(end_);
     end_ += sizeof(result);
     ASSERT(end_ <= to_->end());
     return result;
   }
   bool PromotedStackHasMore() const {
+    ASSERT(scavenging_);
+    ASSERT(external_size_ == 0);
     return end_ < to_->end();
   }
 
@@ -194,6 +208,10 @@
   int64_t gc_time_micros_;
   intptr_t collections_;
 
+  // The total size of external data associated with objects in this scavenger.
+  // External allocations decrease end_. If promoted stack is in use, this is 0.
+  intptr_t external_size_;
+
   friend class ScavengerVisitor;
   friend class ScavengerWeakVisitor;
 
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index ba9d031..38e83b1 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -81,9 +81,10 @@
 
 
 NameReference* LocalScope::FindReference(const String& name) const {
+  ASSERT(name.IsSymbol());
   intptr_t num_references = referenced_.length();
   for (intptr_t i = 0; i < num_references; i++) {
-    if (name.Equals(referenced_[i]->name())) {
+    if (name.raw() == referenced_[i]->name().raw()) {
       return referenced_[i];
     }
   }
@@ -300,7 +301,7 @@
         desc.info.end_pos = var->owner()->end_token_pos();
         desc.info.index = var->index();
         vars->Add(desc);
-      } else if (var->name().Equals(Symbols::SavedEntryContextVar())) {
+      } else if (var->name().raw() == Symbols::SavedEntryContextVar().raw()) {
         // This is the local variable in which the function saves the
         // caller's chain of closure contexts (caller's CTX register).
         VarDesc desc;
@@ -311,7 +312,7 @@
         desc.info.end_pos = 0;
         desc.info.index = var->index();
         vars->Add(desc);
-      } else if (var->name().Equals(Symbols::SavedCurrentContextVar())) {
+      } else if (var->name().raw() == Symbols::SavedCurrentContextVar().raw()) {
         // This is the local variable in which the function saves its
         // own context before calling a closure function.
         VarDesc desc;
@@ -334,9 +335,10 @@
 
 
 SourceLabel* LocalScope::LocalLookupLabel(const String& name) const {
+  ASSERT(name.IsSymbol());
   for (intptr_t i = 0; i < labels_.length(); i++) {
     SourceLabel* label = labels_[i];
-    if (label->name().Equals(name)) {
+    if (label->name().raw() == name.raw()) {
       return label;
     }
   }
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 89851e9..3836a21 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -35,6 +35,7 @@
       index_(LocalVariable::kUninitializedIndex) {
     ASSERT(type.IsZoneHandle());
     ASSERT(type.IsFinalized());
+    ASSERT(name.IsSymbol());
   }
 
   intptr_t token_pos() const { return token_pos_; }
@@ -122,6 +123,7 @@
   NameReference(intptr_t token_pos, const String& name)
     : token_pos_(token_pos),
       name_(name) {
+    ASSERT(name.IsSymbol());
   }
   const String& name() const { return name_; }
   intptr_t token_pos() const { return token_pos_; }
@@ -151,6 +153,7 @@
       name_(name),
       owner_(NULL),
       kind_(kind) {
+    ASSERT(name.IsSymbol());
   }
 
   static SourceLabel* New(intptr_t token_pos, String* name, Kind kind) {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 1019498..1903e4b 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -483,7 +483,7 @@
 
 
 static void PrintArgumentsAndOptions(const JSONObject& obj, JSONStream* js) {
-  JSONObject jsobj(&obj, "message");
+  JSONObject jsobj(&obj, "request");
   {
     JSONArray jsarr(&jsobj, "arguments");
     for (intptr_t i = 0; i < js->num_arguments(); i++) {
@@ -505,7 +505,8 @@
 }
 
 
-static void PrintError(JSONStream* js, const char* format, ...) {
+static void PrintError(JSONStream* js,
+                       const char* format, ...) {
   Isolate* isolate = Isolate::Current();
 
   va_list args;
@@ -521,7 +522,33 @@
 
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "Error");
-  jsobj.AddProperty("text", buffer);
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("message", buffer);
+  PrintArgumentsAndOptions(jsobj, js);
+}
+
+
+static void PrintErrorWithKind(JSONStream* js,
+                               const char* kind,
+                               const char* format, ...) {
+  Isolate* isolate = Isolate::Current();
+
+  va_list args;
+  va_start(args, format);
+  intptr_t len = OS::VSNPrint(NULL, 0, format, args);
+  va_end(args);
+
+  char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
+  va_list args2;
+  va_start(args2, format);
+  OS::VSNPrint(buffer, (len + 1), format, args2);
+  va_end(args2);
+
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "Error");
+  jsobj.AddProperty("id", "");
+  jsobj.AddProperty("kind", kind);
+  jsobj.AddProperty("message", buffer);
   PrintArgumentsAndOptions(jsobj, js);
 }
 
@@ -604,6 +631,7 @@
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "StackTrace");
+  jsobj.AddProperty("id", "stacktrace");
   JSONArray jsarr(&jsobj, "members");
   intptr_t num_frames = stack->Length();
   for (intptr_t i = 0; i < num_frames; i++) {
@@ -688,6 +716,70 @@
 }
 
 
+static bool GetInteger64Id(const char* s, int64_t* id, int base = 10) {
+  if ((s == NULL) || (*s == '\0')) {
+    // Empty string.
+    return false;
+  }
+  if (id == NULL) {
+    // No id pointer.
+    return false;
+  }
+  int64_t r = 0;
+  char* end_ptr = NULL;
+  r = strtoll(s, &end_ptr, base);
+  if (end_ptr == s) {
+    // String was not advanced at all, cannot be valid.
+    return false;
+  }
+  *id = r;
+  return true;
+}
+
+// Scans the string until the '-' character. Returns pointer to string
+// at '-' character. Returns NULL if not found.
+const char* ScanUntilDash(const char* s) {
+  if ((s == NULL) || (*s == '\0')) {
+    // Empty string.
+    return NULL;
+  }
+  while (*s != '\0') {
+    if (*s == '-') {
+      return s;
+    }
+    s++;
+  }
+  return NULL;
+}
+
+
+static bool GetCodeId(const char* s, int64_t* timestamp, uword* address) {
+  if ((s == NULL) || (*s == '\0')) {
+    // Empty string.
+    return false;
+  }
+  if ((timestamp == NULL) || (address == NULL)) {
+    // Bad arguments.
+    return false;
+  }
+  // Extract the timestamp.
+  if (!GetInteger64Id(s, timestamp, 16) || (*timestamp < 0)) {
+    return false;
+  }
+  s = ScanUntilDash(s);
+  if (s == NULL) {
+    return false;
+  }
+  // Skip the dash.
+  s++;
+  // Extract the PC.
+  if (!GetUnsignedIntegerId(s, address, 16)) {
+    return false;
+  }
+  return true;
+}
+
+
 static bool HandleClassesClosures(Isolate* isolate, const Class& cls,
                                   JSONStream* js) {
   intptr_t id;
@@ -867,97 +959,168 @@
 }
 
 
-static bool HandleObjects(Isolate* isolate, JSONStream* js) {
-  REQUIRE_COLLECTION_ID("objects");
-  ASSERT(js->num_arguments() >= 2);
-  const char* arg = js->GetArgument(1);
-
-  // TODO(turnidge): Handle <optimized out> the same way as other
-  // special nulls.
-  if (strcmp(arg, "null") == 0) {
-    Object::null_object().PrintToJSONStream(js, false);
-    return true;
-
-  } else if (strcmp(arg, "not-initialized") == 0) {
-    Object::sentinel().PrintToJSONStream(js, false);
-    return true;
-
-  } else if (strcmp(arg, "being-initialized") == 0) {
-    Object::transition_sentinel().PrintToJSONStream(js, false);
-    return true;
-
-  } else if (strcmp(arg, "optimized-out") == 0) {
-    Symbols::OptimizedOut().PrintToJSONStream(js, false);
-    return true;
-
-  } else if (strcmp(arg, "collected") == 0) {
-    PrintPseudoNull(js, "objects/collected", "<collected>");
-    return true;
-
-  } else if (strcmp(arg, "expired") == 0) {
-    PrintPseudoNull(js, "objects/expired", "<expired>");
-    return true;
-
-  } else if (strcmp(arg, "int") == 0) {
-    if (js->num_arguments() < 3) {
-      PrintError(js, "expected 3 arguments but found %" Pd "\n",
-                 js->num_arguments());
-      return true;
-    }
+static RawObject* LookupObjectId(Isolate* isolate,
+                                 const char* arg,
+                                 bool* error) {
+  *error = false;
+  if (strncmp(arg, "int-", 4) == 0) {
+    arg += 4;
     int64_t value = 0;
-    if (!OS::StringToInt64(js->GetArgument(2), &value) ||
+    if (!OS::StringToInt64(arg, &value) ||
         !Smi::IsValid64(value)) {
-      PrintError(js, "integer value too large\n",
-                 js->num_arguments());
-      return true;
+      *error = true;
+      return Object::null();
     }
     const Integer& obj =
         Integer::Handle(isolate, Smi::New(static_cast<intptr_t>(value)));
-    obj.PrintToJSONStream(js, false);
-    return true;
+    return obj.raw();
 
-  } else if (strcmp(arg, "bool") == 0) {
-    if (js->num_arguments() < 3) {
-      PrintError(js, "expected 3 arguments but found %" Pd "\n",
-                 js->num_arguments());
-      return true;
-    }
-    const char* value_str = js->GetArgument(2);
-    bool value = false;
-    if (strcmp(value_str, "false") == 0) {
-      value = false;
-    } else if (strcmp(value_str, "true") == 0) {
-      value = true;
-    } else {
-      PrintError(js, "expected 'true' or 'false' but found %s\n", value_str);
-      return true;
-    }
-    Bool::Get(value).PrintToJSONStream(js, false);
-    return true;
+  } else if (strcmp(arg, "bool-true") == 0) {
+    return Bool::True().raw();
+
+  } else if (strcmp(arg, "bool-false") == 0) {
+    return Bool::False().raw();
   }
 
   ObjectIdRing* ring = isolate->object_id_ring();
   ASSERT(ring != NULL);
   intptr_t id = -1;
   if (!GetIntegerId(arg, &id)) {
-    Object::null_object().PrintToJSONStream(js, false);
-    return true;
+    *error = true;
+    return Instance::null();
   }
-  Object& obj = Object::Handle(ring->GetObjectForId(id));
-  if (obj.IsNull()) {
-    // The object has been collected by the gc.
-    PrintPseudoNull(js, "objects/collected", "<collected>");
-    return true;
-  } else if (obj.raw() == Object::sentinel().raw()) {
-    // The object id has expired.
-    PrintPseudoNull(js, "objects/expired", "<expired>");
-    return true;
-  }
-  obj.PrintToJSONStream(js, false);
-  return true;
+  return ring->GetObjectForId(id);
 }
 
 
+static bool HandleObjects(Isolate* isolate, JSONStream* js) {
+  REQUIRE_COLLECTION_ID("objects");
+  if (js->num_arguments() < 2) {
+    PrintError(js, "expected at least 2 arguments but found %" Pd "\n",
+               js->num_arguments());
+    return true;
+  }
+  const char* arg = js->GetArgument(1);
+
+  // Handle special objects first.
+  if (strcmp(arg, "null") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      Instance::null_instance().PrintToJSONStream(js, false);
+    }
+    return true;
+
+  } else if (strcmp(arg, "not-initialized") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      Object::sentinel().PrintToJSONStream(js, false);
+    }
+    return true;
+
+  } else if (strcmp(arg, "being-initialized") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      Object::transition_sentinel().PrintToJSONStream(js, false);
+    }
+    return true;
+
+  } else if (strcmp(arg, "optimized-out") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      Symbols::OptimizedOut().PrintToJSONStream(js, false);
+    }
+    return true;
+
+  } else if (strcmp(arg, "collected") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      PrintPseudoNull(js, "objects/collected", "<collected>");
+    }
+    return true;
+
+  } else if (strcmp(arg, "expired") == 0) {
+    if (js->num_arguments() > 2) {
+      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                 js->num_arguments());
+    } else {
+      PrintPseudoNull(js, "objects/expired", "<expired>");
+    }
+    return true;
+  }
+
+  // Lookup the object.
+  Object& obj = Object::Handle(isolate);
+  bool error = false;
+  obj = LookupObjectId(isolate, arg, &error);
+  if (error) {
+    PrintError(js, "unrecognized object id '%s'", arg);
+    return true;
+  }
+
+  // Now what should we do with the object?
+  if (js->num_arguments() == 2) {
+    // Print.
+    if (obj.IsNull()) {
+      // The object has been collected by the gc.
+      PrintPseudoNull(js, "objects/collected", "<collected>");
+      return true;
+    } else if (obj.raw() == Object::sentinel().raw()) {
+      // The object id has expired.
+      PrintPseudoNull(js, "objects/expired", "<expired>");
+      return true;
+    }
+    obj.PrintToJSONStream(js, false);
+    return true;
+  }
+  ASSERT(js->num_arguments() > 2);
+
+  const char* action = js->GetArgument(2);
+  if (strcmp(action, "eval") == 0) {
+    if (js->num_arguments() > 3) {
+      PrintError(js, "expected at most 3 arguments but found %" Pd "\n",
+                 js->num_arguments());
+      return true;
+    }
+    if (obj.IsNull()) {
+      PrintErrorWithKind(js, "EvalCollected",
+                         "attempt to evaluate against collected object\n",
+                         js->num_arguments());
+      return true;
+    }
+    if (obj.raw() == Object::sentinel().raw()) {
+      PrintErrorWithKind(js, "EvalExpired",
+                         "attempt to evaluate against expired object\n",
+                         js->num_arguments());
+      return true;
+    }
+    const char* expr = js->LookupOption("expr");
+    if (expr == NULL) {
+      PrintError(js, "eval expects an 'expr' option\n",
+                 js->num_arguments());
+      return true;
+    }
+    const String& expr_str = String::Handle(isolate, String::New(expr));
+    ASSERT(obj.IsInstance());
+    const Instance& instance = Instance::Cast(obj);
+    const Object& result = Object::Handle(instance.Evaluate(expr_str));
+    result.PrintToJSONStream(js, true);
+    return true;
+  }
+
+  PrintError(js, "unrecognized action '%s'\n", action);
+  return true;
+}
+
 
 static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) {
   JSONObject jsobj(js);
@@ -1012,7 +1175,8 @@
       }
     }
   }
-  PrintError(js, "Cannot find script %s\n", requested_url.ToCString());
+  PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
+                     requested_url.ToCString());
   return true;
 }
 
@@ -1080,6 +1244,8 @@
 
 
 static bool HandleNullCode(uintptr_t pc, JSONStream* js) {
+  // TODO(turnidge): Consider adding/using Object::null_code() for
+  // consistent "type".
   Object::null_object().PrintToJSONStream(js, false);
   return true;
 }
@@ -1087,42 +1253,55 @@
 
 static bool HandleCode(Isolate* isolate, JSONStream* js) {
   REQUIRE_COLLECTION_ID("code");
-  uintptr_t pc;
-  if (js->num_arguments() > 3) {
+  uword pc;
+  if (js->num_arguments() > 2) {
     PrintError(js, "Command too long");
     return true;
   }
-  if (js->num_arguments() == 3) {
-    const char* command = js->GetArgument(1);
-    if ((strcmp("collected", command) == 0) ||
-        (strcmp("native", command) == 0)) {
-      if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) {
-        PrintError(js, "Must specify code address: code/%s/c0deadd0.", command);
-        return true;
-      }
-      return HandleNullCode(pc, js);
-    } else {
-      PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1));
+  ASSERT(js->num_arguments() == 2);
+  static const char* kCollectedPrefix = "collected-";
+  static intptr_t kCollectedPrefixLen = strlen(kCollectedPrefix);
+  static const char* kNativePrefix = "native-";
+  static intptr_t kNativePrefixLen = strlen(kNativePrefix);
+  static const char* kReusedPrefix = "reused-";
+  static intptr_t kReusedPrefixLen = strlen(kReusedPrefix);
+  const char* command = js->GetArgument(1);
+  if (strncmp(kCollectedPrefix, command, kCollectedPrefixLen) == 0) {
+    if (!GetUnsignedIntegerId(&command[kCollectedPrefixLen], &pc, 16)) {
+      PrintError(js, "Must specify code address: code/%sc0deadd0.",
+                 kCollectedPrefix);
       return true;
     }
+    return HandleNullCode(pc, js);
   }
-  ASSERT(js->num_arguments() == 2);
-  if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) {
-    PrintError(js, "Must specify code address: code/c0deadd0.");
+  if (strncmp(kNativePrefix, command, kNativePrefixLen) == 0) {
+    if (!GetUnsignedIntegerId(&command[kNativePrefixLen], &pc, 16)) {
+      PrintError(js, "Must specify code address: code/%sc0deadd0.",
+                 kNativePrefix);
+      return true;
+    }
+    // TODO(johnmccutchan): Support native Code.
+    return HandleNullCode(pc, js);
+  }
+  if (strncmp(kReusedPrefix, command, kReusedPrefixLen) == 0) {
+    if (!GetUnsignedIntegerId(&command[kReusedPrefixLen], &pc, 16)) {
+      PrintError(js, "Must specify code address: code/%sc0deadd0.",
+                 kReusedPrefix);
+      return true;
+    }
+    return HandleNullCode(pc, js);
+  }
+  int64_t timestamp = 0;
+  if (!GetCodeId(command, &timestamp, &pc) || (timestamp < 0)) {
+    PrintError(js, "Malformed code id: %s", command);
     return true;
   }
-  Code& code = Code::Handle();
-  code ^= Code::LookupCode(pc);
+  Code& code = Code::Handle(Code::FindCode(pc, timestamp));
   if (!code.IsNull()) {
     code.PrintToJSONStream(js, false);
     return true;
   }
-  code ^= Code::LookupCodeInVmIsolate(pc);
-  if (!code.IsNull()) {
-    code.PrintToJSONStream(js, false);
-    return true;
-  }
-  PrintError(js, "Could not find code at %" Px "", pc);
+  PrintError(js, "Could not find code with id: %s", command);
   return true;
 }
 
@@ -1169,6 +1348,12 @@
 }
 
 
+static bool HandleHeapMap(Isolate* isolate, JSONStream* js) {
+  isolate->heap()->PrintHeapMapToJSONStream(js);
+  return true;
+}
+
+
 static IsolateMessageHandlerEntry isolate_handlers[] = {
   { "_echo", HandleIsolateEcho },
   { "", HandleIsolate },
@@ -1178,6 +1363,7 @@
   { "coverage", HandleCoverage },
   { "cpu", HandleCpu },
   { "debug", HandleDebug },
+  { "heapmap", HandleHeapMap },
   { "libraries", HandleLibraries },
   { "objects", HandleObjects },
   { "profile", HandleProfile },
diff --git a/runtime/vm/service/running_isolates.dart b/runtime/vm/service/running_isolates.dart
index e371453..afa1e78 100644
--- a/runtime/vm/service/running_isolates.dart
+++ b/runtime/vm/service/running_isolates.dart
@@ -29,6 +29,7 @@
       });
     });
     result['type'] = 'IsolateList';
+    result['id'] = 'isolates';
     result['members'] = members;
     message.setResponse(JSON.encode(result));
   }
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 0ed1e23..7c16a22 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -8,6 +8,7 @@
 #include "vm/debugger.h"
 #include "vm/globals.h"
 #include "vm/message_handler.h"
+#include "vm/object_id_ring.h"
 #include "vm/os.h"
 #include "vm/port.h"
 #include "vm/service.h"
@@ -38,6 +39,44 @@
     return true;
   }
 
+  // Removes a given json key:value from _msg.
+  void filterMsg(const char* key) {
+    int key_len = strlen(key);
+    int old_len = strlen(_msg);
+    char* new_msg = reinterpret_cast<char*>(malloc(old_len + 1));
+    int old_pos = 0;
+    int new_pos = 0;
+    while (_msg[old_pos] != '\0') {
+      if (_msg[old_pos] == '\"') {
+        old_pos++;
+        if ((old_len - old_pos) > key_len &&
+            strncmp(&_msg[old_pos], key, key_len) == 0 &&
+            _msg[old_pos + key_len] == '\"') {
+          old_pos += (key_len + 2);
+          // Skip until next , or }.
+          while (_msg[old_pos] != '\0' &&
+                 _msg[old_pos] != ',' &&
+                 _msg[old_pos] != '}') {
+            old_pos++;
+          }
+          if (_msg[old_pos] == ',') {
+            old_pos++;
+          }
+        } else {
+          new_msg[new_pos] = '\"';;
+          new_pos++;
+        }
+      } else {
+        new_msg[new_pos] = _msg[old_pos];
+        new_pos++;
+        old_pos++;
+      }
+    }
+    new_msg[new_pos] = '\0';
+    free(_msg);
+    _msg = new_msg;
+  }
+
   const char* msg() const { return _msg; }
 
  private:
@@ -189,7 +228,7 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-      "{\"type\":\"StackTrace\",\"members\":[]}",
+      "{\"type\":\"StackTrace\",\"id\":\"stacktrace\",\"members\":[]}",
       handler.msg());
 
   // Malformed request.
@@ -197,8 +236,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-      "{\"type\":\"Error\",\"text\":\"Command too long\","
-      "\"message\":{\"arguments\":[\"stacktrace\",\"jamboree\"],"
+      "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\","
+      "\"request\":{\"arguments\":[\"stacktrace\",\"jamboree\"],"
       "\"option_keys\":[],\"option_values\":[]}}",
       handler.msg());
 }
@@ -257,9 +296,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-      "{\"type\":\"Error\","
-       "\"text\":\"Must specify a subcommand\","
-       "\"message\":{\"arguments\":[\"debug\"],\"option_keys\":[],"
+      "{\"type\":\"Error\",\"id\":\"\","
+       "\"message\":\"Must specify a subcommand\","
+       "\"request\":{\"arguments\":[\"debug\"],\"option_keys\":[],"
                     "\"option_values\":[]}}",
       handler.msg());
 
@@ -267,9 +306,9 @@
   service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"Error\","
-                "\"text\":\"Unrecognized breakpoint id 1111\","
-                "\"message\":{"
+  EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
+                "\"message\":\"Unrecognized breakpoint id 1111\","
+                "\"request\":{"
                     "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"],"
                     "\"option_keys\":[],\"option_values\":[]}}",
                handler.msg());
@@ -279,8 +318,9 @@
       Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"Error\",\"text\":\"Command too long\","
-                "\"message\":{\"arguments\":[\"debug\",\"breakpoints\","
+  EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
+                "\"message\":\"Command too long\","
+                "\"request\":{\"arguments\":[\"debug\",\"breakpoints\","
                                             "\"1111\",\"green\"],"
                              "\"option_keys\":[],\"option_values\":[]}}",
                handler.msg());
@@ -289,14 +329,204 @@
   service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"Error\","
-                "\"text\":\"Unrecognized subcommand 'nosferatu'\","
-                "\"message\":{\"arguments\":[\"debug\",\"nosferatu\"],"
+  EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
+                "\"message\":\"Unrecognized subcommand 'nosferatu'\","
+                "\"request\":{\"arguments\":[\"debug\",\"nosferatu\"],"
                              "\"option_keys\":[],\"option_values\":[]}}",
                handler.msg());
 }
 
 
+TEST_CASE(Service_Objects) {
+  // TODO(turnidge): Extend this test to cover a non-trivial stack trace.
+  const char* kScript =
+      "var port;\n"     // Set to our mock port by C++.
+      "var validId;\n"  // Set to a valid object id by C++.
+      "\n"
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port =
+      Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  ObjectIdRing* ring = isolate->object_id_ring();
+  const String& str = String::Handle(String::New("value"));
+  intptr_t str_id = ring->GetIdForObject(str.raw());
+  Dart_Handle valid_id = Dart_NewInteger(str_id);
+  EXPECT_VALID(valid_id);
+  EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id));
+
+  Instance& service_msg = Instance::Handle();
+
+  // null
+  service_msg = Eval(lib, "[port, ['objects', 'null'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/null\","
+      "\"preview\":\"null\"}",
+      handler.msg());
+
+  // not initialized
+  service_msg = Eval(lib, "[port, ['objects', 'not-initialized'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/not-initialized\","
+      "\"preview\":\"<not initialized>\"}",
+      handler.msg());
+
+  // being initialized
+  service_msg = Eval(lib, "[port, ['objects', 'being-initialized'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/being-initialized\","
+      "\"preview\":\"<being initialized>\"}",
+      handler.msg());
+
+  // optimized out
+  service_msg = Eval(lib, "[port, ['objects', 'optimized-out'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/optimized-out\","
+      "\"preview\":\"<optimized out>\"}",
+      handler.msg());
+
+  // collected
+  service_msg = Eval(lib, "[port, ['objects', 'collected'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/collected\","
+      "\"preview\":\"<collected>\"}",
+      handler.msg());
+
+  // expired
+  service_msg = Eval(lib, "[port, ['objects', 'expired'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
+      "\"preview\":\"<expired>\"}",
+      handler.msg());
+
+  // bool
+  service_msg = Eval(lib, "[port, ['objects', 'bool-true'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Bool\",\"id\":\"objects\\/bool-true\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\","
+      "\"user_name\":\"bool\"},\"preview\":\"true\"}",
+      handler.msg());
+
+  // int
+  service_msg = Eval(lib, "[port, ['objects', 'int-123'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Smi\",\"id\":\"objects\\/int-123\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"123\"}",
+      handler.msg());
+
+  // object id ring / valid
+  service_msg = Eval(lib, "[port, ['objects', '$validId'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  handler.filterMsg("size");
+  EXPECT_STREQ(
+      "{\"type\":\"String\",\"id\":\"objects\\/1\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/60\","
+      "\"user_name\":\"String\"},\"preview\":\"\\\"value\\\"\","
+      "\"fields\":[],}",
+      handler.msg());
+
+  // object id ring / invalid => expired
+  service_msg = Eval(lib, "[port, ['objects', '99999999'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
+      "\"preview\":\"<expired>\"}",
+      handler.msg());
+
+  // expired/eval => error
+  service_msg = Eval(lib, "[port, ['objects', 'expired', 'eval'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Error\",\"id\":\"\","
+      "\"message\":\"expected at most 2 arguments but found 3\\n\","
+      "\"request\":{\"arguments\":[\"objects\",\"expired\",\"eval\"],"
+      "\"option_keys\":[],\"option_values\":[]}}",
+      handler.msg());
+
+  // int/eval => good
+  service_msg = Eval(lib,
+                     "[port, ['objects', 'int-123', 'eval'], "
+                     "['expr'], ['this+99']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-222\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"222\"}",
+      handler.msg());
+
+  // object id ring / invalid => expired
+  service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], "
+                     "['expr'], ['this']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Error\",\"id\":\"\",\"kind\":\"EvalExpired\","
+      "\"message\":\"attempt to evaluate against expired object\\n\","
+      "\"request\":{\"arguments\":[\"objects\",\"99999999\",\"eval\"],"
+      "\"option_keys\":[\"expr\"],\"option_values\":[\"this\"]}}",
+      handler.msg());
+
+  // Extra arg to eval.
+  service_msg = Eval(lib,
+                     "[port, ['objects', 'int-123', 'eval', 'foo'], "
+                     "['expr'], ['this+99']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"Error\",\"id\":\"\","
+      "\"message\":\"expected at most 3 arguments but found 4\\n\","
+      "\"request\":{\"arguments\":[\"objects\",\"int-123\",\"eval\",\"foo\"],"
+      "\"option_keys\":[\"expr\"],\"option_values\":[\"this+99\"]}}",
+      handler.msg());
+}
+
+
+
 TEST_CASE(Service_Classes) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -342,8 +572,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-    "{\"type\":\"Error\",\"text\":\"999999 is not a valid class id.\","
-    "\"message\":{\"arguments\":[\"classes\",\"999999\"],"
+    "{\"type\":\"Error\",\"id\":\"\","
+    "\"message\":\"999999 is not a valid class id.\","
+    "\"request\":{\"arguments\":[\"classes\",\"999999\"],"
     "\"option_keys\":[],\"option_values\":[]}}", handler.msg());
 
   // Request the class A over the service.
@@ -380,7 +611,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"text\":\"Invalid sub collection huh\",\"message\":"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection huh\""
+    ",\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[],"
     "\"option_values\":[]}}", cid);
 
@@ -390,8 +622,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"text\":\"Field 9 not found\","
-    "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"],"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Field 9 not found\","
+    "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function request.
@@ -400,8 +632,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"text\":\"Function 9 not found\","
-    "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"],"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Function 9 not found\","
+    "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
 
@@ -411,7 +643,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\","
+    "\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
@@ -421,7 +654,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\","
+    "\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 }
@@ -461,6 +695,7 @@
   EXPECT(!code_c.IsNull());
   // Use the entry of the code object as it's reference.
   uword entry = code_c.EntryPoint();
+  int64_t compile_timestamp = code_c.compile_timestamp();
   EXPECT_GT(code_c.Size(), 16);
   uword last = entry + code_c.Size();
 
@@ -479,15 +714,15 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-    "{\"type\":\"Error\",\"text\":\"Could not find code at 0\",\"message\":"
-    "{\"arguments\":[\"code\",\"0\"],"
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Malformed code id: 0\","
+    "\"request\":{\"arguments\":[\"code\",\"0\"],"
     "\"option_keys\":[],\"option_values\":[]}}", handler.msg());
 
-  // The following four tests check that a code object can be found
-  // inside the range: [code.EntryPoint(), code.EntryPoint() + code.Size()).
-  // Request code object at code.EntryPoint()
-  // Expect this to succeed as it is inside [entry, entry + size).
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", entry);
+  // The following test checks that a code object can be found only
+  // at compile_timestamp()-code.EntryPoint().
+  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+                      compile_timestamp,
+                      entry);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   {
@@ -495,14 +730,18 @@
     const intptr_t kBufferSize = 512;
     char buffer[kBufferSize];
     OS::SNPrint(buffer, kBufferSize-1,
-                "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry);
+                "{\"type\":\"Code\",\"id\":\"code\\/%" Px64 "-%" Px "\",",
+                compile_timestamp,
+                entry);
     EXPECT_SUBSTRING(buffer, handler.msg());
   }
 
-  // Request code object at code.EntryPoint() + 16.
-  // Expect this to succeed as it is inside [entry, entry + size).
+  // Request code object at compile_timestamp-code.EntryPoint() + 16
+  // Expect this to fail because the address is not the entry point.
   uintptr_t address = entry + 16;
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address);
+  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+                      compile_timestamp,
+                      address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   {
@@ -510,14 +749,18 @@
     const intptr_t kBufferSize = 512;
     char buffer[kBufferSize];
     OS::SNPrint(buffer, kBufferSize-1,
-                "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry);
+                "Could not find code with id: %" Px64 "-%" Px "",
+                compile_timestamp,
+                address);
     EXPECT_SUBSTRING(buffer, handler.msg());
   }
 
-  // Request code object at code.EntryPoint() + code.Size() - 1.
-  // Expect this to succeed as it is inside [entry, entry + size).
-  address = last - 1;
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address);
+  // Request code object at (compile_timestamp - 1)-code.EntryPoint()
+  // Expect this to fail because the timestamp is wrong.
+  address = entry;
+  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+                      compile_timestamp - 1,
+                      address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   {
@@ -525,25 +768,26 @@
     const intptr_t kBufferSize = 512;
     char buffer[kBufferSize];
     OS::SNPrint(buffer, kBufferSize-1,
-                "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry);
+                "Could not find code with id: %" Px64 "-%" Px "",
+                compile_timestamp - 1,
+                address);
     EXPECT_SUBSTRING(buffer, handler.msg());
   }
 
-  // Request code object at code.EntryPoint() + code.Size(). Expect this
-  // to fail as it's outside of [entry, entry + size).
+  // Request native code at address. Expect the null code object back.
   address = last;
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address);
+  service_msg = EvalF(h_lib, "[port, ['code', 'native-%" Px "'], [], []]",
+                      address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  {
-    const intptr_t kBufferSize = 1024;
-    char buffer[kBufferSize];
-    OS::SNPrint(buffer, kBufferSize-1,
-        "{\"type\":\"Error\",\"text\":\"Could not find code at %" Px "\","
-        "\"message\":{\"arguments\":[\"code\",\"%" Px "\"],"
-        "\"option_keys\":[],\"option_values\":[]}}", address, address);
-    EXPECT_STREQ(buffer, handler.msg());
-  }
+  EXPECT_STREQ("{\"type\":\"null\"}", handler.msg());
+
+  // Request malformed native code.
+  service_msg = EvalF(h_lib, "[port, ['code', 'native%" Px "'], [], []]",
+                      address);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg());
 }
 
 
@@ -611,7 +855,7 @@
       "\"type\":\"@Script\",\"id\":\"scripts\\/dart%3Atest-lib\","
       "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\","
       "\"kind\":\"script\"},\"hits\":"
-      "[3,0,3,1,5,1,5,1,5,1,6,1,6,1]}", handler.msg());
+      "[5,1,6,1]}", handler.msg());
 }
 
 
@@ -650,6 +894,35 @@
 }
 
 
+TEST_CASE(Service_HeapMap) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port =
+      Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(lib, "[port, ['heapmap'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"HeapMap\"", handler.msg());
+  EXPECT_SUBSTRING("\"pages\":[[", handler.msg());
+  EXPECT_SUBSTRING("]]", handler.msg());
+}
+
+
 static const char* alpha_callback(
     const char* name,
     const char** arguments,
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index a84d57e..ea1334f 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -528,7 +528,7 @@
 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
   // Correct return address to point just after the call that is being
   // deoptimized.
-  __ AddImmediate(LR, -CallPattern::kFixedLengthInBytes);
+  __ AddImmediate(LR, -CallPattern::LengthInBytes());
   GenerateDeoptimizationSequence(assembler, true);  // Preserve R0.
 }
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 309ccc9..41882b0 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -296,6 +296,8 @@
   V(_LocalClassMirror, "_LocalClassMirror")                                    \
   V(_LocalFunctionTypeMirror, "_LocalFunctionTypeMirror")                      \
   V(_LocalLibraryMirror, "_LocalLibraryMirror")                                \
+  V(_LocalLibraryDependencyMirror, "_LocalLibraryDependencyMirror")            \
+  V(_LocalCombinatorMirror, "_LocalCombinatorMirror")                          \
   V(_LocalMethodMirror, "_LocalMethodMirror")                                  \
   V(_LocalVariableMirror, "_LocalVariableMirror")                              \
   V(_LocalParameterMirror, "_LocalParameterMirror")                            \
@@ -309,6 +311,7 @@
   V(NotInitialized, "<not initialized>")                                       \
   V(ClassId, "get:_classId")                                                   \
   V(AllocationStubFor, "Allocation stub for ")                                 \
+  V(TempParam, ":temp_param")                                                  \
 
 
 // Contains a list of frequently used strings in a canonicalized form. This
diff --git a/runtime/vm/timer.cc b/runtime/vm/timer.cc
index 4a98bf5..840bd21 100644
--- a/runtime/vm/timer.cc
+++ b/runtime/vm/timer.cc
@@ -26,7 +26,7 @@
 
 
 #define TIMER_FIELD_REPORT(name, msg)                                          \
-  if (name().report() && name().message() != NULL) {       \
+  if (name().report() && name().message() != NULL) {                           \
     OS::Print("%s :  %" Pd64 " micros.\n",                                     \
               name().message(),                                                \
               name().TotalElapsedTime());                                      \
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 0db1781..5775444 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -109,18 +109,10 @@
   DISALLOW_COPY_AND_ASSIGN(TimerList);
 };
 
-// Timer Usage.
-#define START_TIMER(name)                                                      \
-  Isolate::Current()->timer_list().name().Start();
-
-#define STOP_TIMER(name)                                                       \
-  Isolate::Current()->timer_list().name().Stop();
-
 // The class TimerScope is used to start and stop a timer within a scope.
 // It is used as follows:
 // {
-//   TIMERSCOPE(name_of_timer);
-//   ....
+//   TimerScope timer(FLAG_name_of_flag, timer, isolate);
 //   .....
 //   code that needs to be timed.
 //   ....
@@ -146,15 +138,59 @@
   }
 
  private:
-  bool flag_;
+  const bool flag_;
   bool nested_;
-  Timer* timer_;
+  Timer* const timer_;
+
+  DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(TimerScope);
 };
 
-#define TIMERSCOPE(name)                                                       \
-  TimerScope vm_internal_timer_(true,                                          \
-                                &(Isolate::Current()->timer_list().name()))
+
+class PauseTimerScope : public StackResource {
+ public:
+  PauseTimerScope(bool flag, Timer* timer, BaseIsolate* isolate = NULL)
+      : StackResource(isolate), flag_(flag), nested_(false), timer_(timer) {
+    if (flag_) {
+      if (timer_->running()) {
+        timer_->Stop();
+      } else {
+        nested_ = true;
+      }
+    }
+  }
+  ~PauseTimerScope() {
+    if (flag_) {
+      if (!nested_) {
+        timer_->Start();
+      }
+    }
+  }
+
+ private:
+  const bool flag_;
+  bool nested_;
+  Timer* const timer_;
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_COPY_AND_ASSIGN(PauseTimerScope);
+};
+
+
+// Macros to deal with named timers in the isolate.
+#define START_TIMER(isolate, name)                                             \
+isolate->timer_list().name().Start();
+
+#define STOP_TIMER(isolate, name)                                              \
+isolate->timer_list().name().Stop();
+
+#define TIMERSCOPE(isolate, name)                                              \
+  TimerScope vm_internal_timer_(true, &(isolate->timer_list().name()), isolate)
+
+#define PAUSETIMERSCOPE(isolate, name)                                         \
+PauseTimerScope vm_internal_timer_(true,                                       \
+                                   &(isolate->timer_list().name()),            \
+                                   isolate)
 
 }  // namespace dart
 
diff --git a/sdk/lib/_internal/compiler/compiler.dart b/sdk/lib/_internal/compiler/compiler.dart
index e40c74a..b79ab22 100644
--- a/sdk/lib/_internal/compiler/compiler.dart
+++ b/sdk/lib/_internal/compiler/compiler.dart
@@ -85,7 +85,7 @@
                        Uri packageRoot,
                        CompilerInputProvider inputProvider,
                        DiagnosticHandler handler,
-                       [List<String> options = const [], 
+                       [List<String> options = const [],
                         CompilerOutputProvider outputProvider,
                         Map<String, dynamic> environment = const {}]) {
   if (!libraryRoot.path.endsWith("/")) {
@@ -107,13 +107,6 @@
   return compiler.run(script).then((_) {
     String code = compiler.assembledCode;
     if (code != null && outputProvider != null) {
-      String outputType = 'js';
-      if (options.contains('--output-type=dart')) {
-        outputType = 'dart';
-      }
-      outputProvider('', outputType)
-          ..add(code)
-          ..close();
       code = ''; // Non-null signals success.
     }
     return code;
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 3995d34..f7a72f1 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -57,7 +57,8 @@
                 hasOption(options, '--disable-type-inference'),
             preserveComments: hasOption(options, '--preserve-comments'),
             verbose: hasOption(options, '--verbose'),
-            sourceMapUri: extractSourceMapUri(options),
+            sourceMapUri: extractUriOption(options, '--source-map='),
+            outputUri: extractUriOption(options, '--out='),
             terseDiagnostics: hasOption(options, '--terse'),
             dumpInfo: hasOption(options, '--dump-info'),
             buildId: extractStringOption(
@@ -84,8 +85,8 @@
     return defaultValue;
   }
 
-  static Uri extractSourceMapUri(List<String> options) {
-    var option = extractStringOption(options, '--source-map=', null);
+  static Uri extractUriOption(List<String> options, String prefix) {
+    var option = extractStringOption(options, prefix, null);
     return (option == null) ? null : Uri.parse(option);
   }
 
@@ -195,7 +196,7 @@
       // the scheme in the script because [Script.uri] is used for resolving
       // relative URIs mentioned in the script. See the comment on
       // [LibraryLoader] for more details.
-      return new leg.Script(readableUri, sourceFile);
+      return new leg.Script(readableUri, resourceUri, sourceFile);
     }).catchError((error) {
       reportReadError(error);
       return null;
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index eacf7df..72b7b3d 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -29,7 +29,7 @@
   String get name => "Closure Simplifier";
 
   ClosureClassMap computeClosureToClassMapping(Element element,
-                                               Expression node,
+                                               Node node,
                                                TreeElements elements) {
     return measure(() {
       ClosureClassMap cached = closureMappingCache[node];
@@ -44,13 +44,17 @@
         translator.translateFunction(element, node);
       } else if (element.isSynthesized) {
         return new ClosureClassMap(null, null, null, new ThisElement(element));
-      } else if (node is SendSet) {
-        // The lazy initializer of a static.
-        translator.translateLazyInitializer(element, node);
       } else {
-        assert(element.isInstanceMember() && element.isField());
-        closureMappingCache[node] =
-            new ClosureClassMap(null, null, null, new ThisElement(element));
+        assert(element.isField());
+        VariableElement field = element;
+        if (field.initializer != null) {
+          // The lazy initializer of a static.
+          translator.translateLazyInitializer(element, node, field.initializer);
+        } else {
+          assert(element.isInstanceMember());
+          closureMappingCache[node] =
+              new ClosureClassMap(null, null, null, new ThisElement(element));
+        }
       }
       assert(closureMappingCache[node] != null);
       return closureMappingCache[node];
@@ -80,15 +84,10 @@
                       ClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
-  VariableListElement get variables {
-    throw new SpannableAssertionFailure(
-        variableElement, 'Should not access variables of ClosureFieldElement.');
-  }
-
-  Expression get cachedNode {
+  Expression get initializer {
     throw new SpannableAssertionFailure(
         variableElement,
-        'Should not access cachedNode of ClosureFieldElement.');
+        'Should not access initializer of ClosureFieldElement.');
   }
 
   bool isInstanceMember() => true;
@@ -346,10 +345,10 @@
     updateClosures();
   }
 
-  void translateLazyInitializer(Element element, SendSet node) {
-    assert(node.assignmentOperator.source == "=");
-    Expression initialValue = node.argumentsNode.nodes.head;
-    visitInvokable(element, node, () { visit(initialValue); });
+  void translateLazyInitializer(VariableElement element,
+                                VariableDefinitions node,
+                                Expression initializer) {
+    visitInvokable(element, node, () { visit(initializer); });
     updateClosures();
   }
 
@@ -719,7 +718,7 @@
                                callElement, thisElement);
   }
 
-  void visitInvokable(Element element, Expression node, void visitChildren()) {
+  void visitInvokable(Element element, Node node, void visitChildren()) {
     bool oldInsideClosure = insideClosure;
     Element oldFunctionElement = currentElement;
     ClosureClassMap oldClosureData = closureData;
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 1a57ccb..aeeae12 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -107,15 +107,14 @@
       }
       pendingVariables.add(element);
 
-      SendSet assignment = node.asSendSet();
+      Expression initializer = element.initializer;
       Constant value;
-      if (assignment == null) {
+      if (initializer == null) {
         // No initial value.
         value = new NullConstant();
       } else {
-        Node right = assignment.arguments.head;
-        value =
-            compileNodeWithDefinitions(right, definitions, isConst: isConst);
+        value = compileNodeWithDefinitions(
+            initializer, definitions, isConst: isConst);
         if (compiler.enableTypeAssertions &&
             value != null &&
             element.isField()) {
@@ -628,6 +627,21 @@
     if (Elements.isUnresolved(constructor)) {
       return signalNotCompileTimeConstant(node);
     }
+
+    // Deferred types can not be used in const instance creation expressions.
+    // Check if the constructor comes from a deferred library.
+    Send selectorSend = node.send.selector.asSend();
+    if (selectorSend != null) {
+      Identifier receiver = selectorSend.receiver.asIdentifier();
+      if (receiver != null) {
+        Element element = elements[receiver];
+        if (element.isPrefix() && (element as PrefixElement).isDeferred) {
+          return signalNotCompileTimeConstant(node,
+              message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
+        }
+      }
+    }
+
     // TODO(ahe): This is nasty: we must eagerly analyze the
     // constructor to ensure the redirectionTarget has been computed
     // correctly.  Find a way to avoid this.
@@ -739,16 +753,16 @@
     return node.expression.accept(this);
   }
 
-  error(Node node) {
+  error(Node node, MessageKind message) {
     // TODO(floitsch): get the list of constants that are currently compiled
     // and present some kind of stack-trace.
-    compiler.reportFatalError(
-        node, MessageKind.NOT_A_COMPILE_TIME_CONSTANT);
+    compiler.reportFatalError(node, message);
   }
 
-  Constant signalNotCompileTimeConstant(Node node) {
+  Constant signalNotCompileTimeConstant(Node node,
+      {MessageKind message: MessageKind.NOT_A_COMPILE_TIME_CONSTANT}) {
     if (isEvaluatingConstant) {
-      error(node);
+      error(node, message);
     }
     // Else we don't need to do anything. The final handler is only
     // optimistically trying to compile constants. So it is normal that we
@@ -765,11 +779,10 @@
                                   Compiler compiler)
       : super(handler, elements, compiler, isConst: true);
 
-  error(Node node) {
+  error(Node node, MessageKind message) {
     // Just fail without reporting it anywhere.
     throw new CompileTimeConstantError(
-        MessageKind.NOT_A_COMPILE_TIME_CONSTANT, const {},
-        compiler.terseDiagnostics);
+        message, const {}, compiler.terseDiagnostics);
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index aa38e28..05fe6c7 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -394,6 +394,11 @@
    */
   final Uri sourceMapUri;
 
+  /**
+   * URI of the main output if the compiler is generating source maps.
+   */
+  final Uri outputUri;
+
   /// Emit terse diagnostics without howToFix.
   final bool terseDiagnostics;
 
@@ -621,20 +626,23 @@
             this.enableNativeLiveTypeAnalysis: false,
             bool emitJavaScript: true,
             bool generateSourceMap: true,
-            this.analyzeAllFlag: false,
+            bool analyzeAllFlag: false,
             bool analyzeOnly: false,
             bool analyzeSignaturesOnly: false,
             this.preserveComments: false,
             this.verbose: false,
             this.sourceMapUri: null,
+            this.outputUri: null,
             this.buildId: UNDETERMINED_BUILD_ID,
             this.terseDiagnostics: false,
             this.dumpInfo: false,
             this.showPackageWarnings: false,
             outputProvider,
             List<String> strips: const []})
-      : this.analyzeOnly = analyzeOnly || analyzeSignaturesOnly,
+      : this.analyzeOnly =
+            analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag,
         this.analyzeSignaturesOnly = analyzeSignaturesOnly,
+        this.analyzeAllFlag = analyzeAllFlag,
         this.outputProvider = (outputProvider == null)
             ? NullSink.outputProvider
             : outputProvider {
@@ -756,7 +764,7 @@
     } else if (node is Element) {
       return spanFromElement(node);
     } else if (node is MetadataAnnotation) {
-      Uri uri = node.annotatedElement.getCompilationUnit().script.uri;
+      Uri uri = node.annotatedElement.getCompilationUnit().script.readableUri;
       return spanFromTokens(node.beginToken, node.endToken, uri);
     } else {
       throw 'No error location.';
@@ -1019,16 +1027,16 @@
     return scanBuiltinLibraries().then((_) {
       if (librariesToAnalyzeWhenRun != null) {
         return Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) {
-          log('analyzing $libraryUri ($buildId)');
+          log('Analyzing $libraryUri ($buildId)');
           return libraryLoader.loadLibrary(libraryUri, null, libraryUri);
         });
       }
     }).then((_) {
       if (uri != null) {
         if (analyzeOnly) {
-          log('analyzing $uri ($buildId)');
+          log('Analyzing $uri ($buildId)');
         } else {
-          log('compiling $uri ($buildId)');
+          log('Compiling $uri ($buildId)');
         }
         return libraryLoader.loadLibrary(uri, null, uri)
             .then((LibraryElement library) {
@@ -1461,7 +1469,7 @@
       throw 'Cannot find tokens to produce error message.';
     }
     if (uri == null && currentElement != null) {
-      uri = currentElement.getCompilationUnit().script.uri;
+      uri = currentElement.getCompilationUnit().script.readableUri;
     }
     return SourceSpan.withCharacterOffsets(begin, end,
       (beginOffset, endOffset) => new SourceSpan(uri, beginOffset, endOffset));
@@ -1490,7 +1498,7 @@
       element = currentElement;
     }
     Token position = element.position();
-    Uri uri = element.getCompilationUnit().script.uri;
+    Uri uri = element.getCompilationUnit().script.readableUri;
     return (position == null)
         ? new SourceSpan(uri, 0, 0)
         : spanFromTokens(position, position, uri);
@@ -1503,7 +1511,7 @@
     if (position == null) return spanFromElement(element);
     Token token = position.token;
     if (token == null) return spanFromElement(element);
-    Uri uri = element.getCompilationUnit().script.uri;
+    Uri uri = element.getCompilationUnit().script.readableUri;
     return spanFromTokens(token, token, uri);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 53a6362..213f28b 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -23,6 +23,7 @@
 abstract class Constant {
   const Constant();
 
+  // TODO: Make all the isXXX in Constant checks getters.
   bool isNull() => false;
   bool isBool() => false;
   bool isTrue() => false;
@@ -45,6 +46,8 @@
 
   bool isNaN() => false;
   bool isMinusZero() => false;
+  bool isZero() => false;
+  bool isOne() => false;
 
   // TODO(johnniwinther): Replace with a 'type' getter.
   DartType computeType(Compiler compiler);
@@ -161,6 +164,8 @@
   bool isUInt31() => value >= 0 && value < (1 << 31);
   bool isUInt32() => value >= 0 && value < (1 << 32);
   bool isPositive() => value >= 0;
+  bool isZero() => value == 0;
+  bool isOne() => value == 1;
 
   DartType computeType(Compiler compiler) {
     return compiler.intClass.computeType(compiler);
@@ -211,6 +216,8 @@
   bool isNaN() => value.isNaN;
   // We need to check for the negative sign since -0.0 == 0.0.
   bool isMinusZero() => value == 0.0 && value.isNegative;
+  bool isZero() => value == 0.0;
+  bool isOne() => value == 1.0;
 
   DartType computeType(Compiler compiler) {
     return compiler.doubleClass.computeType(compiler);
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 49c002f..6a0363a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -56,7 +56,7 @@
   // m[0] is the entire match (which will be equal to argument). m[1]
   // is something like "-o" or "--out=", and m[2] is the parameter.
   Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument);
-  if (m == null) helpAndFail('Error: Unknown option "$argument".');
+  if (m == null) helpAndFail('Unknown option "$argument".');
   return m[2];
 }
 
@@ -109,6 +109,9 @@
   String outputLanguage = 'JavaScript';
   bool stripArgumentSet = false;
   bool analyzeOnly = false;
+  bool analyzeAll = false;
+  // List of provided options that imply that output is expected.
+  List<String> optionsImplyCompilation = <String>[];
   bool hasDisallowUnsafeEval = false;
   // TODO(johnniwinther): Measure time for reading files.
   SourceFileProvider inputProvider = new CompilerSourceFileProvider();
@@ -130,6 +133,7 @@
   }
 
   setOutput(Iterator<String> arguments) {
+    optionsImplyCompilation.add(arguments.current);
     String path;
     if (arguments.current == '-o') {
       if (!arguments.moveNext()) {
@@ -145,6 +149,7 @@
   }
 
   setOutputType(String argument) {
+    optionsImplyCompilation.add(argument);
     if (argument == '--output-type=dart') {
       outputLanguage = OUTPUT_LANGUAGE_DART;
       if (!explicitOut) {
@@ -162,6 +167,7 @@
   }
 
   setStrip(String argument) {
+    optionsImplyCompilation.add(argument);
     stripArgumentSet = true;
     passThrough(argument);
   }
@@ -171,11 +177,21 @@
     passThrough(argument);
   }
 
+  setAnalyzeAll(String argument) {
+    analyzeAll = true;
+    passThrough(argument);
+  }
+
   setVerbose(_) {
     diagnosticHandler.verbose = true;
     passThrough('--verbose');
   }
 
+  implyCompilation(String argument) {
+    optionsImplyCompilation.add(argument);
+    passThrough(argument);
+  }
+
   addInEnvironment(String argument) {
     int eqIndex = argument.indexOf('=');
     String name = argument.substring(2, eqIndex);
@@ -198,7 +214,7 @@
       String allowedCategoriesString = allowedCategoriesList.join(', ');
       for (String category in categories) {
         if (!allowedCategories.contains(category)) {
-          fail('Error: unsupported library category "$category", '
+          fail('Unsupported library category "$category", '
                'supported categories are: $allowedCategoriesString');
         }
       }
@@ -221,7 +237,7 @@
           passThrough('--enable-checked-mode');
           break;
         case 'm':
-          passThrough('--minify');
+          implyCompilation('--minify');
           break;
         default:
           throw 'Internal error: "$shortOption" did not match';
@@ -255,7 +271,7 @@
     new OptionHandler('--library-root=.+', setLibraryRoot),
     new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true),
     new OptionHandler('--allow-mock-compilation', passThrough),
-    new OptionHandler('--minify|-m', passThrough),
+    new OptionHandler('--minify|-m', implyCompilation),
     new OptionHandler('--force-strip=.*', setStrip),
     new OptionHandler('--disable-diagnostic-colors',
                       (_) => diagnosticHandler.enableColors = false),
@@ -264,19 +280,20 @@
     new OptionHandler('--enable[_-]checked[_-]mode|--checked',
                       (_) => passThrough('--enable-checked-mode')),
     new OptionHandler('--enable-concrete-type-inference',
-                      (_) => passThrough('--enable-concrete-type-inference')),
+                      (_) => implyCompilation(
+                          '--enable-concrete-type-inference')),
     new OptionHandler('--trust-type-annotations',
-                      (_) => passThrough('--trust-type-annotations')),
+                      (_) => implyCompilation('--trust-type-annotations')),
     new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
     new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
-    new OptionHandler('--analyze-all', passThrough),
+    new OptionHandler('--analyze-all', setAnalyzeAll),
     new OptionHandler('--analyze-only', setAnalyzeOnly),
-    new OptionHandler('--analyze-signatures-only', passThrough),
+    new OptionHandler('--analyze-signatures-only', setAnalyzeOnly),
     new OptionHandler('--disable-native-live-type-analysis', passThrough),
     new OptionHandler('--categories=.*', setCategories),
-    new OptionHandler('--disable-type-inference', passThrough),
+    new OptionHandler('--disable-type-inference', implyCompilation),
     new OptionHandler('--terse', passThrough),
-    new OptionHandler('--dump-info', passThrough),
+    new OptionHandler('--dump-info', implyCompilation),
     new OptionHandler('--disallow-unsafe-eval',
                       (_) => hasDisallowUnsafeEval = true),
     new OptionHandler('--show-package-warnings', passThrough),
@@ -284,7 +301,7 @@
 
     // The following two options must come last.
     new OptionHandler('-.*', (String argument) {
-      helpAndFail('Error: Unknown option "$argument".');
+      helpAndFail("Unknown option '$argument'.");
     }),
     new OptionHandler('.*', (String argument) {
       arguments.add(nativeToUriPath(argument));
@@ -299,21 +316,21 @@
   if (hasDisallowUnsafeEval) {
     String precompiledName =
         relativize(currentDirectory, computePrecompiledUri(), isWindows);
-    helpAndFail("Error: option '--disallow-unsafe-eval' has been removed."
+    helpAndFail("Option '--disallow-unsafe-eval' has been removed."
                 " Instead, the compiler generates a file named"
                 " '$precompiledName'.");
   }
 
   if (outputLanguage != OUTPUT_LANGUAGE_DART && stripArgumentSet) {
-    helpAndFail('Error: --force-strip may only be used with '
-        '--output-type=dart');
+    helpAndFail("Option '--force-strip' may only be used with "
+                "'--output-type=dart'.");
   }
   if (arguments.isEmpty) {
-    helpAndFail('Error: No Dart file specified.');
+    helpAndFail('No Dart file specified.');
   }
   if (arguments.length > 1) {
     var extra = arguments.sublist(1);
-    helpAndFail('Error: Extra arguments: ${extra.join(" ")}');
+    helpAndFail('Extra arguments: ${extra.join(" ")}');
   }
 
   Uri uri = currentDirectory.resolve(arguments[0]);
@@ -321,10 +338,24 @@
     packageRoot = uri.resolve('./packages/');
   }
 
-  diagnosticHandler.info('package root is $packageRoot');
+  if ((analyzeOnly || analyzeAll) && !optionsImplyCompilation.isEmpty) {
+    if (!analyzeOnly) {
+      diagnosticHandler.info(
+          "Option '--analyze-all' implies '--analyze-only'.",
+          api.Diagnostic.INFO);
+    }
+    diagnosticHandler.info(
+        "Options $optionsImplyCompilation indicate that output is expected, "
+        "but compilation is turned off by the option '--analyze-only'.",
+        api.Diagnostic.INFO);
+  }
+  if (analyzeAll) analyzeOnly = true;
+
+  diagnosticHandler.info('Package root is $packageRoot');
 
   int totalCharactersWritten = 0;
 
+  options.add('--out=$out');
   options.add('--source-map=$sourceMapOut');
 
   List<String> allOutputFiles = new List<String>();
@@ -332,12 +363,12 @@
   compilationDone(String code) {
     if (analyzeOnly) return;
     if (code == null) {
-      fail('Error: Compilation failed.');
+      fail('Compilation failed.');
     }
     writeString(Uri.parse('$out.deps'),
                 getDepsOutput(inputProvider.sourceFiles));
     diagnosticHandler.info(
-         'compiled ${inputProvider.dartCharactersRead} characters Dart '
+         'Compiled ${inputProvider.dartCharactersRead} characters Dart '
          '-> $totalCharactersWritten characters $outputLanguage '
          'in ${relativize(currentDirectory, out, isWindows)}');
     if (diagnosticHandler.verbose) {
@@ -375,14 +406,14 @@
         String outName = out.path.substring(out.path.lastIndexOf('/') + 1);
         uri = out.resolve('${outName}.$extension');
       } else {
-        fail('Error: Unknown extension: $extension');
+        fail('Unknown extension: $extension');
       }
     } else {
       uri = out.resolve('$name.$extension');
     }
 
     if (uri.scheme != 'file') {
-      fail('Error: Unhandled scheme ${uri.scheme} in $uri.');
+      fail('Unhandled scheme ${uri.scheme} in $uri.');
     }
 
     RandomAccessFile output;
@@ -410,21 +441,6 @@
     }
 
     onDone() {
-      if (sourceMapFileName != null) {
-        // Using # is the new proposed standard. @ caused problems in Internet
-        // Explorer due to "Conditional Compilation Statements" in JScript,
-        // see:
-        // http://msdn.microsoft.com/en-us/library/7kx09ct1(v=vs.80).aspx
-        // About source maps, see:
-        // https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
-        // TODO(http://dartbug.com/11914): Remove @ line.
-        String sourceMapTag = '''
-
-//# sourceMappingURL=$sourceMapFileName
-//@ sourceMappingURL=$sourceMapFileName
-''';
-        writeStringSync(sourceMapTag);
-      }
       output.closeSync();
       if (isPrimaryOutput) {
         totalCharactersWritten += charactersWritten;
@@ -460,7 +476,7 @@
 
 void writeString(Uri uri, String text) {
   if (uri.scheme != 'file') {
-    fail('Error: Unhandled scheme ${uri.scheme}.');
+    fail('Unhandled scheme ${uri.scheme}.');
   }
   var file = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE);
   file.writeStringSync(text);
@@ -472,7 +488,7 @@
     diagnosticHandler.diagnosticHandler(
         null, -1, -1, message, api.Diagnostic.ERROR);
   } else {
-    print(message);
+    print('Error: $message');
   }
   exitFunc(1);
 }
@@ -534,9 +550,7 @@
 
   --analyze-all
     Analyze all code.  Without this option, the compiler only analyzes
-    code that is reachable from [main].  This option is useful for
-    finding errors in libraries, but using it can result in bigger and
-    slower output.
+    code that is reachable from [main].  This option implies --analyze-only.
 
   --analyze-only
     Analyze but do not generate code.
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 6f824f5..57e36da 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -17,50 +17,6 @@
       : this.treeElements = new TreeElementMapping(null);
 }
 
-// TODO(ahe): This class should not subclass [TreeElementMapping], if
-// anything, it should implement TreeElements.
-class AggregatedTreeElements extends TreeElementMapping {
-  final List<TreeElements> treeElements;
-
-  AggregatedTreeElements() : treeElements = <TreeElements>[], super(null);
-
-  Element operator[](Node node) {
-    final result = super[node];
-    return result != null ? result : getFirstNotNullResult((e) => e[node]);
-  }
-
-  Selector getSelector(Send send) {
-    final result = super.getSelector(send);
-    return result != null ?
-        result : getFirstNotNullResult((e) => e.getSelector(send));
-  }
-
-  DartType getType(Node node) {
-    final result = super.getType(node);
-    return result != null ?
-        result : getFirstNotNullResult((e) => e.getType(node));
-  }
-
-  getFirstNotNullResult(f(TreeElements element)) {
-    for (final element in treeElements) {
-      final result = f(element);
-      if (result != null) return result;
-    }
-
-    return null;
-  }
-}
-
-class VariableListAst extends ElementAst {
-  VariableListAst(ast) : super(ast, new AggregatedTreeElements());
-
-  add(VariableElement element, TreeElements treeElements) {
-    AggregatedTreeElements e = this.treeElements;
-    e[element.cachedNode] = element;
-    e.treeElements.add(treeElements);
-  }
-}
-
 class DartBackend extends Backend {
   final List<CompilerTask> tasks;
   final bool forceStripTypes;
@@ -310,13 +266,6 @@
     resolvedElements.forEach((element, treeElements) {
       if (!shouldOutput(element) || treeElements == null) return;
       var elementAst = new ElementAst(parse(element), treeElements);
-      if (element.isField()) {
-        final list = (element as VariableElement).variables;
-        elementAst = elementAsts.putIfAbsent(
-            list, () => new VariableListAst(parse(list)));
-        (elementAst as VariableListAst).add(element, treeElements);
-        element = list;
-      }
 
       if (element.isMember()) {
         ClassElement enclosingClass = element.getEnclosingClass();
@@ -449,7 +398,11 @@
 
     final unparser = new EmitterUnparser(renames);
     emitCode(unparser, imports, topLevelNodes, memberNodes);
-    compiler.assembledCode = unparser.result;
+    String assembledCode = unparser.result;
+    compiler.outputProvider('', 'dart')
+        ..add(assembledCode)
+        ..close();
+    compiler.assembledCode = assembledCode;
 
     // Output verbose info about size ratio of resulting bundle to all
     // referenced non-platform sources.
@@ -552,12 +505,10 @@
   final newClassElementCallback;
 
   ReferencedElementCollector(this.compiler,
-                             Element rootElement,
+                             this.rootElement,
                              this.treeElements,
                              this.newTypedefElementCallback,
-                             this.newClassElementCallback)
-      : this.rootElement =
-          rootElement is VariableElement ? rootElement.variables : rootElement;
+                             this.newClassElementCallback);
 
   visitNode(Node node) {
     node.visitChildren(this);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index fec7db6..6faf905 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -226,12 +226,12 @@
     Node elementNode = elementAst.ast;
     if (element is FunctionElement) {
       collectFunctionDeclarationPlaceholders(element, elementNode);
-    } else if (element is VariableListElement) {
+    } else if (element is VariableElement) {
       VariableDefinitions definitions = elementNode;
-      for (Node definition in definitions.definitions) {
-        final definitionElement = treeElements[definition];
-        // definitionElement == null if variable is actually unused.
-        if (definitionElement == null) continue;
+      Node definition = definitions.definitions.nodes.head;
+      final definitionElement = treeElements[elementNode];
+      // definitionElement == null if variable is actually unused.
+      if (definitionElement != null) {
         collectFieldDeclarationPlaceholders(definitionElement, definition);
       }
       makeVarDeclarationTypePlaceholder(definitions);
@@ -505,6 +505,10 @@
   }
 
   visitVariableDefinitions(VariableDefinitions node) {
+    Element definitionElement = treeElements[node];
+    if (definitionElement == backend.mirrorHelperSymbolsMap) {
+      backend.registerMirrorHelperElement(definitionElement, node);
+    }
     // Collect only local placeholders.
     for (Node definition in node.definitions.nodes) {
       Element definitionElement = treeElements[definition];
@@ -513,9 +517,6 @@
       // TODO(smok): Fix this when resolver correctly deals with
       // such cases.
       if (definitionElement == null) continue;
-      if (definitionElement == backend.mirrorHelperSymbolsMap) {
-        backend.registerMirrorHelperElement(definitionElement, node);
-      }
       Send send = definition.asSend();
       if (send != null) {
         // May get FunctionExpression here in definition.selector
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 04aceea..aedc7ea 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -1175,7 +1175,7 @@
   final PotentialSubtypeVisitor potentialSubtypeVisitor;
 
   factory Types(Compiler compiler, BaseClassElementX dynamicElement) {
-    LibraryElement library = new LibraryElementX(new Script(null, null));
+    LibraryElement library = new LibraryElementX(new Script(null, null, null));
     VoidType voidType = new VoidType(new VoidElementX(library));
     DynamicType dynamicType = new DynamicType(dynamicElement);
     dynamicElement.rawTypeCache = dynamicElement.thisType = dynamicType;
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 7fdb796..3e92c1c 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -13,6 +13,9 @@
     StringConstant,
     invariant;
 
+import 'dart_backend/dart_backend.dart' show
+    DartBackend;
+
 import 'elements/elements.dart' show
     Element,
     ClassElement,
@@ -22,6 +25,7 @@
     LibraryElement,
     MetadataAnnotation,
     ScopeContainerElement,
+    PrefixElement,
     ClosureContainer;
 
 import 'util/util.dart' show
@@ -186,17 +190,31 @@
 
   /// Answers whether the [import] has a [DeferredLibrary] annotation.
   bool _isImportDeferred(Import import) {
-    Link<MetadataAnnotation> metadatalist = import.metadata;
-    if (metadatalist == null) return false;
-    for (MetadataAnnotation metadata in metadatalist) {
+    return _allDeferredImports.containsKey(import);
+  }
+
+  /// Checks whether the [import] has a [DeferredLibrary] annotation and stores
+  /// the information in [_allDeferredImports] and on the corresponding
+  /// prefixElement.
+  void _markIfDeferred(Import import, LibraryElement library) {
+    Link<MetadataAnnotation> metadataList = import.metadata;
+    if (metadataList == null) return;
+    for (MetadataAnnotation metadata in metadataList) {
       metadata.ensureResolved(compiler);
       Element element = metadata.value.computeType(compiler).element;
-      if (metadata.value.computeType(compiler).element
-          == deferredLibraryClass) {
-        return true;
+      if (element == deferredLibraryClass) {
+        _allDeferredImports[import] = library.getLibraryFromTag(import);
+        // On encountering a deferred library without a prefix we report an
+        // error, but continue the compilation to possibly give more
+        // information. Therefore it is neccessary to check if there is a prefix
+        // here.
+        Element maybePrefix = library.find(import.prefix.toString());
+        if (maybePrefix != null && maybePrefix.isPrefix()) {
+          PrefixElement prefix = maybePrefix;
+          prefix.markAsDeferred();
+        }
       }
     }
-    return false;
   }
 
   /// Answers whether [element] is explicitly deferred when referred to from
@@ -635,7 +653,6 @@
 
   void ensureMetadataResolved(Compiler compiler) {
     _allDeferredImports[_fakeMainImport] = compiler.mainApp;
-    bool deferredUsedFromMain = false;
     var lastDeferred;
     // When detecting duplicate prefixes of deferred libraries there are 4
     // cases of duplicate prefixes:
@@ -652,7 +669,7 @@
     // import "lib.dart" as a;
     // import "lib2.dart" as a;
     // We must be able to signal error for case 1, 2, 3, but accept case 4.
-    
+
     // The prefixes that have been used by any imports in this library.
     Setlet<String> usedPrefixes = new Setlet<String>();
     // The last deferred import we saw with a given prefix (if any).
@@ -666,6 +683,7 @@
         for (LibraryTag tag in library.tags) {
           if (tag is! Import) continue;
           Import import = tag;
+          _markIfDeferred(import, library);
           String prefix = (import.prefix != null)
               ? import.prefix.toString()
               : null;
@@ -680,11 +698,7 @@
               prefixDeferredImport[prefix] = import;
             }
             splitProgram = true;
-            _allDeferredImports[tag] = library.getLibraryFromTag(tag);
             lastDeferred = import.metadata.first;
-            if (library == compiler.mainApp) {
-              deferredUsedFromMain = true;
-            }
           }
           if (prefix != null) {
             if (previousDeferredImport != null ||
@@ -700,11 +714,12 @@
         }
       });
     }
-    if (splitProgram && !deferredUsedFromMain) {
+    if (splitProgram && compiler.backend is DartBackend) {
+      // TODO(sigurdm): Implement deferred loading for dart2dart.
+      splitProgram = false;
       compiler.reportInfo(
           lastDeferred,
-          MessageKind.DEFERRED_LIBRARY_NOT_FROM_MAIN);
-      splitProgram = false;
+          MessageKind.DEFERRED_LIBRARY_DART_2_DART);
     }
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 37c54b5..63eb7ea 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -292,7 +292,7 @@
       return null;
     }
     int size = 0;
-    DartType type = element.variables.type;
+    DartType type = element.computeType(compiler);
     List<InfoNode> contents = new List<InfoNode>();
     if (emittedCode != null) {
       contents.add(new CodeInfoNode(
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 3a9c4c7..010438f 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -743,6 +743,9 @@
 abstract class PrefixElement extends Element {
   void addImport(Element element, Import import, DiagnosticListener listener);
   Element lookupLocalMember(String memberName);
+  /// Is true if this prefix belongs to a deferred import.
+  bool get isDeferred;
+  void markAsDeferred();
 }
 
 abstract class TypedefElement extends Element
@@ -763,26 +766,18 @@
 }
 
 abstract class VariableElement extends Element {
-  VariableListElement get variables;
-
-  // TODO(kasperl): Try to get rid of this.
-  Expression get cachedNode;
+  Expression get initializer;
 }
 
 abstract class FieldElement extends VariableElement
     implements ClosureContainer {}
 
-abstract class FieldParameterElement extends VariableElement {
-  VariableElement get fieldElement;
+abstract class ParameterElement extends VariableElement {
+  FunctionSignature get functionSignature;
 }
 
-// TODO(johnniwinther): Remove this interface.
-abstract class VariableListElement extends Element {
-  DartType get type;
-  FunctionSignature get functionSignature;
-
-  // TODO(kasperl): Try to get rid of this.
-  void set type(DartType value);
+abstract class FieldParameterElement extends ParameterElement {
+  VariableElement get fieldElement;
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 9a226bc..707aaa8 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -60,6 +60,10 @@
   void addMetadata(MetadataAnnotation annotation) {
     assert(annotation.annotatedElement == null);
     annotation.annotatedElement = this;
+    addMetadataInternal(annotation);
+  }
+
+  void addMetadataInternal(MetadataAnnotation annotation) {
     metadata = metadata.prepend(annotation);
   }
 
@@ -639,7 +643,7 @@
 
   int compareTo(CompilationUnitElement other) {
     if (this == other) return 0;
-    return '${script.uri}'.compareTo('${other.script.uri}');
+    return '${script.readableUri}'.compareTo('${other.script.readableUri}');
   }
 
   accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
@@ -789,7 +793,8 @@
       new Map<LibraryDependency, LibraryElement>();
 
   LibraryElementX(Script script, [Uri canonicalUri, LibraryElement this.origin])
-    : this.canonicalUri = ((canonicalUri == null) ? script.uri : canonicalUri),
+    : this.canonicalUri =
+          ((canonicalUri == null) ? script.readableUri : canonicalUri),
       super(script.name, ElementKind.LIBRARY, null) {
     entryCompilationUnit = new CompilationUnitElementX(script, this);
     if (isPatch) {
@@ -1016,6 +1021,8 @@
 
   final ImportScope importScope = new ImportScope();
 
+  bool isDeferred = false;
+
   PrefixElementX(String prefix, Element enclosing, this.firstPosition)
       : super(prefix, ElementKind.PREFIX, enclosing);
 
@@ -1030,6 +1037,10 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
+
+  void markAsDeferred() {
+    isDeferred = true;
+  }
 }
 
 class TypedefElementX extends ElementX implements TypedefElement {
@@ -1117,64 +1128,119 @@
   accept(ElementVisitor visitor) => visitor.visitTypedefElement(this);
 }
 
-abstract class MetadataContainer extends Element {
-  Link<MetadataAnnotation> metadata;
+// This class holds common information for a list of variable or field
+// declarations. It contains the node, and the type. A [VariableElementX]
+// forwards its [computeType] and [parseNode] methods to this class.
+class VariableList {
+  VariableDefinitions definitions;
+  DartType type;
+  final Modifiers modifiers;
+  Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>();
+
+  VariableList(Modifiers this.modifiers);
+
+  VariableList.node(VariableDefinitions node, this.type)
+      : this.definitions = node,
+        this.modifiers = node.modifiers {
+    assert(modifiers != null);
+  }
+
+  VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
+    return definitions;
+  }
+
+  DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX implements VariableElement,
-    MetadataContainer {
-  final VariableListElement variables;
-  Expression cachedNode; // The send or the identifier in the variables list.
+class VariableElementX extends ElementX implements VariableElement {
+  final Token token;
+  final VariableList variables;
+  VariableDefinitions definitionsCache;
+  Expression initializerCache;
 
   Modifiers get modifiers => variables.modifiers;
 
   VariableElementX(String name,
-                   VariableListElement variables,
                    ElementKind kind,
-                   this.cachedNode)
+                   Element enclosingElement,
+                   VariableList variables,
+                   this.token)
     : this.variables = variables,
-      super(name, kind, variables.enclosingElement);
+      super(name, kind, enclosingElement);
 
   VariableElementX.synthetic(String name,
-      ElementKind kind,
-      Element enclosing) :
+                             ElementKind kind,
+                             Element enclosing)
+      : token = null,
         variables = null,
         super(name, kind, enclosing);
 
-  void addMetadata(MetadataAnnotation metadata) {
-    variables.addMetadata(metadata);
-  }
-
+  // TODO(johnniwinther): Ensure that the [TreeElements] for this variable hold
+  // the mappings for all its metadata.
   Link<MetadataAnnotation> get metadata => variables.metadata;
 
+  void addMetadataInternal(MetadataAnnotation annotation) {
+    variables.metadata = variables.metadata.prepend(annotation);
+  }
+
+  Expression get initializer {
+    assert(invariant(this, definitionsCache != null,
+        message: "Initializer has not been computed for $this."));
+    return initializerCache;
+  }
+
   Node parseNode(DiagnosticListener listener) {
-    if (cachedNode != null) return cachedNode;
-    VariableDefinitions definitions = variables.parseNode(listener);
+    if (definitionsCache != null) return definitionsCache;
+
+    VariableDefinitions definitions = variables.parseNode(this, listener);
+    Expression node;
+    int count = 0;
     for (Link<Node> link = definitions.definitions.nodes;
          !link.isEmpty; link = link.tail) {
       Expression initializedIdentifier = link.head;
       Identifier identifier = initializedIdentifier.asIdentifier();
       if (identifier == null) {
-        identifier = initializedIdentifier.asSendSet().selector.asIdentifier();
+        SendSet sendSet = initializedIdentifier.asSendSet();
+        identifier = sendSet.selector.asIdentifier();
+        if (identical(name, identifier.source)) {
+          node = initializedIdentifier;
+          initializerCache = sendSet.arguments.first;
+        }
+      } else if (identical(name, identifier.source)) {
+        node = initializedIdentifier;
       }
-      if (identical(name, identifier.source)) {
-        cachedNode = initializedIdentifier;
-        return cachedNode;
-      }
+      count++;
     }
-    listener.cancel('internal error: could not find $name', node: variables);
-    return null;
+    if (node == null) {
+      listener.cancel('internal error: could not find $name',
+                      node: definitions);
+    }
+    if (count == 1) {
+      definitionsCache = definitions;
+    } else {
+      // Create a [VariableDefinitions] node for the single definition of
+      // [node].
+      definitionsCache = new VariableDefinitions(definitions.type,
+          definitions.modifiers, new NodeList(
+              definitions.definitions.beginToken,
+              const Link<Node>().prepend(node),
+              definitions.definitions.endToken));
+    }
+    return definitionsCache;
   }
 
   DartType computeType(Compiler compiler) {
-    return variables.computeType(compiler);
+    // Call [parseNode] to ensure that [definitionsCache] and [initializerCache]
+    // are set as a consequence of calling [computeType].
+    parseNode(compiler);
+    return variables.computeType(this, compiler);
   }
 
-  bool isInstanceMember() => variables.isInstanceMember();
+  bool isInstanceMember() => isMember() && !modifiers.isStatic();
 
   // Note: cachedNode.getBeginToken() will not be correct in all
   // cases, for example, for function typed parameters.
-  Token position() => findMyName(variables.position());
+  Token position() => token;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
 }
@@ -1182,10 +1248,11 @@
 class FieldElementX extends VariableElementX implements FieldElement {
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
 
-  FieldElementX(String name,
-                VariableListElement variables,
-                Expression cachedNode)
-    : super(name, variables, ElementKind.FIELD, cachedNode);
+  FieldElementX(Identifier name,
+                Element enclosingElement,
+                VariableList variables)
+    : super(name.source, ElementKind.FIELD, enclosingElement,
+            variables, name.token);
 
   accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
 }
@@ -1198,13 +1265,13 @@
     implements FieldParameterElement {
   VariableElement fieldElement;
 
-  FieldParameterElementX(String name,
-                         Element enclosingElement,
+  FieldParameterElementX(Element enclosingElement,
                          VariableDefinitions variables,
-                         Expression node,
+                         Identifier identifier,
+                         Expression initializer,
                          this.fieldElement)
-      : super(name, enclosingElement, ElementKind.FIELD_PARAMETER,
-          variables, node);
+      : super(ElementKind.FIELD_PARAMETER, enclosingElement,
+              variables, identifier, initializer);
 
   DartType computeType(Compiler compiler) {
     if (definitions.type == null) {
@@ -1216,69 +1283,16 @@
   accept(ElementVisitor visitor) => visitor.visitFieldParameterElement(this);
 }
 
-// This element represents a list of variable or field declaration.
-// It contains the node, and the type. A [VariableElement] always
-// references its [VariableListElement]. It forwards its
-// [computeType] and [parseNode] methods to this element.
-class VariableListElementX extends ElementX implements VariableListElement,
-    MetadataContainer {
-  VariableDefinitions cachedNode;
-  DartType type;
-  final Modifiers modifiers;
-
-  FunctionSignature get functionSignature => null;
-
-  VariableListElementX(ElementKind kind,
-                       Modifiers this.modifiers,
-                       Element enclosing)
-    : super(null, kind, enclosing);
-
-  VariableListElementX.node(VariableDefinitions node,
-                            ElementKind kind,
-                            Element enclosing)
-      : super(null, kind, enclosing),
-        this.cachedNode = node,
-        this.modifiers = node.modifiers {
-    assert(modifiers != null);
-  }
-
-  VariableDefinitions parseNode(DiagnosticListener listener) {
-    return cachedNode;
-  }
-
-  DartType computeType(Compiler compiler) {
-    if (type != null) return type;
-    compiler.withCurrentElement(this, () {
-      VariableDefinitions node = parseNode(compiler);
-      if (node.type != null) {
-        type = compiler.resolveTypeAnnotation(this, node.type);
-      } else {
-        type = compiler.types.dynamicType;
-      }
-    });
-    assert(type != null);
-    return type;
-  }
-
-  Token position() => cachedNode.getBeginToken();
-
-  bool isInstanceMember() {
-    return isMember() && !modifiers.isStatic();
-  }
-
-  accept(ElementVisitor visitor) => visitor.visitVariableListElement(this);
-}
-
 /// [Element] for a formal parameter.
 ///
 /// A [ParameterElementX] can be patched. A parameter of an external method is
 /// patched with the corresponding parameter of the patch method. This is done
 /// to ensure that default values on parameters are computed once (on the
 /// origin parameter) but can be found through both the origin and the patch.
-class ParameterElementX extends ElementX
-    implements VariableElement, VariableListElement, MetadataContainer {
-  VariableDefinitions definitions;
-  Expression cachedNode;
+class ParameterElementX extends ElementX implements ParameterElement {
+  final VariableDefinitions definitions;
+  final Identifier identifier;
+  final Expression initializer;
   DartType type;
 
   /**
@@ -1288,22 +1302,19 @@
    */
   FunctionSignature functionSignature;
 
-  ParameterElementX(String name,
+  ParameterElementX(ElementKind elementKind,
                     Element enclosingElement,
-                    ElementKind elementKind,
-                    VariableDefinitions definitions,
-                    Expression node)
-      : this.definitions = definitions,
-        this.cachedNode = node,
-        super(name, elementKind, enclosingElement);
-
-  VariableListElement get variables => this;
+                    this.definitions,
+                    Identifier identifier,
+                    this.initializer)
+      : this.identifier = identifier,
+        super(identifier.source, elementKind, enclosingElement);
 
   Modifiers get modifiers => definitions.modifiers;
 
-  Token position() => cachedNode.getBeginToken();
+  Token position() => identifier.getBeginToken();
 
-  Node parseNode(DiagnosticListener listener) => cachedNode;
+  Node parseNode(DiagnosticListener listener) => definitions;
 
   DartType computeType(Compiler compiler) {
     assert(invariant(this, type != null,
diff --git a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
index 38d88b3..b234f16 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
@@ -29,7 +29,6 @@
   R visitVariableElement(VariableElement e) => visitElement(e);
   R visitFieldElement(FieldElement e) => visitVariableElement(e);
   R visitFieldParameterElement(FieldParameterElement e) => visitElement(e);
-  R visitVariableListElement(VariableListElement e) => visitElement(e);
   R visitAbstractFieldElement(AbstractFieldElement e) => visitElement(e);
   R visitFunctionElement(FunctionElement e) => visitElement(e);
   R visitConstructorBodyElement(ConstructorBodyElement e) => visitElement(e);
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 4300207..85c558e 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -641,10 +641,12 @@
 
     queue.add(new ResolutionWorkItem(element, itemCompilationContextCreator()));
 
-    // Enable isolate support if we start using something from the
-    // isolate library, or timers for the async library.
+    // Enable isolate support if we start using something from the isolate
+    // library, or timers for the async library.  We exclude constant fields,
+    // which are ending here because their initializing expression is compiled.
     LibraryElement library = element.getLibrary();
-    if (!compiler.hasIsolateSupport()) {
+    if (!compiler.hasIsolateSupport() &&
+        (!element.isField() || !element.modifiers.isConst())) {
       String uri = library.canonicalUri.toString();
       if (uri == 'dart:isolate') {
         enableIsolateSupport(library);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 76aaa00..3533dcc 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -1589,11 +1589,11 @@
       return null;
     }
 
-    handleLeftoverOptionalParameter(Element parameter) {
-      Send send = parameter.parseNode(compiler).asSendSet();
-      result[parameter] = (send == null)
+    handleLeftoverOptionalParameter(ParameterElement parameter) {
+      Expression initializer = parameter.initializer;
+      result[parameter] = (initializer == null)
           ? nullConcreteType
-          : analyzeDefaultValue(function, send.arguments.head);
+          : analyzeDefaultValue(function, initializer);
     }
 
     final Iterator<ConcreteType> remainingPositionalArguments =
@@ -1770,11 +1770,11 @@
    * Analyze the initializer of a field and update [inferredFieldTypes]
    * accordingly. Invalidate the readers of the field if needed.
    */
-  ConcreteType analyzeFieldInitialization(Element field) {
+  ConcreteType analyzeFieldInitialization(VariableElement field) {
     Visitor visitor = new TypeInferrerVisitor(field, this, null, new Map());
-    Node tree = field.parseNode(compiler);
-    ConcreteType type = initializerDo(tree, (node) => node.accept(visitor));
-    if (type != null) {
+    ConcreteType type;
+    if (field.initializer != null) {
+      type = field.initializer.accept(visitor);
       inferredFieldTypes[field] = type;
       invalidateReaders(field);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 89e9015..03d318f 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -442,10 +442,15 @@
 
   T run() {
     var node = analyzedElement.parseNode(compiler);
-    if (analyzedElement.isField() && node.asSendSet() == null) {
-      // Eagerly bailout, because computing the closure data only
-      // works for functions and field assignments.
-      return types.nullType;
+    ast.Expression initializer;
+    if (analyzedElement.isField()) {
+      VariableElement fieldElement = analyzedElement;
+      initializer = fieldElement.initializer;
+      if (initializer == null) {
+        // Eagerly bailout, because computing the closure data only
+        // works for functions and field assignments.
+        return types.nullType;
+      }
     }
     // Update the locals that are boxed in [locals]. These locals will
     // be handled specially, in that we are computing their LUB at
@@ -461,15 +466,14 @@
       locals.setCapturedAndBoxed(variable, field);
     });
     if (analyzedElement.isField()) {
-      return visit(node.asSendSet().arguments.head);
+      return visit(initializer);
     }
 
     FunctionElement function = analyzedElement;
     FunctionSignature signature = function.computeSignature(compiler);
     signature.forEachOptionalParameter((element) {
-      ast.Node node = element.parseNode(compiler);
-      ast.Send send = node.asSendSet();
-      T type = (send == null) ? types.nullType : visit(send.arguments.head);
+      ast.Expression defaultValue = element.initializer;
+      T type = (defaultValue == null) ? types.nullType : visit(defaultValue);
       inferrer.setDefaultTypeOfParameter(element, type);
     });
 
@@ -530,7 +534,7 @@
         cls.forEachInstanceField((_, field) {
           if (field.modifiers.isFinal()) return;
           T type = locals.fieldScope.readField(field);
-          if (type == null && field.parseNode(compiler).asSendSet() == null) {
+          if (type == null && field.initializer == null) {
             inferrer.recordTypeOfNonFinalField(node, field, types.nullType);
           }
         });
@@ -681,7 +685,7 @@
             && isInClassOrSubclass(element)
             && !element.modifiers.isFinal()
             && locals.fieldScope.readField(element) == null
-            && element.parseNode(compiler).asSendSet() == null) {
+            && element.initializer == null) {
           // If the field is being used before this constructor
           // actually had a chance to initialize it, say it can be
           // null.
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index c87036e..bac4d44 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -634,11 +634,12 @@
     addedInGraph++;
 
     if (element.isField()) {
-      ast.Node node = element.parseNode(compiler);
+      VariableElement fieldElement = element;
+      ast.Node node = fieldElement.parseNode(compiler);
       if (element.modifiers.isFinal() || element.modifiers.isConst()) {
         // If [element] is final and has an initializer, we record
         // the inferred type.
-        if (node.asSendSet() != null) {
+        if (fieldElement.initializer != null) {
           if (type is! ListTypeInformation) {
             // For non-container types, the constant handler does
             // constant folding that could give more precise results.
@@ -657,7 +658,7 @@
         } else if (!element.isInstanceMember()) {
           recordType(element, types.nullType);
         }
-      } else if (node.asSendSet() == null) {
+      } else if (fieldElement.initializer == null) {
         // Only update types of static fields if there is no
         // assignment. Instance fields are dealt with in the constructor.
         if (Elements.isStaticOrTopLevelField(element)) {
@@ -667,9 +668,9 @@
         recordTypeOfNonFinalField(node, element, type);
       }
       if (Elements.isStaticOrTopLevelField(element) &&
-          node.asSendSet() != null &&
+          fieldElement.initializer != null &&
           !element.modifiers.isConst()) {
-        var argument = node.asSendSet().arguments.head;
+        var argument = fieldElement.initializer;
         // TODO(13429): We could do better here by using the
         // constant handler to figure out if it's a lazy field or not.
         if (argument.asSend() != null ||
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index d130377..b2ed5a6 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -182,3 +182,66 @@
   T visitParameter(Parameter triv) => visitTrivial(triv);
   T visitContinuation(Continuation triv) => visitTrivial(triv);
 }
+
+// Generate a Lisp-like S-expression representation of an IR node as a string.
+// The representation is not pretty-printed, but it can easily be quoted and
+// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
+// pretty-printed.
+class SExpressionStringifier extends Visitor<String> {
+  final Map<Trivial, String> names = <Trivial, String>{};
+  
+  int _valueCounter = 0;
+  int _continuationCounter = 0;
+  
+  String newValueName() => 'v${_valueCounter++}';
+  String newContinuationName() => 'k${_continuationCounter++}';
+  
+  String visitFunction(Function node) {
+    names[node.returnContinuation] = 'return';
+    return '(Function ${node.body.accept(this)})';
+  }
+  
+  String visitLetVal(LetVal expr) {
+    String name = newValueName();
+    names[expr.value] = name;
+    String value = expr.value.accept(this);
+    String body = expr.body.accept(this);
+    return '(LetVal $name $value) $body';
+  }
+  
+  String visitLetCont(LetCont expr) {
+    String cont = newContinuationName();
+    String param = newValueName();
+    names[expr.continuation] = cont;
+    names[expr.continuation.parameter] = param;
+    String contBody = expr.continuation.body.accept(this);
+    String body = expr.body == null ? 'null' : expr.body.accept(this);
+    return '(LetCont ($cont $param) $contBody) $body';
+  }
+  
+  String visitInvokeStatic(InvokeStatic expr) {
+    String name = expr.target.name;
+    String cont = names[expr.continuation.definition];
+    List<String> args =
+        expr.arguments.map((v) => names[v.definition]).toList(growable: false);
+    return '(InvokeStatic $name $cont ${args.join(' ')})';
+  }
+  
+  String visitInvokeContinuation(InvokeContinuation expr) {
+    String cont = names[expr.continuation.definition];
+    String arg = names[expr.argument.definition];
+    return '(InvokeContinuation $cont $arg)';
+  }
+  
+  String visitConstant(Constant triv) {
+    return '(Constant ${triv.value})';
+  }
+  
+  String visitParameter(Parameter triv) {
+    return '(Unexpected Parameter)';
+  }
+  
+  String visitContinuation(Continuation triv) {
+    return '(Unexpected Continuation)';
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 3ca270d..2ac626b 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -28,6 +28,14 @@
   ByteData doubleData = new ByteData(8);
 
   ConstantSystem get constantSystem => compiler.backend.constantSystem;
+  
+  // A partially constructed expression is one that has a single 'hole' where
+  // there is an expression missing.  Just like the IR builder, the unpickler
+  // represents such an expression by its root and by the 'current' expression
+  // that immediately contains the hole.  If there is no hole (e.g., an
+  // expression in tail position has been seen), then current is null.
+  ir.Expression root;
+  ir.Expression current;
 
   ir.Function unpickle(List<int> data) {
     this.data = data;
@@ -35,6 +43,7 @@
     int numEntries = readInt();
     unpickled = new List<Object>(numEntries);
     index = 0;
+    root = current = null;
     return readFunctionNode();
   }
 
@@ -99,48 +108,58 @@
     return result;
   }
 
-  static ir.Expression addExpression(ir.Expression context,
-                                     ir.Expression expr) {
-    return (context == null) ? expr : context.plug(expr);
+  void addExpression(ir.Expression expr) {
+    if (root == null) {
+      root = current = expr;
+    } else {
+      current = current.plug(expr);
+    }
   }
 
-  // Read a single expression and plug it into an outer context.  If the read
-  // expression is not in tail position, return it.  Otherwise, return null.
-  ir.Expression readExpressionNode(ir.Expression context) {
+  // Read a single expression and plug it into the outer context.
+  ir.Expression readExpressionNode() {
     int tag = readByte();
     switch (tag) {
       case Pickles.NODE_CONSTANT:
         ir.Trivial constant = readConstantNode();
         unpickled[index++] = constant;
-        return addExpression(context, new ir.LetVal(constant));
+        addExpression(new ir.LetVal(constant));
+        break;
       case Pickles.NODE_LET_CONT:
         ir.Parameter parameter = new ir.Parameter();
         ir.Continuation continuation = new ir.Continuation(parameter);
         unpickled[index++] = continuation;
         ir.Expression body = readDelimitedExpressionNode();
         unpickled[index++] = parameter;
-        return addExpression(context, new ir.LetCont(continuation, body));
+        addExpression(new ir.LetCont(continuation, body));
+        break;
       case Pickles.NODE_INVOKE_STATIC:
-        addExpression(context, readInvokeStaticNode());
-        return null;
+        addExpression(readInvokeStaticNode());
+        current = null;
+        break;
       case Pickles.NODE_INVOKE_CONTINUATION:
-        addExpression(context, readInvokeContinuationNode());
-        return null;
+        addExpression(readInvokeContinuationNode());
+        current = null;
+        break;
       default:
         compiler.internalError("Unexpected expression entry tag: $tag");
-        return null;
+        break;
     }
   }
 
   // Iteratively read expressions until an expression in a tail position
-  // (e.g., an invocation) is found.
+  // (e.g., an invocation) is found.  Do not change the outer context.
   ir.Expression readDelimitedExpressionNode() {
-    ir.Expression root = readExpressionNode(null);
-    ir.Expression context = root;
-    while (context != null) {
-      context = readExpressionNode(context);
-    }
-    return root;
+    ir.Expression previous_root = root;
+    ir.Expression previous_current = current;
+    root = current = null;
+    do {
+      readExpressionNode();
+    } while (current != null);
+    ir.Expression result = root;
+    root = previous_root;
+    current = previous_current;
+    return result;
   }
 
   Object readBackReference() {
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index ab05952..5ae235e 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -45,6 +45,36 @@
     return call(source, expression);
   }
 
+  /// Creates a litteral js string from [value].
+  LiteralString escapedString(String value) {
+    // Do not escape unicode characters and ' because they are allowed in the
+    // string literal anyway.
+    String escaped =
+        value.replaceAllMapped(new RegExp('\n|"|\\|\0|\b|\t|\v'), (match) {
+      switch (match.group(0)) {
+        case "\n" : return r"\n";
+        case "\\" : return r"\\";
+        case "\"" : return r'\"';
+        case "\0" : return r"\0";
+        case "\b" : return r"\b";
+        case "\t" : return r"\t";
+        case "\f" : return r"\f";
+        case "\v" : return r"\v";
+      }
+    });
+    LiteralString result = string(escaped);
+    // We don't escape ' under the assumption that the string is wrapped
+    // into ". Verify that assumption.
+    assert(result.value.codeUnitAt(0) == '"'.codeUnitAt(0));
+    return result;
+  }
+
+  /// Creates a litteral js string from [value].
+  ///
+  /// Note that this function only puts quotes around [value]. It does not do
+  /// any escaping, so use only when you can guarantee that [value] does not
+  /// contain newlines or backslashes. For escaping the string use
+  /// [escapedString].
   LiteralString string(String value) => new LiteralString('"$value"');
 
   LiteralNumber number(num value) => new LiteralNumber('$value');
diff --git a/sdk/lib/_internal/compiler/implementation/js/js.dart b/sdk/lib/_internal/compiler/implementation/js/js.dart
index f8a2f61..8bfdd51 100644
--- a/sdk/lib/_internal/compiler/implementation/js/js.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/js.dart
@@ -6,6 +6,7 @@
 
 import 'precedence.dart';
 import '../util/characters.dart' as charCodes;
+import '../util/util.dart';
 
 // TODO(floitsch): remove this dependency (currently necessary for the
 // CodeBuffer).
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
index 254f270..5b3efd8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
@@ -73,7 +73,7 @@
                                    HTypeConversion node,
                                    List<jsAst.Expression> arguments) {
     ErroneousElement element = node.typeExpression.element;
-    arguments.add(js.string(element.message));
+    arguments.add(js.escapedString(element.message));
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index d7eea27..d0218e4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -1529,8 +1529,19 @@
       } else {
         mainBuffer.add('\n');
       }
-      compiler.assembledCode = mainBuffer.getText();
-      outputSourceMap(compiler.assembledCode, '');
+      String assembledCode = mainBuffer.getText();
+      String sourceMapTags = "";
+      if (generateSourceMap) {
+        outputSourceMap(assembledCode, mainBuffer, '',
+            compiler.sourceMapUri, compiler.outputUri);
+        sourceMapTags =
+            generateSourceMapTag(compiler.sourceMapUri, compiler.outputUri);
+      }
+      compiler.outputProvider('', 'js')
+          ..add(assembledCode)
+          ..add(sourceMapTags)
+          ..close();
+      compiler.assembledCode = assembledCode;
 
       mainBuffer.write(
           jsAst.prettyPrint(
@@ -1547,6 +1558,25 @@
     return compiler.assembledCode;
   }
 
+  String generateSourceMapTag(Uri sourceMapUri, Uri fileUri) {
+    if (sourceMapUri != null && fileUri != null) {
+      // Using # is the new proposed standard. @ caused problems in Internet
+      // Explorer due to "Conditional Compilation Statements" in JScript,
+      // see:
+      // http://msdn.microsoft.com/en-us/library/7kx09ct1(v=vs.80).aspx
+      // About source maps, see:
+      // https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+      // TODO(http://dartbug.com/11914): Remove @ line.
+      String sourceMapFileName = relativize(fileUri, sourceMapUri, false);
+      return '''
+
+//# sourceMappingURL=$sourceMapFileName
+//@ sourceMappingURL=$sourceMapFileName
+''';
+    }
+    return '';
+  }
+
   ClassBuilder getElementDescriptorForOutputUnit(Element element,
                                                  OutputUnit outputUnit) {
     Map<OutputUnit, ClassBuilder> descriptors =
@@ -1623,7 +1653,8 @@
       compiler.outputProvider(outputUnit.name, 'js')
         ..add(code)
         ..close();
-      outputSourceMap(compiler.assembledCode, outputUnit.name);
+
+      // TODO(johnniwinther): Support source maps for deferred code.
     }
   }
 
@@ -1633,20 +1664,16 @@
     return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
   }
 
-  String buildSourceMap(CodeBuffer buffer, SourceFile compiledFile) {
-    SourceMapBuilder sourceMapBuilder =
-        new SourceMapBuilder(compiler.sourceMapUri);
-    buffer.forEachSourceLocation(sourceMapBuilder.addMapping);
-    return sourceMapBuilder.build(compiledFile);
-  }
-
-  void outputSourceMap(String code, String name) {
+  void outputSourceMap(String code, CodeBuffer buffer, String name,
+                       [Uri sourceMapUri, Uri fileUri]) {
     if (!generateSourceMap) return;
     // Create a source file for the compilation output. This allows using
     // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
-    SourceFile compiledFile =
-        new StringSourceFile(null, compiler.assembledCode);
-    String sourceMap = buildSourceMap(mainBuffer, compiledFile);
+    SourceFile compiledFile = new StringSourceFile(null, code);
+    SourceMapBuilder sourceMapBuilder =
+            new SourceMapBuilder(sourceMapUri, fileUri);
+    buffer.forEachSourceLocation(sourceMapBuilder.addMapping);
+    String sourceMap = sourceMapBuilder.build(compiledFile);
     compiler.outputProvider(name, 'js.map')
         ..add(sourceMap)
         ..close();
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 53e79da..7daad88 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -223,6 +223,8 @@
   String get name => 'LibraryLoader';
   List onLibraryLoadedCallbacks = [];
 
+  final Map<Uri, LibraryElement> libraryResourceUriMap =
+      new Map<Uri, LibraryElement>();
   final Map<String, LibraryElement> libraryNames =
       new Map<String, LibraryElement>();
 
@@ -277,7 +279,7 @@
 
     bool importsDartCore = false;
     var libraryDependencies = new LinkBuilder<LibraryDependency>();
-    Uri base = library.entryCompilationUnit.script.uri;
+    Uri base = library.entryCompilationUnit.script.readableUri;
 
     // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
     return Future.forEach(library.tags.reverse().toList(), (LibraryTag tag) {
@@ -299,7 +301,6 @@
           } else {
             library.libraryTag = tag;
           }
-          checkDuplicatedLibraryName(library);
         } else if (tag.isPart) {
           Part part = tag;
           StringNode uri = part.uri;
@@ -312,6 +313,7 @@
       });
     }).then((_) {
       return compiler.withCurrentElement(library, () {
+        checkDuplicatedLibraryName(library);
         // Apply patch, if any.
         if (library.isPlatformLibrary) {
           return patchDartLibrary(handler, library, library.canonicalUri.path);
@@ -337,11 +339,30 @@
   }
 
   void checkDuplicatedLibraryName(LibraryElement library) {
+    Uri resourceUri = library.entryCompilationUnit.script.resourceUri;
     LibraryName tag = library.libraryTag;
-    if (tag != null) {
+    LibraryElement existing =
+        libraryResourceUriMap.putIfAbsent(resourceUri, () => library);
+    if (!identical(existing, library)) {
+      if (tag != null) {
+        compiler.withCurrentElement(library, () {
+          compiler.reportWarning(tag.name,
+              MessageKind.DUPLICATED_LIBRARY_RESOURCE,
+              {'libraryName': tag.name,
+               'resourceUri': resourceUri,
+               'canonicalUri1': library.canonicalUri,
+               'canonicalUri2': existing.canonicalUri});
+        });
+      } else {
+        compiler.reportHint(library,
+            MessageKind.DUPLICATED_RESOURCE,
+            {'resourceUri': resourceUri,
+             'canonicalUri1': library.canonicalUri,
+             'canonicalUri2': existing.canonicalUri});
+      }
+    } else if (tag != null) {
       String name = library.getLibraryOrScriptName();
-      LibraryElement existing =
-          libraryNames.putIfAbsent(name, () => library);
+      existing = libraryNames.putIfAbsent(name, () => library);
       if (!identical(existing, library)) {
         compiler.withCurrentElement(library, () {
           compiler.reportWarning(tag.name,
@@ -395,6 +416,7 @@
     return compiler.readScript(readableUri, library, part).
         then((Script sourceScript) {
           if (sourceScript == null) return;
+
           CompilationUnitElement unit =
               new CompilationUnitElementX(sourceScript, library);
           compiler.withCurrentElement(unit, () {
@@ -414,7 +436,7 @@
   Future registerLibraryFromTag(LibraryDependencyHandler handler,
                                 LibraryElement library,
                                 LibraryDependency tag) {
-    Uri base = library.entryCompilationUnit.script.uri;
+    Uri base = library.entryCompilationUnit.script.readableUri;
     Uri resolvedUri = base.resolve(tag.uri.dartString.slowToString());
     return createLibrary(handler, library, resolvedUri, tag.uri, resolvedUri)
         .then((LibraryElement loadedLibrary) {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
index ee87e74..132308b 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
@@ -9,7 +9,7 @@
     extends Dart2JsElementMirror
     with ObjectMirrorMixin, ContainerMixin
     implements LibrarySourceMirror {
-  List<LibraryDependencyMirror> _libraryDependencies;
+  List<LibraryDependencySourceMirror> _libraryDependencies;
 
   Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library)
       : super(system, library);
@@ -83,7 +83,7 @@
 
   void _ensureLibraryDependenciesAnalyzed() {
     if (_libraryDependencies == null) {
-      _libraryDependencies = <LibraryDependencyMirror>[];
+      _libraryDependencies = <LibraryDependencySourceMirror>[];
       for (LibraryTag node in _element.tags.reverse()) {
         LibraryDependency libraryDependency = node.asLibraryDependency();
         if (libraryDependency != null) {
@@ -105,7 +105,7 @@
   }
 }
 
-class Dart2JsLibraryDependencyMirror implements LibraryDependencyMirror {
+class Dart2JsLibraryDependencyMirror implements LibraryDependencySourceMirror {
   final LibraryDependency _node;
   final Dart2JsLibraryMirror _sourceLibrary;
   final Dart2JsLibraryMirror _targetLibrary;
@@ -142,7 +142,7 @@
 
   LibraryMirror get targetLibrary => _targetLibrary;
 
-  String get prefix {
+  /*String*/ get prefix {
     Import import = _node.asImport();
     if (import != null && import.prefix != null) {
       return import.prefix.source;
@@ -155,8 +155,8 @@
   bool get isExport => _node.asExport() != null;
 }
 
-class Dart2JsCombinatorMirror implements CombinatorMirror {
-  final List<String> identifiers;
+class Dart2JsCombinatorMirror implements CombinatorSourceMirror {
+  final List/*<String>*/ identifiers;
   final bool isShow;
 
   Dart2JsCombinatorMirror(this.identifiers, {bool isShow: true})
@@ -228,7 +228,7 @@
 
   String get text => _script.text.substring(_span.begin, _span.end);
 
-  Uri get sourceUri => _script.uri;
+  Uri get sourceUri => _script.resourceUri;
 
   String get sourceText => _script.text;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index ec0b945..64ba2d3 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -186,8 +186,6 @@
         this._variable = variable,
         super(owner.mirrorSystem, variable);
 
-  Element get _beginElement => _variable.variables;
-
   bool get isTopLevel => owner is LibraryMirror;
 
   bool get isStatic => _variable.modifiers.isStatic();
@@ -198,6 +196,8 @@
 
   TypeMirror get type =>
       owner._getTypeMirror(_variable.computeType(mirrorSystem.compiler));
+
+
 }
 
 class Dart2JsParameterMirror extends Dart2JsMemberMirror
@@ -207,7 +207,7 @@
   final bool isNamed;
 
   factory Dart2JsParameterMirror(Dart2JsDeclarationMirror owner,
-                                 VariableElement element,
+                                 ParameterElement element,
                                  {bool isOptional: false,
                                   bool isNamed: false}) {
     if (element is FieldParameterElement) {
@@ -219,19 +219,17 @@
   }
 
   Dart2JsParameterMirror._normal(Dart2JsDeclarationMirror owner,
-                                 VariableElement element,
+                                 ParameterElement element,
                                  this.isOptional,
                                  this.isNamed)
     : this.owner = owner,
       super(owner.mirrorSystem, element);
 
-  Element get _beginElement => _variableElement.variables;
-
-  VariableElement get _variableElement => _element;
+  ParameterElement get _element => super._element;
 
   TypeMirror get type => owner._getTypeMirror(
-      _variableElement.computeType(mirrorSystem.compiler),
-      _variableElement.variables.functionSignature);
+      _element.computeType(mirrorSystem.compiler),
+      _element.functionSignature);
 
 
   bool get isFinal => false;
@@ -241,17 +239,17 @@
   InstanceMirror get defaultValue {
     if (hasDefaultValue) {
       Constant constant = mirrorSystem.compiler.constantHandler
-          .getConstantForVariable(_variableElement);
-      assert(invariant(_variableElement, constant != null,
+          .getConstantForVariable(_element);
+      assert(invariant(_element, constant != null,
           message: "Missing constant for parameter "
-                   "$_variableElement with default value."));
+                   "$_element with default value."));
       return _convertConstantToInstanceMirror(mirrorSystem, constant);
     }
     return null;
   }
 
   bool get hasDefaultValue {
-    return _variableElement.cachedNode.asSendSet() != null;
+    return _element.initializer != null;
   }
 
   bool get isInitializingFormal => false;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 549d4d1..5359a09 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -148,15 +148,6 @@
     assert (_element != null);
   }
 
-  /**
-   * Returns the element to be used to determine the begin token of this
-   * declaration and the metadata associated with this declaration.
-   *
-   * This indirection is needed to use the [VariableListElement] as the location
-   * for type and metadata information on a [VariableElement].
-   */
-  Element get _beginElement => _element;
-
   String get _simpleNameString => _element.name;
 
   bool get isNameSynthetic => false;
@@ -167,9 +158,9 @@
    */
   Token getBeginToken() {
     // TODO(johnniwinther): Avoid calling [parseNode].
-    Node node = _beginElement.parseNode(mirrorSystem.compiler);
+    Node node = _element.parseNode(mirrorSystem.compiler);
     if (node == null) {
-      return _beginElement.position();
+      return _element.position();
     }
     return node.getBeginToken();
   }
@@ -192,8 +183,8 @@
    * metadata annotations.
    */
   Token getFirstToken() {
-    if (!_beginElement.metadata.isEmpty) {
-      for (MetadataAnnotation metadata in _beginElement.metadata) {
+    if (!_element.metadata.isEmpty) {
+      for (MetadataAnnotation metadata in _element.metadata) {
         if (metadata.beginToken != null) {
           return metadata.beginToken;
         }
@@ -209,11 +200,11 @@
     Script script = getScript();
     SourceSpan span;
     if (beginToken == null) {
-      span = new SourceSpan(script.uri, 0, 0);
+      span = new SourceSpan(script.readableUri, 0, 0);
     } else {
       Token endToken = getEndToken();
       span = mirrorSystem.compiler.spanFromTokens(
-          beginToken, endToken, script.uri);
+          beginToken, endToken, script.readableUri);
     }
     return new Dart2JsSourceLocation(script, span);
   }
@@ -454,7 +445,7 @@
   Iterable<DeclarationMirror> _getDeclarationMirrors(Element element) =>
       _library._getDeclarationMirrors(element);
 
-  Uri get uri => _element.script.uri;
+  Uri get uri => _element.script.resourceUri;
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart
index 1a80852..0afbd8e 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart
@@ -118,7 +118,8 @@
 }
 
 /// A mirror on an import or export declaration.
-abstract class LibraryDependencyMirror extends Mirror {
+abstract class LibraryDependencySourceMirror
+    extends Mirror implements LibraryDependencyMirror {
   /// Is `true` if this dependency is an import.
   bool get isImport;
 
@@ -133,7 +134,7 @@
   LibraryMirror get targetLibrary;
 
   /// Returns the prefix if this is a prefixed import and `null` otherwise.
-  String get prefix;
+  /*String*/ get prefix;
 
   /// Returns the list of show/hide combinators on the import/export
   /// declaration.
@@ -144,9 +145,10 @@
 }
 
 /// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorMirror extends Mirror {
+abstract class CombinatorSourceMirror
+    extends Mirror implements CombinatorMirror {
   /// The list of identifiers on the combinator.
-  List<String> get identifiers;
+  List/*<String>*/ get identifiers;
 
   /// Is `true` if this is a 'show' combinator.
   bool get isShow;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index e5b2b8b..3e5e15f 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -340,27 +340,6 @@
           patchParameter.origin == originParameter));
       assert(invariant(patchParameter, patchParameter.patch == null));
       patchParameter.origin = originParameter;
-      // Hack: Use unparser to test parameter equality. This only works because
-      // we are restricting patch uses and the approach cannot be used
-      // elsewhere.
-      String originParameterText =
-          originParameter.parseNode(compiler).toString();
-      String patchParameterText =
-          patchParameter.parseNode(compiler).toString();
-      if (originParameterText != patchParameterText
-          // We special case the list constructor because of the
-          // optional parameter.
-          && origin != compiler.unnamedListConstructor) {
-        compiler.reportError(
-            originParameter.parseNode(compiler),
-            MessageKind.PATCH_PARAMETER_MISMATCH,
-            {'methodName': origin.name,
-             'originParameter': originParameterText,
-             'patchParameter': patchParameterText});
-        compiler.reportInfo(patchParameter,
-            MessageKind.PATCH_POINT_TO_PARAMETER,
-            {'parameterName': patchParameter.name});
-      }
       DartType originParameterType = originParameter.computeType(compiler);
       DartType patchParameterType = patchParameter.computeType(compiler);
       if (originParameterType != patchParameterType) {
@@ -374,6 +353,31 @@
         compiler.reportInfo(patchParameter,
             MessageKind.PATCH_POINT_TO_PARAMETER,
             {'parameterName': patchParameter.name});
+      } else {
+        // Hack: Use unparser to test parameter equality. This only works
+        // because we are restricting patch uses and the approach cannot be used
+        // elsewhere.
+
+        // The node contains the type, so there is a potential overlap.
+        // Therefore we only check the text if the types are identical.
+        String originParameterText =
+            originParameter.parseNode(compiler).toString();
+        String patchParameterText =
+            patchParameter.parseNode(compiler).toString();
+        if (originParameterText != patchParameterText
+            // We special case the list constructor because of the
+            // optional parameter.
+            && origin != compiler.unnamedListConstructor) {
+          compiler.reportError(
+              originParameter.parseNode(compiler),
+              MessageKind.PATCH_PARAMETER_MISMATCH,
+              {'methodName': origin.name,
+               'originParameter': originParameterText,
+               'patchParameter': patchParameterText});
+          compiler.reportInfo(patchParameter,
+              MessageKind.PATCH_POINT_TO_PARAMETER,
+              {'parameterName': patchParameter.name});
+        }
       }
 
       originParameters = originParameters.tail;
@@ -550,21 +554,28 @@
     return new ResolverVisitor(compiler, element, mapping);
   }
 
-  TreeElements resolveField(VariableElement element) {
-    Node tree = element.parseNode(compiler);
-    if(element.modifiers.isStatic() && element.variables.isTopLevel()) {
+  TreeElements resolveField(VariableElementX element) {
+    VariableDefinitions tree = element.parseNode(compiler);
+    if(element.modifiers.isStatic() && element.isTopLevel()) {
       error(element.modifiers.getStatic(),
             MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
     }
     ResolverVisitor visitor = visitorFor(element);
+    // TODO(johnniwinther): Share the resolved type between all variables
+    // declared in the same declaration.
+    if (tree.type != null) {
+      element.variables.type = visitor.resolveTypeAnnotation(tree.type);
+    } else {
+      element.variables.type = compiler.types.dynamicType;
+    }
     visitor.useElement(tree, element);
 
-    SendSet send = tree.asSendSet();
+    Expression initializer = element.initializer;
     Modifiers modifiers = element.modifiers;
-    if (send != null) {
+    if (initializer != null) {
       // TODO(johnniwinther): Avoid analyzing initializers if
       // [Compiler.analyzeSignaturesOnly] is set.
-      visitor.visit(send.arguments.head);
+      visitor.visit(initializer);
     } else if (modifiers.isConst()) {
       compiler.reportError(element, MessageKind.CONST_WITHOUT_INITIALIZER);
     } else if (modifiers.isFinal() && !element.isInstanceMember()) {
@@ -576,7 +587,7 @@
         compiler.constantHandler.compileVariable(
             element, isConst: element.modifiers.isConst());
       });
-      if (tree.asSendSet() != null) {
+      if (initializer != null) {
         if (!element.modifiers.isConst()) {
           // TODO(johnniwinther): Determine the const-ness eagerly to avoid
           // unnecessary registrations.
@@ -594,10 +605,10 @@
     return visitor.mapping;
   }
 
-  TreeElements resolveParameter(Element element) {
-    Node tree = element.parseNode(compiler);
+  TreeElements resolveParameter(ParameterElement element) {
+    element.parseNode(compiler);
     ResolverVisitor visitor = visitorFor(element.enclosingElement);
-    initializerDo(tree, visitor.visit);
+    visitor.visit(element.initializer);
     return visitor.mapping;
   }
 
@@ -1228,16 +1239,17 @@
     compiler.reportFatalError(node, kind, arguments);
   }
 
-  resolveMetadata(MetadataContainer variables, VariableDefinitions node) {
+  Link<MetadataAnnotation> resolveMetadata(Element element,
+                                           VariableDefinitions node) {
     LinkBuilder<MetadataAnnotation> metadata =
         new LinkBuilder<MetadataAnnotation>();
     for (Metadata annotation in node.metadata.nodes) {
       ParameterMetadataAnnotation metadataAnnotation =
           new ParameterMetadataAnnotation(annotation);
-      metadataAnnotation.annotatedElement = variables;
+      metadataAnnotation.annotatedElement = element;
       metadata.addLast(metadataAnnotation.ensureResolved(compiler));
     }
-    variables.metadata = metadata.toLink();
+    return metadata.toLink();
   }
 }
 
@@ -1291,16 +1303,17 @@
         MessageKind.ALREADY_INITIALIZED, {'fieldName': field.name});
   }
 
-  void checkForDuplicateInitializers(Element field, Node init) {
+  void checkForDuplicateInitializers(VariableElement field, Node init) {
     // [field] can be null if it could not be resolved.
     if (field == null) return;
     String name = field.name;
     if (initialized.containsKey(field)) {
       reportDuplicateInitializerError(field, init, initialized[field]);
     } else if (field.modifiers.isFinal()) {
-      Node fieldNode = field.parseNode(visitor.compiler).asSendSet();
-      if (fieldNode != null) {
-        reportDuplicateInitializerError(field, init, fieldNode);
+      field.parseNode(visitor.compiler);
+      Expression initializer = field.initializer;
+      if (initializer != null) {
+        reportDuplicateInitializerError(field, init, initializer);
       }
     }
     initialized[field] = init;
@@ -1461,11 +1474,11 @@
     // that we can ensure that fields are initialized only once.
     FunctionSignature functionParameters =
         constructor.computeSignature(visitor.compiler);
-    functionParameters.forEachParameter((Element element) {
+    functionParameters.forEachParameter((ParameterElement element) {
       if (identical(element.kind, ElementKind.FIELD_PARAMETER)) {
         FieldParameterElement fieldParameter = element;
         checkForDuplicateInitializers(fieldParameter.fieldElement,
-                                      element.parseNode(visitor.compiler));
+                                      element.initializer);
       }
     });
 
@@ -1666,34 +1679,52 @@
 
   TypeResolver(this.compiler);
 
-  Element resolveTypeName(Scope scope,
-                          Identifier prefixName,
-                          Identifier typeName) {
+  /// Tries to resolve the type name as an element.
+  Element resolveTypeName(Identifier prefixName,
+                          Identifier typeName,
+                          Scope scope,
+                          {bool deferredIsMalformed: true}) {
+    Element element;
+    bool deferredTypeAnnotation = false;
     if (prefixName != null) {
-      Element element =
+      Element prefixElement =
           lookupInScope(compiler, prefixName, scope, prefixName.source);
-      if (element != null && element.isPrefix()) {
+      if (prefixElement != null && prefixElement.isPrefix()) {
         // The receiver is a prefix. Lookup in the imported members.
-        PrefixElement prefix = element;
-        return prefix.lookupLocalMember(typeName.source);
+        PrefixElement prefix = prefixElement;
+        element = prefix.lookupLocalMember(typeName.source);
+        // TODO(17260, sigurdm): The test for DartBackend is there because
+        // dart2dart outputs malformed types with prefix.
+        if (element != null &&
+            prefix.isDeferred &&
+            deferredIsMalformed &&
+            compiler.backend is! DartBackend) {
+          element = new ErroneousElementX(MessageKind.DEFERRED_TYPE_ANNOTATION,
+                                          {'node': typeName},
+                                          element.name,
+                                          element);
+        }
+      } else {
+        // The caller of this method will create the ErroneousElement for
+        // the MalformedType.
+        element = null;
       }
-      // The caller of this method will create the ErroneousElement for
-      // the MalformedType.
-      return null;
     } else {
       String stringValue = typeName.source;
       if (identical(stringValue, 'void')) {
-        return compiler.types.voidType.element;
+        element = compiler.types.voidType.element;
       } else if (identical(stringValue, 'dynamic')) {
-        return compiler.dynamicClass;
+        element = compiler.dynamicClass;
       } else {
-        return lookupInScope(compiler, typeName, scope, typeName.source);
+        element = lookupInScope(compiler, typeName, scope, typeName.source);
       }
     }
+    return element;
   }
 
   DartType resolveTypeAnnotation(MappingVisitor visitor, TypeAnnotation node,
-                                 {bool malformedIsError: false}) {
+                                 {bool malformedIsError: false,
+                                  bool deferredIsMalformed: true}) {
     Identifier typeName;
     Identifier prefixName;
     Send send = node.typeName.asSend();
@@ -1705,20 +1736,24 @@
       typeName = node.typeName.asIdentifier();
     }
 
-    Element element = resolveTypeName(visitor.scope, prefixName, typeName);
+    Element element = resolveTypeName(prefixName, typeName, visitor.scope,
+                                      deferredIsMalformed: deferredIsMalformed);
 
     DartType reportFailureAndCreateType(MessageKind messageKind,
                                         Map messageArguments,
-                                        {DartType userProvidedBadType}) {
+                                        {DartType userProvidedBadType,
+                                         Element erroneousElement}) {
       if (malformedIsError) {
         visitor.error(node, messageKind, messageArguments);
       } else {
         compiler.backend.registerThrowRuntimeError(visitor.mapping);
         visitor.warning(node, messageKind, messageArguments);
       }
-      Element erroneousElement = new ErroneousElementX(
-          messageKind, messageArguments, typeName.source,
-          visitor.enclosingElement);
+      if (erroneousElement == null) {
+         erroneousElement = new ErroneousElementX(
+            messageKind, messageArguments, typeName.source,
+            visitor.enclosingElement);
+      }
       LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
       resolveTypeArguments(visitor, node, null, arguments);
       return new MalformedType(erroneousElement,
@@ -1738,6 +1773,7 @@
       return type;
     }
 
+    // Try to construct the type from the element.
     DartType type;
     if (element == null) {
       type = reportFailureAndCreateType(
@@ -1747,6 +1783,11 @@
       type = reportFailureAndCreateType(
           ambiguous.messageKind, ambiguous.messageArguments);
       ambiguous.diagnose(visitor.mapping.currentElement, compiler);
+    } else if (element.isErroneous()) {
+      ErroneousElement erroneousElement = element;
+      type = reportFailureAndCreateType(
+          erroneousElement.messageKind, erroneousElement.messageArguments,
+          erroneousElement: erroneousElement);
     } else if (!element.impliesType()) {
       type = reportFailureAndCreateType(
           MessageKind.NOT_A_TYPE, {'node': node.typeName});
@@ -2199,20 +2240,20 @@
         function.computeSignature(compiler);
     Link<Node> parameterNodes = (node.parameters == null)
         ? const Link<Node>() : node.parameters.nodes;
-    functionParameters.forEachParameter((Element element) {
+    functionParameters.forEachParameter((ParameterElement element) {
       if (element == functionParameters.optionalParameters.head) {
         NodeList nodes = parameterNodes.head;
         parameterNodes = nodes.nodes;
       }
+      visit(element.initializer);
       VariableDefinitions variableDefinitions = parameterNodes.head;
       Node parameterNode = variableDefinitions.definitions.nodes.head;
-      initializerDo(parameterNode, (n) => n.accept(this));
       // Field parameters (this.x) are not visible inside the constructor. The
       // fields they reference are visible, but must be resolved independently.
       if (element.kind == ElementKind.FIELD_PARAMETER) {
         useElement(parameterNode, element);
       } else {
-        defineElement(variableDefinitions.definitions.nodes.head, element);
+        defineElement(parameterNode, element);
       }
       parameterNodes = parameterNodes.tail;
     });
@@ -2968,19 +3009,17 @@
   }
 
   visitVariableDefinitions(VariableDefinitions node) {
+    DartType type;
+    if (node.type != null) {
+      type = resolveTypeAnnotation(node.type);
+    } else {
+      type = compiler.types.dynamicType;
+    }
+    VariableList variables = new VariableList.node(node, type);
     VariableDefinitionsVisitor visitor =
         new VariableDefinitionsVisitor(compiler, node, this,
-                                       ElementKind.VARIABLE);
-    VariableListElementX variables = visitor.variables;
-    // Ensure that we set the type of the [VariableListElement] since it depends
-    // on the current scope. If the current scope is a [MethodScope] or
-    // [BlockScope] it will not be available for the
-    // [VariableListElement.computeType] method.
-    if (node.type != null) {
-      variables.type = resolveTypeAnnotation(node.type);
-    } else {
-      variables.type = compiler.types.dynamicType;
-    }
+                                       ElementKind.VARIABLE,
+                                       variables);
 
     Modifiers modifiers = node.modifiers;
     void reportExtraModifier(String modifier) {
@@ -3012,7 +3051,8 @@
       }
     }
     if (node.metadata != null) {
-      compiler.resolver.resolveMetadata(variables, node);
+      variables.metadata =
+          compiler.resolver.resolveMetadata(enclosingElement, node);
     }
     visitor.visit(node.definitions);
   }
@@ -3181,9 +3221,11 @@
   }
 
   DartType resolveTypeAnnotation(TypeAnnotation node,
-                                 {bool malformedIsError: false}) {
+                                 {bool malformedIsError: false,
+                                  bool deferredIsMalformed: true}) {
     DartType type = typeResolver.resolveTypeAnnotation(
-        this, node, malformedIsError: malformedIsError);
+        this, node, malformedIsError: malformedIsError,
+        deferredIsMalformed: deferredIsMalformed);
     if (type == null) return null;
     if (inCheckContext) {
       compiler.enqueuer.resolution.registerIsCheck(type, mapping);
@@ -4407,20 +4449,21 @@
   }
 }
 
-class VariableDefinitionsVisitor extends CommonResolverVisitor<String> {
+class VariableDefinitionsVisitor extends CommonResolverVisitor<Identifier> {
   VariableDefinitions definitions;
   ResolverVisitor resolver;
   ElementKind kind;
-  VariableListElement variables;
+  VariableList variables;
 
   VariableDefinitionsVisitor(Compiler compiler,
-                             this.definitions, this.resolver, this.kind)
+                             this.definitions,
+                             this.resolver,
+                             this.kind,
+                             this.variables)
       : super(compiler) {
-    variables = new VariableListElementX.node(
-        definitions, ElementKind.VARIABLE_LIST, resolver.enclosingElement);
   }
 
-  String visitSendSet(SendSet node) {
+  Identifier visitSendSet(SendSet node) {
     assert(node.arguments.tail.isEmpty); // Sanity check
     Identifier identifier = node.selector;
     String name = identifier.source;
@@ -4429,12 +4472,12 @@
     resolver.visitIn(node.arguments.head, scope);
     if (scope.variableReferencedInInitializer) {
       resolver.error(identifier, MessageKind.REFERENCE_IN_INITIALIZATION,
-                     {'variableName': name.toString()});
+                     {'variableName': name});
     }
-    return name;
+    return identifier;
   }
 
-  String visitIdentifier(Identifier node) {
+  Identifier visitIdentifier(Identifier node) {
     // The variable is initialized to null.
     resolver.world.registerInstantiatedClass(compiler.nullClass,
                                              resolver.mapping);
@@ -4445,14 +4488,15 @@
         !resolver.allowFinalWithoutInitializer) {
       compiler.reportError(node, MessageKind.FINAL_WITHOUT_INITIALIZER);
     }
-    return node.source;
+    return node;
   }
 
   visitNodeList(NodeList node) {
     for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
-      String name = visit(link.head);
-      VariableElement element =
-          new VariableElementX(name, variables, kind, link.head);
+      Identifier name = visit(link.head);
+      VariableElement element = new VariableElementX(
+          name.source, kind, resolver.enclosingElement,
+          variables, name.token);
       resolver.defineElement(link.head, element);
       if (definitions.modifiers.isConst()) {
         compiler.enqueuer.resolution.addDeferredAction(element, () {
@@ -4567,8 +4611,11 @@
 
   Element visitTypeAnnotation(TypeAnnotation node) {
     assert(invariant(node, type == null));
+    // This is not really resolving a type-annotation, but the name of the
+    // constructor. Therefore we allow deferred types.
     type = resolver.resolveTypeAnnotation(node,
-                                          malformedIsError: inConstContext);
+                                          malformedIsError: inConstContext,
+                                          deferredIsMalformed: false);
     compiler.backend.registerRequiredType(type, resolver.enclosingElement);
     return type.element;
   }
@@ -4608,6 +4655,7 @@
     String name = node.source;
     Element element = resolver.reportLookupErrorIfAny(
         lookupInScope(compiler, node, resolver.scope, name), node, name);
+    resolver.useElement(node, element);
     // TODO(johnniwinther): Change errors to warnings, cf. 11.11.1.
     if (element == null) {
       return failOrReturnErroneousElement(resolver.enclosingElement, node, name,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index 57fcedc..0b59263 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -16,7 +16,7 @@
          ErroneousElementX,
          VariableElementX,
          FieldParameterElementX,
-         VariableListElementX,
+         VariableList,
          FunctionSignatureX,
          LabelElementX,
          TargetElementX,
@@ -33,6 +33,7 @@
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
 import '../ordered_typeset.dart' show OrderedTypeSet, OrderedTypeSetBuilder;
 import 'class_members.dart' show MembersCreator;
+import '../dart_backend/dart_backend.dart' show DartBackend;
 
 part 'members.dart';
 part 'scope.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index cd21970..fd29dc9 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -7,7 +7,7 @@
 /**
  * [SignatureResolver] resolves function signatures.
  */
-class SignatureResolver extends MappingVisitor<Element> {
+class SignatureResolver extends MappingVisitor<ParameterElementX> {
   final Element enclosingElement;
   final Scope scope;
   final MessageKind defaultValuesError;
@@ -27,7 +27,7 @@
 
   bool get defaultValuesAllowed => defaultValuesError == null;
 
-  Element visitNodeList(NodeList node) {
+  visitNodeList(NodeList node) {
     // This must be a list of optional arguments.
     String value = node.beginToken.stringValue;
     if ((!identical(value, '[')) && (!identical(value, '{'))) {
@@ -38,10 +38,9 @@
     LinkBuilder<Element> elements = analyzeNodes(node.nodes);
     optionalParameterCount = elements.length;
     optionalParameters = elements.toLink();
-    return null;
   }
 
-  Element visitVariableDefinitions(VariableDefinitions node) {
+  ParameterElementX visitVariableDefinitions(VariableDefinitions node) {
     Link<Node> definitions = node.definitions.nodes;
     if (definitions.isEmpty) {
       cancel(node, 'internal error: no parameter definition');
@@ -66,9 +65,9 @@
       cancel(node, 'function type parameters not supported');
     }
     currentDefinitions = node;
-    Element element = definition.accept(this);
+    ParameterElementX element = definition.accept(this);
     if (currentDefinitions.metadata != null) {
-      compiler.resolver.resolveMetadata(element, node);
+      element.metadata = compiler.resolver.resolveMetadata(element, node);
     }
     currentDefinitions = null;
     return element;
@@ -108,7 +107,7 @@
   }
 
   Element visitIdentifier(Identifier node) {
-    return createParameter(node, node);
+    return createParameter(node, null);
   }
 
   Identifier getParameterName(Send node) {
@@ -133,19 +132,20 @@
   // The only valid [Send] can be in constructors and must be of the form
   // [:this.x:] (where [:x:] represents an instance field).
   FieldParameterElementX visitSend(Send node) {
-    return createFieldParameter(node);
+    return createFieldParameter(node, null);
   }
 
-  ParameterElementX createParameter(Node node, Identifier name) {
+  ParameterElementX createParameter(Identifier name, Expression initializer) {
     validateName(name);
     ParameterElementX parameter = new ParameterElementX(
-        name.source,
-        enclosingElement, ElementKind.PARAMETER, currentDefinitions, node);
+        ElementKind.PARAMETER, enclosingElement,
+        currentDefinitions, name, initializer);
     computeParameterType(parameter);
     return parameter;
   }
 
-  FieldParameterElementX createFieldParameter(Send node) {
+  FieldParameterElementX createFieldParameter(Send node,
+                                              Expression initializer) {
     FieldParameterElementX element;
     if (node.receiver.asIdentifier() == null ||
         !node.receiver.asIdentifier().isThis()) {
@@ -163,8 +163,8 @@
       } else if (!fieldElement.isInstanceMember()) {
         error(node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name});
       }
-      element = new FieldParameterElementX(name.source,
-          enclosingElement, currentDefinitions, node, fieldElement);
+      element = new FieldParameterElementX(enclosingElement,
+          currentDefinitions, name, initializer, fieldElement);
       computeParameterType(element);
     }
     return element;
@@ -174,10 +174,10 @@
   Element visitSendSet(SendSet node) {
     ParameterElementX element;
     if (node.receiver != null) {
-      element = createFieldParameter(node);
+      element = createFieldParameter(node, node.arguments.first);
     } else if (node.selector.asIdentifier() != null ||
                node.selector.asFunctionExpression() != null) {
-      element = createParameter(node, getParameterName(node));
+      element = createParameter(getParameterName(node), node.arguments.first);
     }
     Node defaultValue = node.arguments.head;
     if (!defaultValuesAllowed) {
@@ -200,7 +200,7 @@
       compiler.reportError(modifiers, MessageKind.VAR_FUNCTION_TYPE_PARAMETER);
     }
 
-    return createParameter(node, node.name);
+    return createParameter(node.name, null);
   }
 
   LinkBuilder<Element> analyzeNodes(Link<Node> link) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
index 1cfc71c..75fe874 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
@@ -164,9 +164,9 @@
     VariableDefinitions variableDefinitions = popNode();
     Modifiers modifiers = variableDefinitions.modifiers;
     pushNode(null);
-    void buildFieldElement(String name, Element fields) {
+    void buildFieldElement(Identifier name, VariableList fields) {
       Element element =
-          new FieldElementX(name, fields, null);
+          new FieldElementX(name, enclosingElement, fields);
       addMember(element);
     }
     buildFieldElements(modifiers, variableDefinitions.definitions,
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 02715ad..92d19f6 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -863,8 +863,9 @@
   }
 
   void endTopLevelFields(int count, Token beginToken, Token endToken) {
-    void buildFieldElement(String name, Element fields) {
-      pushElement(new FieldElementX(name, fields, null));
+    void buildFieldElement(Identifier name, VariableList fields) {
+      pushElement(
+          new FieldElementX(name, compilationUnitElement, fields));
     }
     NodeList variables = makeNodeList(count, null, null, ",");
     TypeAnnotation type = popNode();
@@ -877,13 +878,11 @@
   void buildFieldElements(Modifiers modifiers,
                           NodeList variables,
                           Element enclosingElement,
-                          void buildFieldElement(String name,
-                                                 Element fields),
+                          void buildFieldElement(Identifier name,
+                                                 VariableList fields),
                           Token beginToken, Token endToken) {
-    Element fields = new PartialFieldListElement(beginToken,
-                                                 endToken,
-                                                 modifiers,
-                                                 enclosingElement);
+    VariableList fields =
+        new PartialFieldList(beginToken, endToken, modifiers);
     for (Link<Node> variableNodes = variables.nodes;
          !variableNodes.isEmpty;
          variableNodes = variableNodes.tail) {
@@ -892,8 +891,7 @@
       if (identifier == null) {
         identifier = initializedIdentifier.asSendSet().selector.asIdentifier();
       }
-      String name = identifier.source;
-      buildFieldElement(name, fields);
+      buildFieldElement(identifier, fields);
     }
   }
 
@@ -1961,33 +1959,45 @@
   Token position() => _position;
 }
 
-class PartialFieldListElement extends VariableListElementX {
+class PartialFieldList extends VariableList {
   final Token beginToken;
   final Token endToken;
 
-  PartialFieldListElement(Token this.beginToken,
-                          Token this.endToken,
-                          Modifiers modifiers,
-                          Element enclosing)
-    : super(ElementKind.VARIABLE_LIST, modifiers, enclosing);
+  PartialFieldList(Token this.beginToken,
+                   Token this.endToken,
+                   Modifiers modifiers)
+    : super(modifiers);
 
-  VariableDefinitions parseNode(DiagnosticListener listener) {
-    if (cachedNode != null) return cachedNode;
-    cachedNode = parse(listener,
-                       getCompilationUnit(),
+  VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
+    if (definitions != null) return definitions;
+    definitions = parse(listener,
+                       element.getCompilationUnit(),
                        (p) => p.parseVariablesDeclaration(beginToken));
-    if (!cachedNode.modifiers.isVar() &&
-        !cachedNode.modifiers.isFinal() &&
-        !cachedNode.modifiers.isConst() &&
-        cachedNode.type == null) {
+    if (!definitions.modifiers.isVar() &&
+        !definitions.modifiers.isFinal() &&
+        !definitions.modifiers.isConst() &&
+        definitions.type == null) {
       listener.cancel('A field declaration must start with var, final, '
                       'const, or a type annotation.',
-                      node: cachedNode);
+                      node: definitions);
     }
-    return cachedNode;
+    return definitions;
   }
 
-  Token position() => beginToken; // findMyName doesn't work. I'm nameless.
+  computeType(Element element, Compiler compiler) {
+    if (type != null) return type;
+    // TODO(johnniwinther): Compute this in the resolver.
+    compiler.withCurrentElement(element, () {
+      VariableDefinitions node = parseNode(element, compiler);
+      if (node.type != null) {
+        type = compiler.resolveTypeAnnotation(element, node.type);
+      } else {
+        type = compiler.types.dynamicType;
+      }
+    });
+    assert(type != null);
+    return type;
+  }
 }
 
 class PartialTypedefElement extends TypedefElementX {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart
index 0fa7c57..955fd87 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart
@@ -9,13 +9,13 @@
   String get name => 'Scanner';
 
   void scanLibrary(LibraryElement library) {
-    var compilationUnit = library.entryCompilationUnit;
-    var canonicalUri = library.canonicalUri.toString();
-    var resolvedUri = compilationUnit.script.uri.toString();
+    CompilationUnitElement compilationUnit = library.entryCompilationUnit;
+    String canonicalUri = library.canonicalUri.toString();
+    String resolvedUri = compilationUnit.script.readableUri.toString();
     if (canonicalUri == resolvedUri) {
-      compiler.log("scanning library $canonicalUri");
+      compiler.log("Scanning library $canonicalUri");
     } else {
-      compiler.log("scanning library $canonicalUri ($resolvedUri)");
+      compiler.log("Scanning library $canonicalUri ($resolvedUri)");
     }
     scan(compilationUnit);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
index 20a71f6..b27bd15 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
@@ -13,7 +13,7 @@
          TypedefElementX,
          VariableElementX,
          FieldElementX,
-         VariableListElementX,
+         VariableList,
          ClassElementX,
          MetadataAnnotationX,
          MixinApplicationElementX;
diff --git a/sdk/lib/_internal/compiler/implementation/script.dart b/sdk/lib/_internal/compiler/implementation/script.dart
index 396f4bd..9ceafb4 100644
--- a/sdk/lib/_internal/compiler/implementation/script.dart
+++ b/sdk/lib/_internal/compiler/implementation/script.dart
@@ -12,9 +12,17 @@
    *
    * See [LibraryLoader] for terminology on URIs.
    */
-  final Uri uri;
+  final Uri readableUri;
 
-  Script(this.uri, this.file);
+
+  /**
+   * The resource URI from which this script was loaded.
+   *
+   * See [LibraryLoader] for terminology on URIs.
+   */
+  final Uri resourceUri;
+
+  Script(this.readableUri, this.resourceUri, this.file);
 
   String get text => (file == null) ? null : file.slowText();
   String get name => (file == null) ? null : file.filename;
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
index 861bc2e..76e7ad3 100644
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
@@ -114,14 +114,15 @@
     if (isAborting) return;
     isAborting = (kind == api.Diagnostic.CRASH);
 
-    message = prefixMessage(message, kind);
-
     bool fatal = (kind.ordinal & FATAL) != 0;
     bool isInfo = (kind.ordinal & INFO) != 0;
     if (isInfo && uri == null && kind != api.Diagnostic.INFO) {
       info(message, kind);
       return;
     }
+
+    message = prefixMessage(message, kind);
+
     // [previousKind]/[lastKind] records the previous non-INFO kind we saw.
     // This is used to suppress info about a warning when warnings are
     // suppressed, and similar for hints.
diff --git a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
index a4d2e4b..1f5e908 100644
--- a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
@@ -19,6 +19,7 @@
                                       'opqrstuvwxyz0123456789+/';
 
   final Uri uri;
+  final Uri fileUri;
 
   List<SourceMapEntry> entries;
 
@@ -35,7 +36,7 @@
   int previousSourceNameIndex;
   bool firstEntryInLine;
 
-  SourceMapBuilder(this.uri) {
+  SourceMapBuilder(this.uri, this.fileUri) {
     entries = new List<SourceMapEntry>();
 
     sourceUrlMap = new Map<String, int>();
@@ -76,6 +77,9 @@
     StringBuffer buffer = new StringBuffer();
     buffer.write('{\n');
     buffer.write('  "version": 3,\n');
+    if (uri != null && fileUri != null) {
+      buffer.write('  "file": "${relativize(uri, fileUri, false)}",\n');
+    }
     buffer.write('  "sourceRoot": "",\n');
     buffer.write('  "sources": ');
     if (uri != null) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 85ac0e1..f785e40 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -223,7 +223,7 @@
    *
    * Invariant: [function] must be an implementation element.
    */
-  void startFunction(Element element, ast.Expression node) {
+  void startFunction(Element element, ast.Node node) {
     assert(invariant(element, element.isImplementation));
     Compiler compiler = builder.compiler;
     closureData = compiler.closureToClassMapper.computeClosureToClassMapping(
@@ -1453,11 +1453,10 @@
   }
 
   HGraph buildLazyInitializer(VariableElement variable) {
-    ast.SendSet node = variable.parseNode(compiler);
+    ast.Node node = variable.parseNode(compiler);
     openFunction(variable, node);
-    Link<ast.Node> link = node.arguments;
-    assert(!link.isEmpty && link.tail.isEmpty);
-    visit(link.head);
+    assert(variable.initializer != null);
+    visit(variable.initializer);
     HInstruction value = pop();
     value = potentiallyCheckType(value, variable.computeType(compiler));
     closeAndGotoExit(new HReturn(value));
@@ -1827,19 +1826,19 @@
                               Map<Element, HInstruction> fieldValues) {
     assert(invariant(classElement, classElement.isImplementation));
     classElement.forEachInstanceField(
-        (ClassElement enclosingClass, Element member) {
+        (ClassElement enclosingClass, VariableElement member) {
           compiler.withCurrentElement(member, () {
             TreeElements definitions = compiler.analyzeElement(member);
             ast.Node node = member.parseNode(compiler);
-            ast.SendSet assignment = node.asSendSet();
-            if (assignment == null) {
+            ast.Expression initializer = member.initializer;
+            if (initializer == null) {
               // Unassigned fields of native classes are not initialized to
               // prevent overwriting pre-initialized native properties.
               if (!Elements.isNativeOrExtendsNative(classElement)) {
                 fieldValues[member] = graph.addConstantNull(compiler);
               }
             } else {
-              ast.Node right = assignment.arguments.head;
+              ast.Node right = initializer;
               TreeElements savedElements = elements;
               elements = definitions;
               // In case the field initializer uses closures, run the
@@ -2095,7 +2094,7 @@
    *
    * Invariant: [functionElement] must be the implementation element.
    */
-  void openFunction(Element element, ast.Expression node) {
+  void openFunction(Element element, ast.Node node) {
     assert(invariant(element, element.isImplementation));
     HBasicBlock block = graph.addNewBlock();
     open(graph.entry);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 4f14f50..bd98b6b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -255,6 +255,7 @@
   }
 
   void preGenerateMethod(HGraph graph) {
+    new SsaInstructionSelection(compiler).visitGraph(graph);
     new SsaTypeKnownRemover().visitGraph(graph);
     new SsaInstructionMerger(generateAtUseSite, compiler).visitGraph(graph);
     new SsaConditionMerger(
@@ -1199,10 +1200,10 @@
     }
   }
 
-  void emitIdentityComparison(HInstruction left,
-                              HInstruction right,
-                              bool inverse) {
-    String op = singleIdentityComparison(left, right, compiler);
+  void emitIdentityComparison(HIdentity instruction, bool inverse) {
+    String op = instruction.singleComparisonOp;
+    HInstruction left = instruction.left;
+    HInstruction right = instruction.right;
     if (op != null) {
       use(left);
       js.Expression jsLeft = pop();
@@ -1227,7 +1228,7 @@
   }
 
   visitIdentity(HIdentity node) {
-    emitIdentityComparison(node.left, node.right, false);
+    emitIdentityComparison(node, false);
   }
 
   visitAdd(HAdd node)               => visitInvokeBinary(node, '+');
@@ -1812,11 +1813,12 @@
       handledBySpecialCase = true;
       if (input is HIs) {
         emitIs(input, '!==');
+      } else if (input is HIsViaInterceptor) {
+        emitIsViaInterceptor(input, true);
       } else if (input is HNot) {
         use(input.inputs[0]);
       } else if (input is HIdentity) {
-        HIdentity identity = input;
-        emitIdentityComparison(identity.left, identity.right, true);
+        emitIdentityComparison(input, true);
       } else if (input is HBoolify) {
         use(input.inputs[0]);
         push(new js.Binary("!==", pop(), newLiteralBool(true)), input);
@@ -2240,13 +2242,17 @@
       return;
     }
     if (interceptor != null) {
-      use(interceptor);
+      checkTypeViaProperty(interceptor, type, negative);
     } else {
-      use(input);
+      checkTypeViaProperty(input, type, negative);
     }
+  }
 
+  void checkTypeViaProperty(HInstruction input, DartType type, bool negative) {
     world.registerIsCheck(type, work.resolutionTree);
 
+    use(input);
+
     js.PropertyAccess field =
         new js.PropertyAccess.field(pop(), backend.namer.operatorIsType(type));
     // We always negate at least once so that the result is boolified.
@@ -2319,6 +2325,10 @@
     emitIs(node, "===");
   }
 
+  void visitIsViaInterceptor(HIsViaInterceptor node) {
+    emitIsViaInterceptor(node, false);
+  }
+
   void emitIs(HIs node, String relation)  {
     DartType type = node.typeExpression;
     world.registerIsCheck(type, work.resolutionTree);
@@ -2398,6 +2408,11 @@
     }
   }
 
+  void emitIsViaInterceptor(HIsViaInterceptor node, bool negative) {
+    checkTypeViaProperty(node.interceptor, node.typeExpression, negative);
+    attachLocationToLast(node);
+  }
+
   js.Expression generateTest(HInstruction input, TypeMask checkedType) {
     TypeMask receiver = input.instructionType;
     // Figure out if it is beneficial to turn this into a null check.
@@ -2651,20 +2666,3 @@
     return backend.namer.elementAccess(helper);
   }
 }
-
-String singleIdentityComparison(HInstruction left,
-                                HInstruction right,
-                                Compiler compiler) {
-  // Returns the single identity comparison (== or ===) or null if a more
-  // complex expression is required.
-  if (left.canBeNull() && right.canBeNull()) {
-    if (left.isConstantNull() || right.isConstantNull() ||
-        (left.isPrimitive(compiler) &&
-         left.instructionType == right.instructionType)) {
-      return '==';
-    }
-    return null;
-  } else {
-    return '===';
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index 8a72f49..1e83906 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -5,6 +5,89 @@
 part of ssa;
 
 /**
+ * Replaces some instructions with specialized versions to make codegen easier.
+ * Caches codegen information on nodes.
+ */
+class SsaInstructionSelection extends HBaseVisitor {
+  final Compiler compiler;
+
+  SsaInstructionSelection(this.compiler);
+
+  void visitGraph(HGraph graph) {
+    visitDominatorTree(graph);
+  }
+
+  visitBasicBlock(HBasicBlock block) {
+    HInstruction instruction = block.first;
+    while (instruction != null) {
+      HInstruction next = instruction.next;
+      HInstruction replacement = instruction.accept(this);
+      if (replacement != instruction) {
+        block.rewrite(instruction, replacement);
+
+        // If the replacement instruction does not know its source element, use
+        // the source element of the instruction.
+        if (replacement.sourceElement == null) {
+          replacement.sourceElement = instruction.sourceElement;
+        }
+        if (replacement.sourcePosition == null) {
+          replacement.sourcePosition = instruction.sourcePosition;
+        }
+        if (!replacement.isInBasicBlock()) {
+          // The constant folding can return an instruction that is already
+          // part of the graph (like an input), so we only add the replacement
+          // if necessary.
+          block.addAfter(instruction, replacement);
+          // Visit the replacement as the next instruction in case it can also
+          // be constant folded away.
+          next = replacement;
+        }
+        block.remove(instruction);
+      }
+      instruction = next;
+    }
+  }
+
+  HInstruction visitInstruction(HInstruction node) {
+    return node;
+  }
+
+  HInstruction visitIs(HIs node) {
+    if (node.kind == HIs.RAW_CHECK) {
+      HInstruction interceptor = node.interceptor;
+      if (interceptor != null) {
+        JavaScriptBackend backend = compiler.backend;
+        return new HIsViaInterceptor(node.typeExpression, interceptor,
+                                     backend.boolType);
+      }
+    }
+    return node;
+  }
+
+  HInstruction visitIdentity(HIdentity node) {
+    node.singleComparisonOp = simpleOp(node.left, node.right);
+    return node;
+  }
+
+  String simpleOp(HInstruction left, HInstruction right) {
+    // Returns the single identity comparison (== or ===) or null if a more
+    // complex expression is required.
+    TypeMask leftType = left.instructionType;
+    TypeMask rightType = right.instructionType;
+    if (leftType.isNullable && rightType.isNullable) {
+      if (left.isConstantNull() ||
+          right.isConstantNull() ||
+          (left.isPrimitive(compiler) &&
+           leftType == rightType)) {
+        return '==';
+      }
+      return null;
+    }
+    return '===';
+  }
+}
+
+/**
  * Remove [HTypeKnown] instructions from the graph, to make codegen
  * analysis easier.
  */
@@ -124,9 +207,7 @@
   // does not require an expression with multiple uses (because of null /
   // undefined).
   void visitIdentity(HIdentity instruction) {
-    HInstruction left = instruction.left;
-    HInstruction right = instruction.right;
-    if (singleIdentityComparison(left, right, compiler) != null) {
+    if (instruction.singleComparisonOp != null) {
       super.visitIdentity(instruction);
     }
     // Do nothing.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index f2ae1a5..6e2f2fe 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -173,11 +173,12 @@
     // it with a set of classes it intercepts.
     Set<ClassElement> interceptedClasses;
     JavaScriptBackend backend = compiler.backend;
-    HInstruction dominator =
-        findDominator(node.usedBy.where((i) => i is HInvokeDynamic));
-    // If there is an instruction that dominates all others, we can
-    // use only the selector of that instruction.
-    if (dominator != null) {
+    HInstruction dominator = findDominator(node.usedBy);
+    // If there is a call that dominates all other uses, we can use just the
+    // selector of that instruction.
+    if (dominator is HInvokeDynamic &&
+        dominator.isCallOnInterceptor(compiler) &&
+        node == dominator.receiver) {
       interceptedClasses =
             backend.getInterceptedClassesOn(dominator.selector.name);
 
@@ -201,15 +202,17 @@
     } else {
       interceptedClasses = new Set<ClassElement>();
       for (HInstruction user in node.usedBy) {
-        if (user is HIs) {
-          // Is-checks can be performed on any intercepted class.
+        if (user is HInvokeDynamic &&
+            user.isCallOnInterceptor(compiler) &&
+            node == user.receiver) {
+          interceptedClasses.addAll(
+              backend.getInterceptedClassesOn(user.selector.name));
+        } else {
+          // Use a most general interceptor for other instructions, example,
+          // is-checks and escaping interceptors.
           interceptedClasses.addAll(backend.interceptedClasses);
           break;
         }
-        if (user is! HInvoke) continue;
-        // We don't handle escaping interceptors yet.
-        interceptedClasses.addAll(
-            backend.getInterceptedClassesOn(user.selector.name));
       }
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 774ab84..3b0443e 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -38,6 +38,7 @@
   R visitInvokeSuper(HInvokeSuper node);
   R visitInvokeConstructorBody(HInvokeConstructorBody node);
   R visitIs(HIs node);
+  R visitIsViaInterceptor(HIsViaInterceptor node);
   R visitLazyStatic(HLazyStatic node);
   R visitLess(HLess node);
   R visitLessEqual(HLessEqual node);
@@ -335,6 +336,7 @@
   visitTruncatingDivide(HTruncatingDivide node) => visitBinaryArithmetic(node);
   visitTry(HTry node) => visitControlFlow(node);
   visitIs(HIs node) => visitInstruction(node);
+  visitIsViaInterceptor(HIsViaInterceptor node) => visitInstruction(node);
   visitTypeConversion(HTypeConversion node) => visitCheck(node);
   visitTypeKnown(HTypeKnown node) => visitCheck(node);
   visitReadTypeVariable(HReadTypeVariable node) => visitInstruction(node);
@@ -801,6 +803,7 @@
   static const int INTERFACE_TYPE_TYPECODE = 34;
   static const int DYNAMIC_TYPE_TYPECODE = 35;
   static const int TRUNCATING_DIVIDE_TYPECODE = 36;
+  static const int IS_VIA_INTERCEPTOR_TYPECODE = 37;
 
   HInstruction(this.inputs, this.instructionType)
       : id = idCounter++, usedBy = <HInstruction>[] {
@@ -1237,6 +1240,15 @@
   }
 }
 
+/**
+ * Late instructions are used after the main optimization phases.  They capture
+ * codegen decisions just prior to generating JavaScript.
+ */
+abstract class HLateInstruction extends HInstruction {
+  HLateInstruction(List<HInstruction> inputs, TypeMask type)
+      : super(inputs, type);
+}
+
 class HBoolify extends HInstruction {
   HBoolify(HInstruction value, TypeMask type)
       : super(<HInstruction>[value], type) {
@@ -2025,6 +2037,9 @@
 }
 
 class HIdentity extends HRelational {
+  // Cached codegen decision.
+  String singleComparisonOp;  // null, '===', '=='
+
   HIdentity(left, right, selector, type) : super(left, right, selector, type);
   accept(HVisitor visitor) => visitor.visitIdentity(this);
 
@@ -2342,6 +2357,30 @@
   }
 }
 
+/**
+ * HIsViaInterceptor is a late-stage instruction for a type test that can be
+ * done entirely on an interceptor.  It is not a HCheck because the checked
+ * input is not one of the inputs.
+ */
+class HIsViaInterceptor extends HLateInstruction {
+  final DartType typeExpression;
+   HIsViaInterceptor(this.typeExpression, HInstruction interceptor,
+                     TypeMask type)
+       : super(<HInstruction>[interceptor], type) {
+    setUseGvn();
+  }
+
+  HInstruction get interceptor => inputs[0];
+
+  accept(HVisitor visitor) => visitor.visitIsViaInterceptor(this);
+  toString() => "$interceptor is $typeExpression";
+  int typeCode() => HInstruction.IS_VIA_INTERCEPTOR_TYPECODE;
+  bool typeEquals(HInstruction other) => other is HIsViaInterceptor;
+  bool dataEquals(HIs other) {
+    return typeExpression == other.typeExpression;
+  }
+}
+
 class HTypeConversion extends HCheck {
   final DartType typeExpression;
   final int kind;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index bea5bd5..7931074 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -426,6 +426,28 @@
     return null;
   }
 
+  HInstruction visitAdd(HAdd node) {
+    HInstruction left = node.left;
+    HInstruction right = node.right;
+    // We can only perform this rewriting on Integer, as it is not
+    // valid for -0.0.
+    if (left.isInteger(compiler) && right.isInteger(compiler)) {
+      if (left is HConstant && left.constant.isZero()) return right;
+      if (right is HConstant && right.constant.isZero()) return left;
+    }
+    return super.visitAdd(node);
+  }
+
+  HInstruction visitMultiply(HMultiply node) {
+    HInstruction left = node.left;
+    HInstruction right = node.right;
+    if (left.isNumber(compiler) && right.isNumber(compiler)) {
+      if (left is HConstant && left.constant.isOne()) return right;
+      if (right is HConstant && right.constant.isOne()) return left;
+    }
+    return super.visitMultiply(node);
+  }
+
   HInstruction visitInvokeBinary(HInvokeBinary node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index 37731ba..1d8404c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -329,6 +329,11 @@
 
   String visitInterceptor(HInterceptor node) {
     String value = temporaryId(node.inputs[0]);
+    if (node.interceptedClasses != null) {
+      JavaScriptBackend backend = compiler.backend;
+      String cls = backend.namer.getInterceptorSuffix(node.interceptedClasses);
+      return "Intercept ($cls): $value";
+    }
     return "Intercept: $value";
   }
 
@@ -508,6 +513,11 @@
     return "TypeTest: ${temporaryId(node.expression)} is $type";
   }
 
+  String visitIsViaInterceptor(HIsViaInterceptor node) {
+    String type = node.typeExpression.toString();
+    return "TypeTest: ${temporaryId(node.inputs[0])} is $type";
+  }
+
   String visitTypeConversion(HTypeConversion node) {
     assert(node.inputs.length <= 2);
     String otherInput = (node.inputs.length == 2)
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index ed6852e..775cd43 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -783,6 +783,39 @@
     }
   }
 
+  Range handleInvokeModulo(HInvokeDynamicMethod invoke) {
+    HInstruction left = invoke.inputs[1];
+    HInstruction right = invoke.inputs[1];
+    Range divisor = ranges[right];
+    if (divisor != null) {
+      // For Integer values we can be precise in the upper bound,
+      // so special case those.
+      if (left.isInteger(compiler) && right.isInteger(compiler)) {
+        if (divisor.isPositive) {
+          return info.newNormalizedRange(info.intZero, divisor.upper -
+              info.intOne);
+        } else if (divisor.isNegative) {
+          return info.newNormalizedRange(info.intZero, info.newNegateValue(
+              divisor.lower) - info.intOne);
+        }
+      } else if (left.isNumber(compiler) && right.isNumber(compiler)) {
+        if (divisor.isPositive) {
+          return info.newNormalizedRange(info.intZero, divisor.upper);
+        } else if (divisor.isNegative) {
+          return info.newNormalizedRange(info.intZero, info.newNegateValue(
+              divisor.lower));
+        }
+      }
+    }
+    return info.newUnboundRange();
+  }
+
+  Range visitInvokeDynamicMethod(HInvokeDynamicMethod invoke) {
+    if ((invoke.inputs.length == 3) && (invoke.selector.name == "%"))
+      return handleInvokeModulo(invoke);
+    return super.visitInvokeDynamicMethod(invoke);
+  }
+
   Range handleBinaryOperation(HBinaryArithmetic instruction) {
     if (!instruction.isInteger(compiler)) return info.newUnboundRange();
     return instruction.operation(constantSystem).apply(
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 04b6000..40ec287 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -2114,15 +2114,3 @@
       => node.isInterpolation;
 }
 
-/**
- * If the given node is a send set, it visits its initializer (first
- * argument).
- *
- * TODO(ahe): This method is controversial, the team needs to discuss
- * if top-level methods are acceptable and what naming conventions to
- * use.
- */
-initializerDo(Node node, f(Node node)) {
-  SendSet send = node.asSendSet();
-  if (send != null) return f(send.arguments.head);
-}
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index fe81a31..ee598d7 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -478,10 +478,9 @@
         builder.addLast(node);
       });
       if (signature.optionalParametersAreNamed) {
-        signature.forEachOptionalParameter((Element element) {
-          Node node = element.parseNode(compiler);
-          mapping[node] = element;
-          builder.addLast(new NamedArgument(null, null, node));
+        signature.forEachOptionalParameter((ParameterElement element) {
+          mapping[element.initializer] = element;
+          builder.addLast(new NamedArgument(null, null, element.initializer));
         });
       } else {
         signature.forEachOptionalParameter((Element element) {
@@ -493,7 +492,9 @@
       return builder.toLink();
     }
 
-    internalCompileArgument(Node node) => compileArgument(mapping[node]);
+    internalCompileArgument(Node node) {
+      return compileArgument(mapping[node]);
+    }
 
     Link<Node> nodes = computeCallNodesFromParameters();
 
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index eb3f390..ca5d04d 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -140,7 +140,6 @@
     ..visitTypeVariableElement(null)
     ..visitTypedefElement(null)
     ..visitVariableElement(null)
-    ..visitVariableListElement(null)
     ..visitVoidElement(null)
     ..visitWarnOnUseElement(null);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart b/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
index 654341d..65a4ed2 100644
--- a/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/uri_extras.dart
@@ -34,8 +34,9 @@
       base.port == uri.port &&
       uri.query == "" && uri.fragment == "") {
     if (normalize(uri.path).startsWith(normalize(base.path))) {
-      return uri.path.substring(base.path.length);
+      return uri.path.substring(base.path.lastIndexOf('/') + 1);
     }
+
     List<String> uriParts = uri.path.split('/');
     List<String> baseParts = base.path.split('/');
     int common = 0;
@@ -48,7 +49,10 @@
       // The first part will always be an empty string because the
       // paths are absolute. On Windows, we must also consider drive
       // letters or hostnames.
-      return uri.path;
+      if (baseParts.length > common + 1) {
+        // Avoid using '..' to go to the root, unless we are already there.
+        return uri.path;
+      }
     }
     StringBuffer sb = new StringBuffer();
     for (int i = common + 1; i < baseParts.length; i++) {
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 9b923d1..a67dc21 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -553,6 +553,9 @@
   static const MessageKind NOT_A_COMPILE_TIME_CONSTANT = const MessageKind(
       "Not a compile-time constant.");
 
+  static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT = const MessageKind(
+      "Deferred classes cannot be used to create compile-time constants.");
+
   static const MessageKind CYCLIC_COMPILE_TIME_CONSTANTS = const MessageKind(
       "Cycle in the compile-time constant computation.");
 
@@ -1082,6 +1085,15 @@
   static const MessageKind DUPLICATED_LIBRARY_NAME = const MessageKind(
       "Duplicated library name '#{libraryName}'.");
 
+  static const MessageKind DUPLICATED_RESOURCE = const MessageKind(
+      "The resource '#{resourceUri}' is loaded through both "
+      "'#{canonicalUri1}' and '#{canonicalUri2}'.");
+
+  static const MessageKind DUPLICATED_LIBRARY_RESOURCE =
+      const MessageKind(
+          "The library '#{libraryName}' in '#{resourceUri}' is loaded through "
+          "both '#{canonicalUri1}' and '#{canonicalUri2}'.");
+
   // This is used as an exception.
   static const MessageKind INVALID_SOURCE_FILE_LOCATION = const MessageKind('''
 Invalid offset (#{offset}) in source map.
@@ -1152,13 +1164,10 @@
   static const MessageKind MISSING_FACTORY_KEYWORD = const MessageKind(
       "Did you forget a factory keyword here?");
 
-  static const MessageKind DEFERRED_LIBRARY_NOT_FROM_MAIN =
+  static const MessageKind DEFERRED_LIBRARY_DART_2_DART =
       const MessageKind(
-          "DeferredLibrary used as an annotation here, "
-          "but not used in the main library. Will not split the output.",
-          howToFix:
-            "Try adding a '@DeferredLibrary(...)' annotation in the main "
-            "library");
+          "Deferred loading is not supported by the dart backend yet. "
+          "Will not split the output.");
 
   static const MessageKind DEFERRED_LIBRARY_WITHOUT_PREFIX =
       const MessageKind(
@@ -1172,6 +1181,13 @@
           howToFix:
             "Try changing the import prefix.");
 
+  static const MessageKind DEFERRED_TYPE_ANNOTATION =
+      const MessageKind(
+          "The type #{node} is deferred. "
+          "Deferred types are not valid as type annotations.",
+          howToFix:
+            "Try using a non-deferred abstract class as an interface.");
+
   static const MessageKind ILLEGAL_STATIC = const MessageKind(
       "Modifier static is only allowed on functions declared in "
       "a class.");
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index b9bb8f0..0bd0544 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -15,7 +15,7 @@
   patch static String _systemTemp() {
     throw new UnsupportedError("Directory._systemTemp");
   }
-  patch static int _exists(String path) {
+  patch static _exists(String path) {
     throw new UnsupportedError("Directory._exists");
   }
   patch static _create(String path) {
@@ -276,13 +276,13 @@
 }
 
 patch class RawSocket {
-  patch static Future<RawSocket> connect(var host, int port) {
+  patch static Future<RawSocket> connect(host, int port) {
     throw new UnsupportedError("RawSocket constructor");
   }
 }
 
 patch class Socket {
-  patch static Future<Socket> connect(var host, int port) {
+  patch static Future<Socket> connect(host, int port) {
     throw new UnsupportedError("Socket constructor");
   }
 }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 36ecb47..74df1a4 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -1019,9 +1019,24 @@
     return JS('var', '#.apply(#, #)', jsFunction, function, arguments);
   }
 
-  static getConstructorOrInterceptor(String className) {
+  static getConstructorOrInterceptorToken(String className) {
     // TODO(ahe): Generalize this and improve test coverage of
     // reflecting on intercepted classes.
+
+    // We should probably not be mappling the dart:core interface names to the
+    // interceptor library implementation classes like this.  `JSArray` is just
+    // one implementation of `List`, there are others that have no relationship
+    // with JSArray other than implementing a common interface.
+    //
+    // For now `List` in dart:core and `JSArray` is in dart:_interceptors.  We
+    // need to maintain a distinction to get the correct library mirror.
+    //
+    // TODO(17394): Short term: Refactor to avoid two copies of the list of
+    // known interceptor implementations.
+    //
+    // TODO(17394): Longer term: The proper interfaces with abstract methods
+    // should be emitted.
+
     if (JS('bool', '# == "String"', className)) return const JSString();
     if (JS('bool', '# == "int"', className)) return const JSInt();
     if (JS('bool', '# == "double"', className)) return const JSDouble();
@@ -1032,6 +1047,18 @@
     return JS('var', 'init.allClasses[#]', className);
   }
 
+  static bool isInterceptorToken(var object) {
+    // This must match the list of tokens returned by
+    // [getConstructorOrInterceptorToken] above.
+    return JS('bool', '# === #', object, const JSString())
+        || JS('bool', '# === #', object, const JSInt())
+        || JS('bool', '# === #', object, const JSDouble())
+        || JS('bool', '# === #', object, const JSNumber())
+        || JS('bool', '# === #', object, const JSBool())
+        || JS('bool', '# === #', object, const JSArray())
+        || JS('bool', '# === #', object, const JSNull());
+  }
+
   static bool identicalImplementation(a, b) {
     return JS('bool', '# == null', a)
       ? JS('bool', '# == null', b)
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 2f2069b..6876993 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -485,8 +485,7 @@
   // TODO(ahe): Test this getter.
   DeclarationMirror get owner => null;
 
-  // TODO(ahe): Implement this.
-  Function operator [](Symbol name)
+  List<LibraryDependencyMirror> get libraryDependencies
       => throw new UnimplementedError();
 }
 
@@ -544,7 +543,7 @@
     return mirror;
   }
   var constructorOrInterceptor =
-      Primitives.getConstructorOrInterceptor(mangledName);
+      Primitives.getConstructorOrInterceptorToken(mangledName);
   if (constructorOrInterceptor == null) {
     int index = JS('int|Null', 'init.functionAliases[#]', mangledName);
     if (index != null) {
@@ -556,7 +555,7 @@
     // TODO(ahe): How to handle intercepted classes?
     throw new UnsupportedError('Cannot find class for: ${n(symbol)}');
   }
-  var constructor = (constructorOrInterceptor is Interceptor)
+  var constructor = (Primitives.isInterceptorToken(constructorOrInterceptor))
       ? JS('', '#.constructor', constructorOrInterceptor)
       : constructorOrInterceptor;
   var descriptor = JS('', '#["@"]', constructor);
@@ -788,9 +787,6 @@
 
   List<TypeMirror> get typeArguments => const <TypeMirror>[];
 
-  // TODO(ahe): Implement this.
-  Function operator [](Symbol name) => throw new UnimplementedError();
-
   bool get isAbstract => throw new UnimplementedError();
 
   bool isSubclassOf(ClassMirror other) {
@@ -1100,9 +1096,6 @@
 
   // TODO(ahe): Remove this method from the API.
   MirrorSystem get mirrors => currentJsMirrorSystem;
-
-  // TODO(ahe): Implement this method.
-  Function operator [](Symbol name) => throw new UnimplementedError();
 }
 
 /**
@@ -1400,9 +1393,6 @@
   // TODO(ahe): Implement this.
   ClassMirror get mixin => throw new UnimplementedError();
 
-  // TODO(ahe): Implement this.
-  Function operator [](Symbol name) => throw new UnimplementedError();
-
   bool isSubtypeOf(TypeMirror other) => throw new UnimplementedError();
 
   bool isAssignableTo(TypeMirror other) => throw new UnimplementedError();
@@ -1511,7 +1501,7 @@
   String get _prettyName => 'ClassMirror';
 
   get _jsConstructor {
-    if (_jsConstructorOrInterceptor is Interceptor) {
+    if (Primitives.isInterceptorToken(_jsConstructorOrInterceptor)) {
       return JS('', '#.constructor', _jsConstructorOrInterceptor);
     } else {
       return _jsConstructorOrInterceptor;
@@ -1781,7 +1771,7 @@
 
   JsLibraryMirror get owner {
     if (_owner == null) {
-      if (_jsConstructorOrInterceptor is Interceptor) {
+      if (Primitives.isInterceptorToken(_jsConstructorOrInterceptor)) {
         _owner = reflectType(Object).owner;
       } else {
         for (var list in JsMirrorSystem.librariesByName.values) {
@@ -1912,9 +1902,6 @@
   // TODO(ahe): Implement this.
   ClassMirror get mixin => throw new UnimplementedError();
 
-  // TODO(ahe): Implement this.
-  Function operator [](Symbol name) => throw new UnimplementedError();
-
   bool get isAbstract => throw new UnimplementedError();
 
   bool isSubclassOf(ClassMirror other) {
@@ -2106,9 +2093,6 @@
   InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
     throw new UnsupportedError("ClosureMirror.findInContext not yet supported");
   }
-
-  // TODO(ahe): Implement this method.
-  Function operator [](Symbol name) => throw new UnimplementedError();
 }
 
 class JsMethodMirror extends JsDeclarationMirror implements MethodMirror {
@@ -2409,7 +2393,6 @@
       Symbol constructorName,
       List positionalArguments,
       [Map<Symbol, dynamic> namedArguments]) => throw new UnimplementedError();
-  Function operator [](Symbol name) => throw new UnimplementedError();
   InstanceMirror invoke(Symbol memberName,
                         List positionalArguments,
                         [Map<Symbol, dynamic> namedArguments])
diff --git a/sdk/lib/_internal/lib/js_string.dart b/sdk/lib/_internal/lib/js_string.dart
index 4055647..36372f4 100644
--- a/sdk/lib/_internal/lib/js_string.dart
+++ b/sdk/lib/_internal/lib/js_string.dart
@@ -175,33 +175,54 @@
     }
   }
 
-  // Dart2js can't use JavaScript trim, because JavaScript does not trim
-  // the NEXT LINE character (0x85) and BOMs (0xFEFF).
-  String trim() {
-    const int CARRIAGE_RETURN = 0x0D;
+  /// Finds the index of the first non-whitespace character, or the
+  /// end of the string. Start looking at position [index].
+  static int _skipLeadingWhitespace(String string, int index) {
     const int SPACE = 0x20;
-    const int NEL = 0x85;
-    const int BOM = 0xFEFF;
+    const int CARRIAGE_RETURN = 0x0D;
+    while (index < string.length) {
+      int codeUnit = string.codeUnitAt(index);
+      if (codeUnit != SPACE &&
+          codeUnit != CARRIAGE_RETURN &&
+          !_isWhitespace(codeUnit)) {
+        break;
+      }
+      index++;
+    }
+    return index;
+  }
 
-    // Start by doing JS trim. Then check if it leaves a NEL or BOM at
+  /// Finds the index after the the last non-whitespace character, or 0.
+  /// Start looking at position [index - 1].
+  static int _skipTrailingWhitespace(String string, int index) {
+    const int SPACE = 0x20;
+    const int CARRIAGE_RETURN = 0x0D;
+    while (index > 0) {
+      int codeUnit = string.codeUnitAt(index - 1);
+      if (codeUnit != SPACE &&
+          codeUnit != CARRIAGE_RETURN &&
+          !_isWhitespace(codeUnit)) {
+        break;
+      }
+      index--;
+    }
+    return index;
+  }
+
+  // Dart2js can't use JavaScript trim directly,
+  // because JavaScript does not trim
+  // the NEXT LINE (NEL) character (0x85).
+  String trim() {
+    const int NEL = 0x85;
+
+    // Start by doing JS trim. Then check if it leaves a NEL at
     // either end of the string.
     String result = JS('String', '#.trim()', this);
-
     if (result.length == 0) return result;
     int firstCode = result.codeUnitAt(0);
     int startIndex = 0;
-    if (firstCode == NEL || firstCode == BOM) {
-      startIndex++;
-      while (startIndex < result.length) {
-        int codeUnit = result.codeUnitAt(startIndex);
-        if (codeUnit == SPACE ||
-            codeUnit == CARRIAGE_RETURN ||
-            _isWhitespace(codeUnit)) {
-          startIndex++;
-        } else {
-          break;
-        }
-      }
+    if (firstCode == NEL) {
+      startIndex = _skipLeadingWhitespace(result, 1);
       if (startIndex == result.length) return "";
     }
 
@@ -209,23 +230,69 @@
     // We know that there is at least one character that is non-whitespace.
     // Therefore we don't need to verify that endIndex > startIndex.
     int lastCode = result.codeUnitAt(endIndex - 1);
-    if (lastCode == NEL || lastCode == BOM) {
-      endIndex--;
-      while (true) {
-        int codeUnit = result.codeUnitAt(endIndex - 1);
-        if (codeUnit == SPACE ||
-            codeUnit == CARRIAGE_RETURN ||
-            _isWhitespace(codeUnit)) {
-          endIndex--;
-        } else {
-          break;
-        }
-      }
+    if (lastCode == NEL) {
+      endIndex = _skipTrailingWhitespace(result, endIndex - 1);
     }
     if (startIndex == 0 && endIndex == result.length) return result;
     return JS('String', r'#.substring(#, #)', result, startIndex, endIndex);
   }
 
+  // Dart2js can't use JavaScript trimLeft directly,
+  // because it is not in ES5, so not every browser implements it,
+  // and because those that do will not trim the NEXT LINE character (0x85).
+  String trimLeft() {
+    const int NEL = 0x85;
+
+    // Start by doing JS trim. Then check if it leaves a NEL at
+    // the beginning of the string.
+    String result;
+    int startIndex = 0;
+    if (JS('bool', 'typeof #.trimLeft != "undefined"', this)) {
+      result = JS('String', '#.trimLeft()', this);
+      if (result.length == 0) return result;
+      int firstCode = result.codeUnitAt(0);
+      if (firstCode == NEL) {
+        startIndex = _skipLeadingWhitespace(result, 1);
+      }
+    } else {
+      result = this;
+      startIndex = _skipLeadingWhitespace(this, 0);
+    }
+    if (startIndex == 0) return result;
+    if (startIndex == result.length) return "";
+    return JS('String', r'#.substring(#)', result, startIndex);
+  }
+
+  // Dart2js can't use JavaScript trimRight directly,
+  // because it is not in ES5 and because JavaScript does not trim
+  // the NEXT LINE character (0x85).
+  String trimRight() {
+    const int NEL = 0x85;
+
+    // Start by doing JS trim. Then check if it leaves a NEL or BOM at
+    // the end of the string.
+    String result;
+    int endIndex;
+    // trimRight is implemented by Firefox and Chrome/Blink,
+    // so use it if it is there.
+    if (JS('bool', 'typeof #.trimRight != "undefined"', this)) {
+      result = JS('String', '#.trimRight()', this);
+      endIndex = result.length;
+      if (endIndex == 0) return result;
+      int lastCode = result.codeUnitAt(endIndex - 1);
+      if (lastCode == NEL) {
+        endIndex = _skipTrailingWhitespace(result, endIndex - 1);
+      }
+    } else {
+      result = this;
+      endIndex = _skipTrailingWhitespace(this, this.length);
+    }
+
+    if (endIndex == result.length) return result;
+    if (endIndex == 0) return "";
+    return JS('String', r'#.substring(#, #)', result, 0, endIndex);
+  }
+
   String operator*(int times) {
     if (0 >= times) return '';  // Unnecessary but hoists argument type check.
     if (times == 1 || this.length == 0) return this;
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index ecc8318..8d06b80 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -88,11 +88,19 @@
       captureStackChains: captureStackChains).catchError((error, Chain chain) {
     // This is basically the top-level exception handler so that we don't
     // spew a stack trace on our users.
-    var message;
-
-    log.error(getErrorMessage(error));
+    var message = getErrorMessage(error);
+    log.error(message);
     log.fine("Exception type: ${error.runtimeType}");
 
+    if (log.json.enabled) {
+      if (error is UsageException) {
+        // Don't print usage info in JSON output.
+        log.json.error(error.message);
+      } else {
+        log.json.error(error);
+      }
+    }
+
     if (options['trace'] || !isUserFacingException(error)) {
       log.error(chain.terse);
     } else {
@@ -131,7 +139,7 @@
   if (exception is HttpException || exception is HttpException ||
       exception is SocketException || exception is PubHttpException) {
     return exit_codes.UNAVAILABLE;
-  } else if (exception is FormatException) {
+  } else if (exception is FormatException || exception is DataException) {
     return exit_codes.DATA;
   } else if (exception is UsageException) {
     return exit_codes.USAGE;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
index 55f9f1d..9cc8128 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -8,7 +8,7 @@
 import 'dart:io';
 
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:stack_trace/stack_trace.dart';
 import 'package:watcher/watcher.dart';
 
@@ -159,6 +159,18 @@
     return _builtInTransformers;
   }
 
+  /// Gets the names of the top-level directories in [package] whose contents
+  /// should be provided as source assets.
+  Set<String> getPublicDirectories(String package) {
+    var directories = ["asset", "lib"];
+
+    if (package == graph.entrypoint.root.name) {
+      directories.addAll(_rootDirectories);
+    }
+
+    return directories.toSet();
+  }
+
   /// Loads the assets and transformers for this environment.
   ///
   /// This transforms and serves all library and asset files in all packages in
@@ -178,8 +190,15 @@
       // whole program.
       var subscriptions = [
         barback.errors.listen((error) {
-          if (error is TransformerException) error = error.error;
-          if (!completer.isCompleted) {
+          if (error is TransformerException) {
+            var message = error.error.toString();
+            if (error.stackTrace != null) {
+              message += "\n" + error.stackTrace.terse.toString();
+            }
+
+            _log(new LogEntry(error.transform, error.transform.primaryId,
+                LogLevel.ERROR, message, null));
+          } else if (!completer.isCompleted) {
             completer.completeError(error, new Chain.current());
           }
         }),
@@ -226,8 +245,7 @@
 
   /// Provides all of the source assets in the environment to barback.
   Future _loadSources(Barback barback) {
-    return Future.wait(graph.packages.values.map(
-        (package) => _updateSources(graph.entrypoint, package)));
+    return Future.wait(graph.packages.values.map(_updateSources));
   }
 
   /// Adds all of the source assets in this environment to barback and then
@@ -243,13 +261,12 @@
       var packageId = graph.lockFile.packages[package.name];
       if (packageId != null &&
           graph.entrypoint.cache.sources[packageId.source].shouldCache) {
-        return _updateSources(graph.entrypoint, package);
+        return _updateSources(package);
       }
 
       // Watch the visible package directories for changes.
-      return Future.wait(_getPublicDirectories(graph.entrypoint, package)
-          .map((name) {
-        var subdirectory = path.join(package.dir, name);
+      return Future.wait(getPublicDirectories(package.name).map((name) {
+        var subdirectory = p.join(package.dir, name);
         if (!dirExists(subdirectory)) return new Future.value();
 
         // TODO(nweiz): close these watchers when [barback] is closed.
@@ -257,7 +274,7 @@
         watcher.events.listen((event) {
           // Don't watch files symlinked into these directories.
           // TODO(rnystrom): If pub gets rid of symlinks, remove this.
-          var parts = path.split(event.path);
+          var parts = p.split(event.path);
           if (parts.contains("packages") || parts.contains("assets")) return;
 
           // Skip files that were (most likely) compiled from nearby ".dart"
@@ -274,7 +291,7 @@
           if (event.path.endsWith(".dart.precompiled.js")) return;
 
           var id = new AssetId(package.name,
-              path.relative(event.path, from: package.dir));
+              p.relative(event.path, from: package.dir));
           if (event.type == ChangeType.REMOVE) {
             barback.removeSources([id]);
           } else {
@@ -282,7 +299,7 @@
           }
         });
         return watcher.ready;
-      })).then((_) => _updateSources(graph.entrypoint, package));
+      })).then((_) => _updateSources(package));
     }));
   }
 
@@ -295,10 +312,9 @@
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  Future _updateSources(Entrypoint entrypoint, Package package) {
-    return Future.wait(_getPublicDirectories(entrypoint, package)
-        .map((dirPath) {
-      var dir = path.join(package.dir, dirPath);
+  Future _updateSources(Package package) {
+    return Future.wait(getPublicDirectories(package.name).map((dirPath) {
+      var dir = p.join(package.dir, dirPath);
       if (!dirExists(dir)) return new Future.value();
 
       return new Directory(dir).list(recursive: true, followLinks: true)
@@ -307,11 +323,11 @@
         if (entry is Directory) return [];
         if (entry is Link) return [];
 
-        var relative = path.normalize(
-            path.relative(entry.path, from: package.dir));
+        var relative = p.normalize(
+            p.relative(entry.path, from: package.dir));
 
         // Ignore hidden files or files in "packages" and hidden directories.
-        if (path.split(relative).any((part) =>
+        if (p.split(relative).any((part) =>
             part.startsWith(".") || part == "packages")) {
           return [];
         }
@@ -333,19 +349,6 @@
       }).toList().then(barback.updateSources);
     }));
   }
-
-  /// Gets the names of the top-level directories in [package] whose contents
-  /// should be provided as source assets.
-  Iterable<String> _getPublicDirectories(Entrypoint entrypoint,
-      Package package) {
-    var directories = ["asset", "lib"];
-
-    if (package.name == entrypoint.root.name) {
-      directories.addAll(_rootDirectories);
-    }
-
-    return directories;
-  }
 }
 
 /// Log [entry] using Pub's logging infrastructure.
@@ -354,9 +357,12 @@
 /// show the same context like the file where an error occurred, this tries
 /// to avoid showing redundant data in the entry.
 void _log(LogEntry entry) {
-  messageMentions(String text) {
-    return entry.message.toLowerCase().contains(text.toLowerCase());
-  }
+  messageMentions(text) =>
+      entry.message.toLowerCase().contains(text.toLowerCase());
+
+  messageMentionsAsset(id) =>
+      messageMentions(id.toString()) ||
+      messageMentions(p.joinAll(p.url.split(entry.assetId.path)));
 
   var prefixParts = [];
 
@@ -369,14 +375,14 @@
   prefixParts.add(entry.transform.transformer);
 
   // Mention the primary input of the transform unless the message seems to.
-  if (!messageMentions(entry.transform.primaryId.path)) {
+  if (!messageMentionsAsset(entry.transform.primaryId)) {
     prefixParts.add("on ${entry.transform.primaryId}");
   }
 
   // If the relevant asset isn't the primary input, mention it unless the
   // message already does.
   if (entry.assetId != entry.transform.primaryId &&
-      !messageMentions(entry.assetId.path)) {
+      !messageMentionsAsset(entry.assetId)) {
     prefixParts.add("with input ${entry.assetId}");
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 6f23229..44225d6 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -57,15 +57,30 @@
   Dart2JSTransformer(BuildEnvironment environment, BarbackMode mode)
       : this.withSettings(environment, new BarbackSettings({}, mode));
 
-  /// Only ".dart" files within a buildable directory are processed.
+  /// Only ".dart" entrypoint files within a buildable directory are processed.
   Future<bool> isPrimary(Asset asset) {
     if (asset.id.extension != ".dart") return new Future.value(false);
 
-    for (var dir in ["benchmark", "example", "test", "web"]) {
-      if (asset.id.path.startsWith("$dir/")) return new Future.value(true);
+    if (!["benchmark", "example", "test", "web"]
+        .any((dir) => asset.id.path.startsWith("$dir/"))) {
+      return new Future.value(false);
     }
 
-    return new Future.value(false);
+    return asset.readAsString().then((code) {
+      try {
+        var name = asset.id.path;
+        if (asset.id.package != _environment.rootPackage.name) {
+          name += " in ${asset.id.package}";
+        }
+
+        var parsed = parseCompilationUnit(code, name: name);
+        return dart.isEntrypoint(parsed);
+      } on AnalyzerErrorGroup catch (e) {
+        // If we get a parse error, consider the asset primary so we report
+        // dart2js's more detailed error message instead.
+        return true;
+      }
+    });
   }
 
   Future apply(Transform transform) {
@@ -76,54 +91,41 @@
       transform.logger.info("Compiling ${transform.primaryInput.id}...");
       stopwatch.start();
 
-      return transform.primaryInput.readAsString().then((code) {
-        try {
-          var id = transform.primaryInput.id;
-          var name = id.path;
-          if (id.package != _environment.rootPackage.name) {
-            name += " in ${id.package}";
-          }
+      var provider = new _BarbackCompilerProvider(_environment, transform,
+          generateSourceMaps: _settings.mode != BarbackMode.RELEASE);
 
-          var parsed = parseCompilationUnit(code, name: name);
-          if (!dart.isEntrypoint(parsed)) return null;
-        } on AnalyzerErrorGroup catch (e) {
-          transform.logger.error(e.message);
-          return null;
-        }
+      // Create a "path" to the entrypoint script. The entrypoint may not
+      // actually be on disk, but this gives dart2js a root to resolve relative
+      // paths against.
+      var id = transform.primaryInput.id;
 
-        var provider = new _BarbackCompilerProvider(_environment, transform);
+      var entrypoint = path.join(_environment.graph.packages[id.package].dir,
+          id.path);
 
-        // Create a "path" to the entrypoint script. The entrypoint may not
-        // actually be on disk, but this gives dart2js a root to resolve
-        // relative paths against.
-        var id = transform.primaryInput.id;
-
-        var entrypoint = path.join(_environment.graph.packages[id.package].dir,
-            id.path);
-
-        // TODO(rnystrom): Should have more sophisticated error-handling here.
-        // Need to report compile errors to the user in an easily visible way.
-        // Need to make sure paths in errors are mapped to the original source
-        // path so they can understand them.
-        return Chain.track(dart.compile(
-            entrypoint, provider,
-            commandLineOptions: _configCommandLineOptions,
-            checked: _configBool('checked'),
-            minify: _configBool(
-                'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
-            verbose: _configBool('verbose'),
-            environment: _configEnvironment,
-            packageRoot: path.join(_environment.rootPackage.dir,
-                                   "packages"),
-            analyzeAll: _configBool('analyzeAll'),
-            suppressWarnings: _configBool('suppressWarnings'),
-            suppressHints: _configBool('suppressHints'),
-            suppressPackageWarnings: _configBool(
-                'suppressPackageWarnings', defaultsTo: true),
-            terse: _configBool('terse'))).then((_) {
-          stopwatch.stop();
-          transform.logger.info("Took ${stopwatch.elapsed} to compile $id.");
-        });
+      // TODO(rnystrom): Should have more sophisticated error-handling here.
+      // Need to report compile errors to the user in an easily visible way.
+      // Need to make sure paths in errors are mapped to the original source
+      // path so they can understand them.
+      return Chain.track(dart.compile(
+          entrypoint, provider,
+          commandLineOptions: _configCommandLineOptions,
+          checked: _configBool('checked'),
+          minify: _configBool(
+              'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
+          verbose: _configBool('verbose'),
+          environment: _configEnvironment,
+          packageRoot: path.join(_environment.rootPackage.dir,
+                                 "packages"),
+          analyzeAll: _configBool('analyzeAll'),
+          suppressWarnings: _configBool('suppressWarnings'),
+          suppressHints: _configBool('suppressHints'),
+          suppressPackageWarnings: _configBool(
+              'suppressPackageWarnings', defaultsTo: true),
+          terse: _configBool('terse'),
+          includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE))
+          .then((_) {
+        stopwatch.stop();
+        transform.logger.info("Took ${stopwatch.elapsed} to compile $id.");
       });
     });
   }
@@ -209,6 +211,8 @@
   /// errors.
   var _isAborting = false;
 
+  final bool generateSourceMaps;
+
   compiler.Diagnostic _lastKind = null;
 
   static final int _FATAL =
@@ -218,7 +222,8 @@
       compiler.Diagnostic.INFO.ordinal |
       compiler.Diagnostic.VERBOSE_INFO.ordinal;
 
-  _BarbackCompilerProvider(this._environment, this._transform);
+  _BarbackCompilerProvider(this._environment, this._transform,
+      {this.generateSourceMaps: true});
 
   /// A [CompilerInputProvider] for dart2js.
   Future<String> provideInput(Uri resourceUri) {
@@ -242,6 +247,11 @@
     // for it.
     assert(name == "");
 
+    // TODO(rnystrom): Do this more cleanly. See: #17403.
+    if (!generateSourceMaps && extension.endsWith(".map")) {
+      return new NullSink<String>();
+    }
+
     var primaryId = _transform.primaryInput.id;
     var id = new AssetId(primaryId.package, "${primaryId.path}.$extension");
 
@@ -341,12 +351,11 @@
     // See if it's a path to a "public" asset within the root package. All
     // other files in the root package are not visible to transformers, so
     // should be loaded directly from disk.
-    var rootDir = _environment.rootPackage.dir;
     var sourcePath = path.fromUri(url);
-    if (isBeneath(sourcePath, path.join(rootDir, "lib")) ||
-        isBeneath(sourcePath, path.join(rootDir, "asset")) ||
-        isBeneath(sourcePath, path.join(rootDir, "web"))) {
-      var relative = path.relative(sourcePath, from: rootDir);
+    if (_environment.getPublicDirectories(_environment.rootPackage.name)
+        .any((dir) => path.isWithin(dir, sourcePath))) {
+      var relative = path.relative(sourcePath,
+          from: _environment.rootPackage.dir);
 
       return new AssetId(_environment.rootPackage.name, relative);
     }
@@ -354,3 +363,11 @@
     return null;
   }
 }
+
+/// An [EventSink] that discards all data. Provided to dart2js when we don't
+/// want an actual output.
+class NullSink<T> implements EventSink<T> {
+  void add(T event) {}
+  void addError(errorEvent, [StackTrace stackTrace]) {}
+  void close() {}
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 6907646..c155f32 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -47,6 +47,7 @@
     buffer.writeln();
     buffer.writeln('Global options:');
     buffer.writeln(pubArgParser.getUsage());
+    buffer.writeln();
     buffer.write(_listCommands(mainCommands));
     buffer.writeln();
     buffer.writeln(
@@ -59,7 +60,7 @@
   /// [commands].
   static void usageErrorWithCommands(Map<String, PubCommand> commands,
                                 String message) {
-    throw new UsageException("$message\n${_listCommands(commands)}");
+    throw new UsageException(message, _listCommands(commands));
   }
 
   /// Writes [commands] in a nicely formatted list to [buffer].
@@ -81,7 +82,6 @@
     var isSubcommand = commands != mainCommands;
 
     var buffer = new StringBuffer();
-    buffer.writeln();
     buffer.writeln('Available ${isSubcommand ? "sub" : ""}commands:');
     for (var name in names) {
       buffer.writeln('  ${padRight(name, length)}   '
@@ -190,10 +190,18 @@
   }
 
   // TODO(rnystrom): Use this in other places handle usage failures.
-  /// Throw an [ApplicationException] for a usage error of this command with
+  /// Throw a [UsageException] for a usage error of this command with
   /// [message].
   void usageError(String message) {
-    throw new UsageException("$message\n\n${_getUsage()}");
+    throw new UsageException(message, _getUsage());
+  }
+
+  /// Throw a [DataException] with [message] to indicate that the command has
+  /// failed because of invalid input data.
+  ///
+  /// This will report the error and cause pub to exit with [exit_codes.DATA].
+  void dataError(String message) {
+    throw new DataException(message);
   }
 
   /// Generates a string of usage information for this command.
@@ -203,8 +211,8 @@
 
     var commandUsage = commandParser.getUsage();
     if (!commandUsage.isEmpty) {
-      buffer.write('\n');
-      buffer.write(commandUsage);
+      buffer.writeln();
+      buffer.writeln(commandUsage);
     }
 
     if (subcommands.isNotEmpty) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 6373935..d57be72 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -33,10 +33,10 @@
 
   // TODO(nweiz): make this configurable.
   /// The path to the application's build output directory.
-  String get target => path.join(entrypoint.root.dir, 'build');
+  String get target => 'build';
 
   /// The build mode.
-  BarbackMode get mode => new BarbackMode(commandOptions['mode']);
+  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
 
   /// The number of files that have been built and written to disc so far.
   int builtFiles = 0;
@@ -45,19 +45,26 @@
   final buildDirectories = new Set<String>();
 
   BuildCommand() {
-    commandParser.addOption('mode', defaultsTo: BarbackMode.RELEASE.toString(),
-        help: 'Mode to run transformers in.');
+    commandParser.addOption("format",
+        help: "How output should be displayed.",
+        allowed: ["text", "json"], defaultsTo: "text");
 
-    commandParser.addFlag('all', help: "Build all buildable directories.",
+    commandParser.addOption("mode", defaultsTo: BarbackMode.RELEASE.toString(),
+        help: "Mode to run transformers in.");
+
+    commandParser.addFlag("all", help: "Build all buildable directories.",
         defaultsTo: false, negatable: false);
   }
 
   Future onRun() {
-    var exitCode = _parseBuildDirectories();
-    if (exitCode != exit_codes.SUCCESS) return flushThenExit(exitCode);
+    log.json.enabled = commandOptions["format"] == "json";
 
+    _parseBuildDirectories();
     cleanDir(target);
 
+    var errorsJson = [];
+    var logJson = [];
+
     // Since this server will only be hit by the transformer loader and isn't
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
@@ -69,8 +76,23 @@
       // by getAllAssets().
       environment.barback.errors.listen((error) {
         log.error(log.red("Build error:\n$error"));
+
+        if (log.json.enabled) {
+          // Wrap the error in a map in case we end up decorating it with more
+          // properties later.
+          errorsJson.add({
+            "error": error.toString()
+          });
+        }
       });
 
+      // If we're using JSON output, the regular server logging is disabled.
+      // Instead, we collect it here to include in the final JSON result.
+      if (log.json.enabled) {
+        environment.barback.log.listen(
+            (entry) => logJson.add(_logEntryToJson(entry)));
+      }
+
       return log.progress("Building ${entrypoint.root.name}",
           () => environment.barback.getAllAssets()).then((assets) {
         // Find all of the JS entrypoints we built.
@@ -80,7 +102,15 @@
 
         return Future.wait(assets.map(_writeAsset)).then((_) {
           builtFiles += _copyBrowserJsFiles(dart2JSEntrypoints);
-          log.message("Built $builtFiles ${pluralize('file', builtFiles)}!");
+          log.message('Built $builtFiles ${pluralize('file', builtFiles)} '
+              'to "$target".');
+
+          log.json.message({
+            "buildResult": "success",
+            "outputDirectory": target,
+            "numFiles": builtFiles,
+            "log": logJson
+          });
         });
       });
     }).catchError((error) {
@@ -89,6 +119,12 @@
       if (error is! BarbackException) throw error;
 
       log.error(log.red("Build failed."));
+      log.json.message({
+        "buildResult": "failure",
+        "errors": errorsJson,
+        "log": logJson
+      });
+
       return flushThenExit(exit_codes.DATA);
     });
   }
@@ -103,13 +139,12 @@
   ///
   /// Otherwise, all arguments should be the names of directories to include.
   ///
-  /// Returns the exit code of an error, or zero if it parsed correctly.
-  int _parseBuildDirectories() {
+  /// Throws an exception if the arguments are invalid.
+  void _parseBuildDirectories() {
     if (commandOptions["all"]) {
       if (commandOptions.rest.isNotEmpty) {
-        log.error(
+        usageError(
             'Build directory names are not allowed if "--all" is passed.');
-        return exit_codes.USAGE;
       }
 
       // Include every build directory that exists in the package.
@@ -119,13 +154,12 @@
       if (allowed.isEmpty) {
         var buildDirs = toSentence(ordered(_allowedBuildDirectories.map(
             (name) => '"$name"')));
-        log.error('There are no buildable directories.\n'
+        dataError('There are no buildable directories.\n'
                   'The supported directories are $buildDirs.');
-        return exit_codes.DATA;
       }
 
       buildDirectories.addAll(allowed);
-      return exit_codes.SUCCESS;
+      return;
     }
 
     buildDirectories.addAll(commandOptions.rest);
@@ -144,9 +178,8 @@
       var names = toSentence(ordered(disallowed).map((name) => '"$name"'));
       var allowed = toSentence(ordered(_allowedBuildDirectories.map(
           (name) => '"$name"')));
-      log.error('Unsupported build $dirs $names.\n'
-                'The allowed directories are $allowed.');
-      return exit_codes.USAGE;
+      usageError('Unsupported build $dirs $names.\n'
+                 'The allowed directories are $allowed.');
     }
 
     // Make sure all of the build directories exist.
@@ -154,15 +187,11 @@
         (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
 
     if (missing.length == 1) {
-      log.error('Directory "${missing.single}" does not exist.');
-      return exit_codes.DATA;
+      dataError('Directory "${missing.single}" does not exist.');
     } else if (missing.isNotEmpty) {
       var names = toSentence(ordered(missing).map((name) => '"$name"'));
-      log.error('Directories $names do not exist.');
-      return exit_codes.DATA;
+      dataError('Directories $names do not exist.');
     }
-
-    return exit_codes.SUCCESS;
   }
 
   /// Writes [asset] to the appropriate build directory.
@@ -277,7 +306,7 @@
   /// Ensures that the [name].js file is copied into [directory] in [target],
   /// under `packages/browser/`.
   void _addBrowserJs(String directory, String name) {
-    var jsPath = path.join(
+    var jsPath = path.join(entrypoint.root.dir,
         target, directory, 'packages', 'browser', '$name.js');
     ensureDir(path.dirname(jsPath));
 
@@ -286,4 +315,39 @@
     // directory.
     copyFile(path.join(entrypoint.packagesDir, 'browser', '$name.js'), jsPath);
   }
+
+  /// Converts [entry] to a JSON object for use with JSON-formatted output.
+  Map _logEntryToJson(LogEntry entry) {
+    var data = {
+      "level": entry.level.name,
+      "transformer": {
+        "name": entry.transform.transformer.toString(),
+        "primaryInput": {
+          "package": entry.transform.primaryId.package,
+          "path": entry.transform.primaryId.path
+        },
+      },
+      "assetId": {
+        "package": entry.assetId.package,
+        "path": entry.assetId.path
+      },
+      "message": entry.message
+    };
+
+    if (entry.span != null) {
+      data["span"] = {
+        "url": entry.span.sourceUrl,
+        "start": {
+          "line": entry.span.start.line,
+          "column": entry.span.start.column
+        },
+        "end": {
+          "line": entry.span.end.line,
+          "column": entry.span.end.column
+        },
+      };
+    }
+
+    return data;
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
index 31c6916..922a4aa 100644
--- a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -5,13 +5,10 @@
 library pub.command.list_package_dirs;
 
 import 'dart:async';
-import 'dart:convert';
 
 import 'package:path/path.dart' as path;
 
 import '../command.dart';
-import '../exit_codes.dart' as exit_codes;
-import '../io.dart';
 import '../log.dart' as log;
 
 /// Handles the `list-package-dirs` pub command.
@@ -27,10 +24,10 @@
   }
 
   Future onRun() {
+    log.json.enabled = true;
+
     if (!entrypoint.lockFileExists) {
-      log.error(JSON.encode(
-          'Package "myapp" has no lockfile. Please run "pub get" first.'));
-      return flushThenExit(exit_codes.NO_INPUT);
+      dataError('Package "myapp" has no lockfile. Please run "pub get" first.');
     }
 
     var output = {};
@@ -55,7 +52,7 @@
     output["input_files"] = [entrypoint.lockFilePath];
 
     return Future.wait(futures).then((_) {
-      log.message(JSON.encode(output));
+      log.json.message(output);
     });
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index eb7c517..9bf6876 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -153,7 +153,7 @@
     }
 
     var directories = commandOptions.rest.map(p.normalize).toList();
-    var invalid = directories.where((dir) => !isBeneath(dir, '.'));
+    var invalid = directories.where((dir) => !p.isWithin('.', dir));
     if (invalid.isNotEmpty) {
       usageError("${_directorySentence(invalid, "isn't", "aren't")} in this "
           "package.");
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index cc9146f..530c798 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
+
 import '../../../compiler/compiler.dart' as compiler;
 import '../../../compiler/implementation/filenames.dart'
     show appendSlash;
@@ -61,6 +62,7 @@
     bool suppressHints: false,
     bool suppressPackageWarnings: true,
     bool terse: false,
+    bool includeSourceMapUrls: false,
     bool toDart: false}) {
   return syncFuture(() {
     var options = <String>['--categories=Client,Server'];
@@ -74,6 +76,13 @@
     if (terse) options.add('--terse');
     if (toDart) options.add('--output-type=dart');
 
+    // Add the source map URLs.
+    if (includeSourceMapUrls) {
+      var sourceUrl = path.toUri(entrypoint);
+      options.add("--out=$sourceUrl.js");
+      options.add("--source-map=$sourceUrl.js.map");
+    }
+
     if (environment == null) environment = {};
     if (commandLineOptions != null) options.addAll(commandLineOptions);
 
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 918736a..c098eec 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -248,20 +248,33 @@
     });
   }
 
-  /// Warns users if they have directory or file named `assets` _anywhere_
-  /// inside `web` directory.
+  /// Warns users if they have directory or file named `assets` directly
+  /// inside a top-level directory.
   void _warnOnAssetsPaths() {
-    var webDir = path.join(root.dir, 'web');
-    if (!dirExists(webDir)) return;
+    var buffer = new StringBuffer();
 
-    listDir(webDir, recursive: true)
-      .where((p) => path.basename(p) == 'assets')
-      .forEach((p) {
-        var assetsPath = path.relative(p, from: root.dir);
-        log.warning(
+    warn(message) {
+      if (buffer.isEmpty) {
+        buffer.writeln(
             'Warning: Pub reserves paths containing "assets" for using assets '
-            'from packages. Please rename the path "$assetsPath".');
-      });
+            'from packages.');
+      }
+
+      buffer.writeln(message);
+    }
+
+    // Look inside all of the top-level directories.
+    for (var dir in ordered(listDir(root.dir))) {
+      var assetsPath = path.join(dir, "assets");
+      var relative = path.relative(assetsPath, from: root.dir);
+      if (dirExists(assetsPath)) {
+        warn('Please rename the directory "$relative".');
+      } else if (entryExists(assetsPath)) {
+        warn('Please rename the file "$relative".');
+      }
+    }
+
+    if (buffer.isNotEmpty) log.warning(buffer);
   }
 
   /// Loads the package graph for the application and all of its transitive
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index 79c2931..e05713d 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -31,13 +31,6 @@
 /// additional throughput.
 final _descriptorPool = new Pool(32);
 
-/// Returns whether or not [entry] is nested somewhere within [dir]. This just
-/// performs a path comparison; it doesn't look at the actual filesystem.
-bool isBeneath(String entry, String dir) {
-  var relative = path.relative(entry, from: dir);
-  return !path.isAbsolute(relative) && path.split(relative)[0] != '..';
-}
-
 /// Determines if a file or directory exists at [path].
 bool entryExists(String path) =>
   dirExists(path) || fileExists(path) || linkExists(path);
@@ -795,7 +788,7 @@
     baseDir = path.absolute(baseDir);
     contents = contents.map((entry) {
       entry = path.absolute(entry);
-      if (!isBeneath(entry, baseDir)) {
+      if (!path.isWithin(baseDir, entry)) {
         throw new ArgumentError('Entry $entry is not inside $baseDir.');
       }
       return path.relative(entry, from: baseDir);
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index fd1166d..07a1195 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -6,14 +6,21 @@
 library pub.log;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
+import 'package:stack_trace/stack_trace.dart';
 
 import 'io.dart';
 import 'transcript.dart';
 import 'utils.dart';
 
+/// The singleton instance so that we can have a nice api like:
+///
+///     log.json.error(...);
+final json = new _JsonLogger();
+
 typedef LogFn(Entry entry);
 final Map<Level, LogFn> _loggers = new Map<Level, LogFn>();
 
@@ -209,7 +216,9 @@
   if (_transcript == null) return;
 
   stderr.writeln('---- Log transcript ----');
-  _transcript.forEach(_logToStderrWithLabel, (discarded) {
+  _transcript.forEach((entry) {
+    _printToStream(stderr, entry, showLabel: true);
+  }, (discarded) {
     stderr.writeln('---- ($discarded discarded) ----');
   });
   stderr.writeln('---- End log transcript ----');
@@ -219,6 +228,8 @@
 /// future returned by [callback] completes. If anything else is logged during
 /// this, it cancels the progress.
 Future progress(String message, Future callback()) {
+  if (json.enabled) return callback();
+
   if (_progressTimer != null) throw new StateError("Already in progress.");
 
   _progressMessage = '$message...';
@@ -356,6 +367,12 @@
 }
 
 void _logToStream(IOSink sink, Entry entry, {bool showLabel}) {
+  if (json.enabled) return;
+
+  _printToStream(sink, entry, showLabel: showLabel);
+}
+
+void _printToStream(IOSink sink, Entry entry, {bool showLabel}) {
   _stopProgress();
 
   bool firstLine = true;
@@ -373,3 +390,35 @@
     firstLine = false;
   }
 }
+
+/// Namespace-like class for collecting the methods for JSON logging.
+class _JsonLogger {
+  /// Whether logging should use machine-friendly JSON output or human-friendly
+  /// text.
+  ///
+  /// If set to `true`, then no regular logging is printed. Logged messages
+  /// will still be recorded and displayed if the transcript is printed.
+  bool enabled = false;
+
+  /// Creates an error JSON object for [error] and prints it if JSON output
+  /// is enabled.
+  ///
+  /// Always prints to stdout.
+  void error(error, [stackTrace]) {
+    var errorJson = {"error": error.toString()};
+
+    if (stackTrace == null && error is Error) stackTrace = error.stackTrace;
+    if (stackTrace != null) {
+      errorJson["stackTrace"] = new Chain.forTrace(stackTrace).toString();
+    }
+
+    this.message(errorJson);
+  }
+
+  /// Encodes [message] to JSON and prints it if JSON output is enabled.
+  void message(message) {
+    if (!enabled) return;
+
+    print(JSON.encode(message));
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index ac8e6cd..e6344a4 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -221,8 +221,12 @@
           'Could not find a file named "pubspec.yaml" in "$packageDir".');
     }
 
-    return new Pubspec.parse(readTextFile(pubspecPath), sources,
-        expectedName: expectedName, location: pubspecUri);
+    try {
+      return new Pubspec.parse(readTextFile(pubspecPath), sources,
+          expectedName: expectedName, location: pubspecUri);
+    } on YamlException catch (error) {
+      throw new PubspecException(expectedName, pubspecUri, error.toString());
+    }
   }
 
   Pubspec(this._name, this._version, this._dependencies, this._devDependencies,
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index e9d4acb..2584bc4 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -859,7 +859,20 @@
 
 /// A class for command usage exceptions.
 class UsageException extends ApplicationException {
-  UsageException(String message)
+  /// The command usage information.
+  final String usage;
+
+  UsageException(String message, this.usage)
+      : super(message);
+
+  String toString() => "$message\n\n$usage";
+}
+
+/// A class for errors in a command's input data.
+///
+/// This corresponds to the [exit_codes.DATA] exit code.
+class DataException extends ApplicationException {
+  DataException(String message)
       : super(message);
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart b/sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart
index 7ff8ec7..546eb26 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart
@@ -54,7 +54,7 @@
 
     if (authors != null &&
         (authors is! List || authors.any((author) => author is! String))) {
-      errors.add('Your pubspec.yaml\'s "authors" field must be a string, but '
+      errors.add('Your pubspec.yaml\'s "authors" field must be a list, but '
           'it was "$authors".');
       return;
     }
diff --git a/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart b/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart
index 1a9e464..86171da 100644
--- a/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart
@@ -32,7 +32,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 5 files!"));
+        output: new RegExp(r'Built 5 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart b/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart
index c83d94c..32ee191 100644
--- a/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart
@@ -18,4 +18,16 @@
                '"test" and "web".',
         exitCode: exit_codes.DATA);
   });
+
+  integration("build --all --format json with no buildable directories", () {
+    d.appDir().create();
+
+    schedulePub(args: ["build", "--all", "--format", "json"],
+        outputJson: {'error':
+          'There are no buildable directories.\n'
+          'The supported directories are "benchmark", "bin", "example", '
+          '"test" and "web".'
+        },
+        exitCode: exit_codes.DATA);
+  });
 }
diff --git a/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart b/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart
index d662147..c6f9531 100644
--- a/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart
+++ b/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart
@@ -23,7 +23,7 @@
     ]).create();
 
     schedulePub(args: ["build", "example", "test"],
-        output: new RegExp(r"Built 2 files!"));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/cleans_entire_build_directory_test.dart b/sdk/lib/_internal/pub/test/build/cleans_entire_build_directory_test.dart
index 142914a..16d25c2 100644
--- a/sdk/lib/_internal/pub/test/build/cleans_entire_build_directory_test.dart
+++ b/sdk/lib/_internal/pub/test/build/cleans_entire_build_directory_test.dart
@@ -21,11 +21,11 @@
 
     // Make a build directory containing "example".
     schedulePub(args: ["build", "example"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     // Now build again with just "test". Should wipe out "example".
     schedulePub(args: ["build", "test"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart
index 68edc38..0b1632e 100644
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart
+++ b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart
@@ -27,20 +27,18 @@
     ]).create();
 
     schedulePub(args: ["build", "benchmark"],
-        output: new RegExp(r"Built 6 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('benchmark', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.nothing('file.dart'),
           d.nothing('lib.dart'),
           d.dir('subdir', [
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
             d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty)),
             d.nothing('subfile.dart')
           ])
         ])
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart
index 5b54d3a..0ced048 100644
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart
+++ b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart
@@ -27,20 +27,18 @@
     ]).create();
 
     schedulePub(args: ["build", "example"],
-        output: new RegExp(r"Built 6 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('example', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.nothing('file.dart'),
           d.nothing('lib.dart'),
           d.dir('subdir', [
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
             d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty)),
             d.nothing('subfile.dart')
           ])
         ])
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart
index 2b585d4..8d03346 100644
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart
+++ b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart
@@ -27,20 +27,18 @@
     ]).create();
 
     schedulePub(args: ["build", "test"],
-        output: new RegExp(r"Built 6 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('test', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.nothing('file.dart'),
           d.nothing('lib.dart'),
           d.dir('subdir', [
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
             d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty)),
             d.nothing('subfile.dart')
           ])
         ])
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart
index ec942b6..9ceaead 100644
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart
+++ b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart
@@ -27,20 +27,18 @@
     ]).create();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 6 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('web', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.nothing('file.dart'),
           d.nothing('lib.dart'),
           d.dir('subdir', [
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
             d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty)),
             d.nothing('subfile.dart')
           ])
         ])
diff --git a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
index 43e779c..80c1f55 100644
--- a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
@@ -37,14 +37,13 @@
     pubGet();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 20 files!"));
+        output: new RegExp(r'Built 16 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('example', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.dir('packages', [d.dir('browser', [
             d.file('dart.js', 'contents of dart.js'),
             d.file('interop.js', 'contents of interop.js')
@@ -56,13 +55,11 @@
             ])]),
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
             d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty))
           ])
         ]),
         d.dir('web', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.dir('packages', [d.dir('browser', [
             d.file('dart.js', 'contents of dart.js'),
             d.file('interop.js', 'contents of interop.js')
@@ -73,8 +70,7 @@
               d.file('interop.js', 'contents of interop.js')
             ])]),
             d.matcherFile('subfile.dart.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.js.map', isNot(isEmpty))
+            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty))
           ])
         ])
       ])
diff --git a/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dependency_override_test.dart b/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dependency_override_test.dart
index 7d2bb90..59d0ace 100644
--- a/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dependency_override_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dependency_override_test.dart
@@ -36,7 +36,7 @@
     pubGet();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 5 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dev_dependency_test.dart b/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dev_dependency_test.dart
index 3849227..831de86 100644
--- a/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dev_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_browser_js_with_dev_dependency_test.dart
@@ -36,7 +36,7 @@
     pubGet();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 5 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart b/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
index 76abba2..fecee29 100644
--- a/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
@@ -24,7 +24,7 @@
     ]).create();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 2 files!"));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart b/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
index d5d9b88..3218499 100644
--- a/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
@@ -47,14 +47,13 @@
     ]).create();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 3 files!"));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('web', [
           d.matcherFile('main.dart.js', isNot(isEmpty)),
-          d.matcherFile('main.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('main.dart.js.map', isNot(isEmpty))
+          d.matcherFile('main.dart.precompiled.js', isNot(isEmpty))
         ])
       ])
     ]).validate();
diff --git a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
index 5cd9dcf..3f3868c 100644
--- a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
+++ b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
@@ -15,7 +15,31 @@
     ]).create();
 
     schedulePub(args: ["build", "example", "--all"],
-        error: 'Build directory names are not allowed if "--all" is passed.',
+        error: '''
+            Build directory names are not allowed if "--all" is passed.
+
+            Usage: pub build [options]
+            -h, --help      Print usage information for this command.
+                --format    How output should be displayed.
+                            [text (default), json]
+
+                --mode      Mode to run transformers in.
+                            (defaults to "release")
+
+                --all       Build all buildable directories.''',
         exitCode: exit_codes.USAGE);
   });
+
+  integration("does not allow directory names with --all with JSON output", () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    schedulePub(args: ["build", "example", "--all", "--format", "json"],
+        outputJson: {
+          "error": 'Build directory names are not allowed if "--all" is passed.'
+        },
+        exitCode: exit_codes.USAGE);
+  });
+
 }
diff --git a/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart b/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
index 78ddcf7..fe9bc0d 100644
--- a/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
+++ b/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
@@ -55,7 +55,7 @@
     ]).create();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 2 files!"));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart
index 27fd082..0f41ae1 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart
@@ -20,7 +20,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart
index 148d5db..0ec7d0e 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart
@@ -20,7 +20,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart
index e42d762..cc543f4 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart
@@ -20,7 +20,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart b/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart
index f9d16c6..feb904b 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart
@@ -31,8 +31,8 @@
       ])
     ]).create();
 
-    schedulePub(args: ["build"],
-        output: new RegExp(r"Built 6 files!"));
+    schedulePub(args: ["build", "--mode", "debug"],
+        output: new RegExp(r'Built 8 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart b/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
index d4f3f64..fea77a6 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
+++ b/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
@@ -20,7 +20,7 @@
     ]).create();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 0 files!"));
+        output: new RegExp(r'Built 0 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart
index 6af3a81..6661940 100644
--- a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart
+++ b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart
@@ -41,7 +41,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 7 files!"));
+        output: new RegExp(r'Built 7 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
index 35bda64..380a115 100644
--- a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
@@ -41,7 +41,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--all"],
-        output: new RegExp(r"Built 7 files!"));
+        output: new RegExp(r'Built 7 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/includes_dart_files_from_dependencies_in_debug_test.dart b/sdk/lib/_internal/pub/test/build/includes_dart_files_from_dependencies_in_debug_test.dart
index f8a719b..577282e 100644
--- a/sdk/lib/_internal/pub/test/build/includes_dart_files_from_dependencies_in_debug_test.dart
+++ b/sdk/lib/_internal/pub/test/build/includes_dart_files_from_dependencies_in_debug_test.dart
@@ -38,7 +38,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--mode", "debug", "example"],
-        output: new RegExp(r"Built 4 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart b/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart
index 54130274..5b7ed18 100644
--- a/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/build/includes_dart_files_in_debug_mode_test.dart
@@ -22,7 +22,7 @@
     ]).create();
 
     schedulePub(args: ["build", "--mode", "debug"],
-        output: new RegExp(r"Built 4 files!"));
+        output: new RegExp(r'Built 4 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart
index dc6ec8db..ee64895 100644
--- a/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart
@@ -24,4 +24,25 @@
         error: 'Directories "benchmark" and "test" do not exist.',
         exitCode: exit_codes.DATA);
   });
+
+  integration("fails if any specified build directories don't exist with JSON "
+      "output", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('example', [
+        d.file('file.txt', 'example')
+      ]),
+      d.dir('web', [
+        d.file('file.txt', 'test')
+      ])
+    ]).create();
+
+    schedulePub(args: ["build", "benchmark", "example", "test", "web",
+                       "--format", "json"],
+        outputJson: {
+          "error": 'Directories "benchmark" and "test" do not exist.'
+        },
+        exitCode: exit_codes.DATA);
+  });
+
 }
diff --git a/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart b/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart
index ccf4264..953ee74 100644
--- a/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart
+++ b/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart
@@ -16,4 +16,15 @@
         error: 'Directory "web" does not exist.',
         exitCode: exit_codes.DATA);
   });
+
+  integration("fails if 'web' doesn't exist and no directory is specified "
+      "with JSON output", () {
+    d.appDir().create();
+
+    schedulePub(args: ["build", "--format", "json"],
+        outputJson: {
+          "error": 'Directory "web" does not exist.'
+        },
+        exitCode: exit_codes.DATA);
+  });
 }
diff --git a/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart b/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart
index 699cc73..55badf8 100644
--- a/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart
+++ b/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart
@@ -23,7 +23,7 @@
     ]).create();
 
     schedulePub(args: ["build", "example"],
-        output: new RegExp(r"Built 2 files!"));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart b/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart
new file mode 100644
index 0000000..074690a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) => throw new Exception('oh no!');
+}
+""";
+
+main() {
+  initConfig();
+  integration("outputs error to JSON in a failed build", () {
+    // Loading transformers takes several seconds, so make sure we don't
+    // timeout.
+    currentSchedule.timeout *= 2;
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("transformer.dart", TRANSFORMER)
+      ]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    schedulePub(args: ["build", "--format", "json"],
+        outputJson: {
+          "buildResult": "failure",
+          "errors": [
+            {
+              "error": startsWith(
+                  "Transform Rewrite on myapp|web/foo.txt threw error: oh no!")
+            }
+          ],
+          "log": []
+        },
+        exitCode: exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart b/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart
new file mode 100644
index 0000000..c641f18
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/outputs_results_to_json_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  integration("outputs results to JSON in a successful build", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('main.dart', 'void main() => print("hello");')
+      ])
+    ]).create();
+
+    schedulePub(args: ["build", "--format", "json"],
+        outputJson: {
+          'buildResult': 'success',
+          'outputDirectory': 'build',
+          'numFiles': 2,
+          'log': [
+            {
+              'level': 'Info',
+              'transformer': {
+                'name': 'Dart2JS',
+                'primaryInput': {'package': 'myapp', 'path': 'web/main.dart'}
+              },
+              'assetId': {'package': 'myapp', 'path': 'web/main.dart'},
+              'message': 'Compiling myapp|web/main.dart...'
+            },
+            {
+              'level': 'Info',
+              'transformer': {
+                'name': 'Dart2JS',
+                'primaryInput': {'package': 'myapp', 'path': 'web/main.dart'}
+              },
+              'assetId': {'package': 'myapp', 'path': 'web/main.dart'},
+              'message': contains(r'to compile myapp|web/main.dart.')
+            }
+          ]
+        });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
index c05eab5..bd0db68 100644
--- a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
@@ -27,16 +29,25 @@
       ])
     ]).create();
 
-    schedulePub(args: ["build"],
-        // TODO(rnystrom): Figure out why dart2js errors aren't deterministic.
-        // Use a lookahead regexp to do two searches in one regexp.
-        // Checked all non-matching cases for bad performance.
-        error: new RegExp(
-            r"(?=(.|\n)*^Error on line 1 of .*[/\\]file\.dart:)"
-            r"(.|\n)*^Error on line 1 of .*[/\\]subfile\.dart:",
-            multiLine: true),
-        output: new RegExp(r"Building myapp\.\.\.*"),
-        exitCode: exit_codes.DATA);
+    var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Building myapp..."));
+
+    var consumeFile = consumeThrough(inOrder([
+      "[Error from Dart2JS]:",
+      startsWith(p.join("web", "file.dart") + ":")
+    ]));
+    var consumeSubfile = consumeThrough(inOrder([
+      "[Error from Dart2JS]:",
+      startsWith(p.join("web", "subdir", "subfile.dart") + ":")
+    ]));
+
+    // It's nondeterministic what order the dart2js transformers start running,
+    // so we allow the error messages to be emitted in either order.
+    pub.stderr.expect(either(
+        inOrder([consumeFile, consumeSubfile]),
+        inOrder([consumeSubfile, consumeFile])));
+
+    pub.shouldExit(exit_codes.DATA);
 
     // Doesn't output anything if an error occurred.
     d.dir(appPath, [
diff --git a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
index 7e3c203..73b2b65 100644
--- a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
@@ -13,9 +13,33 @@
     d.appDir().create();
 
     schedulePub(args: ["build", "foo", "bar"],
-        error: 'Unsupported build directories "bar" and "foo".\n'
-               'The allowed directories are "benchmark", "bin", "example", '
-                   '"test" and "web".',
+        error: '''
+            Unsupported build directories "bar" and "foo".
+            The allowed directories are "benchmark", "bin", "example", "test" and "web".
+
+            Usage: pub build [options]
+            -h, --help      Print usage information for this command.
+                --format    How output should be displayed.
+                            [text (default), json]
+
+                --mode      Mode to run transformers in.
+                            (defaults to "release")
+
+                --all       Build all buildable directories.''',
+        exitCode: exit_codes.USAGE);
+  });
+
+  integration("fails if given directories are not buildable with json "
+      "output", () {
+    d.appDir().create();
+
+    schedulePub(args: ["build", "foo", "bar", "--format", "json"],
+        outputJson: {
+          "error":
+            'Unsupported build directories "bar" and "foo".\n'
+            'The allowed directories are "benchmark", "bin", "example", '
+                '"test" and "web".'
+        },
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/build/warns_on_assets_paths_test.dart b/sdk/lib/_internal/pub/test/build/warns_on_assets_paths_test.dart
index 963ebf1..bd3bb4e 100644
--- a/sdk/lib/_internal/pub/test/build/warns_on_assets_paths_test.dart
+++ b/sdk/lib/_internal/pub/test/build/warns_on_assets_paths_test.dart
@@ -6,92 +6,74 @@
 
 import 'package:path/path.dart' as path;
 
-import '../../lib/src/utils.dart';
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
-getWarningRegExp(String assetsPath) {
-  // Escape backslashes since they are metacharacters in a regex.
-  assetsPath = quoteRegExp(assetsPath);
-  return new RegExp(
-      '^Warning: Pub reserves paths containing "assets" for using assets from '
-      'packages\\. Please rename the path "$assetsPath"\\.\$');
-}
-
 main() {
   initConfig();
 
-  integration('warns user about assets dir in the root of "web"', () {
+  integration('warns user about top-level "assets" directories', () {
     d.dir(appPath, [
       d.appPubspec(),
+      d.dir('bin', [
+        d.dir('assets')
+      ]),
+      d.dir('test', [
+        d.dir('assets')
+      ]),
       d.dir('web', [
         d.file('index.html'),
         d.dir('assets')
       ])
     ]).create();
 
-    var assetsPath = path.join('web', 'assets');
-    schedulePub(args: ['build'],
-        error: getWarningRegExp(assetsPath));
+    schedulePub(args: ['build', 'bin', 'test', 'web'],
+        error: """
+Warning: Pub reserves paths containing "assets" for using assets from packages.
+Please rename the directory "${path.join('bin', 'assets')}".
+Please rename the directory "${path.join('test', 'assets')}".
+Please rename the directory "${path.join('web', 'assets')}".
+""");
   });
 
-  integration('warns user about assets dir nested anywhere in "web"', () {
+  integration('warns user about top-level "assets" files', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('bin', [
+        d.file('assets', '...')
+      ]),
+      d.dir('test', [
+        d.file('assets', '...')
+      ]),
+      d.dir('web', [
+        d.file('index.html'),
+        d.file('assets', '...')
+      ])
+    ]).create();
+
+    schedulePub(args: ['build', 'bin', 'test', 'web'],
+        error: """
+Warning: Pub reserves paths containing "assets" for using assets from packages.
+Please rename the file "${path.join('bin', 'assets')}".
+Please rename the file "${path.join('test', 'assets')}".
+Please rename the file "${path.join('web', 'assets')}".
+""");
+  });
+
+  integration('does not warn on "assets" in subdirectories', () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir('web', [
         d.file('index.html'),
         d.dir('foo', [
           d.dir('assets')
+        ]),
+        d.dir('bar', [
+          d.file('assets', '...')
         ])
       ])
     ]).create();
 
-    var assetsPath = path.join('web', 'foo', 'assets');
-    schedulePub(args: ['build'],
-        error: getWarningRegExp(assetsPath));
-  });
-
-  integration('warns user about assets file in the root of "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.file('assets')
-      ])
-    ]).create();
-
-    var assetsPath = path.join('web', 'assets');
-    schedulePub(args: ['build'],
-        error: getWarningRegExp(assetsPath));
-  });
-
-  integration('warns user about assets file nested anywhere in "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.dir('foo', [
-          d.file('assets')
-        ])
-      ])
-    ]).create();
-
-    var assetsPath = path.join('web', 'foo', 'assets');
-    schedulePub(args: ['build'],
-        error: getWarningRegExp(assetsPath));
-  });
-
-  integration('does not warn if no assets dir or file anywhere in "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.dir('foo')
-      ])
-    ]).create();
-
-    schedulePub(args: ['build'],
-        error: new RegExp(
-            r'^(?!Warning: Pub reserves paths containing "assets").*$'));
+    schedulePub(args: ['build'], error: new RegExp(r"^$"));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
index 5d7446c..3bbc72a 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
@@ -15,9 +15,10 @@
     ]).create();
 
     schedulePub(args: ["list-package-dirs", "--format=json"],
-        error: '''
-        "Package \\"myapp\\" has no lockfile. Please run \\"pub get\\" first."
-        ''',
-        exitCode: exit_codes.NO_INPUT);
+        outputJson: {
+          "error":
+            'Package "myapp" has no lockfile. Please run "pub get" first.'
+        },
+        exitCode: exit_codes.DATA);
   });
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/package_files_test.dart b/sdk/lib/_internal/pub/test/package_files_test.dart
index 6f104bd..9598c76 100644
--- a/sdk/lib/_internal/pub/test/package_files_test.dart
+++ b/sdk/lib/_internal/pub/test/package_files_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library lock_file_test;
+library packages_files_test;
 
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart
new file mode 100644
index 0000000..81d6c00
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't crash if an unused .dart file has a syntax error", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", REWRITE_TRANSFORMER),
+        d.file("unused.dart", "(*&^#@")
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    var server = pubServe();
+    server.stderr.expect("[RewriteImport]:");
+    server.stderr.expect(startsWith("Error in myapp|lib/src/unused.dart:"));
+    requestShouldSucceed("foo.out", "foo.out");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/warns_on_assets_paths_test.dart b/sdk/lib/_internal/pub/test/serve/warns_on_assets_paths_test.dart
index 05f9933..3d16fd1 100644
--- a/sdk/lib/_internal/pub/test/serve/warns_on_assets_paths_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/warns_on_assets_paths_test.dart
@@ -8,25 +8,21 @@
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../lib/src/utils.dart';
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import 'utils.dart';
 
-getWarningRegExp(String assetsPath) {
-  // Escape backslashes since they are metacharacters in a regex.
-  assetsPath = quoteRegExp(assetsPath);
-  return new RegExp(
-      r'^Warning: Pub reserves paths containing "assets" for using assets from '
-      'packages\\. Please rename the path "$assetsPath"\\.\$');
-}
-
 main() {
   initConfig();
-
-  integration('warns user about assets dir in the root of "web"', () {
+  integration('warns user about top-level "assets" directories', () {
     d.dir(appPath, [
       d.appPubspec(),
+      d.dir('bin', [
+        d.dir('assets')
+      ]),
+      d.dir('test', [
+        d.dir('assets')
+      ]),
       d.dir('web', [
         d.file('index.html'),
         d.dir('assets')
@@ -36,80 +32,56 @@
     var pub = pubServe();
     waitForBuildSuccess();
 
-    var assetsPath = path.join('web', 'assets');
-    pub.stderr.expect(consumeThrough(matches(getWarningRegExp(assetsPath))));
+    pub.stderr.expect(emitsLines('''
+Warning: Pub reserves paths containing "assets" for using assets from packages.
+Please rename the directory "${path.join('bin', 'assets')}".
+Please rename the directory "${path.join('test', 'assets')}".
+Please rename the directory "${path.join('web', 'assets')}".'''));
     endPubServe();
   });
 
-  integration('warns user about assets dir nested anywhere in "web"', () {
+  integration('warns user about top-level "assets" files', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('bin', [
+        d.file('assets', '...')
+      ]),
+      d.dir('test', [
+        d.file('assets', '...')
+      ]),
+      d.dir('web', [
+        d.file('index.html'),
+        d.file('assets', '...')
+      ])
+    ]).create();
+
+    var pub = pubServe();
+    waitForBuildSuccess();
+    pub.stderr.expect(emitsLines('''
+Warning: Pub reserves paths containing "assets" for using assets from packages.
+Please rename the file "${path.join('bin', 'assets')}".
+Please rename the file "${path.join('test', 'assets')}".
+Please rename the file "${path.join('web', 'assets')}".'''));
+    endPubServe();
+  });
+
+  integration('does not warn on "assets" in subdirectories', () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir('web', [
         d.file('index.html'),
         d.dir('foo', [
           d.dir('assets')
+        ]),
+        d.dir('bar', [
+          d.file('assets', '...')
         ])
       ])
     ]).create();
 
     var pub = pubServe();
     waitForBuildSuccess();
-
-    var assetsPath = path.join('web', 'foo', 'assets');
-    pub.stderr.expect(consumeThrough(matches(getWarningRegExp(assetsPath))));
     endPubServe();
-  });
-
-  integration('warns user about assets file in the root of "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.file('assets')
-      ])
-    ]).create();
-
-    var pub = pubServe();
-    waitForBuildSuccess();
-
-    var assetsPath = path.join('web', 'assets');
-    pub.stderr.expect(consumeThrough(matches(getWarningRegExp(assetsPath))));
-    endPubServe();
-  });
-
-  integration('warns user about assets file nested anywhere in "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.dir('foo', [
-          d.file('assets')
-        ])
-      ])
-    ]).create();
-
-    var pub = pubServe();
-    waitForBuildSuccess();
-
-    var assetsPath = path.join('web', 'foo', 'assets');
-    pub.stderr.expect(consumeThrough(matches(getWarningRegExp(assetsPath))));
-    endPubServe();
-  });
-
-  integration('does not warn if no assets dir or file anywhere in "web"', () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('index.html'),
-        d.dir('foo')
-      ])
-    ]).create();
-
-    var pub = pubServe();
-    waitForBuildSuccess();
-    endPubServe();
-
-    pub.stderr.expect(never(startsWith('Warning: Pub reserves paths containing '
-        '"assets"')));
+    pub.stderr.expect(never(contains("Warning")));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_root_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_root_directory_test.dart
deleted file mode 100644
index 4913344..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_root_directory_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:path/path.dart' as path;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("assetIdToUrls handles files in the top-level directory", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.file("top.txt", "top"),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ])
-    ]).create();
-
-    pubServe(args: [".", "web", path.join("web", "sub")]);
-
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "top.txt"
-      }, replyEquals: {
-        "urls": [
-          getServerUrl(".", "top.txt")
-        ]
-      });
-
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/sub/bar.html"
-      }, replyEquals: {
-        "urls": [
-          getServerUrl("web", "sub/bar.html"),
-          getServerUrl(".", "web/sub/bar.html"),
-          getServerUrl(path.join("web", "sub"), "bar.html")
-        ]
-      });
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index ac4bbb8..2ed23a9 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -381,8 +381,11 @@
 /// Schedules a call to the Pub command-line utility.
 ///
 /// Runs Pub with [args] and validates that its results match [output] (or
-/// [outputJson]), [error], and [exitCode]. If [outputJson] is given, validates
-/// that pub outputs stringified JSON matching that object.
+/// [outputJson]), [error], and [exitCode].
+///
+/// If [outputJson] is given, validates that pub outputs stringified JSON
+/// matching that object, which can be a literal JSON object or any other
+/// [Matcher].
 void schedulePub({List args, Pattern output, Pattern error, outputJson,
     Future<Uri> tokenEndpoint, int exitCode: exit_codes.SUCCESS}) {
   // Cannot pass both output and outputJson.
@@ -812,6 +815,8 @@
   }
 }
 
+/// Validates that [actualText] is a string of JSON that matches [expected],
+/// which may be a literal JSON object, or any other [Matcher].
 void _validateOutputJson(List<String> failures, String pipe,
                          expected, String actualText) {
   var actual;
@@ -824,8 +829,8 @@
     failures.add(actualText);
   }
 
-  // Do a deep comparison of the JSON objects.
-  expect(actual, equals(expected));
+  // Match against the expectation.
+  expect(actual, expected);
 }
 
 /// A function that creates a [Validator] subclass.
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
new file mode 100644
index 0000000..b41e0ca
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  // This is a regression test for issue 17198.
+  initConfig();
+  integration("compiles a Dart file that imports a generated file to JS "
+      "outside web/", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "version": "0.0.1",
+        "transformers": ["myapp/transformer"]
+      }),
+      d.dir("lib", [
+        d.file("transformer.dart", dartTransformer("munge"))
+      ]),
+      d.dir("test", [
+        d.file("main.dart", """
+import "other.dart";
+void main() => print(TOKEN);
+"""),
+d.file("other.dart", """
+library other;
+const TOKEN = "before";
+""")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe(args: ["test"]);
+    requestShouldSucceed("main.dart.js", contains("(before, munge)"),
+        root: "test");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart
index ba124f4..28e9acf 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart
@@ -4,6 +4,8 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_stream.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 import '../../serve/utils.dart';
@@ -30,8 +32,8 @@
     requestShould404("syntax-error.dart.js");
     server.stdout.expect(emitsLines(
         "[Info from Dart2JS]:\n"
-        "Compiling myapp|web/syntax-error.dart...\n"
-        "Build completed with 1 errors."));
+        "Compiling myapp|web/syntax-error.dart..."));
+    server.stdout.expect(consumeThrough("Build completed with 1 errors."));
     endPubServe();
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart
new file mode 100644
index 0000000..c59a9cc
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("includes source map URLs in a debug build", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("main.dart", "void main() => print('hello');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["build", "--mode", "debug"],
+        output: new RegExp(r'Built 4 files to "build".'),
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('web', [
+          d.matcherFile('main.dart.js',
+              contains("# sourceMappingURL=main.dart.js.map")),
+          d.matcherFile('main.dart.js.map', contains('"file": "main.dart.js"'))
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart
new file mode 100644
index 0000000..e4548d6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("omits source maps from a release build", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("main.dart", "void main() => print('hello');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["build"],
+        output: new RegExp(r'Built 2 files to "build".'),
+        exitCode: 0);
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('web', [
+          d.nothing('main.dart.js.map')
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart
index e407ee4..c85d023 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart
@@ -69,7 +69,7 @@
     pubGet();
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 5 files!"),
+        output: new RegExp(r'Built 4 files to "build".'),
         exitCode: 0);
 
     d.dir(appPath, [
@@ -77,7 +77,6 @@
         d.dir('web', [
           d.matcherFile('file.dart.js', isMinifiedDart2JSOutput),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.js.map', isNot(isEmpty)),
           d.dir('packages', [
             d.dir('browser', [
               d.file('dart.js', 'contents of dart.js'),
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
index 4a617ef..6d3e8a8 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
@@ -30,7 +30,8 @@
     createLockFile('myapp', pkg: ['barback']);
 
     var pub = startPubServe();
-    pub.stderr.expect(startsWith('Error on line'));
+    pub.stderr.expect('[RewriteImport]:');
+    pub.stderr.expect(startsWith('Error in'));
     pub.shouldExit(1);
     pub.stderr.expect(never(contains('This is an unexpected error')));
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart
index b077d71..6fbc0b0 100644
--- a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart
@@ -47,7 +47,7 @@
     createLockFile('myapp', pkg: ['barback']);
 
     schedulePub(args: ["build"],
-        output: new RegExp(r"Built 1 file!"));
+        output: new RegExp(r'Built 1 file to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index b7ad177..5e02069 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -7,21 +7,25 @@
 /**
  * An object representing a delayed computation.
  *
- * A [Future] is used to obtain a not yet
- * available value, or error, sometime in the future.  Receivers of a
- * [Future] can register callbacks that handle the value or error once it is
- * available. For example:
+ * A [Future] is used to represent a potential value, or error,
+ * that will be available at some time in the future.
+ * Receivers of a [Future] can register callbacks
+ * that handle the value or error once it is available.
+ * For example:
  *
  *     Future<int> future = getFuture();
  *     future.then((value) => handleValue(value))
  *           .catchError((error) => handleError(error));
  *
- * A [Future] can be completed in two ways: with a value ("the future succeeds")
- * or with an error ("the future fails"). Users can install callbacks for each
- * case. The result of registering a pair of callbacks is a new Future (the
+ * A [Future] can complete in two ways:
+ * with a value ("the future succeeds")
+ * or with an error ("the future fails").
+ * Users can install callbacks for each case.
+ * The result of registering a pair of callbacks is a new Future (the
  * "successor") which in turn is completed with the result of invoking the
- * corresponding callback. The successor is completed with an error if the
- * invoked callback throws. For example:
+ * corresponding callback.
+ * The successor is completed with an error if the invoked callback throws.
+ * For example:
  *
  *     Future<int> successor = future.then((int value) {
  *         // Invoked when the future is completed with a value.
@@ -36,31 +40,33 @@
  *         }
  *       });
  *
- * If a future does not have a successor but is completed with an error, it
- * forwards the error message to the global error-handler. This special casing
- * makes sure that no error is silently dropped. However, it also means that
- * error handlers should be installed early, so that they are present as soon
- * as a future is completed with an error. The following example demonstrates
- * this potential bug:
+ * If a future does not have a successor when it completes with an error,
+ * it forwards the error message to the global error-handler.
+ * This behavior makes sure that no error is silently dropped.
+ * However, it also means that error handlers should be installed early,
+ * so that they are present as soon as a future is completed with an error.
+ * The following example demonstrates this potential bug:
  *
  *     var future = getFuture();
  *     new Timer(new Duration(milliseconds: 5), () {
- *       // The error-handler is only attached 5ms after the future has been
- *       // received. If the future fails in the mean-time it will forward the
- *       // error to the global error-handler, even though there is code (just
- *       // below) to handle the error.
+ *       // The error-handler is not attached until 5 ms after the future has
+ *       // been received. If the future fails before that, the error is
+ *       // forwarded to the global error-handler, even though there is code
+ *       // (just below) to eventually handle the error.
  *       future.then((value) { useValue(value); },
  *                   onError: (e) { handleError(e); });
  *     });
  *
- * In general we discourage registering the two callbacks at the same time, but
- * prefer to use [then] with one argument (the value handler), and to use
- * [catchError] for handling errors. The missing callbacks (the error-handler
- * for [then], and the value-handler for [catchError]), are automatically
- * configured to "forward" the value/error. Separating value and error-handling
- * into separate registration calls usually leads to code that is easier to
- * reason about. In fact it makes asynchronous code very similar to synchronous
- * code:
+ * When registering callbacks, it's often more readable to register the two
+ * callbacks separately, by first using [then] with one argument
+ * (the value handler) and using a second [catchError] for handling errors.
+ * Each of these will forward the result that they don't handle
+ * to their successors, and together they handle both value and error result.
+ * It also has the additional benefit of the [catchError] handling errors in the
+ * [then] value callback too.
+ * Using sequential handlers instead of parallel ones often leads to code that
+ * is easier to reason about.
+ * It also makes asynchronous code very similar to synchronous code:
  *
  *     // Synchronous code.
  *     try {
@@ -70,21 +76,23 @@
  *       return 499;
  *     }
  *
- *  Equivalent asynchronous code, based on futures:
+ * Equivalent asynchronous code, based on futures:
  *
- *     Future<int> future = foo();  // foo now returns a future.
+ *     Future<int> future = new Future(foo);  // Result of foo() as a future.
  *     future.then((int value) => bar(value))
  *           .catchError((e) => 499);
  *
  * Similar to the synchronous code, the error handler (registered with
- * [catchError]) is handling the errors for exceptions coming from calls to
- * 'foo', as well as 'bar'. This would not be the case if the error-handler was
- * registered at the same time as the value-handler.
+ * [catchError]) is handling any errors thrown by either `foo` or `bar`.
+ * If the error-handler had been registered as the `onError` parameter of
+ * the `then` call, it would not catch errors from the `bar` call.
  *
- * Futures can have more than one callback-pairs registered. Each successor is
+ * Futures can have more than one callback-pair registered. Each successor is
  * treated independently and is handled as if it was the only successor.
+ *
+ * A future may also fail to ever complete. In that case, no callbacks are
+ * called.
  */
-// TODO(floitsch): document chaining.
 abstract class Future<T> {
   // The `_nullFuture` is a completed Future with the value `null`.
   static final _Future _nullFuture = new Future.value(null);
@@ -100,7 +108,8 @@
    * the created future will wait until the returned future completes,
    * and will then complete with the same result.
    *
-   * If a value is returned, it becomes the result of the created future.
+   * If a non-future value is returned, the returned future is completed
+   * with that value.
    */
   factory Future(computation()) {
     _Future result = new _Future<T>();
@@ -118,14 +127,15 @@
    * Creates a future containing the result of calling [computation]
    * asynchronously with [scheduleMicrotask].
    *
-   * If the result of executing [computation] throws, the returned future is
-   * completed with the error.
+   * If executing [computation] throws,
+   * the returned future is completed with the thrown error.
    *
-   * If the returned value is itself a [Future], completion of
+   * If calling [computation] returns a [Future], completion of
    * the created future will wait until the returned future completes,
    * and will then complete with the same result.
    *
-   * If a value is returned, it becomes the result of the created future.
+   * If calling [computation] returns a non-future value,
+   * the returned future is completed with that value.
    */
   factory Future.microtask(computation()) {
     _Future result = new _Future<T>();
@@ -146,9 +156,12 @@
    * If calling [computation] throws, the returned future is completed with the
    * error.
    *
-   * If the returned value is itself a [Future], completion of
+   * If calling [computation] returns a [Future], completion of
    * the created future will wait until the returned future completes,
    * and will then complete with the same result.
+   *
+   * If calling [computation] returns a non-future value,
+   * the returned future is completed with that value.
    */
   factory Future.sync(computation()) {
     try {
@@ -165,7 +178,7 @@
    * If [value] is not a [Future], using this constructor is equivalent
    * to [:new Future<T>.sync(() => value):].
    *
-   * See [Completer] to create a Future and complete it later.
+   * Use [Completer] to create a Future and complete it later.
    */
   factory Future.value([value]) {
     return new _Future<T>.immediate(value);
@@ -174,7 +187,7 @@
   /**
    * A future that completes with an error in the next event-loop iteration.
    *
-   * See [Completer] to create a Future and complete it later.
+   * Use [Completer] to create a Future and complete it later.
    */
   factory Future.error(Object error, [StackTrace stackTrace]) {
     return new _Future<T>.immediateError(error, stackTrace);
@@ -187,14 +200,15 @@
    * the result of calling [computation]. If the duration is 0 or less, it
    * completes no sooner than in the next event-loop iteration.
    *
-   * If [computation] is not given or [:null:] then it will behave as if
-   * [computation] was set to [:() => null:]. That is, it will complete with
-   * [:null:].
+   * If [computation] is omitted,
+   * it will be treated as if [computation] was set to `() => null`,
+   * and the future will eventually complete with the `null` value.
    *
    * If calling [computation] throws, the created future will complete with the
    * error.
    *
-   * See [Completer]s, for futures with values that are computed asynchronously.
+   * See also [Completer] for a way to complete a future at a later
+   * time that isn't a known fixed duration.
    */
   factory Future.delayed(Duration duration, [T computation()]) {
     Completer completer = new Completer.sync();
@@ -316,7 +330,7 @@
    * the returned future is completed with the thrown error
    * and a stack trace for the error.
    * In the case of `onError`,
-   * if the exception thrown is the same as the argument to `onError`,
+   * if the exception thrown is `identical` to the error argument to `onError`,
    * the throw is considered a rethrow,
    * and the original stack trace is used instead.
    *
@@ -324,7 +338,8 @@
    * the future returned by `then` will be completed with
    * the same result of the future returned by the callback.
    *
-   * If [onError] is not given it forwards the error to `f`.
+   * If [onError] is not given, and this future completes with an error,
+   * the error is forwarded directly to the returned future.
    *
    * In most cases, it is more readable to use [catchError] separately, possibly
    * with a `test` parameter, instead of handling both value and error in a
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 8a9c936..db5659c 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -82,10 +82,15 @@
    * If [reviver] is omitted, it defaults to returning the value argument.
    *
    * The [toEncodable] function is used during encoding. It is invoked for
-   * values that are not directly encodable to a JSON
+   * values that are not directly encodable to a JSON1toE
    * string (a value that is not a number, boolean, string, null, list or a map
    * with string keys). The function must return an object that is directly
-   * encodable.
+   * encodable. The elements of a returned list and values of a returned map
+   * do not need be directly encodable, and if they aren't, `toEncodable` will
+   * be used on them as well.
+   * Please notice that it is possible to cause an infinite recursive
+   * regress in this way, by effectively creating an infinite data structure
+   * through repeated call to `toEncodable`.
    *
    * If [toEncodable] is omitted, it defaults to a function that returns the
    * result of calling `.toJson()` on the unencodable object.
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index fc29d64..db6d7bc 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -16,7 +16,7 @@
  *
  * * The plain [HashMap] is unordered (no order is guaranteed),
  * * the [LinkedHashMap] iterates in key insertion order,
- * * and a sorted my like [SplayTreeMap] iterates the keys in sorted order.
+ * * and a sorted map like [SplayTreeMap] iterates the keys in sorted order.
  *
  * It is generally not allowed to modify the map (add or remove keys) while
  * an operation is being performed on the map, for example in functions called
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index fd8ca9b..825dba0 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -92,11 +92,11 @@
    *
    * Returns the remainder of the euclidean division. The euclidean division of
    * two integers `a` and `b` yields two integers `q` and `r` such that
-   * `a == b*q + r` and `0 <= r < a.abs()`.
+   * `a == b * q + r` and `0 <= r < b.abs()`.
    *
    * The euclidean division is only defined for integers, but can be easily
    * extended to work with doubles. In that case `r` may have a non-integer
-   * value, but it still verifies `0 <= r < |a|`.
+   * value, but it still verifies `0 <= r < |b|`.
    *
    * The sign of the returned value `r` is always positive.
    *
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index fce1249..5488a2f 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -290,7 +290,7 @@
   String substring(int startIndex, [int endIndex]);
 
   /**
-   * Removes leading and trailing whitespace from a string.
+   * Returns the string without any leading and trailing whitespace.
    *
    * If the string contains leading or trailing whitespace, a new string with no
    * leading and no trailing whitespace is returned:
@@ -326,6 +326,20 @@
   String trim();
 
   /**
+   * Returns the string without any leading whitespace.
+   *
+   * As [trim], but only removes leading whitespace.
+   */
+  String trimLeft();
+
+  /**
+   * Returns the string without any trailing whitespace.
+   *
+   * As [trim], but only removes trailing whitespace.
+   */
+  String trimRight();
+
+  /**
    * Creates a new string by concatenating this string with itself a number
    * of times.
    *
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 15967d9..82454e3 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -35411,15 +35411,19 @@
   }
 
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  Events get on => throw new UnimplementedError();
+  Events get on => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
-      => throw new UnimplementedError();
+      => throw new UnsupportedError(
+        'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  bool dispatchEvent(Event event) => throw new UnimplementedError();
+  bool dispatchEvent(Event event) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
-      [bool useCapture]) => throw new UnimplementedError();
+      [bool useCapture]) => throw new UnsupportedError(
+          'You can only attach EventListeners to your own window.');
 }
 
 class _LocationCrossFrame implements LocationBase {
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 3cc7cd5..a698bd9 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -38770,6 +38770,21 @@
 
   // Implementation support.
   String get typeName => "Window";
+
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  Events get on => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void addEventListener(String type, EventListener listener, [bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  bool dispatchEvent(Event event) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
 }
 
 class _HistoryCrossFrame extends NativeFieldWrapperClass2 implements HistoryBase {
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index 9bb5071..378253f 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -201,19 +201,18 @@
 
   /**
    * Tunes the compression algorithm. Use the value
-   * [ZlibConstant.STRATEGY_DEFAULT] for normal data,
-   * [ZlibConstant.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor),
-   * [ZlibConstant.STRATEGY_HUFFMAN_ONLY] to force Huffman encoding only (no
-   * string match), or [ZlibConstant.STRATEGY_RLE] to limit match distances to
-   * one (run-length encoding).
+   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
+   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
+   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
+   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
+   * match distances to one (run-length encoding).
    */
   final int strategy;
 
   /**
    * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range 8..15. Larger values result in better compression at
-   * the expense of memory usage. The default value is 15
+   * should be in the range `8..15`. Larger values result in better compression
+   * at the expense of memory usage. The default value is `15`
    */
   final int windowBits;
 
@@ -304,19 +303,18 @@
 
   /**
    * Tunes the compression algorithm. Use the value
-   * [ZlibConstant.STRATEGY_DEFAULT] for normal data,
-   * [ZlibConstant.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor),
-   * [ZlibConstant.STRATEGY_HUFFMAN_ONLY] to force Huffman encoding only (no
-   * string match), or [ZlibConstant.STRATEGY_RLE] to limit match distances to
-   * one (run-length encoding).
+   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
+   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
+   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
+   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
+   * match distances to one (run-length encoding).
    */
   final int strategy;
 
   /**
    * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range 8..15. Larger values result in better compression at
-   * the expense of memory usage. The default value is 15
+   * should be in the range `8..15`. Larger values result in better compression
+   * at the expense of memory usage. The default value is `15`
    */
   final int windowBits;
 
@@ -386,8 +384,8 @@
 class ZLibDecoder extends Converter<List<int>, List<int>> {
   /**
    * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range 8..15. Larger values result in better compression at
-   * the expense of memory usage. The default value is 15
+   * should be in the range `8..15`. Larger values result in better compression
+   * at the expense of memory usage. The default value is `15`.
    */
   final int windowBits;
 
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index dd789c7..00c0450 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -18,7 +18,7 @@
   external static _setCurrent(path);
   external static _createTemp(String path);
   external static String _systemTemp();
-  external static int _exists(String path);
+  external static _exists(String path);
   external static _create(String path);
   external static _deleteNative(String path, bool recursive);
   external static _rename(String path, String newPath);
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index dfa75f6..71e3ffe 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -181,11 +181,6 @@
     _openFuture = _file.open(mode: mode);
   }
 
-  _FileStreamConsumer.fromStdio(int fd) {
-    assert(1 <= fd && fd <= 2);
-    _openFuture = new Future.value(_File._openStdioSync(fd));
-  }
-
   Future<File> addStream(Stream<List<int>> stream) {
     Completer<File> completer = new Completer<File>();
     _openFuture
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 5b5e62f..9c034f4 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -202,6 +202,36 @@
 }
 
 
+class _StdConsumer implements StreamConsumer<List<int>> {
+  final _file;
+
+  _StdConsumer(int fd) : _file = _File._openStdioSync(fd);
+
+  Future addStream(Stream<List<int>> stream) {
+    var completer = new Completer();
+    var sub;
+    sub = stream.listen(
+        (data) {
+          try {
+            _file.writeFromSync(data);
+          } catch (e, s) {
+            sub.cancel();
+            completer.completeError(e, s);
+          }
+        },
+        onError: completer.completeError,
+        onDone: completer.complete,
+        cancelOnError: true);
+    return completer.future;
+  }
+
+  Future close() {
+    _file.closeSync();
+    return new Future.value();
+  }
+}
+
+
 class _StdSink implements IOSink {
   final IOSink _sink;
 
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 0c29931..1866969 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -482,30 +482,6 @@
    *             invocation.namedArguments);
    */
   delegate(Invocation invocation);
-
-  /**
-   * Returns a closure for invoking the regular method named [name].
-   *
-   * If [:type.instanceLookup(name):] returns a regular method m, the result of
-   * this method is a closure equivalent to:
-   *
-   *     (r1, ..., rn, {p1: d1, ..., pk: dk}) {
-   *       return this.invoke(name, [r1, ..., rn], {#p1: p1,  ..., #pk: pk});
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and named parameters p1, ..., pk
-   * with defaults d1, ..., dk. The result of this method is a
-   * closure equivalent to:
-   *
-   *     (r1, ..., rn, [p1 = d1, ..., pk = dk]) {
-   *       return this.invoke(name, [r1, ..., rn, p1, ..., pk]);
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and optional positional
-   * parameters p1, ..., pk with defaults d1, ..., dk.  Otherwise, an
-   * [ArgumentError] is thrown.
-   */
-  Function operator [](Symbol name);
 }
 
 /**
@@ -587,26 +563,49 @@
    bool operator ==(other);
 
   /**
-   * If [:declarations[name]:] is a regular method m, the result of this method
-   * is a closure equivalent to:
-   *
-   *     (r1, ..., rn, {p1: d1, ..., pk: dk}) {
-   *       return this.invoke(name, [r1, ..., rn], {#p1: p1, ..., #pk: pk});
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and named parameters p1, ..., pk
-   * with defaults d1, ..., dk. The result of this method is a
-   * closure equivalent to:
-   *
-   *     (r1, ..., rn, [p1 = d1, ..., pk = dk]) {
-   *       return this.invoke(name, [r1, ..., rn, p1, ..., pk]);
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and optional positional
-   * parameters p1, ..., pk with defaults d1, ..., dk.  Otherwise, an
-   * [ArgumentError] is thrown.
+   * Returns a list of the imports and exports in this library;
    */
-  Function operator [](Symbol name);
+  List<LibraryDependencyMirror> get libraryDependencies;
+}
+
+/// A mirror on an import or export declaration.
+abstract class LibraryDependencyMirror {
+  /// Is `true` if this dependency is an import.
+  bool get isImport;
+
+  /// Is `true` if this dependency is an export.
+  bool get isExport;
+
+  /// Returns the library mirror of the library that imports or exports the
+  /// [targetLibrary].
+  LibraryMirror get sourceLibrary;
+
+  /// Returns the library mirror of the library that is imported or exported.
+  LibraryMirror get targetLibrary;
+
+  /// Returns the prefix if this is a prefixed import and `null` otherwise.
+  Symbol get prefix;
+
+  /// Returns the list of show/hide combinators on the import/export
+  /// declaration.
+  List<CombinatorMirror> get combinators;
+
+  /// Returns the source location for this import/export declaration.
+  SourceLocation get location;
+
+  List<InstanceMirror> get metadata;
+}
+
+/// A mirror on a show/hide combinator declared on a library dependency.
+abstract class CombinatorMirror {
+  /// The list of identifiers on the combinator.
+  List<Symbol> get identifiers;
+
+  /// Is `true` if this is a 'show' combinator.
+  bool get isShow;
+
+  /// Is `true` if this is a 'hide' combinator.
+  bool get isHide;
 }
 
 /**
@@ -812,28 +811,6 @@
    bool operator == (other);
 
   /**
-   * If [:declarations[name]:] is a regular method m, the result of this method
-   * is a closure equivalent to:
-   *
-   *     (r1, ..., rn, {p1: d1, ..., pk: dk}) {
-   *       return this.invoke(name, [r1, ..., rn], {#p1: p1, ..., #pk: pk});
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and named parameters p1, ..., pk
-   * with defaults d1, ..., dk. The result of this method is a
-   * closure equivalent to:
-   *
-   *     (r1, ..., rn, [p1 = d1, ..., pk = dk]) {
-   *       return this.invoke(name, [r1, ..., rn, p1, ..., pk]);
-   *     }
-   *
-   * if m has required parameters r1, ..., rn, and optional positional
-   * parameters p1, ..., pk with defaults d1, ..., dk.  Otherwise, an
-   * [ArgumentError] is thrown.
-   */
-  Function operator [](Symbol name);
-
-  /**
    * Returns whether the class denoted by the receiver is a subclass of the
    * class denoted by the argument.
    *
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 10039ae..e98b79b 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -61,8 +61,16 @@
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
 
 [ $compiler == none && $runtime == vm && $arch == mips ]
-LibTest/math/log_A01_t01: Fail
 LibTest/core/double/toInt_A01_t01: Fail
+# These tests take too much memory (300 MB) for our 1 GB test machine.
+# co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
+LibTest/core/List/List_class_A01_t01: Skip # co19 issue 673
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19 issue 673
+LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
+
+[ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
+LibTest/isolate/Isolate/spawnUri_A01_t04: Crash # dartbug.com/17440
+LibTest/isolate/Isolate/spawn_A01_t04: Crash # dartbug.com/17440
 
 [ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips) ]
 LibTest/core/Uri/Uri_A06_t03: Skip # Timeouts, co19-roll r576: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/analyze_only_test.dart
index cce56d6..a49cd42 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/analyze_only_test.dart
@@ -139,8 +139,8 @@
     ['--analyze-only', '--analyze-all'],
     (String code, List errors, List warnings) {
       Expect.isNull(code);
-      Expect.isTrue(errors.isEmpty);
-      Expect.equals(1, warnings.length);
+      Expect.isTrue(errors.isEmpty, 'Unexpected errors: $errors.');
+      Expect.equals(1, warnings.length, 'Unexpected warning count: $warnings.');
       Expect.equals(
           "Cannot resolve type 'Foo'.", warnings[0].toString());
     });
diff --git a/tests/compiler/dart2js/arithmetic_simplification_test.dart b/tests/compiler/dart2js/arithmetic_simplification_test.dart
new file mode 100644
index 0000000..5350a33
--- /dev/null
+++ b/tests/compiler/dart2js/arithmetic_simplification_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test constant folding on numbers.
+
+import "package:expect/expect.dart";
+import 'compiler_helper.dart';
+
+const String INT_PLUS_ZERO = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return (x & 1) + 0;
+}
+""";
+
+const String ZERO_PLUS_INT = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return 0 + (x & 1);
+}
+""";
+
+const String NUM_PLUS_ZERO = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return x + 0;
+}
+""";
+
+const String ZERO_PLUS_NUM = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return 0 + x;
+}
+""";
+
+
+const String INT_TIMES_ONE = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return (x & 1) * 1;
+}
+""";
+
+const String ONE_TIMES_INT = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return 1 * (x & 1);
+}
+""";
+
+const String NUM_TIMES_ONE = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return x * 1;
+}
+""";
+
+const String ONE_TIMES_NUM = """
+int foo(x) => x;
+void main() {
+  var x = foo(0);
+  return 1 * x;
+}
+""";
+
+main() {
+  var plusZero = new RegExp(r"\+ 0");
+  var zeroPlus = new RegExp(r"0 \+");
+  compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero);
+  compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus);
+  compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero);
+  compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus);
+
+  var timesOne = new RegExp(r"\* 1");
+  var oneTimes = new RegExp(r"1 \*");
+  compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne);
+  compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes);
+  compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne);
+  compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes);
+}
diff --git a/tests/compiler/dart2js/codegen_helper.dart b/tests/compiler/dart2js/codegen_helper.dart
index 1d1f455..20a8f0a 100644
--- a/tests/compiler/dart2js/codegen_helper.dart
+++ b/tests/compiler/dart2js/codegen_helper.dart
@@ -28,7 +28,7 @@
     Expect.isTrue(success);
     Map<String, String> result = new Map<String, String>();
     for (var element in compiler.backend.generatedCode.keys) {
-      if (element.getCompilationUnit().script.uri != uri) continue;
+      if (element.getCompilationUnit().script.readableUri != uri) continue;
       var name = element.name;
       var code = compiler.backend.assembleCode(element);
       result[name] = code;
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 2f94eb2..ac12f23 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -2,8 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-mirrors_used_test: Fail # Issue 17313
-
 identity_test: Fail # Issue 6638
 boolified_operator_test: Fail # Issue 8001
 
@@ -17,6 +15,13 @@
 
 logical_expression_test: Fail # Issue 17027
 
+mirrors/library_exports_hidden_test: Fail
+mirrors/library_exports_shown_test: Fail
+mirrors/library_imports_hidden_test: Fail
+mirrors/library_imports_prefixed_test: Fail
+mirrors/library_imports_prefixed_show_hide_test: Fail
+mirrors/library_imports_shown_test: Fail
+
 [ $mode == debug ]
 mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
 
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 98595af..9e52599 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -267,11 +267,12 @@
 ''';
   var expectedResult =
       'globalfoo(){}var globalVar;'
-      'var globalVarInitialized=6,globalVarInitialized2=7;'
+      'var globalVarInitialized=6;var globalVarInitialized2=7;'
       'class A{A(){}A.fromFoo(){}static staticfoo(){}foo(){}'
           'static const field=5;}'
       'A_globalfoo(){}'
-      'var A_globalVar;var A_globalVarInitialized=6,A_globalVarInitialized2=7;'
+      'var A_globalVar;var A_globalVarInitialized=6;'
+          'var A_globalVarInitialized2=7;'
       'class A_A{A_A(){}A_A.A_fromFoo(){}static A_staticfoo(){}foo(){}'
           'static const A_field=5;}'
       'main(){A_globalVar;A_globalVarInitialized;'
diff --git a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
index 45955b5..832d323 100644
--- a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
@@ -65,18 +65,20 @@
 const Map MEMORY_SOURCE_FILES = const {"main.dart": """
 import "dart:async";
 
-@def import 'lib.dart' as lib show f, A;
+@def import 'lib.dart' as lib show f, A, instance;
 
 const def = const DeferredLibrary("deferred");
 
 void main() {
   def.load().then((_) {
-    print(lib.f(new lib.A<lib.A>()));
+    print(lib.f(lib.instance));
   });
 }
 """, "lib.dart": """
 class A<T> {}
 
+A<A> instance = new A<A>();
+
 bool f (Object o) {
   return o is A<A>;
 }
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred_not_in_main_test.dart
index a7002c2..a2d828a 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred_not_in_main_test.dart
@@ -48,12 +48,12 @@
 
     var outputClassLists = compiler.backend.emitter.outputClassLists;
 
-    Expect.equals(mainOutputUnit, outputUnitForElement(foo2));
+    Expect.notEquals(mainOutputUnit, outputUnitForElement(foo2));
   }));
 }
 
 // lib1 imports lib2 deferred. But mainlib never uses DeferredLibrary.
-// Therefore we should not split the program.
+// Test that this case works.
 const Map MEMORY_SOURCE_FILES = const {
   "main.dart":"""
 library mainlib;
diff --git a/tests/compiler/dart2js/duplicate_library_test.dart b/tests/compiler/dart2js/duplicate_library_test.dart
new file mode 100644
index 0000000..43a1deb
--- /dev/null
+++ b/tests/compiler/dart2js/duplicate_library_test.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that duplicate library names result in different messages depending
+// on whether the libraries are based on the same resource.
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+import 'memory_compiler.dart';
+
+void check(String kind,
+           Iterable<DiagnosticMessage> messages,
+           List<String> prefixes) {
+  Expect.equals(messages.length, prefixes.length,
+      "Unexpected $kind count: $messages");
+  int i = 0;
+  messages.forEach((DiagnosticMessage message) {
+    Expect.isTrue(message.message.startsWith(prefixes[i++]));
+  });
+}
+
+void test(Map<String, String> source,
+          {List<String> warnings: const <String>[],
+           List<String> hints: const <String>[]}) {
+  DiagnosticCollector collector = new DiagnosticCollector();
+  var compiler = compilerFor(source,
+                             diagnosticHandler: collector,
+                             showDiagnostics: true,
+                             options: ['--analyze-only', '--analyze-all'],
+                             packageRoot: Uri.parse('memory:pkg/'));
+  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
+    Expect.isTrue(collector.errors.isEmpty);
+    check('warning', collector.warnings, warnings);
+    check('hint', collector.hints, hints);
+    Expect.isTrue(collector.infos.isEmpty);
+  }));
+}
+
+void main() {
+  test({
+    'main.dart': """
+library main;
+
+import 'package:lib/foo.dart';
+import 'pkg/lib/foo.dart';
+""",
+    'pkg/lib/foo.dart': """
+library lib.foo;
+"""},
+    warnings: ["The library 'lib.foo' in 'memory:pkg/lib/foo.dart' is loaded"]);
+
+  test({
+    'main.dart': """
+library main;
+
+import 'package:lib/bar.dart';
+import 'pkg/foo.dart';
+""",
+    'pkg/foo.dart': """
+library foo;
+
+import 'lib/bar.dart';
+""",
+    'pkg/lib/bar.dart': """
+library lib.bar;
+"""},
+    warnings: ["The library 'lib.bar' in 'memory:pkg/lib/bar.dart' is loaded"]);
+
+  test({
+    'main.dart': """
+library main;
+
+import 'foo.dart';
+import 'pkg/lib/baz.dart';
+""",
+    'foo.dart': """
+library foo;
+
+import 'package:lib/baz.dart';
+""",
+    'pkg/lib/baz.dart': """
+library lib.baz;
+"""},
+    warnings: ["The library 'lib.baz' in 'memory:pkg/lib/baz.dart' is loaded"]);
+
+  test({
+    'main.dart': """
+library main;
+
+import 'foo.dart';
+import 'pkg/bar.dart';
+""",
+    'foo.dart': """
+library foo;
+
+import 'package:lib/boz.dart';
+""",
+    'pkg/bar.dart': """
+library bar;
+
+import 'lib/boz.dart';
+""",
+    'pkg/lib/boz.dart': """
+library lib.boz;
+"""},
+    warnings: ["The library 'lib.boz' in 'memory:pkg/lib/boz.dart' is loaded"]);
+
+ test({
+    'main.dart': """
+library main;
+
+import 'package:lib/qux.dart';
+import 'pkg/lib/qux.dart';
+""",
+    'pkg/lib/qux.dart': """
+// No library tag.
+"""},
+    hints: ["The resource 'memory:pkg/lib/qux.dart' is loaded"]);
+
+  test({
+    'main.dart': """
+library main;
+
+import 'foo.dart';
+import 'bar.dart';
+""",
+    'foo.dart': """
+library lib;
+""",
+    'bar.dart': """
+library lib;
+"""},
+    warnings: ["Duplicated library name 'lib'.",
+               "Duplicated library name 'lib'."]);
+}
+
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index b4091f3..392f51b 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -10,7 +10,7 @@
        show NullSink;
 
 import '../../../sdk/lib/_internal/compiler/compiler.dart'
-       show Diagnostic, DiagnosticHandler;
+       show Diagnostic, DiagnosticHandler, CompilerOutputProvider;
 
 import 'dart:async';
 
@@ -59,6 +59,41 @@
   }
 }
 
+class BufferedEventSink implements EventSink<String> {
+  StringBuffer sb = new StringBuffer();
+  String text;
+
+  void add(String event) {
+    sb.write(event);
+  }
+
+  void addError(errorEvent, [StackTrace stackTrace]) {
+    // Do not support this.
+  }
+
+  void close() {
+    text = sb.toString();
+    sb = null;
+  }
+}
+
+class OutputCollector {
+  Map<String, Map<String, BufferedEventSink>> outputMap = {};
+
+  EventSink<String> call(String name, String extension) {
+    Map<String, BufferedEventSink> sinkMap =
+        outputMap.putIfAbsent(extension, () => {});
+    return sinkMap.putIfAbsent(name, () => new BufferedEventSink());
+  }
+
+  String getOutput(String name, String extension) {
+    Map<String, BufferedEventSink> sinkMap = outputMap[extension];
+    if (sinkMap == null) return null;
+    BufferedEventSink sink = sinkMap[name];
+    return sink != null ? sink.text : null;
+  }
+}
+
 DiagnosticHandler createDiagnosticHandler(DiagnosticHandler diagnosticHandler,
                                           SourceFileProvider provider,
                                           bool showDiagnostics) {
@@ -84,6 +119,7 @@
 
 Compiler compilerFor(Map<String,String> memorySourceFiles,
                      {DiagnosticHandler diagnosticHandler,
+                      CompilerOutputProvider outputProvider,
                       List<String> options: const [],
                       Compiler cachedCompiler,
                       bool showDiagnostics: true,
@@ -112,10 +148,13 @@
   var handler =
       createDiagnosticHandler(diagnosticHandler, provider, showDiagnostics);
 
-  EventSink<String> outputProvider(String name, String extension) {
+  EventSink<String> noOutputProvider(String name, String extension) {
     if (name != '') throw 'Attempt to output file "$name.$extension"';
     return new NullSink('$name.$extension');
   }
+  if (outputProvider == null) {
+    outputProvider = noOutputProvider;
+  }
 
   Compiler compiler = new Compiler(readStringFromUri,
                                    outputProvider,
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index 7a882d4..b2f1e46 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -23,9 +23,6 @@
       var value = cls.getField(name).reflectee;
       if (value is MessageKind) {
         kinds[MirrorSystem.getName(name)] = value;
-      } else if (value is DualKind) {
-        kinds['${MirrorSystem.getName(name)}.error'] = value.error;
-        kinds['${MirrorSystem.getName(name)}.warning'] = value.warning;
       } else {
         Expect.fail("Weird static field: '${MirrorSystem.getName(name)}'.");
       }
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index f1bc8da..ab302eb 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -30,7 +30,8 @@
 
   compileAndCheck(source1, name, (compiler, element) {
     compiler.enqueuer.resolution.queueIsClosed = false;
-    Expect.equals(1, length(element.metadata));
+    Expect.equals(1, length(element.metadata),
+        'Unexpected metadata count on $element.');
     PartialMetadataAnnotation annotation = element.metadata.head;
     annotation.ensureResolved(compiler);
     Constant value = annotation.value;
@@ -136,6 +137,7 @@
 
 void testTopLevelFieldMetadata() {
   checkAnnotation('foo', 'var foo;');
+  checkAnnotation('bar', 'var foo, bar;');
 }
 
 void testLibraryTags() {
diff --git a/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart
new file mode 100644
index 0000000..f01441e
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_exports_hidden_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_exports_hidden_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_exports_hidden_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart
new file mode 100644
index 0000000..87f3369
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_exports_shown_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_exports_shown_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_exports_shown_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart b/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart
new file mode 100644
index 0000000..ad4ba20
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_imports_hidden_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_imports_hidden_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_imports_hidden_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart
new file mode 100644
index 0000000..910dde5
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_imports_prefixed_show_hide_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_imports_prefixed_show_hide_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_imports_prefixed_show_hide_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart b/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart
new file mode 100644
index 0000000..5695e98
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_imports_prefixed_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_imports_prefixed_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_imports_prefixed_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart b/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart
new file mode 100644
index 0000000..3f84ce7
--- /dev/null
+++ b/tests/compiler/dart2js/mirrors/library_imports_shown_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file

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

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

+

+import "dart:mirrors";

+

+import "package:async_helper/async_helper.dart";

+

+import "mirrors_test_helper.dart";

+import "../../../lib/mirrors/library_imports_shown_test.dart";

+

+main() {

+  asyncTest(() => analyze("library_imports_shown_test.dart").

+      then((MirrorSystem mirrors) {

+    test(mirrors);

+  }));

+}

diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index dec6f63..846c7f9 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -58,7 +58,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 375;
+    int expectedMethodCount = 376;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 472c1f9..eef31b3 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -336,7 +336,7 @@
    */
   LibraryElement createLibrary(String name, String source) {
     Uri uri = new Uri(scheme: "dart", path: name);
-    var script = new Script(uri, new MockFile(source));
+    var script = new Script(uri, uri, new MockFile(source));
     var library = new LibraryElementX(script);
     library.libraryTag = new LibraryName(null, null, null);
     parseScript(source, library);
@@ -447,7 +447,7 @@
   Future<Script> readScript(Uri uri, [Element element, Node node]) {
     SourceFile sourceFile = sourceFiles[uri.toString()];
     if (sourceFile == null) throw new ArgumentError(uri);
-    return new Future.value(new Script(uri, sourceFile));
+    return new Future.value(new Script(uri, uri, sourceFile));
   }
 
   Element lookupElementIn(ScopeContainerElement container, name) {
@@ -536,7 +536,7 @@
 
 LibraryElement mockLibrary(Compiler compiler, String source) {
   Uri uri = new Uri(scheme: "source");
-  var library = new LibraryElementX(new Script(uri, new MockFile(source)));
+  var library = new LibraryElementX(new Script(uri, uri, new MockFile(source)));
   importLibrary(library, compiler.coreLibrary, compiler);
   library.setExports(<Element>[]);
   return library;
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index acf46ea..926b5ee 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -69,10 +69,8 @@
                    {DiagnosticListener diagnosticHandler}) {
   Token tokens = scan(text);
   if (diagnosticHandler == null) diagnosticHandler = new LoggerCanceler();
-  Script script =
-      new Script(
-          new Uri(scheme: "source"),
-          new MockFile(text));
+  Uri uri = new Uri(scheme: "source");
+  Script script = new Script(uri, uri,new MockFile(text));
   LibraryElement library = new LibraryElementX(script);
   library.canUseNative = true;
   NodeListener listener =
@@ -116,7 +114,7 @@
   if (registerSource != null) {
     registerSource(uri, text);
   }
-  var script = new Script(uri, new MockFile(text));
+  var script = new Script(uri, uri, new MockFile(text));
   var unit = new CompilationUnitElementX(script, library);
   int id = 0;
   ElementListener listener = new ElementListener(compiler, unit, () => id++);
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 5d448c8d9..d75a605 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -615,7 +615,7 @@
   compiler.parseScript("int a;");
   VariableElement element = compiler.mainApp.find("a");
   Expect.equals(ElementKind.FIELD, element.kind);
-  VariableDefinitions node = element.variables.parseNode(compiler);
+  VariableDefinitions node = element.variables.parseNode(element, compiler);
   Identifier typeName = node.type.typeName;
   Expect.equals(typeName.source, 'int');
 
@@ -626,8 +626,8 @@
   Expect.equals(ElementKind.FIELD, cElement.kind);
   Expect.isTrue(bElement != cElement);
 
-  VariableDefinitions bNode = bElement.variables.parseNode(compiler);
-  VariableDefinitions cNode = cElement.variables.parseNode(compiler);
+  VariableDefinitions bNode = bElement.variables.parseNode(bElement, compiler);
+  VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
   Expect.equals(bNode, cNode);
   Expect.isNull(bNode.type);
   Expect.isTrue(bNode.modifiers.isVar());
diff --git a/tests/compiler/dart2js/source_map_test.dart b/tests/compiler/dart2js/source_map_test.dart
new file mode 100644
index 0000000..ee133f5
--- /dev/null
+++ b/tests/compiler/dart2js/source_map_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that options '--source-map' and '--out' correctly adds
+// `sourceMappingURL` and "file" attributes to source file and source map file.
+
+library test.source_map;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'memory_compiler.dart';
+
+const SOURCE = const {
+  '/main.dart': """
+main() {}
+""",
+};
+
+void find(String text, String substring, bool expected) {
+  bool found = text.contains(substring);
+
+  if (expected && !found) {
+    Expect.isTrue(found, 'Expected "$substring" in:\n$text');
+  }
+  if (!expected && found) {
+    Expect.isFalse(found,
+        'Unexpected "$substring" in:\n'
+        '${text.substring(text.indexOf(substring))}');
+  }
+}
+
+void test({String out, String sourceMap, String mapping, String file}) {
+  OutputCollector collector = new OutputCollector();
+  List<String> options = <String>[];
+  if (out != null) {
+    options.add("--out=$out");
+  }
+  if (sourceMap != null) {
+    options.add("--source-map=$sourceMap");
+  }
+  var compiler = compilerFor(SOURCE,
+                             showDiagnostics: true,
+                             outputProvider: collector,
+                             options: options);
+  asyncTest(() => compiler.runCompiler(Uri.parse('memory:/main.dart')).then(
+      (_) {
+    String jsOutput = collector.getOutput('', 'js');
+    Expect.isNotNull(jsOutput);
+    if (mapping != null) {
+      find(jsOutput, '//# sourceMappingURL=$mapping', true);
+      find(jsOutput, '//@ sourceMappingURL=$mapping', true);
+    } else {
+      find(jsOutput, '//# sourceMappingURL=', false);
+      find(jsOutput, '//@ sourceMappingURL=', false);
+    }
+    String jsSourceMapOutput = collector.getOutput('', 'js.map');
+    Expect.isNotNull(jsSourceMapOutput);
+    if (file != null) {
+      find(jsSourceMapOutput, '"file": "$file"', true);
+    } else {
+      find(jsSourceMapOutput, '"file": ', false);
+    }
+  }));
+}
+
+void main() {
+  test();
+  test(sourceMap: 'file:/out.js.map');
+  test(out: 'file:/out.js');
+  test(out: 'file:/out.js', sourceMap: 'file:/out.js.map',
+       file: 'out.js', mapping: 'out.js.map');
+  test(out: 'file:/dir/out.js', sourceMap: 'file:/dir/out.js.map',
+       file: 'out.js', mapping: 'out.js.map');
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/strength_eq_test.dart b/tests/compiler/dart2js/strength_eq_test.dart
new file mode 100644
index 0000000..bddafaa
--- /dev/null
+++ b/tests/compiler/dart2js/strength_eq_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test constant folding on numbers.
+
+import "package:expect/expect.dart";
+import 'compiler_helper.dart';
+
+const String CODE = """
+class A {
+  var link;
+}
+int foo(x) {
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return null;
+  var a = new A();
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return a;
+  a.link = a;
+  return a;
+}
+void main() {
+  var x = foo(0);
+  return x == x.link;
+}
+""";
+
+main() {
+  // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
+  // `x.link`, so x cannot be `null`.
+  var compare = new RegExp(r'x === x\.get\$link\(\)');
+  compileAndMatch(CODE, 'main', compare);
+}
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 59cd008..fb14e82 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -1891,7 +1891,7 @@
   parser.parseStatement(tokens);
   Node node = listener.popNode();
   Element compilationUnit =
-    new CompilationUnitElementX(new Script(null, null), compiler.mainApp);
+    new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
   Element function = new FunctionElementX(
       '', ElementKind.FUNCTION, Modifiers.EMPTY, compilationUnit, false);
   TreeElements elements = compiler.resolveNodeStatement(node, function);
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index cd0d458..5129619 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -57,7 +57,7 @@
 
 String doUnparse(String source) {
   MessageCollector diagnosticListener = new MessageCollector();
-  Script script = new Script(null, null);
+  Script script = new Script(null, null, null);
   LibraryElement lib = new LibraryElementX(script);
   CompilationUnitElement element = new CompilationUnitElementX(script, lib);
   StringScanner scanner = new StringScanner.fromString(source);
diff --git a/tests/compiler/dart2js/uri_extras_test.dart b/tests/compiler/dart2js/uri_extras_test.dart
index 7045384..477b84c 100644
--- a/tests/compiler/dart2js/uri_extras_test.dart
+++ b/tests/compiler/dart2js/uri_extras_test.dart
@@ -14,38 +14,41 @@
       c(expected, base, path, false);
       return;
     }
-    String r;
 
-    r = relativize(Uri.parse('file:$base'),
-                   Uri.parse('file:$path'),
-                   isWindows);
-    Expect.stringEquals(expected, r);
+    test(Uri base, Uri uri) {
+      String r = relativize(base, uri, isWindows);
+      Uri resolved = base.resolve(r);
+      Expect.equals(uri.scheme.toLowerCase(), resolved.scheme.toLowerCase());
+      if (isWindows) {
+        Expect.equals(uri.path.toLowerCase(), resolved.path.toLowerCase());
+      } else {
+        Expect.equals(uri.path, resolved.path);
+      }
+      Expect.stringEquals(expected, r);
+    }
 
-    r = relativize(Uri.parse('FILE:$base'),
-                   Uri.parse('FILE:$path'),
-                   isWindows);
-    Expect.stringEquals(expected, r);
+    test(Uri.parse('file:$base'),
+         Uri.parse('file:$path'));
 
-    r = relativize(Uri.parse('file:$base'),
-                   Uri.parse('FILE:$path'),
-                   isWindows);
-    Expect.stringEquals(expected, r);
+    test(Uri.parse('FILE:$base'),
+         Uri.parse('FILE:$path'));
 
-    r = relativize(Uri.parse('FILE:$base'),
-                   Uri.parse('file:$path'),
-                   isWindows);
-    Expect.stringEquals(expected, r);
+    test(Uri.parse('file:$base'),
+         Uri.parse('FILE:$path'));
+
+    test(Uri.parse('FILE:$base'),
+         Uri.parse('file:$path'));
   }
   c('bar', '/', '/bar', null);
-  c('/bar', '/foo', '/bar', null);
+  c('bar', '/foo', '/bar', null);
   c('/bar', '/foo/', '/bar', null);
 
   c('bar', '///c:/', '///c:/bar', true);
-  c('/c:/bar', '///c:/foo', '///c:/bar', true);
+  c('bar', '///c:/foo', '///c:/bar', true);
   c('/c:/bar', '///c:/foo/', '///c:/bar', true);
 
   c('BAR', '///c:/', '///c:/BAR', true);
-  c('/c:/BAR', '///c:/foo', '///c:/BAR', true);
+  c('BAR', '///c:/foo', '///c:/BAR', true);
   c('/c:/BAR', '///c:/foo/', '///c:/BAR', true);
 
   c('../sdk/lib/_internal/compiler/implementation/dart2js.dart',
@@ -63,6 +66,29 @@
 
   c('/Users/person/file.dart', '/Users/other/', '/Users/person/file.dart',
     true);
+
+  c('out.js.map', '/Users/person/out.js', '/Users/person/out.js.map', null);
+
+  c('../person/out.js.map',
+    '/Users/other/out.js',
+    '/Users/person/out.js.map', false);
+
+  c('/Users/person/out.js.map',
+    '/Users/other/out.js',
+    '/Users/person/out.js.map', true);
+
+  c('out.js', '/Users/person/out.js.map', '/Users/person/out.js', null);
+
+  c('../person/out.js',
+    '/Users/other/out.js.map',
+    '/Users/person/out.js', false);
+
+  c('/Users/person/out.js',
+    '/Users/other/out.js.map',
+    '/Users/person/out.js', true);
+
+  c('out.js', '/out.js.map', '/out.js', null);
+
 }
 
 void main() {
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 42709dc..3c56c5c 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -86,6 +86,7 @@
 [ $compiler == dart2js ]
 error_stack_trace1_test: RuntimeError # Issue 12399
 hash_set_test/01: RuntimeError # Issue 11551
+integer_to_string_test/01: RuntimeError # Issue 1533
 
 big_integer_vm_test: RuntimeError, OK # VM specific test.
 bit_twiddling_bigint_test: RuntimeError # Requires bigint support.
@@ -110,6 +111,9 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
+[ $compiler == dart2js && ($runtime == d8 || $runtime == chrome || $runtime == drt || $runtime == safari) ]
+string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
+
 [ $compiler == dart2dart ]
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
diff --git a/tests/corelib/integer_to_string_test.dart b/tests/corelib/integer_to_string_test.dart
new file mode 100644
index 0000000..8b7061a
--- /dev/null
+++ b/tests/corelib/integer_to_string_test.dart
@@ -0,0 +1,88 @@
+// 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:expect/expect.dart";
+
+main() {
+  /// Test that converting [value] to a string gives [expect].
+  /// Also test that `-value` gives `"-"+expect`.
+  test(int value, String expect) {
+    Expect.equals(expect, value.toString());
+    Expect.equals(expect, "$value");
+    Expect.equals(expect, (new StringBuffer()..write(value)).toString());
+    if (value == 0) return;
+    expect = "-$expect";
+    value = -value;
+    Expect.equals(expect, value.toString());
+    Expect.equals(expect, "$value");
+    Expect.equals(expect, (new StringBuffer()..write(value)).toString());
+  }
+
+  // Null.
+  test(0, "0");
+  test(1, "1");
+  test(2, "2");
+  test(5, "5");
+
+  // Binary special cases.
+
+  // ~2^30.
+  test(0x3fffffff, "1073741823");
+  test(0x40000000, "1073741824");
+  test(0x40000001, "1073741825");
+  // ~2^31.
+  test(0x7fffffff, "2147483647");
+  test(0x80000000, "2147483648");
+  test(0x80000001, "2147483649");
+  // ~2^32.
+  test(0xffffffff,  "4294967295");
+  test(0x100000000, "4294967296");
+  test(0x100000001, "4294967297");
+
+  // ~2^51.
+  test(0x7ffffffffffff, "2251799813685247");
+  test(0x8000000000000, "2251799813685248");
+  test(0x8000000000001, "2251799813685249");
+  // ~2^52.
+  test(0xfffffffffffff, "4503599627370495");
+  test(0x10000000000000, "4503599627370496");
+  test(0x10000000000001, "4503599627370497");
+  // ~2^53.
+  test(0x1fffffffffffff, "9007199254740991");
+  test(0x20000000000000, "9007199254740992");
+  test(0x20000000000001, "9007199254740993");         /// 01: ok
+  // ~2^62.
+  test(0x3fffffffffffffff, "4611686018427387903");    /// 01: continued
+  test(0x4000000000000000, "4611686018427387904");    /// 01: continued
+  test(0x4000000000000001, "4611686018427387905");    /// 01: continued
+  // ~2^63.
+  test(0x7fffffffffffffff, "9223372036854775807");    /// 01: continued
+  test(0x8000000000000000, "9223372036854775808");    /// 01: continued
+  test(0x8000000000000001, "9223372036854775809");    /// 01: continued
+  // ~2^64.
+  test(0xffffffffffffffff, "18446744073709551615");   /// 01: continued
+  test(0x10000000000000000, "18446744073709551616");  /// 01: continued
+  test(0x10000000000000001, "18446744073709551617");  /// 01: continued
+  // Big bignum.
+  test(123456789012345678901234567890,                /// 01: continued
+       "123456789012345678901234567890");             /// 01: continued
+
+  // Decimal special cases.
+
+  int number = 10;
+  // Numbers 99..99, 100...00, and 100..01 up to 23 digits.
+  for (int i = 1; i < 15; i++) {  // Works in dart2js up to 10^15.
+    test(number - 1, "9" * i);
+    test(number, "1" + "0" * i);
+    test(number + 1, "1" + "0" * (i - 1) + "1");
+    number *= 10;
+  }
+  // Fails to represent exactly in dart2js.
+  for (int i = 15; i < 22; i++) {                     /// 01: continued
+    test(number - 1, "9" * i);                        /// 01: continued
+    test(number, "1" + "0" * i);                      /// 01: continued
+    test(number + 1, "1" + "0" * (i - 1) + "1");      /// 01: continued
+    number *= 10;                                     /// 01: continued
+  }                                                   /// 01: continued
+}
diff --git a/tests/corelib/string_trim2_test.dart b/tests/corelib/string_trim2_test.dart
index fc894a2..11379dd 100644
--- a/tests/corelib/string_trim2_test.dart
+++ b/tests/corelib/string_trim2_test.dart
@@ -36,14 +36,14 @@
 
 main() {
   for (var ws in WHITESPACE) {
-    Expect.equals("", new String.fromCharCode(ws).trim());
-  }
-  Expect.equals("", new String.fromCharCodes(WHITESPACE).trim());
-  for (var ws in WHITESPACE) {
+    var name = ws.toRadixString(16);
     var c = new String.fromCharCode(ws);
-    Expect.equals("a", ("a" + c).trim());
-    Expect.equals("a", (c + "a").trim());
-    Expect.equals("a", (c + c + "a" + c + c).trim());
-    Expect.equals("a" + c + "a", (c + c + "a" + c + "a" + c + c).trim());
+    Expect.equals("", c.trim(), "$name");
+    Expect.equals("a", ("a" + c).trim(), "a-$name");
+    Expect.equals("a", (c + "a").trim(), "$name-a");
+    Expect.equals("a", (c + c + "a" + c + c).trim(), "$name around");
+    Expect.equals("a" + c + "a", (c + c + "a" + c + "a" + c + c).trim(),
+                  "$name many");
   }
+  Expect.equals("", new String.fromCharCodes(WHITESPACE).trim(), "ALL");
 }
diff --git a/tests/corelib/string_trimlr_test.dart b/tests/corelib/string_trimlr_test.dart
new file mode 100644
index 0000000..cf47ffc
--- /dev/null
+++ b/tests/corelib/string_trimlr_test.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Characters with Whitespace property (Unicode 6.2).
+// 0009..000D    ; White_Space # Cc       <control-0009>..<control-000D>
+// 0020          ; White_Space # Zs       SPACE
+// 0085          ; White_Space # Cc       <control-0085>
+// 00A0          ; White_Space # Zs       NO-BREAK SPACE
+// 1680          ; White_Space # Zs       OGHAM SPACE MARK
+// 180E          ; White_Space # Zs       MONGOLIAN VOWEL SEPARATOR
+// 2000..200A    ; White_Space # Zs       EN QUAD..HAIR SPACE
+// 2028          ; White_Space # Zl       LINE SEPARATOR
+// 2029          ; White_Space # Zp       PARAGRAPH SEPARATOR
+// 202F          ; White_Space # Zs       NARROW NO-BREAK SPACE
+// 205F          ; White_Space # Zs       MEDIUM MATHEMATICAL SPACE
+// 3000          ; White_Space # Zs       IDEOGRAPHIC SPACE
+// And BOM:
+// FEFF          ; Byte order mark.
+const WHITESPACE = const [
+  0x09,
+  0x0A,
+  0x0B,
+  0x0C,
+  0x0D,
+  0x20,
+  0x85,
+  0xA0,
+  0x1680,
+  0x180E,
+  0x2000,
+  0x2001,
+  0x2002,
+  0x2003,
+  0x2004,
+  0x2005,
+  0x2006,
+  0x2007,
+  0x2008,
+  0x2009,
+  0x200A,
+  0x2028,
+  0x2029,
+  0x202F,
+  0x205F,
+  0x3000,
+  0xFEFF,
+];
+
+main() {
+  // Test the whitespace in different positions.
+  test(ws) {
+    // trimLeft
+    Expect.equals("", ws.trimLeft(), "K1");
+    Expect.equals("", (ws + ws).trimLeft(), "L2");
+    Expect.equals("a" + ws, ("a" + ws).trimLeft(), "L3");
+    Expect.equals("a", (ws + "a").trimLeft(), "L4");
+    Expect.equals("a" + ws + ws, (ws + ws + "a" + ws + ws).trimLeft(), "L5");
+    Expect.equals("a" + ws + "a", (ws + ws + "a" + ws + "a").trimLeft(), "L6");
+    var untrimmable = "a" + ws + "a";
+    Expect.identical(untrimmable, untrimmable.trimLeft(), "L7");
+    // trimRight
+    Expect.equals("", ws.trimRight(), "R1");
+    Expect.equals("", (ws + ws).trimRight(), "R2");
+    Expect.equals("a", ("a" + ws).trimRight(), "R3");
+    Expect.equals(ws + "a", (ws + "a").trimRight(), "R4");
+    Expect.equals(ws + ws + "a", (ws + ws + "a" + ws + ws).trimRight(), "R5");
+    Expect.equals("a" + ws + "a", ("a" + ws + "a" + ws + ws).trimRight(), "R6");
+    Expect.identical(untrimmable, untrimmable.trimRight(), "R7");
+  }
+
+  // Test each whitespace at different locations.
+  for (var ws in WHITESPACE) {
+    var c = new String.fromCharCode(ws);
+    test(c);
+  }
+  // Test all whitespaces at once at different locations.
+  test(new String.fromCharCodes(WHITESPACE));
+
+  // Empty strings.
+  Expect.identical("", "".trimLeft());
+  Expect.identical("", "".trimRight());
+
+  // Test all BMP chars and one surrogate pair.
+  for (int i = 0, j = 0; i <= 0x10000; i++) {
+    if (j < WHITESPACE.length && i == WHITESPACE[j]) {
+      j++;
+      continue;
+    }
+    // U+200b is currently being treated as whitespace by some JS engines.
+    // Should be fixed in tip-of-tree V8 per 2014-02-10.
+    // This line makes string_trimlr_test/none fail but /01 succeede where
+    // this bug is in the JS. Both succeede on the VM and where the bug is
+    // not. Remove this line and comment if all JS engines fix it.
+    if (i == 0x200b) continue;              /// 01: ok
+
+    var s = new String.fromCharCode(i);
+    Expect.identical(s, s.trimLeft());
+    Expect.identical(s, s.trimRight());
+  }
+}
diff --git a/tests/html/dromaeo_smoke_test.dart b/tests/html/dromaeo_smoke_test.dart
index fd92124..1334954 100644
--- a/tests/html/dromaeo_smoke_test.dart
+++ b/tests/html/dromaeo_smoke_test.dart
@@ -5,7 +5,7 @@
 library dromaeo;
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
-import '../../samples/third_party/dromaeo/Dromaeo.dart' as originalTest;
+import '../../samples/third_party/dromaeo/web/Dromaeo.dart' as originalTest;
 import 'dart:html';
 import 'dart:async';
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index e39b4e4..60c52fe 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -6,6 +6,9 @@
 browser/*: SkipByDesign  # Browser specific tests
 isolate_stress_test: Fail # Issue 12588: This should be able to pass when we have wrapper-less tests.
 
+[ $runtime == vm && $arch == mips && $mode == debug ]
+mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
+
 [ $compiler == none || $compiler == dart2dart ]
 serialization_test: SkipByDesign # Tests dart2js-specific serialization code
 isolate_throws_test/01: Skip # Issue 12587
diff --git a/tests/language/call_closurization_test.dart b/tests/language/call_closurization_test.dart
new file mode 100644
index 0000000..6c8dc71
--- /dev/null
+++ b/tests/language/call_closurization_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+main() {
+  bar(a) {
+    return a is String;
+  }
+  var bar_tearOff = bar.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(bar_tearOff(1));
+    Expect.isTrue(bar_tearOff.call('foo'));
+    Expect.isFalse(bar_tearOff.call(1));
+    Expect.isTrue(bar_tearOff('foo'));
+  }
+
+  opt_arg([a = "a"]) => a is String;
+  var opt_arg_tearOff = opt_arg.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(opt_arg_tearOff(1));
+    Expect.isFalse(opt_arg_tearOff.call(1));
+    Expect.isTrue(opt_arg_tearOff());
+    Expect.isTrue(opt_arg_tearOff.call());
+    Expect.isTrue(opt_arg_tearOff("b"));
+    Expect.isTrue(opt_arg_tearOff.call("b"));
+  }
+
+  named_arg({x: 11, y: 22}) => "$x$y";
+  var named_arg_tearOff = named_arg.call;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals("1122", named_arg_tearOff());
+    Expect.equals("1122", named_arg_tearOff.call());
+    Expect.equals("4455", named_arg_tearOff(y:55, x:44));
+    Expect.equals("4455", named_arg_tearOff.call(y:55, x:44));
+    Expect.equals("4455", named_arg_tearOff(x:44, y:55));
+    Expect.equals("4455", named_arg_tearOff.call(x:44, y:55));
+  }
+
+  Expect.throws(() => bar_tearOff.call(), (e) => e is NoSuchMethodError);
+  Expect.throws(() => opt_arg_tearOff.call(x:"p"), (e) => e is NoSuchMethodError);
+  Expect.throws(() => named_arg_tearOff.call("p", "q"), (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/call_test.dart b/tests/language/call_test.dart
index bd6d24f..59d2407 100644
--- a/tests/language/call_test.dart
+++ b/tests/language/call_test.dart
@@ -1,6 +1,7 @@
 // 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.
+// VMOptions=--optimization_counter_threshold=10
 
 import "package:expect/expect.dart";
 
@@ -8,6 +9,35 @@
   bar(a) {
     return a is String;
   }
-  Expect.isFalse(bar(1));
-  Expect.isTrue(bar.call('foo'));
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(bar(1));
+    Expect.isTrue(bar.call('foo'));
+  }
+
+  opt_arg([a = "a"]) => a is String;
+
+  for (var i = 0; i < 20; i++) {
+    Expect.isFalse(opt_arg(1));
+    Expect.isFalse(opt_arg.call(1));
+    Expect.isTrue(opt_arg());
+    Expect.isTrue(opt_arg.call());
+    Expect.isTrue(opt_arg("b"));
+    Expect.isTrue(opt_arg.call("b"));
+  }
+
+  named_arg({x: 11, y: 22}) => "$x$y";
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals("1122", named_arg());
+    Expect.equals("1122", named_arg.call());
+    Expect.equals("4455", named_arg(y:55, x:44));
+    Expect.equals("4455", named_arg.call(y:55, x:44));
+    Expect.equals("4455", named_arg(x:44, y:55));
+    Expect.equals("4455", named_arg.call(x:44, y:55));
+  }
+
+  Expect.throws(() => bar.call(), (e) => e is NoSuchMethodError);
+  Expect.throws(() => opt_arg.call(x:"p"), (e) => e is NoSuchMethodError);
+  Expect.throws(() => named_arg.call("p", "q"), (e) => e is NoSuchMethodError);
 }
diff --git a/tests/language/deferred_constraints_lib.dart b/tests/language/deferred_constraints_lib.dart
index cdc9d4d..9f4d207 100644
--- a/tests/language/deferred_constraints_lib.dart
+++ b/tests/language/deferred_constraints_lib.dart
@@ -2,7 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-class C {}
+class C {
+  static int staticMethod() => 42;
+}
+
+class G<T> {}
 
 class Const {
   const Const();
diff --git a/tests/language/deferred_constraints_lib2.dart b/tests/language/deferred_constraints_lib2.dart
index 7352126..830705f 100644
--- a/tests/language/deferred_constraints_lib2.dart
+++ b/tests/language/deferred_constraints_lib2.dart
@@ -2,4 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-foo () => 42;
\ No newline at end of file
+foo() => 42;
+
+class C {}
diff --git a/tests/language/deferred_constraints_test.dart b/tests/language/deferred_constraints_test.dart
new file mode 100644
index 0000000..6992b78
--- /dev/null
+++ b/tests/language/deferred_constraints_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+@lazy import "deferred_constraints_lib.dart" as lib;
+import "deferred_constraints_lib.dart" as lib2; /// type_annotation_non_deferred: ok
+
+const lazy = const DeferredLibrary('lib');
+
+class F {}
+class G2<T> {}
+
+void f({a: const lib.Const()}) {} /// const_default_argument: compile-time error
+
+@lib.Const() class H {} /// const_annotation: compile-time error
+
+void main() {
+  Expect.throws(() { /// type_annotation1: static type warning
+    lib.C a = new lib.C(); /// type_annotation1: continued
+  }, (e) => e is NoSuchMethodError); /// type_annotation1: continued
+  lib.C a = null; /// type_annotation_null: static type warning
+
+  // In this case we do not defer C.
+  lib2.C a1 = new lib2.C(); /// type_annotation_non_deferred: continued
+  asyncStart();
+  lazy.load().then((_) {
+    lib.C a2 = new lib.C(); /// type_annotation2: dynamic type error, static type warning
+    lib.G<F> a3 = new lib.G<F>(); /// type_annotation_generic1: dynamic type error, static type warning
+    G2<lib.C> a4 = new G2(); /// type_annotation_generic2: static type warning
+    G2<lib.C> a5 = new G2<lib.C>(); /// type_annotation_generic3: static type warning
+    lib.G<lib.C> a = new lib.G<lib.C>(); /// type_annotation_generic4: dynamic type error, static type warning
+    var a6 = new lib.C(); /// new: ok
+    var g1 = new lib.G<F>(); /// new_generic1: ok
+    // new G2<lib.C>() does not give a dynamic type error because a malformed
+    // type used as type-parameter is treated as dynamic.
+    var g2 = new G2<lib.C>(); /// new_generic2: static type warning
+    var g3 = new lib.G<lib.C>(); /// new_generic3: static type warning
+    var instance = lib.constantInstance;
+    Expect.throws(() { /// is_check: static type warning
+      bool a7 = instance is lib.Const; /// is_check: continued
+    }, (e) => e is TypeError); /// is_check: continued
+    Expect.throws(() { /// as_operation: static type warning
+      instance as lib.Const; /// as_operation: continued
+    }, (e) => e is TypeError); /// as_operation: continued
+    Expect.throws(() { /// catch_check: static type warning
+      try { throw instance; } on lib.Const {} /// catch_check: continued
+    }, (e) => e is TypeError); /// catch_check: continued
+    int i = lib.C.staticMethod(); /// static_method: ok
+    var c1 = const lib.Const(); /// const: compile-time error
+    f();  /// const_default_argument: continued
+    var constInstance = lib.constantInstance; /// const_instance: ok
+    var h = new H(); /// const_annotation: continued
+    asyncEnd();
+  });
+}
+
+lib.C a9 = null; /// type_annotation_top_level: static type warning
diff --git a/tests/language/deferred_duplicate_prefix1_test.dart b/tests/language/deferred_duplicate_prefix1_test.dart
index 495d061..2665a09 100644
--- a/tests/language/deferred_duplicate_prefix1_test.dart
+++ b/tests/language/deferred_duplicate_prefix1_test.dart
@@ -4,8 +4,8 @@
 
 import "dart:async";
 
-import "deferred_constraints_lib2.dart" as lib;
-@lazy import "deferred_constraints_lib.dart" as lib; /// 01: compile-time error
+import "deferred_prefix_constraints_lib2.dart" as lib;
+@lazy import "deferred_prefix_constraints_lib.dart" as lib; /// 01: compile-time error
 
 const lazy = const DeferredLibrary('lib');
 
diff --git a/tests/language/deferred_duplicate_prefix2_test.dart b/tests/language/deferred_duplicate_prefix2_test.dart
index 06af454..9e520a8 100644
--- a/tests/language/deferred_duplicate_prefix2_test.dart
+++ b/tests/language/deferred_duplicate_prefix2_test.dart
@@ -4,8 +4,8 @@
 
 import "dart:async";
 
-@lazy import "deferred_constraints_lib.dart" as lib;  /// 01: compile-time error
-import "deferred_constraints_lib2.dart" as lib;
+@lazy import "deferred_prefix_constraints_lib.dart" as lib;  /// 01: compile-time error
+import "deferred_prefix_constraints_lib2.dart" as lib;
 
 const lazy = const DeferredLibrary('lib');
 
diff --git a/tests/language/deferred_duplicate_prefix3_test.dart b/tests/language/deferred_duplicate_prefix3_test.dart
index 15d5e6d..fb54f79 100644
--- a/tests/language/deferred_duplicate_prefix3_test.dart
+++ b/tests/language/deferred_duplicate_prefix3_test.dart
@@ -4,8 +4,8 @@
 
 import "dart:async";
 
-@lazy import "deferred_constraints_lib.dart" as lib;
-@lazy2 import "deferred_constraints_lib2.dart" as lib; /// 01: compile-time error
+@lazy import "deferred_prefix_constraints_lib.dart" as lib;
+@lazy2 import "deferred_prefix_constraints_lib2.dart" as lib; /// 01: compile-time error
 
 const lazy = const DeferredLibrary('lib');
 const lazy2 = const DeferredLibrary('lib2');
diff --git a/tests/language/deferred_no_prefix_test.dart b/tests/language/deferred_no_prefix_test.dart
index 3fed27b..c1674ab 100644
--- a/tests/language/deferred_no_prefix_test.dart
+++ b/tests/language/deferred_no_prefix_test.dart
@@ -9,4 +9,9 @@
 
 const lazy = const DeferredLibrary('lib');
 
-void main() {}
+void main() {
+  lazy.load().then((_) { /// 01: continued
+    C c = new C();       /// 01: continued
+    print(c);            /// 01: continued
+  });                    /// 01: continued
+}
diff --git a/tests/language/deferred_prefix_constraints_lib.dart b/tests/language/deferred_prefix_constraints_lib.dart
new file mode 100644
index 0000000..c79d4e5
--- /dev/null
+++ b/tests/language/deferred_prefix_constraints_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() => 24;
diff --git a/tests/language/deferred_prefix_constraints_lib2.dart b/tests/language/deferred_prefix_constraints_lib2.dart
new file mode 100644
index 0000000..c79d4e5
--- /dev/null
+++ b/tests/language/deferred_prefix_constraints_lib2.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() => 24;
diff --git a/tests/language/interceptor9_test.dart b/tests/language/interceptor9_test.dart
new file mode 100644
index 0000000..a9f057f
--- /dev/null
+++ b/tests/language/interceptor9_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js whose codegen in some cases did not take is
+// tests into account when computing the set of classes for interceptors.
+// See http://dartbug.com/17325
+
+import "package:expect/expect.dart";
+import "dart:typed_data";
+
+confuse(x, [y=null]) => new DateTime.now().day == 42 ? y : x;
+
+boom() {
+    var x = confuse(new Uint8List(22), "");
+    Expect.isTrue(x is Uint8List);
+    x.startsWith("a");
+    x.endsWith("u");
+}
+
+main() {
+  try {
+    var f;
+    if (confuse(true)) { // prevent inlining
+      f = boom;
+    }
+    f();
+  } catch (e) {
+    if (e is ExpectException) throw e;
+  }
+}
diff --git a/tests/language/is_malformed_type_test.dart b/tests/language/is_malformed_type_test.dart
index b5afacc..539dd1f 100644
--- a/tests/language/is_malformed_type_test.dart
+++ b/tests/language/is_malformed_type_test.dart
@@ -12,7 +12,7 @@
   // Test that a runtime error is thrown when the 'is' operator checks for a
   // malformed type.
   try {
-    if (e is Undefined) Expect.fail("unreachable");
+    if (e is Undefined) Expect.fail("unreachable");   /// 99: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -23,7 +23,7 @@
   // Test that a runtime error is thrown when the 'as' operator checks for a
   // malformed type.
   try {
-    if (e as Undefined) Expect.fail("unreachable");
+    if (e as Undefined) Expect.fail("unreachable");   /// 98: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -36,7 +36,7 @@
     // with malformed type is parsed, but not executed at runtime.
     // Regression test for issue 16985.
     evalCount = 0;
-    if (e is Undefined && testEval(e)) Expect.fail("unreachable");
+    if (e is Undefined && testEval(e)) Expect.fail("unreachable");   /// 97: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -50,7 +50,7 @@
     // with malformed type is parsed, but not executed at runtime.
     // Regression test for issue 16985.
     evalCount = 0;
-    if (e as Undefined && testEval(e)) Expect.fail("unreachable");
+    if (e as Undefined && testEval(e)) Expect.fail("unreachable");   /// 96: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -63,7 +63,7 @@
   // runtime error is thrown.
   try {
     evalCount = 0;
-    if (testEval(e) is Undefined) Expect.fail("unreachable");
+    if (testEval(e) is Undefined) Expect.fail("unreachable");   /// 95: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -76,7 +76,7 @@
   // runtime error is thrown.
   try {
     evalCount = 0;
-    if (testEval(e) as Undefined) Expect.fail("unreachable");
+    if (testEval(e) as Undefined) Expect.fail("unreachable");  /// 94: continued
     Expect.fail("unreachable");
   } catch(exc) {
     Expect.isTrue(exc is TypeError);
@@ -85,10 +85,10 @@
 }
 
 main() {
-  test99("99 bottles");  /// 99: ok
-  test98("98 bottles");  /// 98: ok
-  test97("97 bottles");  /// 97: ok
-  test96("96 bottles");  /// 96: ok
-  test95("95 bottles");  /// 95: ok
-  test94("94 bottles");  /// 94: ok
+  test99("99 bottles"); /// 99: static type warning
+  test98("98 bottles"); /// 98: static type warning
+  test97("97 bottles"); /// 97: static type warning
+  test96("96 bottles"); /// 96: static type warning
+  test95("95 bottles"); /// 95: static type warning
+  test94("94 bottles"); /// 94: static type warning
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index ca70884e..7dc0382 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -20,6 +20,29 @@
 duplicate_export_negative_test: Fail # Issue 6134
 mixin_forwarding_constructor2_test: Fail # Issue 13641
 
+# The vm does not support deferred loading.
+deferred_constraints_test/const: Fail
+deferred_constraints_test/const_annotation: Fail
+deferred_constraints_test/const_default_argument: Fail
+
+[ ($compiler == none || $compiler == dart2dart) && $unchecked ]
+# The vm and dart2dart does not support deferred loading.
+deferred_constraints_test/is_check: Fail
+deferred_constraints_test/as_operation: Fail
+deferred_constraints_test/catch_check: Fail
+deferred_constraints_test/type_annotation1: Fail
+
+[ ($compiler == none || $compiler == dart2dart)  && $checked ]
+# The vm and dart2dart does not support deferred loading.
+deferred_constraints_test/as_operation: Fail
+deferred_constraints_test/is_check: Fail
+deferred_constraints_test/catch_check: Fail
+deferred_constraints_test/type_annotation1: Fail
+deferred_constraints_test/type_annotation2: Fail
+deferred_constraints_test/as_operation: Fail
+deferred_constraints_test/type_annotation_generic1: Fail
+deferred_constraints_test/type_annotation_generic4: Fail
+
 [ $compiler == none || $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # The vm and analyzer do not support deferred loading.
 deferred_no_prefix_test/01: Fail
@@ -57,8 +80,8 @@
 malformed2_test/01: Fail, OK
 
 [ $runtime == vm || (($runtime == drt || $runtime == dartium) && $compiler == none) ]
-call_test: Fail # Issue 12602
 dynamic_prefix_core_test/01: Fail # Issue 12478
+call_closurization_test: Fail # Issue 17473
 
 [ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium) ]
 dynamic_prefix_core_test/none: Fail # Issue 12478
@@ -95,3 +118,6 @@
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
 override_inheritance_mixed_test/08: Fail # Issue 16137
 override_inheritance_mixed_test/09: Fail # Issue 16137
+
+[ $compiler == none && $runtime == vm && $arch == mips && $checked ]
+generic_instanceof3_test: Pass, Crash # dartbug.com/17440
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 319229e..f4c89cf 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -5,7 +5,6 @@
 [ $compiler == dartanalyzer ]
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
-is_malformed_type_test/*: Fail # don't know how to tell analyzer to expect static warning
 
 # Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
 built_in_identifier_prefix_test: CompileTimeError # Issue 12694
@@ -28,6 +27,8 @@
 const_map2_test/00: MissingCompileTimeError # Issue 17209
 switch_case_test/none: CompileTimeError # Issue 17209
 
+call_closurization_test: StaticWarning # Issue 17476
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -474,3 +475,19 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
+deferred_constraints_test/type_annotation1: MissingStaticWarning
+deferred_constraints_test/type_annotation2: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_test/as_operation: MissingStaticWarning
+deferred_constraints_test/is_check: MissingStaticWarning
+deferred_constraints_test/new_generic2: MissingStaticWarning
+deferred_constraints_test/new_generic3: MissingStaticWarning
+deferred_constraints_test/catch_check: MissingStaticWarning
+deferred_constraints_test/const: MissingCompileTimeError
+deferred_constraints_test/const_annotation: MissingCompileTimeError
+deferred_constraints_test/const_default_argument: MissingCompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 8531ff2..86e489a 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -5,7 +5,6 @@
 [ $compiler == dart2analyzer ]
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
-is_malformed_type_test/*: Fail # don't know how to tell analyzer to expect static warning
 
 # Test issue 12694 (was analyzer issue), (1) when "abstract" is import prefix using it as type is warning; (2) currently analyzer resolves prefix as field (don't ask)
 built_in_identifier_prefix_test: CompileTimeError # Issue 12694
@@ -28,6 +27,8 @@
 const_map2_test/00: MissingCompileTimeError # Issue 17209
 switch_case_test/none: CompileTimeError # Issue 17209
 
+call_closurization_test: StaticWarning # Issue 17476
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -474,3 +475,19 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
+deferred_constraints_test/type_annotation1: MissingStaticWarning
+deferred_constraints_test/type_annotation2: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_test/as_operation: MissingStaticWarning
+deferred_constraints_test/is_check: MissingStaticWarning
+deferred_constraints_test/new_generic2: MissingStaticWarning
+deferred_constraints_test/new_generic3: MissingStaticWarning
+deferred_constraints_test/catch_check: MissingStaticWarning
+deferred_constraints_test/const: MissingCompileTimeError
+deferred_constraints_test/const_annotation: MissingCompileTimeError
+deferred_constraints_test/const_default_argument: MissingCompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 48b3140..3f55762 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -130,6 +130,7 @@
 truncdiv_test: RuntimeError # Issue 15246
 invocation_mirror2_test: RuntimeError # Issue 6490 (wrong retval).
 generic_closure_test: RuntimeError # Issue 12605
+call_closurization_test: RuntimeError # Issue 17474
 
 # Compilation errors.
 const_var_test: CompileTimeError # Issue 12793
@@ -292,6 +293,10 @@
 
 [ $runtime == ie9 ]
 stack_trace_test: Fail, OK # Stack traces not available in IE9.
+deferred_constraints_test/*: Fail, Pass # http://dartbug.com/12635
 
 [ $compiler == dart2js && $host_checked ]
 const_factory_with_body_test/01: Crash
+
+[ ($compiler == dart2js && $csp)]
+deferred_constraints_test/*: Skip # Issue 16898
diff --git a/tests/language/vm/load_to_load_forwarding_vm_test.dart b/tests/language/vm/load_to_load_forwarding_vm_test.dart
index be99d88..5926305 100644
--- a/tests/language/vm/load_to_load_forwarding_vm_test.dart
+++ b/tests/language/vm/load_to_load_forwarding_vm_test.dart
@@ -266,6 +266,24 @@
   }
   return a[0] + a[1];
 }
+
+
+testIndexedAliasedStore3(i) {
+  var a = new List(2);
+  a[0] = 1;
+  a[i] = 3;
+  return a[0];
+}
+
+
+testIndexedAliasedStore4(b) {
+  var a = new List(2);
+  a[0] = 1;
+  b[0] = 3;
+  return a[0];
+}
+
+
 var indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
 
 class Z {
@@ -349,6 +367,16 @@
   for (var i = 0; i < 20; i++) {
     Expect.equals(4, testIndexedAliasedStore2(array, array, indices[1]));
   }
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(3, testIndexedAliasedStore3(indices[0]));
+  }
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(1, testIndexedAliasedStore3(indices[1]));
+  }
+
+  for (var i = 0; i < 20; i++) {
+    Expect.equals(1, testIndexedAliasedStore4(array));
+  }
 
   var test_array = new List(1);
   for (var i = 0; i < 20; i++) {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index da7a51c..e8fd11f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -59,14 +59,24 @@
 mirrors/instance_members_test: RuntimeError # Issue 14633
 mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
 mirrors/invoke_test: RuntimeError # Issue 11954
+mirrors/invoke_call_through_getter_previously_accessed_test: RuntimeError # Issue 15138
 mirrors/invoke_call_through_getter_test: RuntimeError # Issue 15138
+mirrors/invoke_call_through_implicit_getter_previously_accessed_test: RuntimeError # Issue 15138
+mirrors/invoke_call_through_implicit_getter_test: RuntimeError # Issue 15138
 mirrors/invoke_closurization_test: RuntimeError # Issue 13002
 mirrors/invoke_named_test/none: RuntimeError # Issue 12863
 mirrors/invoke_private_test: CompileTimeError # Issue 12164
 mirrors/invoke_private_wrong_library_test: CompileTimeError # Issue 12164
-mirrors/invoke_subscript_test: RuntimeError # Issue 13002
 mirrors/invoke_throws_test: RuntimeError # Issue 11954
 mirrors/library_declarations_test/none: RuntimeError # Issue 13439, Issue 13733
+mirrors/library_exports_shown_test: RuntimeError # Issue 6490
+mirrors/library_exports_hidden_test: RuntimeError # Issue 6490
+mirrors/library_imports_metadata_test: RuntimeError # Issue 6490
+mirrors/library_imports_bad_metadata_test/none: RuntimeError # Issue 6490
+mirrors/library_imports_shown_test: RuntimeError # Issue 6490
+mirrors/library_imports_hidden_test: RuntimeError # Issue 6490
+mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
+mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
@@ -116,7 +126,6 @@
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
-mirrors/invoke_subscript_test: RuntimeError, Timeout # Issue 15610
 
 [ $compiler == dart2js && $runtime != jsshell && $runtime != safari && $runtime != ff && $runtime != ie9 && $runtime != ie10]
 math/math_test: RuntimeError
diff --git a/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
new file mode 100644
index 0000000..0f9c591
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.invoke_call_through_getter;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+  call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+  noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+  get fakeFunctionCall => new FakeFunctionCall();
+  get fakeFunctionNSM => new FakeFunctionNSM();
+  get closure => (x, y) => '2 $this $x $y';
+  get closureOpt => (x, y, [z, w]) => '3 $this $x $y $z $w';
+  get closureNamed => (x, y, {z, w}) => '4 $this $x $y $z $w';
+  get notAClosure => 'Not a closure';
+  noSuchMethod(msg) => 'DNU';
+
+  toString() => 'C';
+}
+
+testInstanceBase() {
+  var c = new C();
+
+  Expect.equals('1 5 6', c.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', c.fakeFunctionNSM(7, 8));
+  Expect.equals('2 C 9 10', c.closure(9, 10));
+  Expect.equals('3 C 11 12 13 null', c.closureOpt(11, 12, 13));
+  Expect.equals('4 C 14 15 null 16', c.closureNamed(14, 15, w: 16));
+  Expect.equals('DNU', c.doesNotExist(17, 18));
+  Expect.throws(() => c.closure('wrong arity'), (e) => e is NoSuchMethodError);
+  Expect.throws(() => c.notAClosure(), (e) => e is NoSuchMethodError);
+}
+
+testInstanceReflective() {
+  InstanceMirror im = reflect(new C());
+
+  Expect.equals('1 5 6',
+                im.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                im.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 C 9 10',
+                im.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 C 11 12 13 null',
+                im.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 C 14 15 null 16',
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('DNU',
+                im.invoke(#doesNotExist, [17, 18]).reflectee);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
+}
+
+class D {
+  static get fakeFunctionCall => new FakeFunctionCall();
+  static get fakeFunctionNSM => new FakeFunctionNSM();
+  static get closure => (x, y) => '2 $x $y';
+  static get closureOpt => (x, y, [z, w]) => '3 $x $y $z $w';
+  static get closureNamed => (x, y, {z, w}) => '4 $x $y $z $w';
+  static get notAClosure => 'Not a closure';
+}
+
+testClassBase() {
+  Expect.equals('1 5 6', D.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', D.fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', D.closure(9, 10));
+  Expect.equals('3 11 12 13 null', D.closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', D.closureNamed(14, 15, w: 16));
+  Expect.throws(() => D.closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testClassReflective() {
+  ClassMirror cm = reflectClass(D);
+
+  Expect.equals('1 5 6',
+                cm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                cm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                cm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+get fakeFunctionCall => new FakeFunctionCall();
+get fakeFunctionNSM => new FakeFunctionNSM();
+get closure => (x, y) => '2 $x $y';
+get closureOpt => (x, y, [z, w]) => '3 $x $y $z $w';
+get closureNamed => (x, y, {z, w}) => '4 $x $y $z $w';
+get notAClosure => 'Not a closure';
+
+testLibraryBase() {
+  Expect.equals('1 5 6', fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', closure(9, 10));
+  Expect.equals('3 11 12 13 null', closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', closureNamed(14, 15, w: 16));
+  Expect.throws(() => closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testLibraryReflective() {
+  LibraryMirror lm = reflectClass(D).owner;
+
+  Expect.equals('1 5 6',
+                lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                lm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+main() {
+  // Access the getters/closures at the base level in this variant.
+  testInstanceBase();
+  testInstanceReflective();
+  testClassBase();
+  testClassReflective();
+  testLibraryBase();
+  testLibraryReflective();
+}
diff --git a/tests/lib/mirrors/invoke_call_through_getter_test.dart b/tests/lib/mirrors/invoke_call_through_getter_test.dart
index 71dca68..a4afdd6 100644
--- a/tests/lib/mirrors/invoke_call_through_getter_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_getter_test.dart
@@ -130,10 +130,11 @@
 }
 
 main() {
-  testInstanceBase();
+  // Do not access the getters/closures at the base level in this variant.
+  //testInstanceBase();
   testInstanceReflective();
-  testClassBase();
+  //testClassBase();
   testClassReflective();
-  testLibraryBase();
+  //testLibraryBase();
   testLibraryReflective();
 }
diff --git a/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
new file mode 100644
index 0000000..edda37c
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.invoke_call_through_implicit_getter;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+  call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+  noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+  var fakeFunctionCall = new FakeFunctionCall();
+  var fakeFunctionNSM = new FakeFunctionNSM();
+  var closure;  // = (x, y) => '2 $this $x $y';
+  var closureOpt;  // = (x, y, [z, w]) => '3 $this $x $y $z $w';
+  var closureNamed;  // = (x, y, {z, w}) => '4 $this $x $y $z $w';
+  var notAClosure = 'Not a closure';
+  noSuchMethod(msg) => 'DNU';
+
+  C() {
+    closure = (x, y) => '2 $this $x $y';
+    closureOpt = (x, y, [z, w]) => '3 $this $x $y $z $w';
+    closureNamed = (x, y, {z, w}) => '4 $this $x $y $z $w';
+  }
+
+  toString() => 'C';
+}
+
+testInstanceBase() {
+  var c = new C();
+
+  Expect.equals('1 5 6', c.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', c.fakeFunctionNSM(7, 8));
+  Expect.equals('2 C 9 10', c.closure(9, 10));
+  Expect.equals('3 C 11 12 13 null', c.closureOpt(11, 12, 13));
+  Expect.equals('4 C 14 15 null 16', c.closureNamed(14, 15, w: 16));
+  Expect.equals('DNU', c.doesNotExist(17, 18));
+  Expect.throws(() => c.closure('wrong arity'), (e) => e is NoSuchMethodError);
+  Expect.throws(() => c.notAClosure(), (e) => e is NoSuchMethodError);
+}
+
+testInstanceReflective() {
+  InstanceMirror im = reflect(new C());
+
+  Expect.equals('1 5 6',
+                im.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                im.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 C 9 10',
+                im.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 C 11 12 13 null',
+                im.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 C 14 15 null 16',
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('DNU',
+                im.invoke(#doesNotExist, [17, 18]).reflectee);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
+}
+
+class D {
+  static var fakeFunctionCall = new FakeFunctionCall();
+  static var fakeFunctionNSM = new FakeFunctionNSM();
+  static var closure = (x, y) => '2 $x $y';
+  static var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
+  static var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
+  static var notAClosure = 'Not a closure';
+}
+
+testClassBase() {
+  Expect.equals('1 5 6', D.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', D.fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', D.closure(9, 10));
+  Expect.equals('3 11 12 13 null', D.closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', D.closureNamed(14, 15, w: 16));
+  Expect.throws(() => D.closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testClassReflective() {
+  ClassMirror cm = reflectClass(D);
+
+  Expect.equals('1 5 6',
+                cm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                cm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                cm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+var fakeFunctionCall = new FakeFunctionCall();
+var fakeFunctionNSM = new FakeFunctionNSM();
+var closure = (x, y) => '2 $x $y';
+var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
+var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
+var notAClosure = 'Not a closure';
+
+testLibraryBase() {
+  Expect.equals('1 5 6', fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', closure(9, 10));
+  Expect.equals('3 11 12 13 null', closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', closureNamed(14, 15, w: 16));
+  Expect.throws(() => closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testLibraryReflective() {
+  LibraryMirror lm = reflectClass(D).owner;
+
+  Expect.equals('1 5 6',
+                lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                lm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+main() {
+  testInstanceBase();
+  testInstanceReflective();
+  testClassBase();
+  testClassReflective();
+  testLibraryBase();
+  testLibraryReflective();
+}
diff --git a/tests/lib/mirrors/invoke_call_through_implicit_getter_test.dart b/tests/lib/mirrors/invoke_call_through_implicit_getter_test.dart
new file mode 100644
index 0000000..6aa5cdf
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_through_implicit_getter_test.dart
@@ -0,0 +1,146 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.invoke_call_through_implicit_getter;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+  call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+  noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+  var fakeFunctionCall = new FakeFunctionCall();
+  var fakeFunctionNSM = new FakeFunctionNSM();
+  var closure;  // = (x, y) => '2 $this $x $y';
+  var closureOpt;  // = (x, y, [z, w]) => '3 $this $x $y $z $w';
+  var closureNamed;  // = (x, y, {z, w}) => '4 $this $x $y $z $w';
+  var notAClosure = 'Not a closure';
+  noSuchMethod(msg) => 'DNU';
+
+  C() {
+    closure = (x, y) => '2 $this $x $y';
+    closureOpt = (x, y, [z, w]) => '3 $this $x $y $z $w';
+    closureNamed = (x, y, {z, w}) => '4 $this $x $y $z $w';
+  }
+
+  toString() => 'C';
+}
+
+testInstanceBase() {
+  var c = new C();
+
+  Expect.equals('1 5 6', c.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', c.fakeFunctionNSM(7, 8));
+  Expect.equals('2 C 9 10', c.closure(9, 10));
+  Expect.equals('3 C 11 12 13 null', c.closureOpt(11, 12, 13));
+  Expect.equals('4 C 14 15 null 16', c.closureNamed(14, 15, w: 16));
+  Expect.equals('DNU', c.doesNotExist(17, 18));
+  Expect.throws(() => c.closure('wrong arity'), (e) => e is NoSuchMethodError);
+  Expect.throws(() => c.notAClosure(), (e) => e is NoSuchMethodError);
+}
+
+testInstanceReflective() {
+  InstanceMirror im = reflect(new C());
+
+  Expect.equals('1 5 6',
+                im.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                im.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 C 9 10',
+                im.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 C 11 12 13 null',
+                im.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 C 14 15 null 16',
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('DNU',
+                im.invoke(#doesNotExist, [17, 18]).reflectee);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
+}
+
+class D {
+  static var fakeFunctionCall = new FakeFunctionCall();
+  static var fakeFunctionNSM = new FakeFunctionNSM();
+  static var closure = (x, y) => '2 $x $y';
+  static var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
+  static var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
+  static var notAClosure = 'Not a closure';
+}
+
+testClassBase() {
+  Expect.equals('1 5 6', D.fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', D.fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', D.closure(9, 10));
+  Expect.equals('3 11 12 13 null', D.closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', D.closureNamed(14, 15, w: 16));
+  Expect.throws(() => D.closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testClassReflective() {
+  ClassMirror cm = reflectClass(D);
+
+  Expect.equals('1 5 6',
+                cm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                cm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                cm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+var fakeFunctionCall = new FakeFunctionCall();
+var fakeFunctionNSM = new FakeFunctionNSM();
+var closure = (x, y) => '2 $x $y';
+var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
+var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
+var notAClosure = 'Not a closure';
+
+testLibraryBase() {
+  Expect.equals('1 5 6', fakeFunctionCall(5, 6));
+  Expect.equals('7, 8', fakeFunctionNSM(7, 8));
+  Expect.equals('2 9 10', closure(9, 10));
+  Expect.equals('3 11 12 13 null', closureOpt(11, 12, 13));
+  Expect.equals('4 14 15 null 16', closureNamed(14, 15, w: 16));
+  Expect.throws(() => closure('wrong arity'), (e) => e is NoSuchMethodError);
+}
+
+testLibraryReflective() {
+  LibraryMirror lm = reflectClass(D).owner;
+
+  Expect.equals('1 5 6',
+                lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
+  Expect.equals('7, 8',
+                lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
+  Expect.equals('2 9 10',
+                lm.invoke(#closure, [9, 10]).reflectee);
+  Expect.equals('3 11 12 13 null',
+                lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
+  Expect.equals('4 14 15 null 16',
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+}
+
+main() {
+  // Do not access the getters/closures at the base level in this variant.
+  //testInstanceBase();
+  testInstanceReflective();
+  //testClassBase();
+  testClassReflective();
+  //testLibraryBase();
+  testLibraryReflective();
+}
diff --git a/tests/lib/mirrors/invoke_subscript_test.dart b/tests/lib/mirrors/invoke_subscript_test.dart
deleted file mode 100644
index 301091a..0000000
--- a/tests/lib/mirrors/invoke_subscript_test.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 test.invoke_subscript_test;
-
-import 'dart:mirrors';
-import 'package:expect/expect.dart';
-
-class Super {
-  inheritedMethod(a, b) => a + b;
-  staticFunctionInSuper(x) => x;
-}
-
-class Class extends Super {
-  var field = 'f';
-  get getter => 'g';
-  set setter(v) => 's';
-  method(x, y, z) => '$x-$y-$z';
-  methodWithNamed(x, {y, z:'Z'}) => '$x+$y+$z';
-  methodWithOptPos(x, [y, z='Z']) => '$x*$y*$z';
-
-  static var staticField = 'sf';
-  static get staticGetter => 'sg';
-  static set staticSetter(v) => 'ss';
-  static staticFunction(x, y, z) => '$x-$y-$z';
-  static staticFunctionWithNamed(x, {y, z:'Z'}) => '$x+$y+$z';
-  static staticFunctionWithOptPos(x, [y, z='Z']) => '$x*$y*$z';
-
-}
-
-var toplevelField ='tf';
-get toplevelGetter => 'tg';
-set toplevelSetter(v) => 'ts';
-toplevelFunction(x, y, z) => '$x-$y-$z';
-toplevelFunctionWithNamed(x, {y, z:'Z'}) => '$x+$y+$z';
-toplevelFunctionWithOptPos(x, [y, z='Z']) => '$x*$y*$z';
-
-expectArgumentError(f) {
-  Expect.throws(f, (e) => e is ArgumentError);
-}
-
-main() {
-  InstanceMirror im = reflect(new Class());
-  Expect.equals('A-B-C', im[#method]('A', 'B', 'C').reflectee);
-  Expect.throws(() => im[#method]('A', 'B', 'C', 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-  Expect.equals(7, im[#inheritedMethod](3, 4).reflectee);
-  expectArgumentError(() => im[#field]);
-  expectArgumentError(() => im[#getter]);
-  expectArgumentError(() => im[#setter]);
-  expectArgumentError(() => im[#doesntExist]);
-  expectArgumentError(() => im[#staticFunction]);
-
-  ClassMirror cm = reflectClass(Class);
-  Expect.equals('A-B-C', cm[#staticFunction]('A', 'B', 'C').reflectee);
-  Expect.throws(() => cm[#staticFunction]('A', 'B', 'C', 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-  expectArgumentError(() => cm[#staticField]);
-  expectArgumentError(() => cm[#staticGetter]);
-  expectArgumentError(() => cm[#staticSetter]);
-  expectArgumentError(() => cm[#staticDoesntExist]);
-  expectArgumentError(() => cm[#staticFunctionInSuper]);
-  expectArgumentError(() => cm[#method]);
-
-  LibraryMirror lm = cm.owner;
-  Expect.equals('A-B-C', lm[#toplevelFunction]('A', 'B', 'C').reflectee);
-  Expect.throws(() => lm[#toplevelFunction]('A', 'B', 'C', 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-
-  expectArgumentError(() => lm[#toplevelField]);
-  expectArgumentError(() => lm[#toplevelGetter]);
-  expectArgumentError(() => lm[#toplevelSetter]);
-  expectArgumentError(() => lm[#toplevelDoesntExist]);
-
-  // dart2js might stop testing here.
-
-  Expect.equals('A+B+Z', im[#methodWithNamed]('A', y: 'B').reflectee);
-  Expect.equals('A*B*Z', im[#methodWithOptPos]('A', 'B').reflectee);
-  Expect.throws(() => im[#methodWithNamed]('A', w: 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-  Expect.throws(() => im[#method](),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-
-  Expect.equals('A+B+Z', cm[#staticFunctionWithNamed]('A', y: 'B').reflectee);
-  Expect.equals('A*B*Z', cm[#staticFunctionWithOptPos]('A', 'B').reflectee);
-  Expect.throws(() => cm[#staticFunctionWithNamed]('A', w: 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-  Expect.throws(() => cm[#staticFunctionWithOptPos](),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-
-  Expect.equals('A+B+Z', lm[#toplevelFunctionWithNamed]('A', y: 'B').reflectee);
-  Expect.equals('A*B*Z', lm[#toplevelFunctionWithOptPos]('A', 'B').reflectee);
-  Expect.throws(() => lm[#toplevelFunctionWithNamed]('A', w: 'D'),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-  Expect.throws(() => lm[#toplevelFunctionWithOptPos](),
-                (e) => e is NoSuchMethodError,
-                'Wrong arity');
-}
diff --git a/tests/lib/mirrors/library_exports_hidden.dart b/tests/lib/mirrors/library_exports_hidden.dart
new file mode 100644
index 0000000..c1ea081
--- /dev/null
+++ b/tests/lib/mirrors/library_exports_hidden.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_exports_hidden;
+
+export 'library_imports_a.dart' hide somethingFromA, somethingFromBoth;
+export 'library_imports_b.dart' hide somethingFromB;
+
+var somethingFromHidden;
diff --git a/tests/lib/mirrors/library_exports_hidden_test.dart b/tests/lib/mirrors/library_exports_hidden_test.dart
new file mode 100644
index 0000000..990dbb1
--- /dev/null
+++ b/tests/lib/mirrors/library_exports_hidden_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_exports_hidden.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror hidden = mirrors.findLibrary(#library_exports_hidden);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   hidden.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'export library_imports_a\n'
+      ' hide somethingFromA\n'
+      ' hide somethingFromBoth\n'
+      'export library_imports_b\n'
+      ' hide somethingFromB\n',
+      stringifyDependencies(hidden));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/library_exports_shown.dart b/tests/lib/mirrors/library_exports_shown.dart
new file mode 100644
index 0000000..524ab4c
--- /dev/null
+++ b/tests/lib/mirrors/library_exports_shown.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_exports_shown;
+
+export 'library_imports_a.dart' show somethingFromA, somethingFromBoth;
+export 'library_imports_b.dart' show somethingFromB;
+
+var somethingFromShown;
diff --git a/tests/lib/mirrors/library_exports_shown_test.dart b/tests/lib/mirrors/library_exports_shown_test.dart
new file mode 100644
index 0000000..66592f1
--- /dev/null
+++ b/tests/lib/mirrors/library_exports_shown_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_exports_shown.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror shown = mirrors.findLibrary(#library_exports_shown);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   shown.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'export library_imports_a\n'
+      ' show somethingFromA\n'
+      ' show somethingFromBoth\n'
+      'export library_imports_b\n'
+      ' show somethingFromB\n',
+      stringifyDependencies(shown));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/library_imports_a.dart b/tests/lib/mirrors/library_imports_a.dart
new file mode 100644
index 0000000..afdc329
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_a.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_a;
+
+var somethingFromA;
+var somethingFromBoth;
diff --git a/tests/lib/mirrors/library_imports_b.dart b/tests/lib/mirrors/library_imports_b.dart
new file mode 100644
index 0000000..493f323
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_b.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_b;
+
+var somethingFromB;
+var somethingFromBoth;
diff --git a/tests/lib/mirrors/library_imports_bad_metadata_test.dart b/tests/lib/mirrors/library_imports_bad_metadata_test.dart
new file mode 100644
index 0000000..51c756e
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_bad_metadata_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports_bad_metadata;
+
+@undefined  /// 01: compile-time error
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+main() {
+  LibraryMirror thisLibrary =
+      currentMirrorSystem().findLibrary(#test.library_imports_bad_metadata);
+
+  thisLibrary.libraryDependencies.forEach((dep) {
+    Expect.listEquals([], dep.metadata);
+  });
+}
diff --git a/tests/lib/mirrors/library_imports_hidden.dart b/tests/lib/mirrors/library_imports_hidden.dart
new file mode 100644
index 0000000..deccc64
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_hidden.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_hidden;
+
+import 'library_imports_a.dart' hide somethingFromA, somethingFromBoth;
+import 'library_imports_b.dart' hide somethingFromB;
+
+var somethingFromHidden;
diff --git a/tests/lib/mirrors/library_imports_hidden_test.dart b/tests/lib/mirrors/library_imports_hidden_test.dart
new file mode 100644
index 0000000..3f1dcb0
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_hidden_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_imports_hidden.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror hidden = mirrors.findLibrary(#library_imports_hidden);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   hidden.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'import library_imports_a\n'
+      ' hide somethingFromA\n'
+      ' hide somethingFromBoth\n'
+      'import library_imports_b\n'
+      ' hide somethingFromB\n',
+      stringifyDependencies(hidden));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/library_imports_metadata.dart b/tests/lib/mirrors/library_imports_metadata.dart
new file mode 100644
index 0000000..9507269
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_metadata.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_metadata;
+
+@m1
+import 'dart:mirrors' as mirrors;
+
+@m2 @m3
+import 'dart:collection';
+
+import 'dart:async';
+
+const m1 = const Object();
+const m2 = const Object();
+const m3 = const Object();
diff --git a/tests/lib/mirrors/library_imports_metadata_test.dart b/tests/lib/mirrors/library_imports_metadata_test.dart
new file mode 100644
index 0000000..aa96d01
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_metadata_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_imports_metadata.dart';
+
+main() {
+  LibraryMirror lib = currentMirrorSystem().findLibrary(#library_imports_metadata);
+
+  LibraryMirror core = currentMirrorSystem().findLibrary(#dart.core);
+  LibraryMirror mirrors = currentMirrorSystem().findLibrary(#dart.mirrors);
+  LibraryMirror collection = currentMirrorSystem().findLibrary(#dart.collection);
+  LibraryMirror async = currentMirrorSystem().findLibrary(#dart.async);
+
+  Expect.setEquals([core, mirrors, collection, async],
+                   lib.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.async\n'
+      'import dart.collection\n'
+      'import dart.core\n'
+      'import dart.mirrors as mirrors\n',
+      stringifyDependencies(lib));
+
+  Expect.listEquals(
+      [].map(reflect).toList(),
+      lib.libraryDependencies
+          .singleWhere((dep) => dep.targetLibrary == core).metadata);
+
+  Expect.listEquals(
+      [m1].map(reflect).toList(),
+      lib.libraryDependencies
+          .singleWhere((dep) => dep.targetLibrary == mirrors).metadata);
+
+  Expect.listEquals(
+      [m2, m3].map(reflect).toList(),
+      lib.libraryDependencies
+          .singleWhere((dep) => dep.targetLibrary == collection).metadata);
+
+  Expect.listEquals(
+      [].map(reflect).toList(),
+      lib.libraryDependencies
+          .singleWhere((dep) => dep.targetLibrary == async).metadata);
+}
diff --git a/tests/lib/mirrors/library_imports_prefixed.dart b/tests/lib/mirrors/library_imports_prefixed.dart
new file mode 100644
index 0000000..ad50f42
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_prefixed.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_prefixed;
+
+import 'library_imports_a.dart' as prefixa;
+import 'library_imports_b.dart' as prefixb;
+
+var somethingFromPrefixed;
diff --git a/tests/lib/mirrors/library_imports_prefixed_show_hide.dart b/tests/lib/mirrors/library_imports_prefixed_show_hide.dart
new file mode 100644
index 0000000..ea7c71f
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_prefixed_show_hide.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_prefixed_show_hide;
+
+import 'library_imports_a.dart' as prefixa show somethingFromA;
+import 'library_imports_b.dart' as prefixb hide somethingFromB;
+
+var somethingFromPrefixed;
diff --git a/tests/lib/mirrors/library_imports_prefixed_show_hide_test.dart b/tests/lib/mirrors/library_imports_prefixed_show_hide_test.dart
new file mode 100644
index 0000000..eb865a1
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_prefixed_show_hide_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_imports_prefixed_show_hide.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror prefixed_show_hide = mirrors.findLibrary(#library_imports_prefixed_show_hide);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   prefixed_show_hide.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'import library_imports_a as prefixa\n'
+      ' show somethingFromA\n'
+      'import library_imports_b as prefixb\n'
+      ' hide somethingFromB\n',
+      stringifyDependencies(prefixed_show_hide));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/library_imports_prefixed_test.dart b/tests/lib/mirrors/library_imports_prefixed_test.dart
new file mode 100644
index 0000000..beda171
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_prefixed_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_imports_prefixed.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror prefixed = mirrors.findLibrary(#library_imports_prefixed);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   prefixed.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'import library_imports_a as prefixa\n'
+      'import library_imports_b as prefixb\n',
+      stringifyDependencies(prefixed));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/library_imports_shown.dart b/tests/lib/mirrors/library_imports_shown.dart
new file mode 100644
index 0000000..6790902
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_shown.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library library_imports_shown;
+
+import 'library_imports_a.dart' show somethingFromA, somethingFromBoth;
+import 'library_imports_b.dart' show somethingFromB;
+
+var somethingFromShown;
diff --git a/tests/lib/mirrors/library_imports_shown_test.dart b/tests/lib/mirrors/library_imports_shown_test.dart
new file mode 100644
index 0000000..fb16df2
--- /dev/null
+++ b/tests/lib/mirrors/library_imports_shown_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.library_imports;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+import 'library_imports_shown.dart';
+
+test(MirrorSystem mirrors) {
+  LibraryMirror shown = mirrors.findLibrary(#library_imports_shown);
+  LibraryMirror a = mirrors.findLibrary(#library_imports_a);
+  LibraryMirror b = mirrors.findLibrary(#library_imports_b);
+  LibraryMirror core = mirrors.findLibrary(#dart.core);
+
+  Expect.setEquals([a, b, core],
+                   shown.libraryDependencies.map((dep) => dep.targetLibrary));
+
+  Expect.stringEquals(
+      'import dart.core\n'
+      'import library_imports_a\n'
+      ' show somethingFromA\n'
+      ' show somethingFromBoth\n'
+      'import library_imports_b\n'
+      ' show somethingFromB\n',
+      stringifyDependencies(shown));
+}
+
+main() {
+  test(currentMirrorSystem());
+}
diff --git a/tests/lib/mirrors/stringify.dart b/tests/lib/mirrors/stringify.dart
index c848f93..067769a 100644
--- a/tests/lib/mirrors/stringify.dart
+++ b/tests/lib/mirrors/stringify.dart
@@ -114,6 +114,39 @@
   return 'Method($buffer)';
 }
 
+stringifyDependencies(LibraryMirror l) {
+  n(s) => s is Symbol ? MirrorSystem.getName(s) : s;
+  compareDep(a, b) =>
+      n(a.targetLibrary.simpleName).compareTo(n(b.targetLibrary.simpleName));
+  compareCom(a, b) => n(a.identifier).compareTo(n(b.identifier));
+  compareFirst(a, b) => a[0].compareTo(b[0]);
+  sortBy(c, p) => new List.from(c)..sort(p);
+
+  var buffer = new StringBuffer();
+  sortBy(l.libraryDependencies, compareDep).forEach((dep) {
+    if (dep.isImport) buffer.write('import ');
+    if (dep.isExport) buffer.write('export ');
+    buffer.write(n(dep.targetLibrary.simpleName));
+    if (dep.prefix != null) buffer.write(' as ${n(dep.prefix)}');
+    buffer.write('\n');
+
+    List flattenedCombinators = new List();
+    dep.combinators.forEach((com) {
+      com.identifiers.forEach((ident) {
+        flattenedCombinators.add([n(ident), com.isShow, com.isHide]);
+      });
+    });
+    sortBy(flattenedCombinators, compareFirst).forEach((triple) {
+      buffer.write(' ');
+      if (triple[1]) buffer.write('show ');
+      if (triple[2]) buffer.write('hide ');
+      buffer.write(triple[0]);
+      buffer.write('\n');
+    });
+  });
+  return buffer.toString();
+}
+
 stringify(value) {
   if (value is Map) return stringifyMap(value);
   if (value is Iterable) return stringifyIterable(value);
diff --git a/tests/standalone/io/signal_test_script.dart b/tests/standalone/io/signal_test_script.dart
index 7f43c5a..02b2c25 100644
--- a/tests/standalone/io/signal_test_script.dart
+++ b/tests/standalone/io/signal_test_script.dart
@@ -3,9 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:io";
+import "dart:async";
 
 void main(args) {
   var signal;
+  // This process should die if it never receives a signal.
+  var timeout = new Timer(new Duration(seconds: 25), () => exit(1));
   switch (args[0]) {
     case 'SIGHUP': signal = ProcessSignal.SIGHUP; break;
     case 'SIGINT': signal = ProcessSignal.SIGINT; break;
@@ -18,7 +21,7 @@
     if (signal != s) exit(1);
     if (signal.toString() != args[0]) exit(1);
     print('got signal');
+    timeout.cancel();
   });
   print("ready");
 }
-
diff --git a/tests/standalone/io/test_harness_analyzer_test.dart b/tests/standalone/io/test_harness_analyzer_test.dart
index 82b289d..f2a2b40 100644
--- a/tests/standalone/io/test_harness_analyzer_test.dart
+++ b/tests/standalone/io/test_harness_analyzer_test.dart
@@ -4,7 +4,6 @@
 
 import '../../../tools/test.dart' as test_dart;
 import '../../../tools/testing/dart/launch_browser.dart' as launch_browser;
-import '../../../tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart' as browser_perf_testing;
 
 // The purpose of this test is to run the analyzer on it and make sure our
 // testing scripts are free of warnings/errors.
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index 3baeb38..cb41800 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index e21c3b4..f5d3421 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -104,6 +104,9 @@
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
 
+[ $arch == arm ]
+vmservice/isolate_echo_test: Fail # Issue 17431
+
 [ $arch == simmips || $arch == mips ]
 io/web_socket_test: Pass, Slow
 io/http_server_response_test: Pass, Slow
@@ -111,10 +114,8 @@
 oom_error_stacktrace_test: Skip # Fails on Linux
 
 [ $arch == mips ]
-io/test_extension_test: Fail
-io/test_extension_fail_test: Fail
-io/dart_std_io_pipe_test: Fail
-io/file_read_special_device_test: Fail
+io/signals_test: Fail # dartbug.com/17440
+io/file_stat_test: Fail # dartbug.com/17440
 
 [ $compiler == none && $runtime == dartium && $unchecked ]
 assert_test: Fail # Issue 13719: Please triage this failure.
diff --git a/tests/standalone/vmservice/isolate_echo_test.dart b/tests/standalone/vmservice/isolate_echo_test.dart
index d305248..2f311d2 100644
--- a/tests/standalone/vmservice/isolate_echo_test.dart
+++ b/tests/standalone/vmservice/isolate_echo_test.dart
@@ -14,22 +14,22 @@
   onRequestCompleted(Map reply) {
     Expect.equals('message', reply['type']);
 
-    Expect.equals(3, reply['message']['arguments'].length);
-    Expect.equals('_echo', reply['message']['arguments'][0]);
-    Expect.equals('foo', reply['message']['arguments'][1]);
-    Expect.equals('bar', reply['message']['arguments'][2]);
+    Expect.equals(3, reply['request']['arguments'].length);
+    Expect.equals('_echo', reply['request']['arguments'][0]);
+    Expect.equals('foo', reply['request']['arguments'][1]);
+    Expect.equals('bar', reply['request']['arguments'][2]);
 
-    Expect.equals(4, reply['message']['option_keys'].length);
-    Expect.equals('a', reply['message']['option_keys'][0]);
-    Expect.equals('k', reply['message']['option_keys'][1]);
-    Expect.equals('d', reply['message']['option_keys'][2]);
-    Expect.equals('z', reply['message']['option_keys'][3]);
+    Expect.equals(4, reply['request']['option_keys'].length);
+    Expect.equals('a', reply['request']['option_keys'][0]);
+    Expect.equals('k', reply['request']['option_keys'][1]);
+    Expect.equals('d', reply['request']['option_keys'][2]);
+    Expect.equals('z', reply['request']['option_keys'][3]);
 
-    Expect.equals(4, reply['message']['option_values'].length);
-    Expect.equals('b', reply['message']['option_values'][0]);
-    Expect.equals('', reply['message']['option_values'][1]);
-    Expect.equals('e', reply['message']['option_values'][2]);
-    Expect.equals('w', reply['message']['option_values'][3]);
+    Expect.equals(4, reply['request']['option_values'].length);
+    Expect.equals('b', reply['request']['option_values'][0]);
+    Expect.equals('', reply['request']['option_values'][1]);
+    Expect.equals('e', reply['request']['option_values'][2]);
+    Expect.equals('w', reply['request']['option_values'][3]);
   }
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index 893bf1a..bc3ad81 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 3
 PATCH 0
-PRERELEASE 3
-PRERELEASE_PATCH 2
+PRERELEASE 4
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 44366db..ab49a1c 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -210,23 +210,31 @@
 class GSUtil(object):
   GSUTIL_IS_SHELL_SCRIPT = False
   GSUTIL_PATH = None
+  USE_DART_REPO_VERSION = False
 
   def _layzCalculateGSUtilPath(self):
     if not GSUtil.GSUTIL_PATH:
       buildbot_gsutil = utils.GetBuildbotGSUtilPath()
-      if os.path.isfile(buildbot_gsutil):
+      if os.path.isfile(buildbot_gsutil) and not GSUtil.USE_DART_REPO_VERSION:
         GSUtil.GSUTIL_IS_SHELL_SCRIPT = True
         GSUtil.GSUTIL_PATH = buildbot_gsutil
       else:
         dart_gsutil = os.path.join(DART_DIR, 'third_party', 'gsutil', 'gsutil')
-        possible_locations = (list(os.environ['PATH'].split(os.pathsep))
-            + [dart_gsutil])
-        for directory in possible_locations:
-          location = os.path.join(directory, 'gsutil')
-          if os.path.isfile(location):
-            GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
-            GSUtil.GSUTIL_PATH = location
-            break
+        if os.path.isfile(dart_gsutil):
+          GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
+          GSUtil.GSUTIL_PATH = dart_gsutil
+        elif GSUtil.USE_DART_REPO_VERSION:
+          raise Exception("Dart repository version of gsutil required, "
+                          "but not found.")
+        else:
+          # We did not find gsutil, look in path
+          possible_locations = list(os.environ['PATH'].split(os.pathsep))
+          for directory in possible_locations:
+            location = os.path.join(directory, 'gsutil')
+            if os.path.isfile(location):
+              GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
+              GSUtil.GSUTIL_PATH = location
+              break
       assert GSUtil.GSUTIL_PATH
 
   def execute(self, gsutil_args):
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index fd4880a..a53d90b 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -25,7 +25,7 @@
     r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?-?(\d*)-?(\d*)')
 DART2JS_FULL_BUILDER = r'dart2js-full-(linux|mac|windows)(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
-    r'dart2js-(ie9|ie10|ff|safari|chrome|chromeOnAndroid|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
+    r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
 
 DART2JS_FULL_CONFIGURATIONS = {
   'linux' : [ ],
@@ -136,8 +136,8 @@
 
 
 def NeedsXterm(compiler, runtime):
-  return runtime in ['ie9', 'ie10', 'chrome', 'safari', 'opera', 'ff', 'drt',
-                     'dartium']
+  return runtime in ['ie9', 'ie10', 'ie11', 'chrome', 'safari', 'opera', 
+                     'ff', 'drt', 'dartium']
 
 
 def TestStepName(name, flags):
@@ -261,7 +261,7 @@
     TestStep("dart2js_unit", mode, system, 'none', 'vm', ['dart2js'],
              unit_test_flags, arch)
 
-  if compiler == 'dart2js' and system == 'windows' and runtime == 'ie10':
+  if compiler == 'dart2js' and runtime in ['ie10', 'ie11']:
     TestStep("%s-%s" % (compiler, runtime), mode, system, compiler, runtime,
              ['html'], flags, arch)
   else:
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index 7fd4af4..138c7dc 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -44,9 +44,11 @@
   with bot.BuildStep('Upload apk'):
     revision = utils.GetSVNRevision()
     namer = bot_utils.GCSNamer(internal=True)
+    # The version of gsutil we have on the bots is not new enough to support
+    # the acl set commands.
+    bot_utils.GSUtil.USE_DART_REPO_VERSION = True
     gsutil = bot_utils.GSUtil()
 
-
     # Archive dartuim
     local = os.path.join(options.build_products_dir, APK_LOCATION)
     # TODO(whesse): pass in arch and mode from reciepe
@@ -82,8 +84,7 @@
     print "No build products directory given."
     sys.exit(1)
 
-  # Reenable once we have new gsutil working
-  # UploadAPKs(options)
+  UploadAPKs(options)
   sys.exit(0)
 
 if __name__ == '__main__':
diff --git a/tools/build.py b/tools/build.py
index 1e83352..7fc3187 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -105,7 +105,7 @@
         print ("Cross-compilation to %s is not supported on host os %s."
                % (os, HOST_OS))
         return False
-      if not arch in ['ia32', 'arm']:
+      if not arch in ['ia32', 'arm', 'mips']:
         print ("Cross-compilation to %s is not supported for architecture %s."
                % (os, arch))
         return False
@@ -114,9 +114,6 @@
       if args == []:
         print "For android builds you must specify a target, such as 'runtime'."
         return False
-      if 'v8' in args:
-        print "The v8 target is not supported for android builds."
-        return False
   return True
 
 
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index caaa81c..e71ebf1 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -40,7 +40,7 @@
 versiondir = ''
 
 # Ignore Git/SVN files, checked-in binaries, backup files, etc..
-ignoredPaths = ['tools/testing/bin'
+ignoredPaths = ['tools/testing/bin',
                 'third_party/7zip', 'third_party/android_tools',
                 'third_party/clang', 'third_party/d8',
                 'third_party/firefox_jsshell']
diff --git a/tools/dom/src/dart2js_DOMImplementation.dart b/tools/dom/src/dart2js_DOMImplementation.dart
index 78a54b3..a844f23 100644
--- a/tools/dom/src/dart2js_DOMImplementation.dart
+++ b/tools/dom/src/dart2js_DOMImplementation.dart
@@ -51,15 +51,19 @@
   }
 
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  Events get on => throw new UnimplementedError();
+  Events get on => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
-      => throw new UnimplementedError();
+      => throw new UnsupportedError(
+        'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
-  bool dispatchEvent(Event event) => throw new UnimplementedError();
+  bool dispatchEvent(Event event) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
-      [bool useCapture]) => throw new UnimplementedError();
+      [bool useCapture]) => throw new UnsupportedError(
+          'You can only attach EventListeners to your own window.');
 }
 
 class _LocationCrossFrame implements LocationBase {
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index d84e396..af81731 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -473,6 +473,21 @@
 
   // Implementation support.
   String get typeName => "Window";
+
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  Events get on => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void addEventListener(String type, EventListener listener, [bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  bool dispatchEvent(Event event) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
 }
 
 class _HistoryCrossFrame extends NativeFieldWrapperClass2 implements HistoryBase {
diff --git a/tools/get_archive.py b/tools/get_archive.py
index a7cf26d..a00bb9c 100755
--- a/tools/get_archive.py
+++ b/tools/get_archive.py
@@ -55,7 +55,7 @@
 # Dictionary storing the earliest revision of each download we have stored.
 LAST_VALID = {'dartium': 4285, 'chromedriver': 7823, 'sdk': 9761, 'drt': 5342}
 
-sys.path.append(os.path.join(GSUTIL_DIR, 'boto'))
+sys.path.append(os.path.join(GSUTIL_DIR, 'third_party', 'boto'))
 import boto
 
 
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index 79f93dd..4100beb 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -95,42 +95,47 @@
       # Configurations
       'DebugIA32': {
         'inherit_from': [
-            'Dart_Base', 'Dart_ia32_Base', 'Dart_Debug',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_ia32_Base',
-            'Dart_<(dart_target_os)_Debug',],
+          'Dart_Base', 'Dart_ia32_Base', 'Dart_Debug',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_ia32_Base',
+          'Dart_<(dart_target_os)_Debug',
+        ],
       },
 
       'ReleaseIA32': {
         'inherit_from': [
-            'Dart_Base', 'Dart_ia32_Base', 'Dart_Release',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_ia32_Base',
-            'Dart_<(dart_target_os)_Release',],
+          'Dart_Base', 'Dart_ia32_Base', 'Dart_Release',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_ia32_Base',
+          'Dart_<(dart_target_os)_Release',
+        ],
       },
 
       'DebugX64': {
         'inherit_from': [
-            'Dart_Base', 'Dart_x64_Base', 'Dart_Debug',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_x64_Base',
-            'Dart_<(dart_target_os)_Debug',],
+          'Dart_Base', 'Dart_x64_Base', 'Dart_Debug',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_x64_Base',
+          'Dart_<(dart_target_os)_Debug',
+        ],
       },
 
       'ReleaseX64': {
         'inherit_from': [
-            'Dart_Base', 'Dart_x64_Base', 'Dart_Release',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_x64_Base',
-            'Dart_<(dart_target_os)_Release',],
+          'Dart_Base', 'Dart_x64_Base', 'Dart_Release',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_x64_Base',
+          'Dart_<(dart_target_os)_Release',
+        ],
       },
 
       'DebugSIMARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_simarm_Base', 'Dart_Debug',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_simarm_Base',
-            'Dart_<(dart_target_os)_Debug',],
+          'Dart_Base', 'Dart_simarm_Base', 'Dart_Debug',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simarm_Base',
+          'Dart_<(dart_target_os)_Debug',
+        ],
         'defines': [
           'DEBUG',
         ],
@@ -138,18 +143,20 @@
 
       'ReleaseSIMARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_simarm_Base', 'Dart_Release',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_simarm_Base',
-            'Dart_<(dart_target_os)_Release',],
+          'Dart_Base', 'Dart_simarm_Base', 'Dart_Release',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simarm_Base',
+          'Dart_<(dart_target_os)_Release',
+        ],
       },
 
       'DebugSIMMIPS': {
         'inherit_from': [
-            'Dart_Base', 'Dart_simmips_Base', 'Dart_Debug',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_simmips_Base',
-            'Dart_<(dart_target_os)_Debug',],
+          'Dart_Base', 'Dart_simmips_Base', 'Dart_Debug',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simmips_Base',
+          'Dart_<(dart_target_os)_Debug',
+        ],
         'defines': [
           'DEBUG',
         ],
@@ -157,44 +164,85 @@
 
       'ReleaseSIMMIPS': {
         'inherit_from': [
-            'Dart_Base', 'Dart_simmips_Base', 'Dart_Release',
-            'Dart_<(dart_target_os)_Base',
-            'Dart_<(dart_target_os)_simmips_Base',
-            'Dart_<(dart_target_os)_Release',],
+          'Dart_Base', 'Dart_simmips_Base', 'Dart_Release',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simmips_Base',
+          'Dart_<(dart_target_os)_Release',
+        ],
       },
 
 
       # ARM and MIPS hardware configurations are only for Linux and Android.
+      'DebugXARM': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_xarm_Base',
+          'Dart_Linux_Debug',
+        ],
+      },
+
+      'ReleaseXARM': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_xarm_Base',
+          'Dart_Linux_Release',
+        ],
+      },
+
       'DebugARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
-            'Dart_Linux_Base',
-            'Dart_Linux_arm_Base',
-            'Dart_Linux_Debug',],
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_arm_Base',
+          'Dart_Linux_Debug',
+        ],
       },
 
       'ReleaseARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_arm_Base', 'Dart_Release',
-            'Dart_Linux_Base',
-            'Dart_Linux_arm_Base',
-            'Dart_Linux_Release',],
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_arm_Base',
+          'Dart_Linux_Release',
+        ],
+      },
+
+      'DebugXMIPS': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_mips_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_xmips_Base',
+          'Dart_Linux_Debug',
+        ],
+      },
+
+      'ReleaseXMIPS': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_mips_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_xmips_Base',
+          'Dart_Linux_Release',
+        ],
       },
 
       'DebugMIPS': {
         'inherit_from': [
-            'Dart_Base', 'Dart_mips_Base', 'Dart_Debug',
-            'Dart_Linux_Base',
-            'Dart_Linux_mips_Base',
-            'Dart_Linux_Debug',],
+          'Dart_Base', 'Dart_mips_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_mips_Base',
+          'Dart_Linux_Debug',
+        ],
       },
 
       'ReleaseMIPS': {
         'inherit_from': [
-            'Dart_Base', 'Dart_mips_Base', 'Dart_Release',
-            'Dart_Linux_Base',
-            'Dart_Linux_mips_Base',
-            'Dart_Linux_Release',],
+          'Dart_Base', 'Dart_mips_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_mips_Base',
+          'Dart_Linux_Release',
+        ],
       },
 
       # Android configurations. The configuration names explicitly include
@@ -204,34 +252,38 @@
       # gyp, it will still be 'linux'.
       'DebugAndroidIA32': {
         'inherit_from': [
-            'Dart_Base', 'Dart_ia32_Base', 'Dart_Debug',
-            'Dart_Android_Base',
-            'Dart_Android_ia32_Base',
-            'Dart_Android_Debug',],
+          'Dart_Base', 'Dart_ia32_Base', 'Dart_Debug',
+          'Dart_Android_Base',
+          'Dart_Android_ia32_Base',
+          'Dart_Android_Debug',
+        ],
       },
 
       'ReleaseAndroidIA32': {
         'inherit_from': [
-            'Dart_Base', 'Dart_ia32_Base', 'Dart_Release',
-            'Dart_Android_Base',
-            'Dart_Android_ia32_Base',
-            'Dart_Android_Release',],
+          'Dart_Base', 'Dart_ia32_Base', 'Dart_Release',
+          'Dart_Android_Base',
+          'Dart_Android_ia32_Base',
+          'Dart_Android_Release',
+        ],
       },
 
       'DebugAndroidARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
-            'Dart_Android_Base',
-            'Dart_Android_arm_Base',
-            'Dart_Android_Debug',],
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Debug',
+          'Dart_Android_Base',
+          'Dart_Android_arm_Base',
+          'Dart_Android_Debug',
+        ],
       },
 
       'ReleaseAndroidARM': {
         'inherit_from': [
-            'Dart_Base', 'Dart_arm_Base', 'Dart_Release',
-            'Dart_Android_Base',
-            'Dart_Android_arm_Base',
-            'Dart_Android_Release',],
+          'Dart_Base', 'Dart_arm_Base', 'Dart_Release',
+          'Dart_Android_Base',
+          'Dart_Android_arm_Base',
+          'Dart_Android_Release',
+        ],
       },
 
       # These targets assume that target_arch is passed in explicitly
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index b7a9f74..4f9d748 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -49,13 +49,13 @@
         ],
       },
 
-      'Dart_Linux_arm_Base': {
+      # ARM cross-build
+      'Dart_Linux_xarm_Base': {
         'abstract': 1,
         'target_conditions': [
         ['_toolset=="target"', {
           'cflags': [
             '-marm',
-            '-march=armv7-a',
             '-mfpu=vfp',
             '-Wno-psabi', # suppresses va_list warning
             '-fno-strict-overflow',
@@ -71,13 +71,29 @@
         }]]
       },
 
+      # ARM native build
+      'Dart_Linux_arm_Base': {
+        'abstract': 1,
+        'cflags': [
+          '-marm',
+          '-mfpu=vfp',
+          '-Wno-psabi', # suppresses va_list warning
+          '-fno-strict-overflow',
+        ],
+        'defines': [
+          # In build.py, we specify the hf compiler.
+          'ARM_FLOAT_ABI_HARD',
+        ],
+      },
+
       'Dart_Linux_simmips_Base': {
         'abstract': 1,
         'cflags': [ '-O3', '-m32', '-msse2' ],
         'ldflags': [ '-m32', ],
       },
 
-      'Dart_Linux_mips_Base': {
+      # MIPS cross-build
+      'Dart_Linux_xmips_Base': {
         'abstract': 1,
         'target_conditions': [
           ['_toolset=="target"', {
@@ -93,6 +109,16 @@
         }]]
       },
 
+      # MIPS native build
+      'Dart_Linux_mips_Base': {
+        'abstract': 1,
+        'cflags': [
+          '-march=mips32',
+          '-mhard-float',
+          '-fno-strict-overflow',
+        ],
+      },
+
       'Dart_Linux_Debug': {
         'abstract': 1,
         'cflags': [
diff --git a/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart b/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.dart
deleted file mode 100644
index 2a79ab8..0000000
--- a/tools/testing/dart/browser_perf_testing/lib/browser_perf_testing.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.
-
-/// Dart script to launch performance tests without WebDriver/Selenium.
-///
-/// WARNING: Although this is laid out like a package, it is not really a
-/// package since it relies on test.dart files!
-library browser_perf_testing;
-
-import '../../browser_controller.dart';
-import '../../utils.dart';
-import '../../http_server.dart';
-import 'dart:async';
-import 'dart:io';
-import 'dart:convert';
-import 'package:path/path.dart' as path;
-import 'package:args/args.dart' as args_parser;
-
-final String ADDRESS = '127.0.0.1';
-
-/// A map that is passed to the testing framework to specify what ports the
-/// browser controller runs on.
-final Map SERVER_CONFIG = {
-  'test_driver_port': 0,
-  'test_driver_error_port': 0
-};
-
-void main (List<String> args) {
-  var options = _parseArguments(args);
-
-  // Start a server to serve the entire repo: the http server is available on
-  // window.location.port.
-  var servers = new TestingServers(
-      new Path('/Users/efortuna/dart-git2/dart/xcodebuild/ReleaseIA32'),
-      false, options['browser'], path.dirname(path.dirname(path.dirname(
-      path.dirname(path.dirname(path.dirname(Platform.script.path)))))));
-  servers.startServers(ADDRESS).then((_) {
-    _runPerfTests(options, servers);
-  });
-}
-
-/// Helper function to parse the arguments for this file.
-Map _parseArguments(List<String> args) {
-  var parser =  new args_parser.ArgParser();
-  parser.addOption('browser', defaultsTo: 'chrome', help: 'Name of the browser'
-      ' to run this test with.');
-  parser.addOption('termination_test_file', defaultsTo:
-      '/root_dart/samples/third_party/dromaeo/dromaeo_end_condition.js',
-      help: 'Path to a javascript file that contains the function '
-      '"testIsComplete" tests whether the performance test has finished '
-      'running. This is in a form that can be served up by '
-      'http_server.dart, so it begins with /root_dart or some other server '
-      'understood prefix.');
-  parser.addOption('test_path', defaultsTo:
-      '/root_dart/samples/third_party/dromaeo/index-js.html?jsANDqueryORjs'
-      'ANDtraverseORjsANDattributes', help: 'Path to the performance test we '
-      'wish to run. This is in a form that can be served up by '
-      'http_server.dart, so it begins with /root_dart or some other server '
-      'understood prefix.');
-  parser.addOption('checked', defaultsTo: false,
-      help: 'Run this test in checked mode.');
-  parser.addFlag('help', abbr: 'h', negatable: false, callback: (help) {
-    if (help) {
-      print(parser.getUsage());
-      exit(0);
-    };
-  });
-  parser.addOption('timeout', defaultsTo: 300,
-      help: 'Maximum amount of time to let a test run, in seconds.');
-  return parser.parse(args);
-}
-
-void _runPerfTests(Map options, TestingServers servers) {
-  var browserName = options['browser'];
-
-  var testRunner = new BrowserTestRunner(SERVER_CONFIG, ADDRESS, browserName, 1,
-      checkedMode: options['checked'],
-      testingServer: new BrowserPerfTestingServer(browserName,
-      options['termination_test_file'], servers.port));
-
-  var url = 'http://$ADDRESS:${servers.port}${options["test_path"]}';
-
-  BrowserTest browserTest = new BrowserTest(url,
-      (BrowserTestOutput output) {
-        var eventQueue = JSON.decode(output.lastKnownMessage);
-        var lastEvent = eventQueue.last;
-        var lines = lastEvent['value'].split('\n');
-        for (var line in lines) {
-          print(line);
-        }
-        testRunner.terminate();
-        servers.stopServers();
-      }, options['timeout']);
-
-  testRunner.start().then((started) {
-    if (started) {
-      testRunner.queueTest(browserTest);
-    } else {
-      print("Issue starting browser test runner $started");
-      exit(1);
-    }
-  });
-}
-
-/// Server for controlling and running performance tests. Note the tests
-/// themselves are served on the local file system (to eliminate any additional
-/// potential sources of lag), but we need a server to communicate when the test
-/// is done.
-class BrowserPerfTestingServer extends BrowserTestingServer {
-  // Path to the script containing the ending condition of the performance test,
-  // in the form of /root_dart, /root_build, or some other, as per the form of
-  // url expected from http_server.dart.
-  String endConditionScript;
-  /// Port number to access the server serving the whole Dart repository.
-  int repoPort;
-
-  BrowserPerfTestingServer(String browserName, this.endConditionScript,
-      this.repoPort) : super(SERVER_CONFIG, ADDRESS,
-      !Browser.BROWSERS_WITH_WINDOW_SUPPORT.contains(browserName));
-
-  /// We create a slightly modified version of the original browser_controller
-  /// driver page.
-  String getDriverPage(String browserId) {
-    var orig = super.getDriverPage(browserId);
-    //TODO(efortuna): Hacky!
-    var insertIndex = orig.indexOf('<script type');
-    var otherInsert = orig.indexOf('} else {',
-        orig.indexOf('if (isStatusUpdate)'));
-    var result = orig.substring(0, insertIndex) + """
-    <!-- To create a performance test, you must write a script that provides an
-  ending condition for the particular test, in the form /root_dart/foo (or
-  whatever base from http_server). // TODO not hard code.-->
-  <script src="http://$localIp:$repoPort$endConditionScript"></script>
-""" + orig.substring(insertIndex, otherInsert) + """
-            if (testIsComplete(msg)) {
-              var obj = new Object();
-              obj['message'] = msg;
-              obj['is_first_message'] = false;
-              obj['is_status_update'] = false;
-              obj['is_done'] = true;
-              window.postMessage(JSON.stringify(obj), '*');
-            }""" + orig.substring(otherInsert);
-    return result;
-  }
-}
diff --git a/tools/testing/dart/perf_test_controller.js b/tools/testing/dart/perf_test_controller.js
deleted file mode 100644
index f6990bb..0000000
--- a/tools/testing/dart/perf_test_controller.js
+++ /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.
-
-/// Helper file to make performance tests run with the Dart browser controller
-/// in test.dart.
-
-// First import test_controller.js
-dartPrint('unittest-suite-wait-for-done');
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 4937643..7c69d32 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2068,16 +2068,28 @@
     if (configuration['build_directory'] != '') {
       return configuration['build_directory'];
     }
-    var outputDir = '';
-    var system = configuration['system'];
-    if (system == 'linux') {
-      outputDir = 'out/';
-    } else if (system == 'macos') {
-      outputDir = 'xcodebuild/';
-    } else if (system == 'windows') {
-      outputDir = 'build/';
+    
+    return "${outputDir(configuration)}${configurationDir(configuration)}";
+  }
+
+  static getValidOutputDir(Map configuration, String mode, String arch) {
+    // We allow our code to have been cross compiled, i.e., that there
+    // is an X in front of the arch. We don't allow both a cross compiled
+    // and a normal version to be present (except if you specifically pass
+    // in the build_directory).
+    var normal = '$mode$arch';
+    var cross = '${mode}X$arch';
+    var outDir = outputDir(configuration);
+    var normalDir = new Directory(new Path('$outDir$normal').toNativePath());
+    var crossDir = new Directory(new Path('$outDir$cross').toNativePath());
+    if (normalDir.existsSync() && crossDir.existsSync()) {
+      throw "You can't have both $normalDir and $crossDir, we don't know which"
+            " binary to use";
     }
-    return "$outputDir${configurationDir(configuration)}";
+    if (crossDir.existsSync()) {
+      return cross;
+    }
+    return normal;
   }
 
   static String configurationDir(Map configuration) {
@@ -2088,7 +2100,7 @@
     var mode = (configuration['mode'] == 'debug') ? 'Debug' : 'Release';
     var arch = configuration['arch'].toUpperCase();
     if (currentWorkingDirectory != dartDir()) {
-      return '$mode$arch';
+      return getValidOutputDir(configuration, mode, arch);
     } else {
       return mode;
     }
diff --git a/tools/testing/perf_testing/run_perf_tests.py b/tools/testing/perf_testing/run_perf_tests.py
index 8b790cb2..1034e6d 100755
--- a/tools/testing/perf_testing/run_perf_tests.py
+++ b/tools/testing/perf_testing/run_perf_tests.py
@@ -174,7 +174,7 @@
       # don't have test statistics for what's passing on x64. Eliminate arch
       # specification when we have tests running on x64, too.
       shutil.rmtree(os.path.join(os.getcwd(),
-                    utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32')),
+                    utils.GetBuildRoot(utils.GuessOS())),
                     onerror=TestRunner._OnRmError)
       lines = self.RunCmd([os.path.join('.', 'tools', 'build.py'), '-m',
                             'release', '--arch=ia32', 'create_sdk'])
@@ -721,14 +721,20 @@
         return
 
       # Build tests.
-      dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo')
+      # TODO(efortuna): Make the pub functionality a separate function.
       current_path = os.getcwd()
-      os.chdir(dromaeo_path)
-      stdout, _ = self.test.test_runner.RunCmd(
-          ['python', 'generate_perf_and_dart2js_tests.py'])
+      os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party',
+          'dromaeo'))
+      self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
+          utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
+          'dart-sdk', 'bin', 'pub'), 'install']) # TODO: pub upgrade?
+      stdout, _ = self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
+          utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
+          'dart-sdk', 'bin', 'pub'), 'build'])
       os.chdir(current_path)
-      if 'Error: Compilation failed' in stdout:
+      if 'failed' in stdout:
         return
+
       versions = DromaeoTester.GetDromaeoVersions()
 
       for browser in BrowserTester.GetBrowsers():
@@ -741,29 +747,19 @@
               'tools', 'testing', 'perf_testing', self.test.result_folder_name,
               'dromaeo-%s-%s-%s' % (self.test.cur_time, browser, version_name))
           self.AddSvnRevisionToTrace(self.test.trace_file, browser)
-          url_path = '/'.join(['/root_dart', dromaeo_path, 'index%s.html?%s'% (
+          url_path = '/'.join(['/code_root', 'build', 'web', 'index%s.html?%s'%(
               '-dart' if version_name == 'dart_html' else '-js',
               version)])
 
-          # TODO(efortuna): Make this a separate function. We should do this
-          # once per cycle.
-          os.chdir(os.path.join(DART_REPO_LOC, 'tools', 'testing', 'dart',
-              'browser_perf_testing'))
-          self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
-              utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
-              'dart-sdk', 'bin', 'pub'), 'install'])
-          os.chdir(current_path)
-
           self.test.test_runner.RunCmd(
-              [os.path.join(utils.GetBuildRoot(
+              [os.path.join(DART_REPO_LOC, utils.GetBuildRoot(
                utils.GuessOS(), 'release', 'ia32'), 'dart-sdk', 'bin', 'dart'),
-               '--package-root=%s' % os.path.join(DART_REPO_LOC, 'tools',
-               'testing', 'dart', 'browser_perf_testing', 'packages'),
-               os.path.join('tools', 'testing', 'dart', 'browser_perf_testing',
-               'lib', 'browser_perf_testing.dart'),
-               '--browser', browser, '--termination_test_file',
-               '/root_dart/samples/third_party/dromaeo/dromaeo_end_condition.'
-               'js', '--test_path', url_path], self.test.trace_file,
+               '--package-root=%s' % os.path.join(DART_REPO_LOC, 'samples',
+               'third_party', 'dromaeo', 'packages'), os.path.join(
+               DART_REPO_LOC, 'samples', 'third_party', 'dromaeo', 'packages',
+               'browser_controller', 'browser_perf_testing.dart'),
+               '--browser', browser,
+               '--test_path', url_path], self.test.trace_file,
                append=True)
 
     @staticmethod
diff --git a/tools/utils.py b/tools/utils.py
index a8ad21d..57d2c00 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -50,6 +50,8 @@
   id = platform.machine()
   if id.startswith('arm'):
     return 'arm'
+  elif id.startswith('mips'):
+    return 'mips'
   elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
     return 'ia32'
   elif id == 'i86pc':
@@ -57,6 +59,10 @@
   elif '64' in id:
     return 'x64'
   else:
+    guess_os = GuessOS()
+    print "Warning: Guessing architecture %s based on os %s\n" % (id, guess_os)
+    if guess_os == 'win32':
+      return 'ia32'
     return None
 
 
@@ -207,6 +213,19 @@
   'macos': os.path.join('xcodebuild'),
 }
 
+ARCH_FAMILY = {
+  'ia32': 'ia32',
+  'x64': 'ia32',
+  'arm': 'arm',
+  'mips': 'mips',
+  'simarm': 'ia32',
+  'simmips': 'ia32',
+}
+
+ARCH_GUESS = GuessArchitecture()
+BASE_DIR = os.path.abspath(os.path.join(os.curdir, '..'))
+DART_DIR = os.path.abspath(os.path.join(__file__, '..', '..'))
+
 def GetBuildbotGSUtilPath():
   gsutil = '/b/build/scripts/slave/gsutil'
   if platform.system() == 'Windows':
@@ -216,16 +235,20 @@
 def GetBuildMode(mode):
   return BUILD_MODES[mode]
 
+def GetArchFamily(arch):
+  return ARCH_FAMILY[arch]
+
 def GetBuildConf(mode, arch, conf_os=None):
   if conf_os == 'android':
     return '%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper())
   else:
-    return '%s%s' % (GetBuildMode(mode), arch.upper())
-
-ARCH_GUESS = GuessArchitecture()
-BASE_DIR = os.path.abspath(os.path.join(os.curdir, '..'))
-DART_DIR = os.path.abspath(os.path.join(__file__, '..', '..'))
-
+    # Ask for a cross build if the host and target architectures don't match.
+    host_arch = ARCH_GUESS
+    cross_build = ''
+    if GetArchFamily(host_arch) != GetArchFamily(arch):
+      print "GetBuildConf: Cross-build of %s on %s\n" % (arch, host_arch)
+      cross_build = 'X'
+    return '%s%s%s' % (GetBuildMode(mode), cross_build, arch.upper())
 
 def GetBuildDir(host_os, target_os):
   return BUILD_ROOT[host_os]
@@ -503,6 +526,8 @@
     system = GuessOS()
     if arch == 'arm':
       return os.path.join(dart_binary_prefix, system, 'dart-arm')
+    elif arch == 'mips':
+      return os.path.join(dart_binary_prefix, system, 'dart-mips')
     else:
       return os.path.join(dart_binary_prefix, system, 'dart')