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')
 
